From a899084e373e251c1146814d9fdfddc1fb85753c Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Mon, 23 Mar 2009 23:26:37 +0000 Subject: [PATCH] Import release 2.0beta1 --- AUTHORS | 226 +- CMakeLists.txt | 91 +- ChangeLog | 1401 ++- Doxyfile | 68 +- FEATURES | 1 + NEWS | 154 +- README | 13 +- TODO | 70 +- autopackage/default.apspec | 6 +- cmake/check-qca2-ossl.sh | 9 + cmake/config-kmess.h.in | 3 + cmake/get-svn-version.sh | 6 +- configure | 14 +- data/CMakeLists.txt | 5 +- .../Classic-compact/Classic-compact.css | 12 + .../Classic-compact/Classic-compact.xsl | 4 +- data/chatstyles/Classic/Classic.css | 11 + .../Colourful-Enclosed/Colourful-Enclosed.css | 13 + data/chatstyles/Dim/Dim.css | 11 + data/chatstyles/Efficient/Efficient.css | 14 + data/chatstyles/Fresh-dark/Fresh-dark.css | 13 + data/chatstyles/Fresh/Fresh.css | 14 + data/chatstyles/Pure/Pure.css | 13 + data/emoticons/KMess2-new/emoticons.xml | 4 - data/icons/CMakeLists.txt | 13 +- data/icons/likeback_bug.png | Bin 0 -> 703 bytes data/icons/likeback_dislike.png | Bin 0 -> 844 bytes data/icons/likeback_feature.png | Bin 0 -> 829 bytes data/icons/likeback_like.png | Bin 0 -> 894 bytes data/kmess.desktop | 4 +- data/kmess.notifyrc | 24 +- data/kmesschatstyles.knsrc | 4 + data/pics/CMakeLists.txt | 4 +- data/pics/kmesslogo.png | Bin 16152 -> 0 bytes data/pics/kmesslogo.svgz | Bin 0 -> 7891 bytes data/pics/kmesslogo2.png | Bin 16742 -> 0 bytes data/pics/kmesspic.png | Bin 10946 -> 8243 bytes data/pics/kmesspic.svgz | Bin 0 -> 8197 bytes data/pics/kmesspic.xcf | Bin 17136 -> 0 bytes data/pics/kmessstrip1.png | Bin 0 -> 10365 bytes data/pics/kmessstrip1.svgz | Bin 0 -> 7889 bytes data/pics/kmessstrip2.png | Bin 0 -> 10059 bytes data/pics/kmessstrip2.svgz | Bin 0 -> 17640 bytes doc/en/chatwindow-contextmenu.png | Bin 39389 -> 9159 bytes doc/en/chatwindow-custom-emoticons-add.png | Bin 21051 -> 29266 bytes doc/en/chatwindow-emoticons.png | Bin 70872 -> 46082 bytes doc/en/chatwindow-nosidebar.png | Bin 27838 -> 0 bytes doc/en/chatwindow-withsidebar.png | Bin 52029 -> 102056 bytes doc/en/contactlist-contextmenu.png | Bin 16203 -> 14010 bytes doc/en/contactlist-states.png | Bin 0 -> 31931 bytes doc/en/emoticonsbutton.png | Bin 1183 -> 0 bytes doc/en/general-settings-dialog-settings.png | Bin 0 -> 53543 bytes doc/en/index.docbook | 949 +- doc/en/mainwindow.png | Bin 48898 -> 102953 bytes doc/en/picturechange-dialog.png | Bin 22234 -> 0 bytes doc/en/picturechange-result.png | Bin 49178 -> 0 bytes doc/en/popup-balloon.png | Bin 20148 -> 0 bytes doc/en/settings-dialog-account.png | Bin 57539 -> 72985 bytes doc/en/settings-dialog-chatlogs.png | Bin 40520 -> 65433 bytes doc/en/settings-dialog-chatting.png | Bin 61791 -> 77283 bytes doc/en/settings-dialog-email.png | Bin 39486 -> 0 bytes .../settings-dialog-emoticons-custom-add.png | Bin 0 -> 29266 bytes doc/en/settings-dialog-emoticons-custom.png | Bin 45385 -> 62381 bytes doc/en/settings-dialog-emoticons.png | Bin 38449 -> 75684 bytes doc/en/sidebarbutton.png | Bin 727 -> 0 bytes doc/en/startupscreen.png | Bin 35852 -> 53443 bytes doc/en/styles-fresh.png | Bin 15674 -> 18193 bytes kmess.lsm | 2 +- kmess.spec | 8 +- po/ar.po | 6473 +++++++++----- po/ca.po | 6312 ++++++++----- po/da.po | 6546 +++++++++----- po/de.po | 7537 +++++++++------- po/el.po | 5785 ++++++++++++ po/es.po | 7848 +++++++++++------ po/et.po | 6299 ++++++++----- po/fi.po | 6545 +++++++++----- po/fr.po | 7051 +++++++++------ po/hu.po | 7162 +++++++++------ po/it.po | 7422 ++++++++++------ po/kmess.pot | 5532 ++++++++---- po/ko.po | 6231 ++++++++----- po/mergetrans | 2 +- po/nb.po | 6363 ++++++++----- po/nl.po | 7737 +++++++++------- po/pt_BR.po | 7643 ++++++++++------ po/sk.po | 6432 ++++++++++++++ po/sl.po | 6302 ++++++++----- po/sr.po | 6029 +++++++++++++ po/sv.po | 7504 ++++++++++------ po/th.po | 6266 ++++++++----- po/tr.po | 6487 +++++++++----- po/zh_CN.po | 6712 +++++++++----- po/zh_TW.po | 6954 +++++++++------ src/CMakeLists.txt | 77 +- src/account.cpp | 741 +- src/account.h | 140 +- src/accountaction.cpp | 2 +- src/accountaction.h | 2 +- src/accountsmanager.cpp | 303 +- src/chat/chat.cpp | 1392 +-- src/chat/chat.h | 98 +- src/chat/chatmaster.cpp | 590 +- src/chat/chatmaster.h | 33 +- src/chat/chatmessagestyle.cpp | 353 +- src/chat/chatmessagestyle.h | 50 +- src/chat/chatmessageview.cpp | 802 +- src/chat/chatmessageview.h | 69 +- src/chat/chatstatusbar.cpp | 375 + src/chat/chatstatusbar.h | 120 + src/chat/chatview.cpp | 1348 +-- src/chat/chatview.h | 151 +- src/chat/chatview.ui | 231 - src/chat/chatwindow.cpp | 2848 +++--- src/chat/chatwindow.h | 230 +- src/chat/chatwindow.ui | 459 +- src/chat/chatwindowui.rc | 45 + src/chat/contactaction.cpp | 118 - src/chat/contactaction.h | 76 - src/chat/contactframe.cpp | 438 +- src/chat/contactframe.h | 37 +- src/chat/contactframe.ui | 216 +- src/chat/contactsidebar.cpp | 280 - src/chat/contactswidget.cpp | 510 ++ .../{contactsidebar.h => contactswidget.h} | 61 +- src/chat/contactswidget.ui | 142 + src/chat/emoticonsidebar.cpp | 261 - src/chat/emoticonswidget.cpp | 498 ++ .../{emoticonsidebar.h => emoticonswidget.h} | 62 +- src/chat/inkedit.cpp | 213 +- src/chat/inkedit.h | 45 +- src/chat/inkedit.ui | 28 +- src/chat/winkswidget.cpp | 361 + src/chat/winkswidget.h | 67 + src/chat/xsltransformation.cpp | 90 +- src/chat/xsltransformation.h | 6 + src/contact/contact.cpp | 163 +- src/contact/contact.h | 18 +- src/contact/contactbase.cpp | 212 +- src/contact/contactbase.h | 44 +- src/contact/contactextension.cpp | 56 +- src/contact/contactextension.h | 2 +- src/contact/contactlistmodelitem.cpp | 596 -- src/contact/group.cpp | 29 +- src/contact/group.h | 8 +- src/contact/invitedcontact.cpp | 6 +- src/contact/invitedcontact.h | 2 +- src/contact/msnobject.cpp | 85 +- src/contact/msnobject.h | 12 +- src/contact/msnstatus.cpp | 130 +- src/contact/msnstatus.h | 34 +- src/{network => contact}/specialgroups.h | 5 +- src/contactlistmodelfilter.cpp | 289 - src/currentaccount.cpp | 156 +- src/currentaccount.h | 64 +- src/dialogs/addcontactdialog.cpp | 66 +- src/dialogs/addcontactdialog.h | 10 +- src/dialogs/addcontactdialog.ui | 89 +- src/dialogs/addemoticondialog.cpp | 21 +- src/dialogs/addemoticondialog.h | 9 +- src/dialogs/addemoticondialog.ui | 2 +- src/dialogs/awaymessagedialog.cpp | 3 +- src/dialogs/awaymessagedialog.ui | 2 +- src/dialogs/chathistorydialog.cpp | 536 ++ src/dialogs/chathistorydialog.h | 72 + src/dialogs/chathistorydialog.ui | 296 + src/dialogs/contactaddeduserdialog.cpp | 113 +- src/dialogs/contactaddeduserdialog.h | 28 +- src/dialogs/contactaddeduserdialog.ui | 145 +- src/dialogs/contactentry.cpp | 137 + src/dialogs/contactentry.h | 65 + src/dialogs/contactentry.ui | 98 + src/dialogs/contactpropertiesdialog.cpp | 268 +- src/dialogs/contactpropertiesdialog.h | 10 + src/dialogs/contactpropertiesdialog.ui | 165 +- src/dialogs/invitedialog.cpp | 265 + src/dialogs/invitedialog.h | 67 + src/dialogs/invitedialog.ui | 186 + src/dialogs/listexportdialog.cpp | 307 + src/dialogs/listexportdialog.h | 54 + src/dialogs/listexportdialog.ui | 133 + src/dialogs/networkwindow.cpp | 144 +- src/dialogs/networkwindow.h | 10 +- src/dialogs/transferentry.cpp | 14 +- src/dialogs/transferentry.h | 28 +- src/dialogs/transferentry.ui | 382 +- src/dialogs/transferwindow.cpp | 94 +- src/dialogs/transferwindow.h | 15 +- src/dialogs/transferwindow.ui | 105 +- src/dialogs/userpicturesdialog.cpp | 183 +- src/dialogs/userpicturesdialog.h | 33 +- src/dialogs/userpicturesdialog.ui | 36 +- src/emoticon.cpp | 66 +- src/emoticon.h | 19 +- src/emoticonmanager.cpp | 102 +- src/emoticonmanager.h | 18 +- src/emoticontheme.cpp | 61 +- src/emoticontheme.h | 30 +- src/initialview.cpp | 543 +- src/initialview.h | 40 +- src/initialview.ui | 742 +- src/kmess.cpp | 722 +- src/kmess.h | 40 +- src/kmessapplication.cpp | 65 +- src/kmessapplication.h | 2 + src/kmessdebug.h | 21 +- src/kmessinterface.cpp | 521 +- src/kmessinterface.h | 52 +- src/kmessinterfaceui.rc | 99 + src/kmesstest.cpp | 619 +- src/kmesstest.h | 38 +- src/kmessview.cpp | 810 +- src/kmessview.h | 59 +- src/kmessview.ui | 29 +- ...viewdelegate.cpp => kmessviewdelegate.cpp} | 149 +- ...listviewdelegate.h => kmessviewdelegate.h} | 44 +- src/main.cpp | 176 +- src/{contact => model}/contactlist.cpp | 956 +- src/{contact => model}/contactlist.h | 37 +- src/model/contactlistmodelfilter.cpp | 403 + src/{ => model}/contactlistmodelfilter.h | 13 +- src/model/contactlistmodelitem.cpp | 756 ++ src/{contact => model}/contactlistmodelitem.h | 56 +- src/network/applications/application.cpp | 10 +- src/network/applications/applicationlist.cpp | 21 +- src/network/applications/filetransfer.cpp | 400 +- src/network/applications/filetransfer.h | 16 +- src/network/applications/filetransferp2p.cpp | 110 +- src/network/applications/filetransferp2p.h | 2 + src/network/applications/inktransferp2p.cpp | 5 +- src/network/applications/inktransferp2p.h | 4 +- src/network/applications/mimeapplication.cpp | 124 +- src/network/applications/mimeapplication.h | 6 + .../applications/msnobjecttransferp2p.cpp | 58 +- .../applications/msnobjecttransferp2p.h | 2 + src/network/applications/msnremotedesktop.cpp | 4 +- src/network/applications/p2papplication.cpp | 137 +- src/network/applications/p2papplication.h | 20 +- .../applications/p2papplicationbase.cpp | 412 +- src/network/applications/p2papplicationbase.h | 55 +- src/network/applications/sipconnection.cpp | 24 +- .../applications/voiceconversation.cpp | 14 +- .../applications/webapplicationp2p.cpp | 14 +- .../applications/webcamtransferp2p.cpp | 686 +- src/network/applications/webcamtransferp2p.h | 53 +- src/network/chatmessage.h | 4 +- src/network/extra/directconnectionbase.cpp | 106 +- src/network/extra/directconnectionbase.h | 3 + src/network/extra/directconnectionpool.cpp | 81 +- src/network/extra/directconnectionpool.h | 9 +- src/network/extra/msnftpconnection.cpp | 45 +- src/network/extra/msnftpconnection.h | 12 +- src/network/extra/msnwebcamconnection.cpp | 236 + src/network/extra/msnwebcamconnection.h | 90 + src/network/extra/p2pfragmenttracker.cpp | 22 +- src/network/extra/p2pfragmenttracker.h | 20 +- src/network/mimemessage.cpp | 22 +- src/network/msnchallengehandler.cpp | 136 +- src/network/msnchallengehandler.h | 53 +- src/network/msnconnection.cpp | 491 +- src/network/msnconnection.h | 74 +- src/network/msnnotificationconnection.cpp | 2767 +++--- src/network/msnnotificationconnection.h | 178 +- src/network/msnsocketbase.cpp | 55 + src/network/msnsocketbase.h | 16 + src/network/msnsockethttp.cpp | 484 +- src/network/msnsockethttp.h | 52 +- src/network/msnsocketnull.cpp | 856 ++ src/network/msnsocketnull.h | 167 + src/network/msnsockettcp.cpp | 34 +- src/network/msnswitchboardconnection.cpp | 832 +- src/network/msnswitchboardconnection.h | 69 +- src/network/p2pmessage.cpp | 111 +- src/network/p2pmessage.h | 113 +- src/network/soap/addressbookservice.cpp | 1039 +++ src/network/soap/addressbookservice.h | 125 + src/network/soap/httpsoapconnection.cpp | 704 +- src/network/soap/httpsoapconnection.h | 113 +- src/network/soap/msnappdirectoryservice.cpp | 111 +- src/network/soap/msnappdirectoryservice.h | 21 +- src/network/soap/offlineimservice.cpp | 490 +- src/network/soap/offlineimservice.h | 50 +- src/network/soap/passportloginservice.cpp | 613 +- src/network/soap/passportloginservice.h | 73 +- src/network/soap/roamingservice.cpp | 112 + src/network/soap/roamingservice.h | 53 + src/network/soap/soapmessage.cpp | 318 +- src/network/soap/soapmessage.h | 134 +- src/network/upnp/igdcontrolpoint.cpp | 4 +- src/network/upnp/layer3forwardingservice.cpp | 4 +- src/network/upnp/service.cpp | 22 +- src/network/upnp/ssdpconnection.cpp | 14 +- src/notification/chatnotification.cpp | 170 +- src/notification/chatnotification.h | 20 +- .../contactstatusnotification.cpp | 174 +- src/notification/contactstatusnotification.h | 21 +- src/notification/newemailnotification.cpp | 119 +- src/notification/newemailnotification.h | 16 +- src/notification/notificationmanager.cpp | 237 +- src/notification/notificationmanager.h | 82 +- src/notification/passivepopup.cpp | 140 - src/notification/passivepopup.h | 100 - src/notification/passivepopupview.cpp | 80 - src/notification/passivepopupview.h | 62 - src/notification/passivepopupview.ui | 299 - src/notification/passivepopupwidget.cpp | 66 - src/notification/passivepopupwidget.h | 57 - src/{ => notification}/systemtraywidget.cpp | 82 +- src/{ => notification}/systemtraywidget.h | 9 +- src/settings/accountpage.cpp | 107 +- src/settings/accountpage.h | 4 + src/settings/accountpage.ui | 1101 +-- src/settings/accountsettingsdialog.cpp | 60 +- src/settings/accountsettingsdialog.h | 13 +- src/settings/accountsmanagerpage.cpp | 64 +- src/settings/accountsmanagerpage.ui | 15 +- src/settings/alertspage.cpp | 136 - src/settings/alertspage.ui | 523 -- src/settings/chatloggingpage.cpp | 62 +- src/settings/chatloggingpage.h | 2 +- src/settings/chatloggingpage.ui | 352 +- src/settings/chatstylepage.cpp | 248 +- src/settings/chatstylepage.h | 28 +- src/settings/chatstylepage.ui | 635 +- src/settings/contactlistpage.cpp | 73 + .../{alertspage.h => contactlistpage.h} | 27 +- src/settings/contactlistpage.ui | 105 + src/settings/emoticonspage.cpp | 35 +- src/settings/emoticonspage.ui | 173 +- src/settings/globalsettingsdialog.cpp | 5 +- src/settings/miscellaneouspage.cpp | 12 +- src/settings/miscellaneouspage.ui | 297 +- src/utils/crashhandler.cpp | 59 +- src/utils/kmess-send/CMakeLists.txt | 25 + src/utils/kmess-send/kmesssendmenuitem.cpp | 47 + src/utils/kmess-send/kmesssendmenuitem.h | 44 + src/utils/kmess-send/kmesssendplugin.cpp | 247 + src/utils/kmess-send/kmesssendplugin.desktop | 7 + src/utils/kmess-send/kmesssendplugin.h | 51 + src/utils/kmessconfig.cpp | 136 +- src/utils/kmessconfig.h | 9 + src/utils/kmessdbus.cpp | 103 +- src/utils/kmessdbus.h | 9 + src/utils/kmessdbus.xml | 18 - src/utils/kmessdbusadaptor.cpp | 130 + src/utils/kmessdbusadaptor.h | 101 + src/utils/kmessdbusdatatypes.cpp | 42 + src/utils/kmessdbusdatatypes.h | 44 + src/utils/kmessshared.cpp | 278 +- src/utils/kmessshared.h | 18 +- src/utils/likeback/likeback.cpp | 499 ++ src/utils/likeback/likeback.h | 357 + src/utils/likeback/likeback_p.h | 86 + src/utils/likeback/likebackbar.cpp | 155 + src/utils/likeback/likebackbar.h | 51 + src/utils/likeback/likebackbar.ui | 146 + src/utils/likeback/likebackdialog.cpp | 320 + src/utils/likeback/likebackdialog.h | 50 + src/utils/likeback/likebackdialog.ui | 213 + src/utils/nowlisteningclient.cpp | 128 +- src/utils/nowlisteningclient.h | 23 +- src/utils/richtextparser.cpp | 621 +- src/utils/richtextparser.h | 17 +- src/utils/thumbnailprovider.cpp | 7 +- src/utils/thumbnailprovider.h | 2 +- src/utils/xautolock.cpp | 9 +- src/utils/xautolock.h | 2 - src/utils/xmlfunctions.cpp | 9 +- templates/cpp | 4 +- templates/h | 4 +- tests/modeltest/modeltest.cpp | 3 +- tests/old_richtextparser.cpp | 932 ++ tests/old_richtextparser.h | 169 + 373 files changed, 147541 insertions(+), 68476 deletions(-) create mode 100755 cmake/check-qca2-ossl.sh create mode 100644 data/icons/likeback_bug.png create mode 100644 data/icons/likeback_dislike.png create mode 100644 data/icons/likeback_feature.png create mode 100644 data/icons/likeback_like.png create mode 100644 data/kmesschatstyles.knsrc delete mode 100644 data/pics/kmesslogo.png create mode 100644 data/pics/kmesslogo.svgz delete mode 100644 data/pics/kmesslogo2.png create mode 100644 data/pics/kmesspic.svgz delete mode 100644 data/pics/kmesspic.xcf create mode 100644 data/pics/kmessstrip1.png create mode 100644 data/pics/kmessstrip1.svgz create mode 100644 data/pics/kmessstrip2.png create mode 100644 data/pics/kmessstrip2.svgz delete mode 100644 doc/en/chatwindow-nosidebar.png create mode 100644 doc/en/contactlist-states.png delete mode 100644 doc/en/emoticonsbutton.png create mode 100644 doc/en/general-settings-dialog-settings.png delete mode 100644 doc/en/picturechange-dialog.png delete mode 100644 doc/en/picturechange-result.png delete mode 100644 doc/en/popup-balloon.png delete mode 100644 doc/en/settings-dialog-email.png create mode 100644 doc/en/settings-dialog-emoticons-custom-add.png delete mode 100644 doc/en/sidebarbutton.png create mode 100644 po/el.po create mode 100644 po/sk.po create mode 100644 po/sr.po create mode 100644 src/chat/chatstatusbar.cpp create mode 100644 src/chat/chatstatusbar.h delete mode 100644 src/chat/chatview.ui create mode 100644 src/chat/chatwindowui.rc delete mode 100644 src/chat/contactaction.cpp delete mode 100644 src/chat/contactaction.h delete mode 100644 src/chat/contactsidebar.cpp create mode 100644 src/chat/contactswidget.cpp rename src/chat/{contactsidebar.h => contactswidget.h} (51%) create mode 100644 src/chat/contactswidget.ui delete mode 100644 src/chat/emoticonsidebar.cpp create mode 100644 src/chat/emoticonswidget.cpp rename src/chat/{emoticonsidebar.h => emoticonswidget.h} (58%) create mode 100644 src/chat/winkswidget.cpp create mode 100644 src/chat/winkswidget.h delete mode 100644 src/contact/contactlistmodelitem.cpp rename src/{network => contact}/specialgroups.h (95%) delete mode 100644 src/contactlistmodelfilter.cpp create mode 100644 src/dialogs/chathistorydialog.cpp create mode 100644 src/dialogs/chathistorydialog.h create mode 100644 src/dialogs/chathistorydialog.ui create mode 100644 src/dialogs/contactentry.cpp create mode 100644 src/dialogs/contactentry.h create mode 100644 src/dialogs/contactentry.ui create mode 100644 src/dialogs/invitedialog.cpp create mode 100644 src/dialogs/invitedialog.h create mode 100644 src/dialogs/invitedialog.ui create mode 100644 src/dialogs/listexportdialog.cpp create mode 100644 src/dialogs/listexportdialog.h create mode 100644 src/dialogs/listexportdialog.ui create mode 100644 src/kmessinterfaceui.rc rename src/{contactlistviewdelegate.cpp => kmessviewdelegate.cpp} (71%) rename src/{contactlistviewdelegate.h => kmessviewdelegate.h} (61%) rename src/{contact => model}/contactlist.cpp (56%) rename src/{contact => model}/contactlist.h (85%) create mode 100644 src/model/contactlistmodelfilter.cpp rename src/{ => model}/contactlistmodelfilter.h (94%) create mode 100644 src/model/contactlistmodelitem.cpp rename src/{contact => model}/contactlistmodelitem.h (67%) create mode 100644 src/network/extra/msnwebcamconnection.cpp create mode 100644 src/network/extra/msnwebcamconnection.h create mode 100644 src/network/msnsocketnull.cpp create mode 100644 src/network/msnsocketnull.h create mode 100644 src/network/soap/addressbookservice.cpp create mode 100644 src/network/soap/addressbookservice.h create mode 100644 src/network/soap/roamingservice.cpp create mode 100644 src/network/soap/roamingservice.h delete mode 100644 src/notification/passivepopup.cpp delete mode 100644 src/notification/passivepopup.h delete mode 100644 src/notification/passivepopupview.cpp delete mode 100644 src/notification/passivepopupview.h delete mode 100644 src/notification/passivepopupview.ui delete mode 100644 src/notification/passivepopupwidget.cpp delete mode 100644 src/notification/passivepopupwidget.h rename src/{ => notification}/systemtraywidget.cpp (82%) rename src/{ => notification}/systemtraywidget.h (91%) delete mode 100644 src/settings/alertspage.cpp delete mode 100644 src/settings/alertspage.ui create mode 100644 src/settings/contactlistpage.cpp rename src/settings/{alertspage.h => contactlistpage.h} (65%) create mode 100644 src/settings/contactlistpage.ui create mode 100644 src/utils/kmess-send/CMakeLists.txt create mode 100644 src/utils/kmess-send/kmesssendmenuitem.cpp create mode 100644 src/utils/kmess-send/kmesssendmenuitem.h create mode 100644 src/utils/kmess-send/kmesssendplugin.cpp create mode 100644 src/utils/kmess-send/kmesssendplugin.desktop create mode 100644 src/utils/kmess-send/kmesssendplugin.h delete mode 100644 src/utils/kmessdbus.xml create mode 100644 src/utils/kmessdbusadaptor.cpp create mode 100644 src/utils/kmessdbusadaptor.h create mode 100644 src/utils/kmessdbusdatatypes.cpp create mode 100644 src/utils/kmessdbusdatatypes.h create mode 100644 src/utils/likeback/likeback.cpp create mode 100644 src/utils/likeback/likeback.h create mode 100644 src/utils/likeback/likeback_p.h create mode 100644 src/utils/likeback/likebackbar.cpp create mode 100644 src/utils/likeback/likebackbar.h create mode 100644 src/utils/likeback/likebackbar.ui create mode 100644 src/utils/likeback/likebackdialog.cpp create mode 100644 src/utils/likeback/likebackdialog.h create mode 100644 src/utils/likeback/likebackdialog.ui create mode 100644 tests/old_richtextparser.cpp create mode 100644 tests/old_richtextparser.h diff --git a/AUTHORS b/AUTHORS index 28fb676..c6ca6a2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,4 +1,5 @@ -Developers: +-- Developers -- + Mike K. Bennett Michael Curtis Jan Toenjes @@ -6,48 +7,138 @@ Developers: Richard Conway Valerio Pilo Antonio Nastasi + Ruben Vandamme -Translations: - Arabic - Mohamed Aser - Youssef Chahibi - Brazilian Portuguese - Mauricio Rother - Catalan - Jaume Cornadó - Chinese (Simplified) - Lin Haoxiang - Liu Sizhuang - Chinese (Traditional) - Yen-chou Chen - Danish - Lars Sommer - Pascal d'Hermilly - Dutch - Arend van Beelen Jr. - Diederik van der Boor - Jaap Woldringh - Estonian - Jyri Toomessoo - Finnish - Markus Vuori - Joonas Niilola - Jussi Timperi - French - Choplair - Vincent Fretin - Andrea Blankenstijn - German - Jan Tönjes - Hungarian - Páder Rezsõ - Italian - David Vignoni - Valerio Pilo - Vincenzo Reale - Korean - Park Dong Cheon - Norsk Bokmal - Øyvind Sæther - Slovenian - Matjaž kaše - Spanish - Johanna Gersch - J.C.A. Javi - Alejandro Araiza Alvarado - Jaume Corbí - Christian Kaiser - Swedish - Christian Lundgren - Thai - Rachan Hongpairote - Turkish - Gorkem Cetin - Barbaros Ulutas - Uğur Çetin +-- Translations -- + Translations Maintainer: + + Panagiotis Papadopoulos + + Arabic: + + Mohamed Aser + Youssef Chahibi + + Brazilian Portuguese: + + Mauricio Rother + Leonel Freire + Maurício Arozi Moraes + + Catalan: + + Jaume Cornadó + + Chinese (Simplified): + + Lin Haoxiang + Liu Sizhuang + Cheng Yang + + Chinese (Traditional): + + Yen-chou Chen + Tryneeds-Chinese Translation Platform + + Danish: + + Lars Sommer + Pascal d'Hermilly + + Dutch: + + Arend van Beelen Jr. + Diederik van der Boor + Jaap Woldringh + Elve + Sander Pientka + + Estonian: + + Jyri Toomessoo + + Finnish: + + Markus Vuori + Joonas Niilola + Jussi Timperi + + French: + + Choplair + Vincent Fretin + Andrea Blankenstijn + Barthe Guillaume + + German: + + Jan Tönjes + Panagiotis Papadopoulos + + Greek: + + Panagiotis Papadopoulos + Dimitrios Glentadakis + + Hungarian: + + Páder Rezső + Pauli Henrik + + Italian: + + David Vignoni + Valerio Pilo + Vincenzo Reale + + Korean: + + Park Dong Cheon + + Norsk Bokmal: + + Øyvind Sæther + + Serbian: + + Zoran Milovanović + + Slovak: + + Rastislav Krupanský + + Slovenian: + + Matjaž kaše + + Spanish: + + Johanna Gersch + J.C.A. Javi + Alejandro Araiza Alvarado + Jaume Corbí + Christian Kaiser + Juan Pablo González Tognarelli + Alexis Daniel Medina Medina + + Swedish: + + Christian Lundgren + Mattias Newzella + + Thai: + + Rachan Hongpairote + + Turkish: + + Gorkem Cetin + Barbaros Ulutas + Uğur Çetin + +-- Thanks to -- -Also tranks to: Jan Tönjes - testing, documentation, web master, project management, etc @@ -84,6 +175,34 @@ Also tranks to: Damien Sandras - GnomeMeeting developer + Liu Sizhuang + - P4-Context field support + + Guido Solinas + - Pictures in contact list code + - Contact client info + - Chat font zoom + + Pedro Ferreira + - File transfer thumbnails + + Matteo Nardi <91.matteo@gmail.com> + - KWallet support + + Adam Goossens + - Notifications blocking option + - Winks disabling option + - Last message date feature + + Sjors Gielen + - IRC-like commands in the chat window + + Andrea Decorte + - Group selection in 'contact added user' dialog + + Dario Freddi + - Chat history dialog + KMerlin - Inspiration and assorted code @@ -99,29 +218,4 @@ Also tranks to: - Close-to-tray icon screenshot code Amarok - - Custom crash handler implementation - - Liu Sizhuang - - P4-Context field support - - Guido Solinas - - Pictures in contact list code - - Contact client info - - Chat font zoom - - Pedro Ferreira - - File transfer thumbnails - - Ruben Vandamme - - Basic DBus support - - Tab closing message - - Menu hiding shortcut - - Toolbars lock - - Matteo Nardi <91.matteo@gmail.com> - - KWallet support - - Adam Goossens - - Notifications blocking option - - Winks disabling option - - Last message date feature + - Custom crash handler implementation \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index f5499e6..8b5c5ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,9 +3,10 @@ PROJECT( kmess ) #### System checks #### -# To add checks, see +# To add checks, see in one or more of these paths # /usr/share/cmake/Modules # /usr/share/kde4/apps/cmake/modules +# /usr/share/apps/cmake # Check for cmake, same as minimum for KDE 4.0.0 CMAKE_MINIMUM_REQUIRED( VERSION 2.4.5 ) @@ -14,18 +15,77 @@ CMAKE_MINIMUM_REQUIRED( VERSION 2.4.5 ) FIND_PACKAGE( KDE4 REQUIRED ) # Check for libxml2 -FIND_PACKAGE( LibXml2 REQUIRED ) -MACRO_OPTIONAL_FIND_PACKAGE( LibXml2 ) -MACRO_LOG_FEATURE( LIBXML2_FOUND "LibXML2" "Libraries used to develop XML applications" "http://xmlsoft.org" FALSE "" "Required for the chat styles system." ) +FIND_PACKAGE( LibXml2 ) +MACRO_LOG_FEATURE( LIBXML2_FOUND "LibXML2" "Libraries used to develop XML-aware applications" "http://www.xmlsoft.org/" TRUE "" +" Required for the chat styles system. + * You will need this package and the matching development package: for example, 'kmess' and 'kmess-dev' or 'kmess-devel'. + * Usually the package names for this library are on Ubuntu: 'libxml2' and 'libxml2-dev', and on openSUSE: 'libxml2' and 'libxml2-devel'. + * Please refer to the KMess board for more info, and specially to this guide: http://www.kmess.org/board/viewtopic.php?t=3100" ) # Check for libxslt -FIND_PACKAGE( LibXslt REQUIRED ) -MACRO_OPTIONAL_FIND_PACKAGE( LibXslt ) -MACRO_LOG_FEATURE( LIBXSLT_FOUND "LibXSLT" "A library to transform XML files into other XML files" "http://xmlsoft.org/XSLT" FALSE "" "Required for the chat styles system." ) +FIND_PACKAGE( LibXslt ) +MACRO_LOG_FEATURE( LIBXSLT_FOUND "LibXSLT" "A library to transform XML into other formats" "http://www.xmlsoft.org/XSLT" TRUE "" +" Required for the chat styles system. + * You will need this package and the matching development package: for example, 'kmess' and 'kmess-dev' or 'kmess-devel'. + * Usually the package names for this library are on Ubuntu: 'libxslt' and 'libxslt-dev', and on openSUSE: 'libxslt' and 'libxslt-devel'. + * Please refer to the KMess board for more info, and specially to this guide: http://www.kmess.org/board/viewtopic.php?t=3100" ) + +# Check for qca2 +FIND_PACKAGE( QCA2 ) +MACRO_LOG_FEATURE( QCA2_FOUND "QCA 2" "A cryptographic library written in Qt to access various encryption methods" "http://delta.affinix.com/qca/" TRUE "" +" Required for the Windows Live Messenger login process. + * You will need this package and the matching development package: for example, 'kmess' and 'kmess-dev' or 'kmess-devel'. + * Usually the package names for this library are on Ubuntu: 'libqca2' and 'libqca2-dev', and on openSUSE: 'libqca2' and 'libqca2-devel'. + * Please refer to the KMess board for more info, and specially to this guide: http://www.kmess.org/board/viewtopic.php?t=3100" ) + +# As far as I know, it is impossible to find out if the required QCA plugin for OpenSSL is installed: +# so we need to ask QCA itself it it's got such a plugin. Pretty darned unportable stuff. +IF( QCA2_FOUND ) + IF( UNIX ) + EXECUTE_PROCESS( COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/cmake/check-qca2-ossl.sh OUTPUT_VARIABLE HAS_QCA2_OSSL_PLUGIN ) + IF( HAS_QCA2_OSSL_PLUGIN EQUAL 1 ) + SET( QCA2_OSSL_PLUGIN_FOUND TRUE ) + ELSE( HAS_QCA2_OSSL_PLUGIN EQUAL 1 ) + SET( QCA2_OSSL_PLUGIN_FOUND FALSE ) + ENDIF( HAS_QCA2_OSSL_PLUGIN EQUAL 1 ) + MACRO_LOG_FEATURE( QCA2_OSSL_PLUGIN_FOUND "QCA 2 - OpenSSL Plugin" "OpenSSL interaction library for QCA2" "http://delta.affinix.com/qca/" TRUE "" +" Required for the Windows Live Messenger login process. + * This package should have been installed along QCA2: if you have QCA2 installed + but still see this message, your distribution probably packages it separately. + Ubuntu does this; the package name is 'libqca2-plugin-ossl'. + * Please refer to the KMess forum for more info, and specially to this guide: http://www.kmess.org/board/viewtopic.php?t=3100" ) + ELSE( UNIX ) + # TODO: Find another *portable* way to detect the OSSL plugin. + MESSAGE( STATUS "NOTE: The qca2 OpenSSL can't be detected on this platform yet. Make sure you have it installed." ) + ENDIF( UNIX ) +ENDIF( QCA2_FOUND ) # Check for XScreenSaver extension MACRO_BOOL_TO_01( X11_Xscreensaver_FOUND HAVE_XSCREENSAVER ) -MACRO_LOG_FEATURE( X11_Xscreensaver_FOUND "XScreenSaver" "X11 extension used to check idle state" "" FALSE "" "Required for the auto-away feature." ) +MACRO_OPTIONAL_FIND_PACKAGE(X11) +IF( X11_FOUND ) + MACRO_LOG_FEATURE( X11_Xscreensaver_FOUND "XScreenSaver" "X11 extension used to check idle state" "" FALSE "" +" Required for the auto-away feature. + * Usually the package names for this library are on Ubuntu, 'libxss-dev' and on openSUSE, 'xorg-x11-libs'. + * Please refer to the KMess board for more info, and specially to this guide: http://www.kmess.org/board/viewtopic.php?t=3100" ) +ELSE( X11_FOUND ) + MESSAGE( STATUS "NOTE: The auto-away feature is not supported on this platform yet." ) +ENDIF( X11_FOUND ) + +# Check for libkonq +# QUIET is to fix compiling on systems like Debian Lenny, which don't have FindLibKonq.cmake +# (for an optional feature, we don't want that to be fatal) +MACRO_OPTIONAL_FIND_PACKAGE( LibKonq QUIET ) +MACRO_LOG_FEATURE( LIBKONQ_FOUND "LibKonq" "Integration with Konqueror context menu" "http://www.kde.org/" FALSE "" +" Optional context menu integration with Konqueror. + * You will need this package and the matching development package: for example, 'kmess' and 'kmess-dev' or 'kmess-devel'. + * Usually the package names for this library are on Ubuntu: 'libkonq5' and 'libkonq5-dev', and on openSUSE: 'libkonq5' and 'libkonq-devel'. + * Please refer to the KMess board for more info, and specially to this guide: http://www.kmess.org/board/viewtopic.php?t=3100" ) + + +# Display the dependency collection results +MACRO_DISPLAY_FEATURE_LOG() + #### Configure build #### @@ -42,7 +102,7 @@ INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ${LIBXM # Switch between the following two commands to force using a predefined version number # EXECUTE_PROCESS( COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/cmake/get-svn-version.sh OUTPUT_VARIABLE KMESS_VERSION ) -SET( KMESS_VERSION "2.0alpha2" ) +SET( KMESS_VERSION "2.0beta1" ) #### Define compiler flags #### @@ -50,9 +110,9 @@ SET( KMESS_VERSION "2.0alpha2" ) # Tune the debug build with even more flags # also see FindKDE4Internal.cmake for more defaults IF( CMAKE_COMPILER_IS_GNUCXX ) - # skipped: -ansi -pendantic -Wfatal-errors -Wold-style-cast + # skipped: -ansi -pendantic -Wfatal-errors -Wold-style-cast -Wconversion SET( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -Wall" ) - SET( CMAKE_CXX_FLAGS_DEBUGFULL "-O0 -g3 -fno-inline -Wall -Woverloaded-virtual -Wsign-compare -Wundef -Wconversion" ) + SET( CMAKE_CXX_FLAGS_DEBUGFULL "-O0 -g3 -fno-inline -Wall -Woverloaded-virtual -Wsign-compare -Wundef -fvisibility=default" ) ENDIF( CMAKE_COMPILER_IS_GNUCXX ) @@ -75,6 +135,9 @@ ELSE( CMAKE_BUILD_TYPE STREQUAL debugfull OR KMESS_DEBUG_OUTPUT EQUAL 1 ) ENDIF( CMAKE_BUILD_TYPE STREQUAL debugfull OR KMESS_DEBUG_OUTPUT EQUAL 1 ) +# Change symbol visibility, to obtain clearer KDE backtraces +SET( __KDE_HAVE_GCC_VISIBILITY 0 ) + # Set a default value for relocatable binary support IF( KMESS_ENABLE_BINRELOC EQUAL 1 ) SET( KMESS_ENABLE_BINRELOC "1" ) @@ -83,6 +146,12 @@ ELSE( KMESS_ENABLE_BINRELOC EQUAL 1 ) ENDIF( KMESS_ENABLE_BINRELOC EQUAL 1 ) +# Enable the experimental webcam connection if needed +IF( NOT DEFINED KMESS_ENABLE_WEBCAM ) + SET( KMESS_ENABLE_WEBCAM "0" ) +ENDIF( NOT DEFINED KMESS_ENABLE_WEBCAM ) + + # Set a default installation path IF( NOT CMAKE_INSTALL_PREFIX ) SET( CMAKE_INSTALL_PREFIX "/usr" ) diff --git a/ChangeLog b/ChangeLog index d3926b9..64377f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,1393 @@ +--- 2.0beta1 released --- + +2009-03-23 (dazjorz) + * Fixed checking if we already have an emoticon (which worked on one account, + didn't work on another - now it works fine on all accounts.) + +2009-03-23 (Valerio) + * Merged patch by Adam Goossens, fixing a crash in the direct file transfer code. + +2009-03-22 (Pano) + * Merged an updated Brazilian Portuguese translation by Maurício Arozi Moraes. + +2009-03-22 (Diederik) + * Fixed automatic reconnection. + * Implemented cmake check for libkonq. + * Improved Konqueror integration, don't show menu if KMess is not running. + Also sorted entried by display name. + +2009-03-22 (Ruben) + * Added menu plugin for Konqueror to send files using KMess. + +2009-03-22 (Valerio) + * Fixed adding to the contact list non-Messenger contacts. + * Fixed applying the emoticon style to existing chats. + * Fixed showing emoticons in the contact list tooltips. + * Added confirmation dialog when the user tries to steal the picture + of a contact. + * Added back popups and taskbar actions to the "New Message" notification event. + * Added warning message in the winks widget, shown if you have none. + * Fixed the connection dropped chat warning message. + * Added a warning message if you try to send more than 7 different emoticons, + and prevent the server from disconnecting us if that happens. + * Changed the KMess Bird alignment in the Contact List background. + +2009-03-22 (dazjorz) + * Made the timer stop when waiting for a contact to accept: Now, the contact + can take more than 30 seconds to accept before KMess automatically cancels. + * Fixed taking the correct upper value for the transfer port from the + configuration. + +2009-03-21 (Pano) + * Merged an updated Traditional Chinese translation by the Tryneeds-Chinese Translation Platform. + +2009-03-21 (Valerio) + * Fixed connecting with new empty accounts. + * Fixed changing and saving the contact list picture (and the account settings generally). + * Added back saving the last known friendly name for each account. + +2009-03-21 (dazjorz) + * Fixed the bug of a "pending" image being shown instead of the shortcut for + a blacklisted emoticon. + * Changed again some of the strings in chat.cpp. + * Merged patch by A. Decorte, which fixes localization in external + members.msn.com links. + * Fixed crash when KMess could not connect directly to a P2P client. + +2009-03-21 (sifcenter) + * Removed all "\r\n" text from sendCommand argument and put them directly on body of the function: + removed also the assert to check them. + +2009-03-20 (Pano) + * Increased the size of the users own Display Picture in the Chat window to 96x96, + so that it matches the contact ones. + +2009-03-20 (sifcenter) + * Polished a little the NS class. Polished also a bit the MsnChallengeHandler: + now the product key and id are stored in this class. + +2009-03-20 (Valerio) + * Fixed minimum size of the chat and contactlist windows. + +2009-03-19 (Pano) + * Merged an updated Hungarian translation by Pauli Henrik. + * Merged an updated German translation. + +2009-03-18 (Diederik) + * Fixed detection of aMSN. + * Fixed displaying Kopete (libmsn) as "WLM". It's faking an insanely high version number. + +2009-03-18 (Valerio) + * Fixed saving the Current Account. + * Fixed display picture updates when the users have added themselves + to the contactlist. + * Fixed hiding empty groups when the contact list contents are displayed by group. + * Merged patch by Andrea Decorte: add a tooltip to the contact's personal message/music + in the chat windows. + +2009-03-18 (Ruben) + * Fixed grammatical error in status change messages. + +2009-03-17 (Valerio) + * Improved the looks of contact tooltips in the Contact List. + * Merged patch by Sjors Gielen: new kmess text parser! It's faster, definitely more + accurate, and more readable than the old one! + * Merged patch by Sjors Gielen: add a new chat toolbutton to divide the text chatting + and drawing editors. + +2009-03-16 (Diederik) + * Fixed detection of the clientcaps for WLM 2009. + * Adding new clientcaps to the debug output. + * Fixed display of MsnObject data messages in the network window. + +2009-03-16 (Valerio) + * Fixed duplicated messages about the contact going offline. + * Fixed notifications also appearing for session messages. + * Fixed first message notification when the user sent the first message of the chat. + * Added option to show the user picture in chat, like in Messenger. + * Fixed visualization of html characters in the chat tab names. + * Added current account handle to the tab tooltip. + * Enabled by default the Search Bar. + * Made the History Box optional, and disabled by default. + * Simplified the Account saving system. + +2009-03-15 (Pano) + * Merged an updated Dutch translation by Sander Pientka. + +2009-03-15 (Diederik) + * Added detection of the clientcaps for WLM 2009. + * Updated the list of known clientcaps, with newly reverse engineered values. + * Fixed picture/emoticon/wink transfers with WLM 2009. + +2009-03-15 (Valerio) + * Contact status messages now don't cause visual notifications anymore. + * Improved the automatic resize of the user contact picture in the contact list. + +2009-03-14 (Valerio) + * Improved friendly name formatting options throughout the code. + * Added new formatting options, allowing to avoid a whole lot of html escaping calls. + * Merged patch by Adam Goossens: add an informative message when a contact in chat + goes offline, telling that the next messages will be Offline IMs. Also adds + status change messages, like the join/part ones. + * Merged patch by Adam Goossens: add an informative message when opening an offline + chat, to tell that the next messages will be Offline IMs. + * Fixed alignment of the emoticons within the Custom Emoticons page of the Account + Settings. + * Fixed the emoticon widget preview under Qt 4.5. + * Fixed enabled status of the automatic login option in the Account settings. + * Fixed contact list tooltips under Qt 4.5. + * Added the ability to spawn a context menu to all the widgets in a Contacts Frame. + * Fixed saving some chat window options. + * If the user has added him/herself, show the current user picture in the list. + +2009-03-13 (Valerio) + * Fixed showing ampersands in chat tab captions. + * When a tab which is not the current one receives a message, blink the chat window + title with that chat's title, not the current one's. + * The user's display picture on the contact list will now shrink when both the + mail and music labels are hidden, to leave less empty space. + * Merged an improved patch by Adam Goossens: add a warning label on the auto-idle + settings if KMess was built without XScreenSaver. + * Merged an improved patch by Adam Goossens: Prevent the user from deleting the + currently connected account. + * Fixed disabling emoticons from the chat window, custom emoticons were still + being shown. + * Fixed wrong HTML encoding in the text of KDE notification popups. + * Fixed incorrect repaint by dock widgets when they are moved from a side to the + top or bottom of the chat window (or viceversa). + +2009-03-12 (Ruben) + * Open chats are now regrouped when the user changes chat grouping settings. + +2009-03-12 (Diederik) + * Fixed a memory leak which happens when a SOAP error occurs. + +2009-03-12 (Valerio) + * Merged patch by Sjors Gielen: Prevent the Winks button from getting keyboard focus. + * Merged an improved patch by Sjors Gielen: Fix crash when receiving offline messages + before the contact list is available; also improves handling corner-cases. + * Fixed contact list window hiding when starting within a KDE session. + * Added an option to remove the bird from the contact list background. + +2009-03-11 (Valerio) + * Added to SOAP classes a system to transparently handle ticket token handling and + expiration. KMess is now able to request new tokens when they expire. + * Rewritten the code which reads tokens from the SOAP response to be more future-proof. + * Added handling wrong ticket token responses. + +2009-03-10 (Valerio) + * Improved the handling of endpoint URLs by all SOAP classes. + * Added centralized transparent detection of server redirections. + * Added ability for SOAP classes to accept endpoint switching suggestions from the server. + * Fixed a broken signal in MsnSwitchboardConnection. + * Merged patch by Sjors Gielen: add tooltips and "What's This?" descriptions to the chat + window's editor buttons. + +2009-03-09 (sifcenter) + * Improved the code of the WinksWidget class. + +2009-03-09 (Valerio) + * Fixed compiler error when XScreenSaver is not present. + * Added back Esc as keyboard shortcut to close the current chat tab. + +2009-03-08 (Pano) + * Merged an updated French translation by Barthe Guillaume. + +2009-03-08 (sifcenter) + * Added a very experimental support for winks sending: + - The winks are searched in winks/ directory + - Moved some code about winks from chat class to winksWidget class + * Continuing the work for the wink sending: + - Now kmess stores the stamp value of wink msn object recevied: this value is necessary to send the wink to WLM clients. + - The list of winks availables is made by searching of file .cab and correspondent .stamp file ( where is the certificate ). + - Now the list shows the image of the winks ( if there is one ). + - Note that the past received winks aren't sendable because kmess didn't store the certificates. So I think is better to + remove all content of ~/.kde/share/apps/kmess/winks/ . + - Fixed the retrieving for one wink that the user has already. + +2009-03-08 (Diederik) + * Changed chat closing behaviour, close button of the window should prompt to close all tabs (like web browsers also do). + Also made queryClose() and queryExit() public again, as these are overwritten methods from KMainWindow. + * Improved layout of the main window, added small spacing between 'Connect' button and status text. + +2009-03-07 (Valerio) + * Improved the Address Book service: added support for multiple Live services; reduced the number + of data retrieved from the server; simplified the response parsing code. + * Fixed some Account Settings bugs in font and color selection. + * Merged an improved patch by Andrea Decorte: + - Reorganized the account settings user interface. + - Added option to show the email of contacts instead of their friendly names in the contact list. + * Display the user's font size in chat messages. + * Immediately sync to disk the changes to group positions and expanded status, and to contact properties. + * Fixed order of arguments, which caused the wrong chat settings to be set. + +2009-03-07 (sifcenter) + * Improved the code of Contact Properties Dialog and fixed small issues ( the buttons weren't disabled when + there aren't item selected ). + * Cleaned the code of Passport Login Service class. + * Removed useless method in Contact class. + * Cleaned some classes in Contact directory: fixed also the showing of name of receiving wink. + +2009-03-06 (sifcenter) + * Added the ability to steal the contact pictures from Contact Properties Dialog, and use it as personal. + +2009-03-06 (Valerio) + * Fixed long-standing bug with KNotification; it will not highlight erroneously + the chat windows anymore. The notification event "Mark taskbar entry" doesn't + work anymore. Unfortunately it's a KDE bug and there's no workaround at the moment. + +2009-03-05 (Ruben) + * Fixed IP range in "File Transfers" settings. + +2009-03-03 (Pano) + * Merged an updated Brazilian Portuguese translation by Sergio Rafael Lemke. + +2009-03-03 (Valerio) + * Do not insert twice duplicate links on contacts' Copy actions. + * Fixed copiable links didn't get updated when the contact's name and PM changed. + +2009-03-02 (Pano) + * Merged an updated Dutch translation by Sander Pientka. + +2009-03-02 (Ruben) + * Don't add a newly created guestAccount to the initialView. Fixes bug where password dissappeared when connecting. + +2009-03-02 (Valerio) + * Added drag&drop support for the chat window. You can now drop contacts from + the list to invite them to the chat. + * Added a fix to SOAP error response 503 Service Unavailable. + * Added a 500 msec timeout to the LikeBack bar to prevent it from using too much + CPU. Thanks Ruben! + +2009-03-01 (sifcenter) + * Disabled the "new line" button when the user selects ink or emoticons panel. + * Fixed the format of the font in chat window. Thanks to swiftscythe. + +2009-03-01 (Valerio) + * Completed proxy support. KMess will now use the KDE proxy settings. + It's untested code: try it and tell us! + * Added initial drag&drop support on the contact list. Doing it does nothing at + the moment. + +2009-03-01 (Pano) + * Merged an updated Norsk Bokmål translation by Øyvind Sæther. + +2009-02-28 (valerio) + * Do not group followup messages if more than 10 minutes have passed between them. + +2009-02-28 (sifcenter) + * Fixed the checkbox of "Display a count of unread mail". It hadn't effect. + +2009-02-28 (Dario) + * More intelligent handling of conversation history using QObject metadata + * Adding a log converter for old logs + +2009-02-27 (Dario) + * Added a hack to make history dialog work with older timestamps + * Migrating the whole chat logging system to timestamps. This means that logs are now + standardized, and that we can control the visualization on the fly. Added 2 new options to + chat style to render seconds and date in the message timestamp. Side effect: old logs are + no longer compatible with history. + +2009-02-27 (Pano) + * Merged an updated Traditional Chinese translation by Yen-chou Chen. + * Merged an updated German translation. + +2009-02-26 (Valerio) + * Fixed logging in with new, empty, accounts. + * Added cmake variable which should help to get clearer KDE backtraces. + * Fixed sending keepalives on incoming switchboard connections. + * Fixed detection of keepalive period end. + * Only warn about connection issues when the chat is not idle. + * Merged patch by Andrea Decorte: when the user gets added by a contact, you can now add + that contact to the groups you want. + * Added option (disabled by default) to show contact join/part messages in chat. + +2009-02-25 (Valerio) + * Improved and merged a patch by Dario Freddi, continuing the work on the Chat Browser: + - Improved the UI. + - Switched the contacts list and search to a model. + - Added a caching mechanism for XML file contents. + * Updated the Italian translation. + +2009-02-24 (Valerio) + * Fixed contact list search. + * Improved chat window keyboard shortcuts. + * Added menu entries for actions "next tab" and "previous tab". + +2009-02-23 (Diederik) + * Updated NEWS file with all fixes between alpha2 and 2009-02-15. + * Updated Dutch translation, consistent 'dit account' vs 'deze account' and s/weergeef/toon/'. + +2009-02-23 (Valerio) + * Rewritten the contact list filtering code for clarity. + * Improved the contact list model: + - made the model items to move themselves; + - fixed contact list sorting: it was not being sorted initially; + - made kmess to pass the model test again. + * Merged patch by Dario Freddi, to implement the long-awaited Chat Logs browser. + * Fixed a couple compiler errors when building under KDE 4.0. + * Merged patch by Dario Freddi, to implement KDE Get Hot New Stuff. Initial support is + only working for chat styles. + +2009-02-22 (sifcenter) + * Added the ability to add one contact to more groups from Add Contact Dialog. + Removed the soap request to re-add one already blocked contact when the user move it from + removed group to Friendly List. + Now the user can choice to add one "removed contact" to initial groups. + * Fixed codec issue in group name. Thanks to Montserrat. + * Fixed the receiving of Ink over P2P connection. + +2009-02-22 (Valerio) + * Added a warning and forced the 7 characters limit when renaming emoticons with + the Custom Emoticon Settings. + * Merged a patch from Urs Wolfer: + - improved compiler compliance when the --pedantic option is on. + - improved the contact list looks by using a styled delegate, bringing us + Dolphin-like selections :) + * Merged patch by Andrea Decorte to show if you blocked a contact in its tooltip. + +2009-02-21 (Pano) + * Merged an updated German translation. + +2009-02-21 (Valerio) + * Fixed crash on chat window reactivation. + * Avoided a wrong ContactFrame warning. + * When chat windows are disabled (due to being disconnected): + - Disabled more chat-related chat window actions. + - Fixed a crash when clicking an emoticon in a dock. + - Fixed chat window title when switching between tabs. + * Prevented Account Settings from switching back to the first page on window hide&show. + * Reorganized the contact list popup menus. + * Changed the status icons. + * Added icons to the status choice menu, also made KMess to use a single status menu everywhere. + +2009-02-19 (sifcenter) + * Fixed crash when one invited user leave the SB. I don't know when precisely the bug occurs + but I know the check added is necessary to avoid it. + +2009-02-18 (Pano) + * Merged an updated Traditional Chinese translation by Yen-chou Chen. + +2009-02-16 (Pano) + * Updated the KMess Documentation + * Updated the NEWS file + * Merged new strings to the translation files + +2009-02-15 (Diederik) + * Added an updated Swedish translation by Mattias Newzella. + +2009-02-12 (sifcenter) + * Fixed an issue in chatmaster: now the participants list is checked before execute other operations. + Thanks to alexismedina to report. + * Cleaned a bit ChatWindow and MsnSwitchboardConnection classes. + * Fixed the corrupt view of context menu on right click over personal message field in CL. Thanks to pano. + +2009-02-10 (Pano) + * Merged an updated French translation by Barthe Guillaume. + * Merged an updated Traditional Chinese translation by Yen-chou Chen. + * Merged an updated German translation. + * Added Dimitrios Glentadakis to the Credits for his Greek translation. + +2009-02-10 (sifcenter) + * Improved ContactListViewDelegate class. + * Modified the system tray class: when the user is offline the kmess logo is + showed, else the status icon. + * Moved the system tray class to notification folder. + * Cleaned XAutoLock, NowListening and XmlFunctions classes. + +2009-02-09 (Valerio) + * Removed some duplicate state variables from Chat. Always query the active chat connection. + * Added a tooltip message to show whether the contact has you in its list or not. + * Fixed new custom emoticons, sometimes they could not be added. + * Fixed the emoticon blacklist, it's now able to remove all emoticons. + * Reorganized the code: moved all the model-related classes to a directory of their own, and + renamed ContactListViewDelegate to KMessViewDelegate. + * Added command-line option to keep the main window hidden at startup. + * Always add the tooltip to chat tabs. + * Improved the way the chat tabs tooltips are shown. + +2009-02-08 (sifcenter) + * Improved the ContactList Model. + * Improved a little the ContactListViewDelegate class. + * Cleaned the KMessView, ChatStatusBar, ContactFrame and ContactsWidget classes. + * Fixed adding of an exists contact. Add the support to send Privacy setting: the user + interface must yet implemented. + * Cleaned ContactListModelItem and ContactListModelFilter classes. + +2009-02-07 (Valerio) + * Fixed SOAP errors and warnings, they're now gracefully handled and you should now only get + disconnected for real issues. + +2009-02-07 (sifcenter) + * Now the tooltip of the personal message ( in the contact list ) is the PM if there is one. + * Added the support for URL PROFILE/PERSON commands. Switched to better storing method for them. + Restored the ability to send email by clicking the action menu in the CL and use the correct url + to show the personal profile. Note: for the moment URL PERSON response is useless. Ticket #59. + * Rewrited some code of address book soap class: now the list is parsed all and after that the signal + with the contact informations is emitted, added support for retrieving BLP ( privacy ) argument from + personal information. + +2009-02-07 (Pano) + * Merged an updated French translation by Barthe Guillaume. + +2009-02-06 (sifcenter) + * Fixed the "open chat" button on notitication. Now the action opens and raise correctly the window chat. + * Improved invite contact dialog. Added two buttons used for add/remove contacts and one search box. + Ticket #392. + * Improved user picture dialog code. + +2009-02-06 (Valerio) + * Fixed contact list search results, they disappeared when a contact logged in or out. + * Removed the line on top of the contact list window, it doesn't work with other + themes as well as with Oxygen, and looked ugly even then, if the menu was turned off. + +2009-02-05 (Pano) + * Merged an updated French translation by Barthe Guillaume. + * Merged an updated Greek translation by Dimitrios Glentadakis. + * Merged an updated German translation. + * Changed the appearance of the Now Playing Label. It now only shows the Song title and the Artist's name + +2009-02-05 (sifcenter) + * Added "read" email button on email notification. Ticket #393. + +2009-02-05 (Valerio) + * Improved contact list model: fixes list ordering when blocking/unblocking a contact. + +2009-02-04 (Valerio) + * Added a contact emoticon blacklist: right-click on an annoying emoticon will let you + choose to ignore it; from that contact's properties you can restore it. + * Fixed LikeBack, it is now enabled on all debug builds. + +2009-02-03 (Valerio) + * Fixed build process with the KDE 4.0 libraries. + +2009-02-02 (Pano) + * Merged an updated Spanish translation by Alexis Daniel Medina Medina. + * Added Alexis Daniel Medina Medina to the Credits. + * Merged an updated Dutch translation by Sander Pientka. + * Merged an updated French translation by Barthe Guillaume. + +2009-02-02 (Valerio) + * Fixed "view profile" pages. + +2009-02-01 (sifcenter) + * Added the support for player mpris compliant ( like Amarok2, Vlc, etc.. ). Ticket #357. + +2009-02-01 (Pano) + * Merged an updated Spanish translation by Juan Pablo González Tognarelli. + * Added a Serbian translation by Zoran Milovanović. Thanks! + * Added Zoran Milovanović to the Credits. + * Merged an updated Dutch translation by Sander Pientka. + * Merged an updated French translation by Barthe Guillaume. + +2009-01-31 (Valerio) + * Added Alt+Z keyboard shortcut to send nudges. + +2009-01-31 (Pano) + * Merged an updated Dutch translation by Sander Pientka. + * Added Sander Pientka to the Credits. + * Merged some of my improvements to the KMess documentation. + + +2009-01-31 (Diederik) + * If QCA2 is not found, cmake shouldn't annoy you about libqca2-plugin-ossl + * Did some housekeeping in the new documentation file (feature list, ohloh link, kdelibs-5 note). + +2009-01-31 (Valerio) + * Fixed saving groups. + * Added emoticons to the messages in notification popups. + +2009-01-30 (Valerio) + * Added a warning message when the configuration files are not accessible, and a workaround + to prevent debug builds of the KDE Libs from asserting when writing on read-only config files. + * Changed again the way account passwords get saved, in an attempt to stop KMess from forgetting + its passwords sometimes. + * Removed InitialView's returnPressed() signals: managing the Return key presses is now entirely + a matter for the event filter method. + * Fixed XML chat logging. + +2009-01-29 (Pano) + * Merged an updated Dutch translation by Sander Pientka. + +2009-01-29 (Valerio) + * Turned all error dialog boxen into passive KDE notifications, with additional details + on request. + * Fixed a bug when saving chats, the altered HTML was being applied to the chat window + too. Thanks a lot to DevEagle for the assistance. + +2009-01-28 (Valerio) + * Fixed the Contacts Dock's minimum size and made it to also update on PM changes. + * Fixed autologin on session restore. + * Vastly improved the Initial View. + - Added timeouts to all reconnection operations + - Improved the status label timer (multiple timed messages caused wrongly timed + label cleanups) + - Added keyboard shortcuts: pressing Enter from any widget will start the + connection attempt, pressing Esc while connecting cancels it + - Added a "Reconnect now" link when connecting + - Simplified the code in some parts + - Improved Solid integration, not having Solid installed will not cause problems + anymore. + +2009-01-27 (Valerio) + * Prevented long Personal Messages in the Contacts dock from taking all the space. + * Fixed tab names were never displayed elided. + * Changed the KMess tray icon, it's now the KMess logo. When connected, it gets overlaid with the + current status icon. + * Fixed MSN Plus tags, uppercase foreground color tags were being interpreted as background color + tags. + * Improved a bit how the emoticons are shown within text. + * Improved a tiny bit the rendering speed of the contact list. + * Fixed nudge sounds and events. + * Prevented long friendly names in the Contacts Dock from expanding the dock. + * Fixed a couple strings as suggested by Ralesk's translation. + * Merged an updated English help by Heimen Stoffels. Thanks a lot! + * Fixed cancel link was not removed when a file transfer invitation hit the timeout. + * Prevented "user is typing" messages from being sent to all active tabs. + * Don't show the chat window's tab bar when the tab grouping option is turned off. + * Fixed personal message removal, WLM2009 did not recognize it. + * Removed sound playing from the "contact status changed" event. Also removed taskbar notifications + for the contact-list-window-related events. + +2009-01-25 (sifcenter) + * Simplified systemtraywidget class. + +2009-01-24 (sifcenter) + * Added confirmation dialog when the user choose to delete one previous personal picture. + +2009-01-21 (Pano) + * Merged an updated Spanish translation by Juan Pablo González Tognarelli. + +2009-01-21 (Ruben) + * Fixed bug in autoconnect error message when the user denied access to the KDE Wallet. Reported by Pano. + +2009-01-18 (sifcenter) + * Fixed the refresh of style when the user checked the "group follow up messages" checkbox in chat + style preview. Ticket #374 + +2009-01-17 (sifcenter) + * Enhanced the code for closing the chat tabs. + * Polished a bit the ChatView class. + +2009-01-17 (Pano) + * Merged an updated Spanish translation by Juan Pablo González Tognarelli. + * Merged an updated German translation. + +2009-01-16 (sifcenter) + * Implemented "confirmation prompt" before deleting a custom emoticon. Ticket #386. + * Fixed the incorrectly closing of the chats. If chat->queryClose() isn't called + the SB remaining opened and the messages received from the contact are lost and the + logs aren't saved. + * Fixed the focus system of the chats. I hope this is the last commit about it :). + +2009-01-13 (Valerio) + * Fixed the typing messages, they were being sent when changing between tabs, too. + * Removed the work-around to avoid the dock minimum size bug, it did more harm than good. + +2009-01-12 (Pano) + * Merged an updated Simplified Chinese translation by Cheng Yang. + * Updated the AUTHORS file and translation credits + +2009-01-12 (Valerio) + * Microsoft has blocked access to the server we previously used to retrieve the contact list and + other things: we'll temporarily use their redirection server. + * Fixed drag'n'drop in the chat window's message editors. + * Fixed crash when using the close button on the chat tab tab. + +2009-01-11 (Valerio) + * Fixed the chat tab closing icon, which didn't work. + * Added back chat tab closing with middle click. + * Fixed wrong check which often made notifications not to be shown. + +2009-01-11 (Pano) + * Merged an updated Traditional Chinese translation by the Tryneeds-Chinese Translation Platform. + +2009-01-09 (Valerio) + * Completely refactored the Chat Window code. + * Fixed a small issue with custom widgets paths in the Chat Window UI file. + * Fixed detection of first received chat message. + +2009-01-07 (Diederik) + * Added a small change which could fix a crash in KMessView with disconnecting. + * Enabled popups by default in kmess.notifyrc, to use the new KDE 4.2 plasma popups. + * Add www. everwhere in the cmake output. + +2009-01-05 (sifcenter) + * Added the basic support to retrieve the information about user profile from roaming service. + For the moment the code is commented, but the retrive of pm, nickname and picture location seems work. + +2009-01-03 (Diederik) + * Fixed foling@home being parsed as e-mail address. + +2009-01-03 (Ruben) + * UserPicturesDialog now uses KDialog. + +2009-01-03 (sifcenter) + * Cleaned a little bit the Contact class. + +2009-01-02 (Pano) + * Changed another bunch of strings, to ensure compliance with the KDE Human Interface Guidelines. + +2009-01-02 (Ruben) + * Start browsing for a display picture at the location where the user selected the current one. + +2009-01-01 (Diederik) + * fix remove group message, space was missing. + * improved ordering of menu items in the 'action' menu. + +2008-12-29 (Pano) + * Merged an updated Hungarian translation by Pauli Henrik. + +2008-12-25 (Ruben) + * Add EventFilter to the emoticon widgets. + * Don't return to the message editor when the user uses a shortcut. + +2008-12-22 (Pano) + * Changed a couple of strings, to make them more logical and to ensure compliance with the KDE Human Interface Guidelines. + +2008-12-21 (Pano) + * Merged an updated Spanish translation by Juan Pablo González Tognarelli. + +2008-12-21 (Ruben) + * Enabling an emoticon Dock now hides the corresponding Widget when it was open. + * Renamed setEmoticonButtonVisibility to setEmoticonWidgetVisibility to better cover its new content. + * Fixed MSN Plus! formatting of nickname when receiving an ink. + +2008-12-20 (Ruben) + * Escape keypress in chat window first closes the open widget now (if any), before the tab itself is closed. + +2008-12-20 (sifcenter) + * Fixed the detaching of emoticon bar in chat window and the crash while closing one tab. The function causes the crash was: + chatFrame_->removeWidget( chat ), for the moment is commented. + * Improved some code in chat view/window. + +2008-12-17 (Pano) + * Fixed some strings (and updated all translation files). + * Merged an updated German translation. + +2008-12-17 (Valerio) + * Fixed remembering the spelling check option in the chat window. + * Improved the logic behind chat tab deletion, removed two useless methods. + * Improved the mechanism which allows the message editor to always keep focus. + * Improved a bit the password storage code. + * Improved a bit the chat window management code. + +2008-12-16 (Valerio) + * Enabled enhanced rendering hints on the contact list view: the emoticons are now + resized nicely. + +2008-12-15 (Valerio) + * Removed the custom KMess popup balloons. + - We'll use the KDE ones; + - The Account Settings page Alerts has been emptied from all popup-related settings; + - The place for popup & notification configuration will be the KMess Configuration + dialog from now on; + - Custom contact sounds do not work anymore, they'll be reimplemented later. + +2008-12-14 (Valerio) + * Fixed disconnection from switchboard server not triggering the "contact left chat" + mechanism. + * Added a chat warning when the connection to the switchboard server goes unexpectedly + down. + * Fixed wrong interpretation of NAK messages; also added a chat warning when a message + could not be delivered to some or all contacts. + * Fixed forced reconnection when the session is restored. + +2008-12-13 (sifcenter) + * Fixed the layout for emoticon setting page. Thanks to pano. + * Fixed duplicate items when the user click on the "edit note" from the chat. Thanks to elpreto. + +2008-12-12 (Valerio) + * Implemented internal chat logging. This feature internally stores (within the + config directory) your conversations in a computer-friendly format. This will + allow us to add some nifty features in the future, like a chat log browser! + If you want, you can still tell KMess to still save your chat logs in a + directory of your choice in HTML or text format, to be able to view chat logs + even if KMess is not running. + * Fixed the last compiler warnings. + * Improved the way KMess reports having received unknown datacast messages. + +2008-12-12 (Pano) + * Merged an updated Spanish translation by Juan Pablo González Tognarelli. + * Merged an updated French translation by Barthe Guillaume. + * Merged an updated German translation. + * Added Barthe Guillaume to the credits and the AUTHORS file. + +2008-12-11 (sifcenter) + * Polished emoticon manager class and use QHash instead of QMap where possible. + +2008-12-10 (Valerio) + * Fixed crash when disconnecting. + * Inserted LikeBack into KMess, to make it easy for testers to report bugs. + Devs, please contact me for the boring technical details & instructions :) + * Fixed received offline messages being treated as outgoing messages: this caused + new chat windows to appear instead of lying in the task bar. + +2008-12-09 (Diederik) + * Fixed a small error in history combobox for Dutch translations. + +2008-12-09 (sifcenter) + * Improved a little some methods in chat class. + * Added the ability to start a private chat with a contact is in multi chat. Ticket #230. + +2008-12-09 (Valerio) + * Got rid of the little AdBlock icons in the chat windows. + * Fixed switching tabs causing the chat log to scroll up a bit. + +2008-12-08 (Valerio) + * Fixed issue with Offline Messages; if many OIMs were received at login, they all appeared + as having been sent by one of the senders. + * Removed the Account Settings menu in the contact list window: there now is an action to show + the settings for the current account, if one is connected. You can still access the other + accounts' configuration via the "Configure KMess..." action. + * Fixed emoticon buttons visibility when new tabs are added. + * Fixed saving groups order. + +2008-12-07 (sifcenter) + * Don't block the contact if the user click on the cancel button in the dialog that appears when + one contact add the user. + * Added the support for the special contact for example alice.it users and also added the ability to + store extra information into qhash in contact class. + * Removed the actions move and remove from group for the contacts when the list display mode is "by group" + or when it is "mixed" and the contact is offline. They caused wrong soap request. + +2008-12-07 (Valerio) + * Added options to add or block invited contacts in chat. The contacts dock will also be + now updated when you add or remove a contact from your list. + +2008-12-06 (Pano) + * Merged an updated Spanish translation by Juan Pablo González Tognarelli. + +2008-12-06 (Valerio) + * Added two new Docks to always have your emoticons at hand. + * Changed the switchboard signal to report sending failure to report the entire original + message, so that the chat can show a proper error notification. + * Rewritten the method which reestablishes closed chats for additional readability. + * Rewritten the KDE notifications, they now have buttons to allow interacting with the popup. + * Fixed regression: the Connect and Account Settings menus work again now. + * Added confirmation dialogs which will appear when the menu bar gets hidden. + * Fixed the circle position in the screenshot of the dialog shown when closing the Contact + List to tray. + * Fixed typo resulting in seeing the 'contact left' messages in 1-on-1 chats, too. + +2008-12-05 (Valerio) + * Implemented KDE session saving and restoring. KMess now remembers if you were connected, + and with which account. You need to have a saved password for this to succeed! + +2008-12-03 (Valerio) + * Fixed a lot of compiler warnings. + +2008-12-03 (Pano) + * Merged an updated Traditional Chinese translation by Yen-chou Chen. + +2008-12-03 (Valerio) + * Improved the Chat Window menus and enabled the Find dialog. + +2008-12-02 (Pano) + * Changed a couple of strings, to ensure compliance with the KDE Human Interface Guidelines + +2008-12-01 (sifcenter) + * Improved the blinking of chat in taskbar. + * Added a tab-close button like konqueror. + * Removed useless method from ChatWindow class. + +2008-11-30 (Valerio) + * Added a menu option in the contact list window to show the right-click context menu for the + selected list item. + * Revised reporting of message sending failure and unified the displayed error message. + * Fixed the KDE contact status notifications, they were not shown if the popup balloon was + disabled. + * Improved with Pano some ugly strings. + * Changed place to a couple of actions in the contact list menu. + * Increased the interval between automessages to two minutes. + * Fixed a freeze when sending or receiving invitations; vastly increased the speed and + accuracy of the long words filter. + * Moved and renamed the Contact List Search bar to the View Menu. + * Added the group options in the contact list context menu for contacts in the Offline + and Online groups. + +2008-11-29 (Diederik) + * Improved invoking e-mail and webbrowser. + - using KToolInvocation class with invokeBrowser() / invokeMailer() methods. + - make sure command arguments are escaped. + - make sure mailto addresses are opened through openEmailCommand() instead of openBrowser() + +2008-11-29 (sifcenter) + * Removed close button from tabs in chat window ( it's too easy to hit accidentally and the some text + gone over the button ). + +2008-11-29 (Valerio) + * Improved long words cutting; now the code excludes HTML tag contents so clicking long links, + like links to eBay auctions, will always work. + * Improved the UI strings of the chat logging settings page. + * Added a bit more security to the chat logs by settings the permissions to 600 (user read&write + only, no access to anyone else). + * Added the Nudge event to the KNotify event list. It has the KDE default nudge sound, for now. + * Added a tool tip for the chat's tabs. It currently shows who's in chat, their status, and when + the chat was started. + +2008-11-28 (Valerio) + * Improved file drag'n'drop operations. Now we can send files dropped from Nepomuk searches, Places + and whatnot. Also, we can now directly drop a file from the Internet and have it sent via MSN, + should this ever need to anyone ;) + * Added a workaround for very long words; they're now cut down to pieces, to avoid KMess showing + the horizontal scroll bar. Any saved chat will have the string uncut. + * Fixed the appearance of the Individuals group; it now also shows the number of online contacts + like user groups. + * Removed the timeout for the automatic reconnection: if Solid detects you're online, the + reconnection starts immediately. There's no maximum limit of retries, it may try indefinitely. + This may be changed later.. + * Improved the chat logging system. + - You can now choose the format in which the chats will be saved (HTML,XML,text are currently + supported). + - You can also manually save the chat in all supported formats. + - The chat logging settings dialog has been redesigned. + * Increased the auto scroll down threshold, it was too easy for a chat to stop scrolling due to a + big emoticon. + +2008-11-27 (Valerio) + * Fixed login for MSN.com accounts (address@msn.com). + * Fixed the name of the contacts dock action; it didn't change correctly. + * Fixed fast retype. + * Improved the chat's auto-scroll code: + - its code and logic are simpler + - the auto-scroll didn't work all the times, now it does + - if you're looking back in the chat history, new messages won't get you back on the bottom + - pressing pageup/down now manually scrolls up and down the history; add shift to scroll faster + * Merged a patch by Finrold to improve the KNotify notification messages. + * Added discarding notification events incoming from the active chat in the active window. + +2008-11-25 (Valerio) + * Simplified chat style management; fixed chat clearing when changing style; fixed weird crashes when + chats were opened. + * Added some checks to avoid chatting or using applications with yourself. + +2008-11-23 (Valerio) + * Moved all the message processing in ChatView to ChatMessageView. + * Improved the message processing, decoupled the chat history from the actual view: it's + now possible to clear the chat view. + +2008-11-23 (sifcenter) + * Modified the chatwindow style: now also only one chat has a tab into chatwindow. Removed PM from contactframe and added to tab icon + the status of the contact. Now the color of the tab text is red if there are unreaded messages. Removed friendlyname and status icon from + the contacframe if it's a single chat. + * Fixed the restore chat window geometry. + +2008-11-22 (sifcenter) + * Re-added tooltip in emoticon box. + +2008-11-22 (Valerio) + * Fixed a crash at login. + +2008-11-19 (Pano) + * Merged an updated Traditional Chinese translation by Yen-chou Chen. + * Merged an updated Greek translation. + * Merged an updated German translation. + +2008-11-19 (Valerio) + * Implemented parsing of server errors with payloads. Reorganized error code handling. Also added payloads + dumping, when server command debugging is enabled. + * Moved all generic error detection and parsing from MsnNotificationConnection to MsnConnection. + Connection-specific error handling is still done by the child classes. + * Fixed and improved the regex for Plus! color tag removal. + +2008-11-19 (Ruben) + * Fixed bug in re-enabling newline button after selecting a emoticon. Thanks to mark-h for reporting. + * Fixed grammatical error in an error message. + * Fixed MSN Plus! formatting of nickname of the user when sending an ink. + +2008-11-15 (Valerio) + * Fixed encoding bug in developer builds, causing a crash when receiving P2P data due to a conflict + with Qt internal mechanisms. + +2008-11-15 (sifcenter) + * Fixed the issue when in the contact list there is "messenger@microsoft.com" contact. The contact shouldn't be + exist. + * Fixed the issue with disappearing of widgets ( contact image and emoticons ) when user closes a tab: removed one call to + slotSwitchTab because setCurrentIndex method calls it automatically. Also removed one useless connect. + +---- till here -- + +2008-11-14 (Pano) + * Merged an updated Greek translation. + * Fixed a typo in the emoticon titles. + * Added Panagiotis Papadopoulos to the credits and AUTHORS file, for the Greek translation. + +2008-11-13 (Pano) + * Merged an updated Brazilian Portuguese translation by Leonel Freire. + * Merged an updated Greek translation. + +2008-11-11 (Pano) + * Fixed some wrong UI strings + * Added a Greek translation by Panagiotis Papadopoulos + +2008-11-11 (Valerio) + * Fixed connecting with saved accounts without a stored password. + +2008-11-09 (Valerio) + * Added support for plain text passwords when a KDE Wallet is not available. + * Fixed using the Connect menu to connect with accounts with no saved password. + * Fixed incorrect deletion of MSN Plus formatting codes when the relevant option is disabled. + +2008-11-09 (Pano) + * Merged an updated Spanish translation by Juan Pablo González Tognarelli. + * Added Leonel Freire to the Credits + +2008-11-08 (Pano) + * Merged an updated Brazilian Portuguese translation by Leonel Freire. + * Merged an updated German translation. + +2008-11-08 (Valerio) + * Fixed disconnecting due to missed pings. + +2008-11-07 (Pano) + * Merged an updated German translation. + +2008-11-07 (sifcenter) + * Added the support for timestamp in the soap addressbook class. + * Added one frame to emoticon widget to preview the emoticon. + +2008-11-07 (Valerio) + * Renamed the Contact Sidebar to Contacts Widget and the Emoticon Sidebar to Emoticons Widget. + * Replaced the obsolete Sidebar with a fancy Dock Widget. + * Improved the behavior and looks of the Contacts Dock Widget. + +2008-11-06 (sifcenter) + * Fixed the issue with resizing of chatwindow and emoticons list. Thanks to Pano for reporting. + * Fixed the issue with encoding of title in taskbar while chatwindow blinking. Thanks to Pano again. + +2008-11-06 (Pano) + * Merged an updated Italian translation by Valerio Pilo. + * Merged an updated German translation by Panagiotis Papadopoulos. + +2008-11-06 (Valerio) + * Rewritten all SOAP classes to use QNetworkAccessManager. + * Fixed the encoding problems in friendly names. + * Fixed groups tooltip, and removed the count of online contacts for empty groups, which made no sense. + * Merged an updated Spanish translation, by Juan Pablo González Tognarelli. + * Added right-click option for email addresses shown in chat to add that contact to the contact list. Thanks Ruben! + +2008-11-04 (Diederik) + * Removed the use of "expr" in the check-qca2-ossl.sh script + +2008-11-03 (Valerio) + * Fixed some wrong UI strings. Thanks to Panagiotis Papadopoulos and elpreto. + * Fixed quotes in file transfers accept/reject links, they could be translated and could get broken during + translation process. + +2008-11-03 (sifcenter) + * Improved performance for EmoticonSidebar: create the informative label only if is a custom theme and only + if is necessary. + +2008-11-02 (Diederik) + * Fixed P2P invitations with Windows Live Messenger 2009. + * Added "Windows Media Center" to the list of known clients. + +2008-11-02 (sifcenter) + * Moved emoticons list from sidebar to the same space of the message box. + * Removed old emoticon button from chatwindow. + * Completed the commit 3845 and polished the identation of msnnotificationconnection + * Fixed the MSNP15: when the user was added from contact no message showed. Thanks to finrold for report. + +2008-11-02 (Valerio) + * Fixed a crash when disconnecting. + * Applied a lot of i18n and UI improvements suggested by Henrik Pauli and Panagiotis Papadopoulos. + * Merged an updated Hungarian translation by Henrik Pauli. + * Merged an updated German translation by Panagiotis Papadopoulos. + * Updated the translation files. + * Switched order of the artist and track title in Now Listening information. + * Reduced the minimum size of the message editor in chat windows. + +2008-11-01 (sifcenter) + * Unblocked the ability to open switchboard while the user is invisible. Anyway we should rewrite some part + to implement fine the support of offline chats. For example we should see for CAL response to decide if + the remote client is online or not and if we can begin a offline chat. + * Fixed the issue with msnp15, one user can't be in allowed and blocked list at the same time. Thanks to J.P. + * Use QCryptographicHash instead to KCodecs for calculate md5 hash and switched from KCodecs fromBase64 method to + fromBase64 method of QByteArray. + * Fixed Offline messages sender. + * Added the ability to retrieve the personal friendlyname from AddressBook. + * Finally merged the msnp15, now is the only kmess protocol. + * Fixed the PRP command for unverified accounts. + +2008-10-31 (sifcenter) + * Added the invite dialog. + +2008-10-26 (sifcenter) + * Improved transfer window. Now is possible to show/hide download/upload entries. + * Switched the action for left mouse click on the contact picture ( in chat ) from "show profile" to "show menu" + and added the glow effect. + +2008-10-24 (sifcenter) + * Added "list" option to runtest argument. + * Added close button to search frame. + +2008-10-24 (Valerio) + * Do not update the contact list window title when there is no friendly name. + * Fixed account duplication when adding the first emoticon from the emoticon sidebar. + * Fixed status bar visibility not being correctly reapplied when restarting. + * Merged an updated Slovak translation by Rastislav Krupanský. + * Merged an updated Traditional Chinese translation by Yen-chou Chen. + +2008-10-15 (Ruben) + * Don't hide displaypicture in a small initialview. + +2008-10-13 (Diederik) + * Textual changes in the cmake checks. + * Fix syntax errors in cmake check for QCA2-openSSL, it shouldn't include the ${expansion} tokens. + * Fixed inconsistency with notation of 'e-mail' vs 'email'. Use 'email' now which is used by other KDE apps too. + * Fix compiling issue with win32, hide unix checks for non-unix platforms. + * Fix compiling issue with mingw32-g++, added workarrounds for compiler bug "extraneour `char' ignored" message. + +2008-10-12 (Valerio) + * Delete HTTP requests when done with them. Should avoid KMess from sucking hundreds of MBs of RAM. + +2008-10-10 (Ruben) + * Fixed MSN Plus! formatting of nickname in "away auto-replies" of the user. + +2008-10-09 (Ruben) + * Send invalid commands with more than one '/' as they are very likely to be a file path. + +2008-10-08 (Ruben) + * Improved statusbar of ChatWindow: + - Typing message with keyboard icon. + - "Disconnected" message with "Reconnect" button. + +2008-10-08 (Valerio) + * Rewritten the HTTP connection class to use QNetworkAccessManager. + +2008-10-07 (Valerio) + * Added a nice workaround for the problem of non displayed contacts within groups at login. + +2008-10-06 (Valerio) + * Fixed missed return to TCP connections after disconnecting from an HTTP session. + * Added a warning about KMess needing a restart after the protocol version is changed. + +2008-10-05 (Ruben) + * Improved crash handler. + +2008-10-05 (Valerio) + * Little improvement on the build process: when building in release mode, exclude the testing + class. + * Added a new debugging facility: read a connection's data from a saved KMess log, and fake + connecting with it. See MsnSocketNull for details. + * Switched by default to MSNP15, but a checkbox in the Global settings allows you to continue + using the old MSNP12 connection. For a while. + * The Now Listening icon in chat is no more grayed out when the chat connection is closed. + * Fixed adding back to the list a contact who is in the Allowed or Removed group. + * Heavily improved the packages detection at CMake stage, now everything is detected *and* + you also get a nice summary at the end of it. + +2008-10-03 (Valerio) + * Continued the simplification work on the contact list code, a lot of unnecessary calls are + now avoided, this may fix the crash on start. + +2008-10-02 (Valerio) + * Fixed emoticons in contact list, they were not shown if MSN Plus formatting was disabled. + * Changed a bit of the contact list code, it may fix the crashes on start. + +2008-10-01 (Valerio) + * Rewritten most of the Contact List Model. Contacts not in a group are now put together in the + Individuals group, instead of the root node. Performance should be vastly improved, and perfectly + stable, too.. Let's hope this time it will work :) + * Added a Quit button to the possible chatwindow toolbar actions. + * Added another good bit of simplification to the Contact List view code. + * Fixed offline contacts were always shown in the Individuals group. + * Enabled back the status icon when the chat becomes idle. + * Fixed layouting issue in the Classic Compact chat style. Thanks to Ralesk for the patch! + * Increased the timeout for automatic disconnection. It won't work at 15 secs under certain network + conditions. + +2008-09-30 (Valerio) + * Moved SpecialGroups away from the Network folder to the Contact one. + +2008-09-28 (Valerio) + * More improvements to the Contact List model code. They should fix: status sorting, group ordering, + incorrect visual updates, a crash randomly occurring, and a crash when exiting. + They also simplify a bit the code and the role of the roles (no pun intended :P). + * Fixed double error box when adding a non-existing contact to the list. + * Merged an updated Hungarian translation and many little translations improvements by Henrik Pauli. + * Merged an updated Slovak translation by Rastislav Krupanský. + * Added two missing return statements which made it possible for guest accounts to be remembered anyways. + * Added remembering the status of the contact list search bar when logging in/out. + * Added a little workaround to avoid crashing on close. + +2008-09-26 (Ruben) + * Fixed remembering spell checker setting in the chat window. Bug reported by elpreto. + +2008-09-24 (Ruben) + * Show original "alternative name" in Contact Properties instead of a cleaned version. + * Use ContactBase class in internal ContactJoined, ContactLeft, ContactTyping and Nudge signals/methods. + +2008-09-23 (Ruben) + * Don't show number in chat when changing tabs using Alt[0-9]. + +2008-09-20 (Valerio) + * Fixed regression which removed the focus from the message editor when switching between chats. + * Fixed wrong strings in a couple of UI files, and a couple typos too. + * Updated with current strings the main translation file and the various localization files. + * Updated Italian translation. + +2008-09-19 (Ruben) + * Another small fix to prevent MSN Plus! markup tags from appearing. + +2008-09-19 (Valerio) + * Improved user feedback when getting disconnected while chats are still open: you now + get a message in each chat about why the chat is not active anymore; and the + visual cues in the contact frame are more clear, too. + * Removed disabling chat window toolbuttons when the chat is offline, it was confusing. + * Made non-reactivable chats to close. + * Simplified a bit the signal passing between Chat and ChatWindow. + * Added Alt+number keyboard shortcut to switch between tabs in the chat window. + * Added Enter keyboard shortcut to open new chats in the contact list. + * Fixed a possible infinite recursion issue due to an unchecked focus change event. + * Updated spanish translation, by Juan Pablo González Tognarelli. + +2008-09-18 (Ruben) + * MSNP15: When connection, send original friendlyName instead of a cleaned version. + +2008-09-18 (Valerio) + * Fixed issue with InitialView when displaying long text in the status label. + * Improved status messages management within InitialView. + * Fixed login with msn.com accounts, like kmess@msn.com. + +2008-09-17 (Ruben) + * Don't show MSN Plus! markup tags in "joined the chat" messages. + +2008-09-17 (Valerio) + * Improved the Contact List model: + - Fixed many subtle model management issues. + - Fixed contacts sorting in the list. + - Improved a bit the overall performance and loading time. + * Fixed the right-click option to chat with a non-friend, blocked or offline contact. + +2008-09-16 (Valerio) + * Quickly fixed a compiler error with KDE 4.0.5, as reported by sifcenter. + +2008-09-15 (Valerio) + * Fixed a crash when receiving MSN Plus! predefined messages. + * Fixed the switch to another server did not reset the initiating connection status. + +2008-09-14 (Ruben) + * Fixed appearance of html-ish in status and chat notifications. + +2008-09-12 (Valerio) + * Improved a bit the way the chat windows settings are saved, to try fix positioning issues (as reported at the board). + * Fixed contact list search option being still checked after disconnecting. + * Added Slovak translation, by Rastislav Krupanský. + +2008-09-11 (Valerio) + * Rewritten the initial view's user interface. Added two links to create new accounts and to recover lost passwords. + It isn't ridicolously tall anymore and has a maximum width to avoid that ugly effect on window maximization. + * Made SVG versions of the common KMess logos, and replaced all PNGs with ones rendered from the new SVGs. + * Improved the connection process, now server transfers are handled more gracefully, and the switch to HTTP is not + attempted when a sensible error is received from the server while logging in. + +2008-09-11 (sifcenter) + * Fixed small issue ( widget enabling ) in initial view. + * Removed some useless code: double setEnabled(false) were present in InitialView::slotConnectionClicked() + and InitialView::startedConnecting(..) called by KMess::connectWithAccount(..). Also switchViewToInitialScreen() was + useless because when KMess::connectWithAccount(..) is called we are already stay in initial view. + +2008-09-10 (Ruben) + * Fixed 100% CPU during reconnection timeout. + * Increased kmessinterfaceui.rc version number to have it merged with the file of the user. + +2008-09-10 (Valerio) + * Merged Spanish translation by Juan Pablo González Tognarelli. + * Fixed not working HTTP fallback when the MSN server disconnects too early. + * Fixed switchboards with HTTP connections; they were trying the standard TCP + connection anyways. + +2008-09-09 (Diederik) + * Improved wink error messages, differentiate between cabextract "not found" or "failed". + Also capture stderr output from cabextract. + * Fixed a crash with receiving files with the msnftp protocol. + Since Qt 4, QTcpServer deletes the QTcpSocket when it's deleted, because it's a qobject child. + * Fixed displaying the filename for sending files over MSNFTP. + * Make sure sending files happens over P2P again by default (fix debugging test). + +2008-09-09 (Valerio) + * Added a 'Close All Tabs' button to the Network Window. + * Moved the htmlEscape and htmlUnescape methods from Emoticon to KMessShared. + * Changed the htmlEscape and htmlUnescape methods to make them return the modified string, and + changed their calls with regard to this new feature. + * Fixed the way HTML entities are displayed on the chat tabs, and improved the related code. + * Fixed chat window creation and first appearance. A little empty window previously flashed onscreen before the + actual chat was created, due to some incorrectly ordered calls. + * Fixed typing messages not disappearing sometimes, when receiving a message. Also improved its behavior when a + contact changes friendly name. + * Changed the Now Listening icon displayed on chat windows to one which will for sure exist on any box with KDE4. + +2008-09-09 (sifcenter) + * Added the basic dialog for contact list export. For the moment only csv and xml formats are supported. + * Added erase brush to ink view. + * Fixed issue with contact list model. Now we don't check for parent. + * Added some messages to winks receiving. + +2008-09-08 (sifcenter) + * Fixed issue when the user has a very long contact list ( ADL command bug ). Thanks to Bugra ( Montserrat ). + * Fixed some issues with chatwindow focus. I hope this is the last time! =). + +2008-09-08 (Valerio) + * Implemented a "Null Socket" to test KMess while being offline and/or to avoid being banned ;) + * Fixed Now Listening support for Amarok 2. + +2008-09-07 (Diederik) + * Another obstacle conquered, the remote client is sending webcam frames to us! + KMess does not really notice it yet, but ethereal reveals that things are working. + +2008-09-07 (sifcenter) + * MSNP15: Switched the http endpoint to https in AddressBook class. Also fixed the maxium number of contacts for each ADL command + and added 241 error to list. + * MSNP15: Added UBN command. For the moment useless. + * Fixed one issue with list model. It was impossible to click on the contacts present in any groups. + +2008-09-05 (Valerio) + * Improved the initial login timer: it won't surrender anymore after some minutes, but it will if the server + sends no commands for more than 15 seconds. This value is easily adjustable in case it's needed. Of course, after + the login is complete, the 30-second ping replaces the login timer. + +2008-09-04 (Valerio) + * Fixed newly created empty groups did not appear if "Show Empty Groups" option was off: they now are always visible. + Groups with contacts, all of which are offline, are still hidden with that option active. + * Merged an updated Dutch translation by Elve. + * Improved "Close all tabs" chat menu action: don't remove it, just disable it so users know it's there. + * Improved the fix to the QSortFilterProxyModel crash: added more tests to thoroughly verify that the incoming index + is not corrupted. + * Fixed bug which made reconnection after unwanted disconnection impossible to cancel. + +2008-09-03 (Valerio) + * Added some more debugging output and a possible fix for the #330 ticket (wrong chat reactivation). + * Fixed group expansion when searching. + +2008-09-02 (Valerio) + * Fixed not saving passwords when the 'save password' account option is off. + * Fixed changing emoticon theme did not update the emoticons already displayed in the chat windows. + +2008-09-01 (Valerio) + * Added a first fix for the chat window focus issues. + * Fixed old-style (i.e. not P2P) file transfers. + * Fixed disconnection when ignoring "contact added you" dialogs. + * Fixed case of the first typed character when you start typing while drawing. + * Fixed selecting a status before connection completion was causing a disconnection. + * Require a double-click to select and edit an account's settings in the Accounts Manager. + * Improved the resetting process of the Initial View to help avoid corner cases. + +2008-08-31 (Ruben) + * Removed unneeded define in msnstatus.h + +2008-08-31 (Diederik) + * Small code cleanup, updated the merged patch to coding standards and removed the unneeded isIdleForced parameter. + * Next step in webcam support, KMess is able to receive the XML tag. + * Avoid displaying the same 'contact left' chat notification twice for the same contact, if there no conversation is helt in between. + +2008-08-23 (Valerio) + * Merged patch by dazjorz, improving the text commands ("/me","/status") feature. + Changed stuff: + - improved and simplified code quality; + - fixed the command output duplication bug; + - added a "/back" alias; + - added ability to set an away auto-message with "/away". + +2008-08-18 (Valerio) + * Fixed auto-reconnect for account without a saved password. + * Added timing-out labels and some informative messages to the Initial View. + +2008-08-17 (Ruben) + * More use of KXmlGuiWindow in the ContactList. + * Fixed typo which made "Show Empty Groups" disappear. + +2008-08-16 (Diederik) + * Add cmake command to the 'Makefile' generated by ./configure + * Merged patch by dazjorz, add /me and /status commands. + +2008-08-15 (sifcenter) + * MSNP15: added clearRequestData method at AB class. Ticket #315. + * Removed the ability, in contact properties dialog, to add/move user to/from group if it isn't in FL. + +2008-08-14 (Ruben) + * Scrolling the mousewheel over the displayPicture in the InitialView now switches account. + +2008-08-14 (Diederik) + * Made KMess a bit more verbose when switching to the HTTP connection type. + +2008-08-13 (sifcenter) + * MSNP15: incremented performance. + +2008-08-13 (Ruben) + * Ported Contactlist to KXmlGuiWindow. + * Fixed disappeared Cut,Copy,Paste in ChatWindow + * Removed unneeded include in ChatWindow + +2008-08-13 (Diederik) + * First steps to implement webcam support. not working, and still experimental: + - Use cmake -D KMESS_ENABLE_WEBCAM=1 to test it. + - implement invite button in the chat window. + - changes to to make inserting utf16 strings easier. + - add special casing in the base p2p class to handle webcam negotiation data. + - make sendP2PMessage() accessable for derived classes, needed for webcam. + - add data size verification check for p2p messages. + - updated the network window to display the webcam negotiation packets properly. + +2008-08-12 (Diederik) + * Applied patch by dazjorz, implementing IRC-like commands in the chat window (/away, etc..) + +2008-08-12 (Ruben) + * Prevent display of "Jan 1th 1970" in Last Seen and Last Message + * Fixed Chat-menu workaround in ChatWindow + * Fixed typo in MsnNotificationConnectionP15 + +2008-08-12 (sifcenter) + * MSNP15: added support for ADL payload. + * MSNP15: added to CL also the contacts are not present in AB. + * MSNP15: added support for re-added one contact from "removed" group to FL list. + * MSNP15: rewrited some code to manage removing of one contact. + * MSNP15: fixed small issue with initial adl command. + * Removed the italic on the contact hasn't us in its CL and use one transparent red line. + +2008-08-11 (Diederik) + * Reverted hiding translator names in the about data, some translations require names to be translated (e.g. for special characters). + * Make sure the 'disable winks' setting is read properly as well, and enabled by default. + +2008-08-11 (Ruben) + * Ported Chatwindow to KXmlGuiWindow. + * Renamed and reworked Initmenu functions in ChatWindow. + +2008-08-11 (Valerio) + * Removed the useless Rich Text parser debugging from the default debug output. + * Removed a whole lot of useless debug output which no one ever cares about. + * Fixed connecting manually after canceling a reconnection. + * Fixed the (hopefully) last model crash. + +2008-08-11 (sifcenter) + * Added the ability to prevent the adding of one contact that already exists in contact list. + * MSNP15: fixed possible issue with different architectures. + * MSNP15: better code for block, unblock, allow contact. + * MSNP15: update the code for passport, oim and email/profile view. Also added qhash for tokens for each requested domain. + * MSNP15: cleaned code from addressbook services class. + +2008-08-10 (Ruben) + * Display picture is now clickable when offline. + +2008-08-10 (Valerio) + * Implemented automatic reconnection. Also improved some error reporting. + * Fixed the login view blocking on connection when the connection fails. + * Added a method to completely delete a contact from the contact list. + +2008-08-10 (sifcenter) + * Added initial support to msnp15. To active the experimental support use -DKMESS_ENABLE_MSNP15=1 cmake option. + By default this feature is off. + * MSNP15: added the ability to add a contact to AddressBook. + * MSNP15: added the ability to remove a contact from AddressBook. + * MSNP15: added the ability to remove a group. + * MSNP15: added the ability to rename a group. + * MSNP15: added the ability to add a group. + * MSNP15: added the ability to add/move/remove contact from/to group. + * MSNP15: added the ability to add new contact and put directly it into one group. + --- 2.0alpha2 released --- 2008-08-09 (Valerio) @@ -111,7 +1500,7 @@ 2008-07-13 (sifcenter) * Fixed the new line button signal on chat window. - * Cleaned the header include files on the classes in + * Cleaned the header include files on the classes in - Dialog folder - Utils folder - Notification folder @@ -299,7 +1688,7 @@ to Mouse Enter to give feedback of "clickable item" to user. * Reorganized the contact properties dialog and removed the line edit for alternative picture. * Removed contact label from contact frame in chat. We already have send and copy email buttons. - * Fixed the alternative contact's picture. When Msn Object was received from server the contact picture path was + * Fixed the alternative contact's picture. When Msn Object was received from server the contact picture path was overwritten by it ( also if we had set the alternative picture ). * Fixed the change of message in KMessInterface: if the message isn't changed don't re-set the QLabel. * Merged patch by Ruben to fix find user shortcut when the menu is hidden. @@ -341,7 +1730,7 @@ messages). 2008-06-17 (sifcenter) - * Added the ability to send ink via mimemessage ( p2p ink sending is based on + * Added the ability to send ink via mimemessage ( p2p ink sending is based on proprietary ink format ). * Added the ability to choose size of pen for ink. * Added the ability to switch automatically from ink editor when the user press a key. @@ -495,7 +1884,7 @@ * Renamed the class AutoLoginView to LoginView. 2008-05-23 (sifcenter) - * Added the ability to parse effects text for words contain accented chars and + * Added the ability to parse effects text for words contain accented chars and white space: thanks to swiftscythe for reporting. * Moved the code for emoticon side buttons to QListWidget. * Fixed the bug in contact sidebar: it wasn't possible to click on the tab contact. @@ -551,7 +1940,7 @@ 2008-05-13 (sifcenter) * Added the password to editbox in account page settings - + 2008-05-12 (Diederik) * Make the XmlFunctions code more verbose, while debugging offline-im sending. * Fixed compiling the new network window for KDE 4.0. @@ -672,7 +2061,7 @@ * Added an i18n call to KMess::addNewGroup() to the default group name. * Fixed the problem with long friendlynames ( set the maximum length to 387 characters url encoded ). * Fixed some escape friendlyname in kmessview.cpp. - * Fixed some icons: + * Fixed some icons: - copy link in popup menu on link click. - contact flag blocked, food and phone. * Improved the history combo box and remove oldest item if the count is >= 500 elements. diff --git a/Doxyfile b/Doxyfile index 049018d..37c3e6c 100644 --- a/Doxyfile +++ b/Doxyfile @@ -5,7 +5,7 @@ #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = KMess -PROJECT_NUMBER = 2.0-alpha2 +PROJECT_NUMBER = 2.0-beta1 OUTPUT_DIRECTORY = ./apidocs CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English @@ -25,8 +25,8 @@ ABBREVIATE_BRIEF = "The $name class" \ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES -STRIP_FROM_PATH = -STRIP_FROM_INC_PATH = +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO @@ -35,7 +35,7 @@ DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 2 -ALIASES = +ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_FOR_FORTRAN = NO @@ -73,13 +73,13 @@ GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = +ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = NO SHOW_DIRECTORIES = NO SHOW_FILES = YES SHOW_NAMESPACES = YES -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- @@ -89,7 +89,7 @@ WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = YES WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- @@ -104,13 +104,13 @@ EXCLUDE = *.moc \ *.moc.h EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = */build*/* -EXCLUDE_SYMBOLS = -EXAMPLE_PATH = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing @@ -128,7 +128,7 @@ VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 4 -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- @@ -144,8 +144,8 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project HTML_DYNAMIC_SECTIONS = NO -CHM_FILE = -HHC_LOCATION = +CHM_FILE = +HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO @@ -163,8 +163,8 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = +EXTRA_PACKAGES = +LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO @@ -176,8 +176,8 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- @@ -190,8 +190,8 @@ MAN_LINKS = NO #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = +XML_SCHEMA = +XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output @@ -203,37 +203,37 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- -# Configuration options related to the preprocessor +# Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = PREDEFINED = KMESSTEST \ KMESS_NETWORK_WINDOW -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::additions related to external references +# Configuration::additions related to external references #--------------------------------------------------------------------------- -TAGFILES = +TAGFILES = GENERATE_TAGFILE = kmess.tag ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO -MSCGEN_PATH = +MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES DOT_FONTNAME = FreeSans -DOT_FONTPATH = +DOT_FONTPATH = CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES @@ -246,8 +246,8 @@ CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = NO DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = +DOT_PATH = +DOTFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = NO @@ -255,6 +255,6 @@ DOT_MULTI_TARGETS = YES GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- -# Configuration::additions related to the search engine +# Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO diff --git a/FEATURES b/FEATURES index 196357c..446d3f6 100644 --- a/FEATURES +++ b/FEATURES @@ -26,6 +26,7 @@ Support for KDE's KWallet, to store in a secure way the accounts passwords. Automatic detection of network connection and disconnection. Option to block notifications when the status is set to Busy. Option to disable displaying of received winks. +Automatic reconnection to MSN after unwanted disconnections. - 1.5.1 - Contact's MSN client detection. diff --git a/NEWS b/NEWS index 43d9928..545b222 100644 --- a/NEWS +++ b/NEWS @@ -1,44 +1,146 @@ -Changes between KMess SVN and 2.0-alpha2: +Changes between KMess SVN and 2.0-beta1: -------------------------------------- +- None yet. + +Changes between KMess 2.0-beta1 and 2.0-alpha2: +-------------------------------------- +- added support to start chats while you're invisible. +- added automatic reconnection after unwanted disconnections. +- added IRC like command handling in the chat window (/away, etc..) +- added 'Send with KMess' menu item to Konqueror context menu's. +- added verbose status message when KMess fallbacks to the HTTP connection. +- added contact emoticon blacklist, to block annoying custom emoticons from contacts. +- added Likeback support to collect user feedback, ported from Basket of KDE 3. +- added support to configure the toolbars and menus in the chat window. +- added contact list export dialog. +- added close button in the contact list search box. +- added context menu to the contact list, to open the contact menu with the left mouse too. +- added confirmation dialogs when the menu gets hidden with Ctrl+M. +- added confirmation dialogs when deleting custom emoticons. +- added confirmation dialogs when deleting old display pictures. +- added filtering options to the file transfer window, to show downloads/uploads only. +- added Greek translation by Panagiotis Papadopoulos. +- added Serbian translation by Zoran Milovanović. +- added Slovak translation by Rastislav Krupanský. +- improved protocol support, upgraded the server core protocol to MSNP15. +- improved user interface of the main login dialog, added links. +- improved overall user interface with further fine tuning. +- improved KDE session restoring; KMess will reconnect if you were connected at logout. +- improved chat notifications to be compatible with the new Plasma notifications of KDE 4.2. +- improved emoticon panels; users can choose between message editors or permanent sidebar panels. +- improved painting controls for the Ink handwriting. +- improved chat logging support (support XML, TXT output) in preparation of a chat logging browser. +- improved chat autoscroll feature. +- improved chat window status bar. +- improved several English messages in the user interface. +- improved reporting of error messages, using notifications for warnings. +- improved cmake detection of libqca2-plugin-ossl package for Ubuntu. +- changed contact sidebar, clicking the contact always shows the context menu. +- fixed multiple bugs with automatic reconnecting. +- fixed blocked login view when there is no network connection. +- fixed saving passwords when the 'save password' account option is off. +- fixed saving passwords when KWallet is not supported, or the user refused to use it. +- fixed contact list group expanding/collapsing with incremental search. +- fixed contact list sorting and grouping. +- fixed context menu to chat with a blocked/offline/allowed contact. +- fixed double error box when adding a non-existing contact to the list. +- fixed chat window focus issues. +- fixed chat tabs for contacts with HTML characters in their name. +- fixed chat tabs for contacts with long names. +- fixed chat tabs being displayed when tabbed chatting is disabled. +- fixed chat messages displayed in the wrong tab. +- fixed chat message wordwrapping for long unbreakable words. +- fixed chat spell checker setting, the setting was not remembered correctly. +- fixed typing messages for tabbed chats. +- fixed adding custom emoticons from the chat window sidebar. +- fixed and improved shortcut keys to switch between chat tabs, start a chat, etc... +- fixed layouting issue in the Classic Compact chat style. +- fixed displaying a 'contact left chat' message twice if there was no conversation in between. +- fixed unclickable display picture in the chat if the contact is offline. +- fixed invalid dates being displayed for contact properties. +- fixed updating the chat windows after an emoticon theme is changed. +- fixed updating the chat style preview when "Group follow up messages" is toggled. +- fixed start folder of the file browser for account pictures. +- fixed displaying the filename for files transferred with the old MSNFTP protocol. +- fixed cancel link not being removed when a file transfer invitation hit the timeout +- fixed notification default settings. +- fixed missing nudge event in the notification settings. +- fixed missing detection of "Windows Media Center" in the list of known MSN clients. +- fixed now listening icon, using a common icon now. +- fixed now listening support, added support for all MPris-compatible players. +- fixed inconsistent order of the artist and track title in now Listening information. +- fixed position of the red circle in the system tray screenshot. +- fixed protocol support of group chats. +- fixed protocol support of the MSN-HTTP fallback. +- fixed protocol support of MSNP2P by Windows Live Messenger 2009, should fix picture/emoticon transfers. +- fixed protocol support of MSN Plus! markup, displaying contact names incorrectly at various places. +- fixed protocol support for resetting your Personal Message, was not recognized by Windows Live Messenger 2009. +- fixed displaying of Offline-IM messages, wrong sender was displayed when receiving many messages. +- fixed error handling for SOAP protocol errors. +- fixed "view profile" pages with updated MSN website. +- fixed crashes in the contact list model code. +- fixed a crash when receiving MSN Plus! predefined messages. +- fixed a crash with receiving files with the old MSNFTP protocol. +- fixed an assertion crashing KMess caused by read-only configuration files with a KDE 4 debug build. +- fixed compiling issues with KDE 4.0, 'KDE on Windows' and MinGW32. +- fixed compiler warnings. +- fixed adblock icons showing up by the embedded KHTMLPart component in the chat window. +- fixed network code to use QNetworkAccessManager, this should give us proper Proxy support. +- fixed browser invocation code, using KToolInvocation to have instant invocation. +- fixed issues with network detection if Solid/NetworkManager is not available. +- fixed removed translator name entries in the .po files; some languages appear to have translated names. +- removed custom notification settings in favour of KNotify settings in the global settings panel. +- updated English handbook by Heimen Stoffels. +- updated Brazilian Portuguese translation by Leonel Freire. +- updated Dutch translation by Elvse and Sander Pientka. +- updated French translation by Barthe Guillaume. +- updated German translation by Panagiotis Papadopoulos. +- updated Greek translation by Panagiotis Papadopoulos, Dimitrios Glentadakis. +- updated Hungarian translation by Pauli Henrik. +- updated Italian translation. +- updated Norsk Bokmal translation by Øyvind Sæther. +- updated Simplified Chinese translation by Cheng Yang. +- updated Spanish translation by Alexis Daniel Medina Medina, Juan Pablo González Tognarelli. +- updated Swedish translation by Mattias Newzella. +- updated Traditional Chinese translation by Yen-chou Chen, the Tryneeds-Chinese Translation Platform. Changes between KMess 2.0-alpha2 and 2.0-alpha: -------------------------------------- - added connecting over HTTP, to deal with corporate firewalls which only allow connections to browse the web. -- added an history box in the contact list, to display recent contact events. +- added tabbed chatting support! - added offline messaging functionality. -- added an application-wide settings dialog. -- added an account manager in the application-wide settings. -- added ability to search the contacts in contact list. -- added the ability to send huge messages. -- added option to copy the music a contact is listening to the clipboard. -- added option to choose the browser and e-mail client used to open Web links. -- added tabbed chatting support. -- added the ability to send ink messages. -- added a little button on the notification popups to allow closing them, other than the right-click. -- added an option to choose a default directory where to put all received files. -- added option to choose the interval of ports used for fast file transfers. -- added ability to keep short notes for each contact. +- added the support to send ink messages. +- added the support to send huge messages. - added full MSN Plus text-formatting support in chat and in the contact list. -- added a DBus remote control interface, to enable interaction with KMess from other applications. -- added options to switch a contact between groups from that contact's properties dialog. -- added dialog to choose a previously set display picture for the account. -- added a dark chat style suitable for use with dark KDE color themes. -- added option to choose the dimensions of the contact list pictures. -- added KWallet support to store in a secure way the passwords of the saved accounts. +- added application-wide settings dialog, which includes an account manager. +- added option to choose the interval of ports used for fast file transfers. +- added option to change the groups of a contact from the contact's properties dialog. +- added option to choose a previously set display picture for the account. +- added option to choose the dimensions of the pictures in the contact list. - added option to specify where received files will be downloaded to. +- added option to display all offline contacts in a single group ("mixed" group mode). - added option to hide currently empty groups. -- added option to display online contacts divided by group along with offline contacts all grouped in the offline group. -- added detection of network connection availability. - added option to block notifications when the status is set to Busy. - added option to disable displaying of received winks. -- added the date of the last received message from a contact. +- added option to choose a default directory where to put all received files. +- added option to choose the browser and e-mail client used to open Web links. +- added copy menu entry for the music a contact is listening. +- added a dark chat style suitable for use with dark KDE color themes. +- added ability to keep short notes for each contact. +- added a search box in the contact list. +- added an history box in the contact list, which displays recent contact events. +- added a close button on the notification popups (for people who don't know about right-click to close). +- added a DBus remote control interface, to enable interaction with KMess from other applications. +- added KWallet support to store in a secure way the passwords of the saved accounts. +- added detection of network connection availability, using Solid. +- added tracking of the 'last seen' and 'last chat message' dates for a contact. - improved reporting of error messages. - improved the user interface of many dialogs. - improved the Now Playing support with Amarok 2 support. Amarok 1.4 is still supported. -- improved the way the file transfer messages are displayed within the chat. -- improved the auto-message feature by displaying the automessage more often. +- improved the file transfer messages within the chat. +- improved the auto-message feature, displays the automessage more often. - fixed displaying old contact names and no personal messages after login. - fixed loading emoticon themes containing non-PNG picture files. - fixed compatibility and styling issues with dark KDE color schemes. @@ -67,7 +169,7 @@ Changes between KMess 1.5.2 and 1.5.1: - fixed displaying old contact names after login. - fixed enabled auto-away settings if the XScreenSaver extension was not found. - fixed a bug which caused a disconnection when setting an extremely long nickname. -- fixed a bug which discarded saved settings for an account when quitting and when just disconnecting. +- fixed a bug which discarded saved settings for an account when quitting and when just disconnecting. - fixed a bug which prevented non-PNG emoticon themes from loading. - fixed a crash in debug builds for unknown contacts. - fixed a possible crash in the passive popups. diff --git a/README b/README index 080d5d2..081afa6 100644 --- a/README +++ b/README @@ -2,11 +2,12 @@ About KMess: ============ -KMess is a MSN Messenger clone for Linux. It enables Linux users -to chat with friends online who are using MSN Messenger in -Windows or Mac OS. The strength of KMess is it's integration -with the KDE desktop environment, focus on MSN Messenger -specific features and an easy-to-use interface. +KMess is a Windows Live Messenger client for Linux. It enables +Linux, Mac and even Windows users to chat with friends online +who are using the official Messenger client for Windows. The +strengths of KMess are its integration with the KDE desktop +environment, its focus on Live Messenger specific features +and an easy-to-use interface. Like many Linux and KDE applications, KMess is free software. The licensing terms are the GNU General Public License. @@ -90,7 +91,7 @@ Try the following switches to change the build. -D KMESS_ENABLE_BINRELOC=[1,0] Enable support for binary relocatable binaries. This allows the binary - to find it's resource files whatevery directory it is installed in. + to find it's resource files whatever directory it is installed in. -G "MinGW Makefiles" diff --git a/TODO b/TODO index a714367..5ad7f0c 100644 --- a/TODO +++ b/TODO @@ -1,12 +1,14 @@ - Please note this file is replaced by an online Trac installation. - Our trac installation can be found at: http://trac.kmess.org/ + Please note that this file has been replaced by an online project management tool, + and all information here can be completely outdated. + Our new project management site can be found at: http://trac.kmess.org/ If you're looking for junior jobs, you may also contact us - at the KMess help forums. + at the KMess help forums: http://kmess.org/board/ Thanks + - The KMess team @@ -16,7 +18,6 @@ To do: Unfinished new features: ___ Invite contacts for a new chat session when the current chat is used for file transfers. ___ Invite contacts for a new chat session when the current chat has multiple participants (display dialog to choose the contact). -___ Change mouse cursor when hovering over the "personal status message" widget, make non-active background color less dark. ___ Lookup all "TODO" items in the code. Unfinished protocol features: @@ -35,7 +36,6 @@ Junior jobs: ___ Improve wink playing, include preview, offer "play" button (also see other showWink() issues). Also fixes issues when chat is started with a wink. ___ Implement phone settings (PRP and BPR fields). ___ Implement privacy settings (GTC and BLP fields, messages like "can't chat with invited contact" because not in the AL). -___ Add the ability to select another browser for opened links, instead of the kde's default browser. ... And if you're up for a challenge, you could try one of the "Low priority protocol features" below too. ... Or try to implement a new MSN feature (see "Future ideas" section). @@ -44,14 +44,11 @@ ___ Fix repeated picture transfer invitations when contact declines or aborts th ___ Automatically clean up the displaypics folder, and msnpicture-alias-##.png images that are older then 1 month. ___ Add detection for NAK responses to file transfer invitations ___ Improve performance of restyling the chat window: combine xml to one string. -___ Contact list items flicker, specially when there are a lot of contacts. Low-priority features: ___ Improve wink processing messages of `cabextract` output in ChatWindow::showWink(). ___ When chat window closes, inform user the file transfers will also abort. -___ See what happens when there is a picture transfer in a multi-chat, and one of the chats becomes buzy. -___ Improve the parsing of *bold* /italics/ and _underline_, so http:/website/ does not become italic and avoid mangling to . -___ Disable cut/copy for the password line (InitialViewInterface, not using KPasswordEdit because it disables too much). +___ See what happens when there is a picture transfer in a multi-chat, and one of the chats becomes busy. ___ When opening chat windows, shift their position to make them cascade. Low-priority code changes: @@ -60,11 +57,6 @@ ___ Only allow plugins/non-local files temporary when displaying winks? ___ Implement Application::attachToChat(..) feature to improve aborting? ___ Create a WinkArchive class for the code in ChatWindow::showWink(). ___ Include contact meta-data in receivedMessage() call of ChatWindow::showWink(). -___ Use kdWarning() instead of kdDebug() << "WARNING", for warning messages. -___ Use if(KMESS_NULL(..)) checks instead of current if(.. != 0) { .. } -___ Move utility classes to a separate folder. -___ Put TcpConnectionBase under MsnConnection. -___ Remove all #includes for and replace it with "kmessdebug.h" (watch for inclusions from subdirs) Low-priority protocol features: ___ Support adding contacts to multiple groups. @@ -79,21 +71,8 @@ ___ Leave a P2PApplication half-open to receive a final error message. ___ Use "URL PERSON/PROFILE" settings. Wishes by users for 1.5: -___ Compact sidebar list as described in http://www.kmess.org/board/viewtopic.php?t=460 - (make it optional, let the user choose between "no", "compact", "full") -___ Maybe: improve chat window layout like http://kde-apps.org/content/show.php?content=24461 - (looks more clean, though it's a bit kmerlin like though, and the current pictures list is not that bad for multi-chat) - Being worked on -___ Group off-line contacts in one single group. -___ Group chats: use more compact contact frame. -___ Account menu's: only show submenu when there are multiple accounts. ___ XMMS2 now listening: http://www.kmess.org/board/viewtopic.php?t=1569 (use relaytool from autopackage.org for that). -Wishes by users for 1.6: -___ Tabbed chats. - -Open for discussion: -___ Order of the title in the main window, account before or after. Should distinguish from the chat windows though. - Implemented for 1.5: _Y_ Implement text/x-clientcaps message and MsnObject name to advertise KMess to other third-party messengers. _Y_ Add a checkbox to the settingspanel to disable the shaking window effect. @@ -166,6 +145,36 @@ _N_ "Who has me in his/hers contact list?" dialog (allowed/removed groups alread _N_ Include the network-window as "--with-network-window" if the network-window-code displays traffic nicer. +Implemented for 2.0: +_Y_ Account menu's: only show submenu when there are multiple accounts. +_Y_ Add the ability to select another browser for opened links, instead of the kde's default browser. +_Y_ Change mouse cursor when hovering over the "personal status message" widget, make non-active background color less dark. +_Y_ Compact sidebar list as described in http://www.kmess.org/board/viewtopic.php?t=460 + (make it optional, let the user choose between "no", "compact", "full") +_Y_ Contact list items flicker, specially when there are a lot of contacts. +_Y_ Disable cut/copy for the password line (InitialViewInterface, not using KPasswordEdit because it disables too much). +_Y_ Group chats: use more compact contact frame. +_Y_ Group off-line contacts in one single group. +_Y_ Improve the parsing of *bold* /italics/ and _underline_, so http:/website/ does not become italic and avoid mangling + to . + (looks more clean, though it's a bit kmerlin like though, and the current pictures list is not that bad for multi-chat) - Being worked on +_Y_ Maybe: improve chat window layout like http://kde-apps.org/content/show.php?content=24461 +_Y_ Move utility classes to a separate folder. +_Y_ Order of the title in the main window, account before or after. Should distinguish from the chat windows though. +_Y_ Put TcpConnectionBase under MsnConnection. +_Y_ Remove all #includes for and replace it with "kmessdebug.h" (watch for inclusions from subdirs) +_Y_ See what happens when there is a picture transfer in a multi-chat, and one of the chats becomes buzy. +_Y_ Tabbed chats. +_Y_ Use if(KMESS_NULL(..)) checks instead of current if(.. != 0) { .. } +_Y_ Use kdWarning() instead of kdDebug() << "WARNING", for warning messages. +_Y_ Add HTTP connection method. +_Y_ Add Ink support? +_Y_ Upgrade to MSNP14, but not until the protocol is fully understood! (it has some radical changes). +_Y_ Update contact properties edit dialog, icon button for contact icon. +_Y_ Browse/view the contact picture cache (include meta data, like contact handle and date/time) +_Y_ GetHotNewStuff (as of KDE 3.4, either support it through a KPart, or wait for KDE 4 conversion) +_Y_ KWallet integration + Future ideas: @@ -180,13 +189,10 @@ ___ Implement STUN support, also for Connection-Type field, see http://en.wikipe ___ Add voice (SIP) support ___ Add Voice clips support, see http://www.hypothetic.org/docs/msn/phorum/read.php?f=1&i=11505&t=11437 ___ Add webcam (RTP) support, see http://www.hypothetic.org/docs/msn/phorum/read.php?f=1&i=9837&t=9837 -___ Add Ink support? ___ Fix msn remote desktop invitation support (context field with user/pass) -___ Add HTTP connection method. ___ Implement MSN Spaces integration ___ Implement MSN Games support (ActicitiesCollection : public QPtrList) ___ Implement shared folders. -___ Upgrade to MSNP14, but not until the protocol is fully understood! (it has some radical changes). Invitation support: ___ Check whether gnomemeeting, krdc exists before starting/acceping a session @@ -194,12 +200,8 @@ ___ Support Konference for netmeeting invitations as well. ___ Detect whether gnomemeeting or konference exists before starting a netmeeting session. Interface features: -___ Update contact properties edit dialog, icon button for contact icon. -___ Browse/view the contact picture cache (include meta data, like contact handle and date/time) ___ Show an icon overlay for contact connected with webmessenger.msn.com / MSN Mobile ___ Add contact icon (purple?) for unknown contacts added by others in a multi-chat session. KDE Integration: ___ KDE-IM bridge (http://developer.kde.org/documentation/library/cvs-api/interfaces/html/classKIMIface.html) -___ GetHotNewStuff (as of KDE 3.4, either support it through a KPart, or wait for KDE 4 conversion) -___ KWallet integration diff --git a/autopackage/default.apspec b/autopackage/default.apspec index 2252548..565de9f 100644 --- a/autopackage/default.apspec +++ b/autopackage/default.apspec @@ -4,7 +4,7 @@ RootName: @kmess.sourceforge.net/kmess:$SOFTWAREVERSION DisplayName: KMess ShortName: kmess -SoftwareVersion: 2.0alpha2 +SoftwareVersion: 2.0beta1 Maintainer: The KMess Developers Packager: Diederik van der Boor Summary: MSN Messenger client for KDE @@ -44,8 +44,8 @@ echo "*" | import [Prepare] -# KDE 4.0 is the minimum requirement after the port to KDE4 -require @kde.org/kdelibs 4.0 +# KDE 4.1 is the minimum requirement for KMess 2 +require @kde.org/kdelibs 4.1 # flash and cabextract are used for winks. playWinks="1" diff --git a/cmake/check-qca2-ossl.sh b/cmake/check-qca2-ossl.sh new file mode 100755 index 0000000..a1c5203 --- /dev/null +++ b/cmake/check-qca2-ossl.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +QCATOOL_EXEC=$(which qcatool2 2>/dev/null) +if [ ! -x "$QCATOOL_EXEC" ]; then + echo 0 + exit +fi + +qcatool2 plugins | grep -q qca-ossl && echo 1 || echo 0 diff --git a/cmake/config-kmess.h.in b/cmake/config-kmess.h.in index 182a1f9..8fb7a7b 100644 --- a/cmake/config-kmess.h.in +++ b/cmake/config-kmess.h.in @@ -22,3 +22,6 @@ /* Define if you have KPhone installed (for SIP voice chat) (currently unused) */ /* #define HAS_KPHONE 1 */ + +/* Define whether to enable MSN webcam support (HIGHLY EXPERIMENTAL) */ +#define ENABLE_WEBCAM ${KMESS_ENABLE_WEBCAM} diff --git a/cmake/get-svn-version.sh b/cmake/get-svn-version.sh index f6bc55b..3fd795c 100755 --- a/cmake/get-svn-version.sh +++ b/cmake/get-svn-version.sh @@ -23,7 +23,11 @@ svnver=`LANG=C svnversion` # see if this is not a repository. if [ "$svnver" = "exported" ]; then - echo -n "$appver"; + if [ -z "$KMESS_VER" ]; then + echo -n "$appver"; + else + echo -n "$KMESS_VER"; + fi exit; fi diff --git a/configure b/configure index 8460393..4c916a7 100755 --- a/configure +++ b/configure @@ -37,6 +37,7 @@ fi PREFIX=$DEFAULT_PREFIX BUILD_TYPE="relwithdebinfo" BUILD_DIR="build" +REAL_BUILD_DIR="" DEBUG=0 BINRELOC=0 @@ -129,11 +130,12 @@ function run_cmake # and switch so build messages are ok. test -e "$BUILD_DIR" || mkdir "$BUILD_DIR" || exit 1 cd "$BUILD_DIR" + REAL_BUILD_DIR=`pwd` # debug about cmake echo "configuring KMess $KMESS_VER" echo "checking build directory" - echo "running cmake from `pwd`" + echo "running cmake from $REAL_BUILD_DIR" echo "command: cmake -D CMAKE_INSTALL_PREFIX=$PREFIX \ " echo " -D CMAKE_BUILD_TYPE=$BUILD_TYPE \ " echo " -D KMESS_DEBUG_OUTPUT=$DEBUG \ " @@ -183,6 +185,16 @@ function cmake_ok # Build type: $BUILD_TYPE # Build directory: $BUILD_DIR # +# +# cmake command: +# +# cd \"$REAL_BUILD_DIR\" +# cmake -D CMAKE_INSTALL_PREFIX=$PREFIX \\ +# -D CMAKE_BUILD_TYPE=$BUILD_TYPE \\ +# -D KMESS_DEBUG_OUTPUT=$DEBUG \\ +# -D KMESS_ENABLE_BINRELOC=$BINRELOC \\ +# \"$SRC_DIR\" +# " > $makefile for target in $targets; do diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index feaf1e5..030d4cf 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -5,5 +5,6 @@ ADD_SUBDIRECTORY( sounds ) ADD_SUBDIRECTORY( emoticons ) ADD_SUBDIRECTORY( chatstyles ) -INSTALL( FILES kmess.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kmess ) -INSTALL( FILES kmess.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} ) +INSTALL( FILES kmesschatstyles.knsrc DESTINATION ${CONFIG_INSTALL_DIR} ) +INSTALL( FILES kmess.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kmess ) +INSTALL( FILES kmess.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} ) diff --git a/data/chatstyles/Classic-compact/Classic-compact.css b/data/chatstyles/Classic-compact/Classic-compact.css index 1e3abbc..9a08132 100644 --- a/data/chatstyles/Classic-compact/Classic-compact.css +++ b/data/chatstyles/Classic-compact/Classic-compact.css @@ -55,6 +55,18 @@ div.notification .filename { } +/* + * Separator for the various chats within HTML files + */ +div.conversation +{ + margin: 2em 1em 1em 1em; + padding-bottom: 0.5em; + border-bottom: 1px solid gray; + color: purple; +} + + /** * Remaining markup is done inline in the .xsl file. diff --git a/data/chatstyles/Classic-compact/Classic-compact.xsl b/data/chatstyles/Classic-compact/Classic-compact.xsl index 5be4254..4675c12 100644 --- a/data/chatstyles/Classic-compact/Classic-compact.xsl +++ b/data/chatstyles/Classic-compact/Classic-compact.xsl @@ -42,8 +42,8 @@ - float:left; clear:both; padding-right: 0.3em; - float:right; clear:both; padding-left: 0.3em; + padding-right: 0.3em; + padding-left: 0.3em; diff --git a/data/chatstyles/Classic/Classic.css b/data/chatstyles/Classic/Classic.css index 3763d96..02228b9 100644 --- a/data/chatstyles/Classic/Classic.css +++ b/data/chatstyles/Classic/Classic.css @@ -55,6 +55,17 @@ div.notification .filename { } +/* + * Separator for the various chats within HTML files + */ +div.conversation +{ + margin: 2em 1em 1em 1em; + padding-bottom: 0.5em; + border-bottom: 1px solid gray; + color: purple; +} + /** * Remaining markup is done inline in the .xsl file. diff --git a/data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.css b/data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.css index fccdb5b..8f92c6f 100644 --- a/data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.css +++ b/data/chatstyles/Colourful-Enclosed/Colourful-Enclosed.css @@ -195,3 +195,16 @@ img.customEmoticonPlaceholder vertical-align: top; } + + +/* + * Separator for the various chats within HTML files + */ +div.conversation +{ + margin: 3em 2em 2em 2em; + padding: 0.5em; + border: 1px solid grey; + color: purple; + text-align: center; +} diff --git a/data/chatstyles/Dim/Dim.css b/data/chatstyles/Dim/Dim.css index 58bcf07..066e190 100644 --- a/data/chatstyles/Dim/Dim.css +++ b/data/chatstyles/Dim/Dim.css @@ -183,3 +183,14 @@ img.customEmoticonPlaceholder vertical-align: top; } + + +/* + * Separator for the various chats within HTML files + */ +div.conversation +{ + margin-top: 3em; + margin-bottom: 1em; + color: purple; +} diff --git a/data/chatstyles/Efficient/Efficient.css b/data/chatstyles/Efficient/Efficient.css index 3df2e08..47b277c 100644 --- a/data/chatstyles/Efficient/Efficient.css +++ b/data/chatstyles/Efficient/Efficient.css @@ -251,3 +251,17 @@ img.customEmoticonPlaceholder vertical-align: top; } + + +/* + * Separator for the various chats within HTML files + */ +div.conversation +{ + padding: 0; + margin-left: 6em; + margin-top: 3em; + margin-bottom: 1.5em; + font-size: larger; + color: purple; +} diff --git a/data/chatstyles/Fresh-dark/Fresh-dark.css b/data/chatstyles/Fresh-dark/Fresh-dark.css index 32b54c5..bce7121 100644 --- a/data/chatstyles/Fresh-dark/Fresh-dark.css +++ b/data/chatstyles/Fresh-dark/Fresh-dark.css @@ -281,3 +281,16 @@ img.customEmoticonPlaceholder padding: 0; } + + +/* + * Separator for the various chats within HTML files + */ +div.conversation +{ + margin: 2em 1em 1em 1em; + padding: 0.5em; + border: 1px solid #000500; + font-size: larger; + color: #bb0; +} diff --git a/data/chatstyles/Fresh/Fresh.css b/data/chatstyles/Fresh/Fresh.css index 532dcb0..0866227 100644 --- a/data/chatstyles/Fresh/Fresh.css +++ b/data/chatstyles/Fresh/Fresh.css @@ -280,3 +280,17 @@ img.customEmoticonPlaceholder padding: 0; } + + +/* + * Separator for the various chats within HTML files + */ +div.conversation +{ + margin: 3em 2em 2em 2em; + padding: 0.5em; + border: 1px solid #dce6ff; + font-size: larger; + color: purple; + text-align: center; +} diff --git a/data/chatstyles/Pure/Pure.css b/data/chatstyles/Pure/Pure.css index 799feac..4b11b29 100644 --- a/data/chatstyles/Pure/Pure.css +++ b/data/chatstyles/Pure/Pure.css @@ -319,3 +319,16 @@ img.customEmoticonPlaceholder padding: 10px; } + + +/* + * Separator for the various chats within HTML files + */ +div.conversation +{ + margin: 2em 1.5em 1.5em 1.5em; + padding: 0.5em; + border: 1px solid #e1e1e1; + font-size: larger; + color: purple; +} diff --git a/data/emoticons/KMess2-new/emoticons.xml b/data/emoticons/KMess2-new/emoticons.xml index 5e2ab92..5c7c659 100644 --- a/data/emoticons/KMess2-new/emoticons.xml +++ b/data/emoticons/KMess2-new/emoticons.xml @@ -226,10 +226,6 @@ (bah) - - (nah) - - :[ :-[ diff --git a/data/icons/CMakeLists.txt b/data/icons/CMakeLists.txt index 39dc321..44e60cf 100644 --- a/data/icons/CMakeLists.txt +++ b/data/icons/CMakeLists.txt @@ -1,4 +1,15 @@ KDE4_INSTALL_ICONS( ${ICON_INSTALL_DIR} ) -INSTALL( FILES gnomemeeting.png DESTINATION ${DATA_INSTALL_DIR}/kmess/icons/hicolor/16x16/apps ) +SET( KMESS_ICON_INSTALL_DIR ${DATA_INSTALL_DIR}/kmess/icons/hicolor/16x16 ) + + +# If we're compiling in debug mode, also add the LikeBack icons +IF( ${KMESS_ENABLE_DEBUG_OUTPUT} EQUAL 1 ) + INSTALL( FILES likeback_bug.png DESTINATION ${KMESS_ICON_INSTALL_DIR}/actions ) + INSTALL( FILES likeback_dislike.png DESTINATION ${KMESS_ICON_INSTALL_DIR}/actions ) + INSTALL( FILES likeback_feature.png DESTINATION ${KMESS_ICON_INSTALL_DIR}/actions ) + INSTALL( FILES likeback_like.png DESTINATION ${KMESS_ICON_INSTALL_DIR}/actions ) +ENDIF( ${KMESS_ENABLE_DEBUG_OUTPUT} EQUAL 1 ) + +INSTALL( FILES gnomemeeting.png DESTINATION ${KMESS_ICON_INSTALL_DIR}/apps ) diff --git a/data/icons/likeback_bug.png b/data/icons/likeback_bug.png new file mode 100644 index 0000000000000000000000000000000000000000..1edc6c10e7e56182a65f4a72312de0f1c0843807 GIT binary patch literal 703 zcmV;w0zmzVP)L zQ@=}FQ5Ze%5xVGeDFv}~aVezwOR>+;01tpi;Ihg%pBx$IYd!3-4Or))a!MuuC7Lv zO6C0c_!z$LLn-y4P$)caHkcxUSoi%jFOR!IgmLc_DytYwgRWrKS5)%CG5kx~!CXLPWjgaydanT5Ek7u9Win z3p~&J?l?}`ahz?}b^GS#=K7|lrXD7f$?Y% z0Du5Utu?yQA$KMbb@s1%V2s(R)oNg7Xs!P_N-1=L+}qoOF=nURLgC=xV5L^8P5&)? l1ITfl9cyg?xcE%B!5^~39CgnkVoLx3002ovPDHLkV1iq?NsRyi literal 0 HcmV?d00001 diff --git a/data/icons/likeback_dislike.png b/data/icons/likeback_dislike.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc9a137cc2656ab776dd6bbb7649a4914232d5a GIT binary patch literal 844 zcmV-S1GD^zP)Y=gPg{ zRs?^ut_v4&)13=x5V4esf^|wdB_`@5WRgj4X70Un&-q-W6x;gkzQ1?z@;<^trJtQC z5oqGI4wUbWQ>=6`bmYBj`G4=_f#*+OX^^qVQ*#SU&$g(H*U$iienPL)=AWC(#4O3B zAJ!ic@SmJ*iG6ZOUV3Am6Q^P=5_J0yWNif*?tn(XRHhrZuB-GH?fci-_XS2D&oxZx z*cEy0@@biVg3w!q{s!!JknV5D_U*$yehjV7q6dB@MEUvXgB$BM`{>0I!*JQ0eETh# zo^;y2%5ba8UU!#DzJ~TUNO~!@*vAwplJBFYTo0*FK0J5iM;FqpX^)&*km>1|pT9tc zJ+6K?#_x9>m)_}P1_ylpZG+~~8Qz@#6-FZ@Y{!JLg^==%(_vbtI@4nFCUWO{G#Uff z!WfWb4H@h)k~*naPzzY3C?FrS)S9{r#i)!>ldW5j?IT&j>nAeKK3`>`_zQKG3+Mi1 zi~(Rl&7td~ycX1!oll48pbudayaSZVpobau$X6Ai;PKftqKOJ<32>kSqZD6&^Pxy} zZ!6KNs}Uj&{vMLuP^^W$XDkAgfAVNZsGh76*JD&66nWyUNnIhnTWsEGN6$6q2oa^# z0i~D6@n(`pBg827SdQ-R<9`_tUY!JTGVj}k)2{P`PJiq6vKyazA+F8Dr85!1ln5Nf zh&zmm=9I=aF;7ncfplvpOA1{!F&zO|zi1ofVRU8U__L=Y$-oyV7R7=H5(1(DBrw|R zvAsK7@ndqn@s(e{ALY9jq*YGc(qz@mN3~jPTnRCUYYj>mWn}%`Y$x^Ci;6BD|C;tA zFm)Dbkg-^aWT7mkjvIz;=F|l)Tfu#R@`}pnKt1pLs{9;(n$ilD%sP3ob z5{N#40AgW40PcUk872uT3CD{##4~fM*fB72@iH(lGBW)C^qTwIokPLT_pJ%jhyFD=RTG z&23J4dhNqQpl}mN4j_Qw2C%X-6pGvEGBAjWGcbHS3N{f1FfubRO2{zCIcPAvzIUP! zW&l6{A-urGz{4y6bk*lGAWt)31%G)MSOh;ZFtRf6z=Qw-2yOt-wZHzqyUN1I^@o9h znFHv8|7b1%2J*Kb4F5hoV)*-?0q#720D>Fv{WC+y%PU`-Bm^!oFtD&QFfcJ9G=t0n z8Tj`n!{hUR7`}aE=z&QA1P~M41%DW(KRw5A{_AU?3s`_&`S%5Z{{u1WSBB3o{xCc^ z$#5R1b^=TvKmfrF_|M4j=KDK_ju#h!Y@h=ectH^h#X$CdHU@@AXMu6|mZ1X}jc;K3 z00IbZz~6sBSF7>N@gfEZ!fSzcZqk#7F~ zx7F6xNmf-=4LNY&;Lpd8AI<;#`O`+A)M1#KKYt*B1`uEXD1``7@-9f-00000NkvXX Hu0mjfd9P)B literal 0 HcmV?d00001 diff --git a/data/icons/likeback_like.png b/data/icons/likeback_like.png new file mode 100644 index 0000000000000000000000000000000000000000..b62b61164fe08af465b99c09ee2a8a86670f9427 GIT binary patch literal 894 zcmV-^1A+XBP)vt4HW+D>N!-}B_{VaI> z+{CXcG0CJX9-Aq94-~H2&j{J3-Mx=QYYvrH3D{zzJA$?@cMrG8OiVx5F4!S=CZF(? zifmjNDcn@x5pTYJ^73)5c*~c{&`aY}C zRo;4K3nK)>BnT-v_gn*EUG{qSl9zcLN0FM4SPLARWpOyz4&t=OV*4Wc^Ci-?5Z`1t zI)~Ibe4CNBx9NRxndPnD(3vJnlfY(KtmHtqy1`1r8+l^d_j4S~7C8LV0O>_+O)IPs zR4%0)YQz3%kGp)2lmxYJ8gigp%1KSrZf?~7^2?8wyh@=^>XM!|bh;tc>oH`o`DBsN zQi%znutKvF^paBB)*Wq{0^pNxWp$^l&inTtJ(^ze|$mIc1q5CR#hkbqF2b9hQ=M3KB`lV zBy;^TGpR3X)|DQBh)s|?u#KTTTQ6$n-=AUqe>DPp`ZfP><~Gi>BsAYX%YQik4QGUg UJXQh`O8@`>07*qoM6N<$g1af9y8r+H literal 0 HcmV?d00001 diff --git a/data/kmess.desktop b/data/kmess.desktop index 30293d1..3c838f9 100644 --- a/data/kmess.desktop +++ b/data/kmess.desktop @@ -8,7 +8,7 @@ DocPath=kmess/index.html Terminal=0 Categories=Qt;KDE;Network;InstantMessaging; Comment=MSN Messenger Clone for KDE 4 -Comment[de]=MSN Messenger Clone für KDE 4 +Comment[de]=MSN-Messenger-Klon für KDE 4 Comment[nl]=MSN Messenger Kloon voor KDE 4 GenericName=MSN Client GenericName[af]=Irc Kliënt @@ -20,7 +20,7 @@ GenericName[ca]=Client MSN GenericName[cs]=MSN klient GenericName[cy]=Dibynnydd MSN GenericName[da]=MSN-klient -GenericName[de]=MSN Programm +GenericName[de]=MSN-Programm GenericName[el]=Πελάτης MSN GenericName[eo]=MSN-kliento GenericName[es]=Cliente de MSN diff --git a/data/kmess.notifyrc b/data/kmess.notifyrc index e91c059..68d06ec 100644 --- a/data/kmess.notifyrc +++ b/data/kmess.notifyrc @@ -7,34 +7,46 @@ Comment=KMess Messenger Client Name=Contact Online Comment=A contact has come online Sound=kmess_logon.ogg -Action=Sound|Taskbar +Action=Sound|Popup [Event/contact status] Name=Contact Status Comment=A contact has changed its MSN status Sound=kmess_logon.ogg -Action=Sound|Taskbar +Action= [Event/contact offline] Name=Contact Offline Comment=A contact has gone offline Sound=kmess_logoff.ogg -Action=Sound|Taskbar +Action=Sound|Popup [Event/chat start] Name=Chat Start Comment=A contact has started a chat with you Sound=kmess_chat.ogg -Action=Taskbar +Action=Sound|Popup|Taskbar [Event/new message] Name=New Message Comment=You received a message from a contact Sound=kmess_chat.ogg -Action=Taskbar +Action=Sound|Popup|Taskbar + +[Event/nudge] +Name=Nudge +Comment=A contact requires your attention +Sound=KDE-Im-Nudge.ogg +Action=Sound|Popup|Taskbar [Event/new email] Name=New Email Comment=You have received a new email Sound=kmess_msg.ogg -Action=Sound|Taskbar +Action=Sound|Popup|Taskbar + +[Event/status] +Name=KMess and Network Status +Comment=Information on network and application status +Sound=KDE-Sys-Special.ogg +Action=Sound|Popup diff --git a/data/kmesschatstyles.knsrc b/data/kmesschatstyles.knsrc new file mode 100644 index 0000000..4bca765 --- /dev/null +++ b/data/kmesschatstyles.knsrc @@ -0,0 +1,4 @@ +[KNewStuff2] +ProvidersUrl=http://kmess.org/newstuff/chatstyles/providers.xml +TargetDir=kmess/styles +Uncompress=true diff --git a/data/pics/CMakeLists.txt b/data/pics/CMakeLists.txt index 4e3dd01..6e86d14 100644 --- a/data/pics/CMakeLists.txt +++ b/data/pics/CMakeLists.txt @@ -8,9 +8,9 @@ SET( kmess_PICS emoticons.png empty.png invisible.png - kmesslogo.png - kmesslogo2.png kmesspic.png + kmessstrip1.png + kmessstrip2.png lunch.png offline.png online.png diff --git a/data/pics/kmesslogo.png b/data/pics/kmesslogo.png deleted file mode 100644 index f894c2b5f1bd9323ec9fa3404f584fe840255207..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16152 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 YV??#_YA9TKv>md0*M7&>J1H^$59@k5>;M1& diff --git a/data/pics/kmesslogo.svgz b/data/pics/kmesslogo.svgz new file mode 100644 index 0000000000000000000000000000000000000000..71dc235ecc06592354986098979cfb35aa613643 GIT binary patch literal 7891 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 literal 10946 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 diff --git a/data/pics/kmesspic.svgz b/data/pics/kmesspic.svgz new file mode 100644 index 0000000000000000000000000000000000000000..3238c762dfc5a4e7ec7810c5ffcacfd3cf6cb7ab GIT binary patch literal 8197 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 literal 0 HcmV?d00001 diff --git a/data/pics/kmesspic.xcf b/data/pics/kmesspic.xcf deleted file mode 100644 index 9594f331d20226628c341bed33f37e3a1d4975ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17136 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 NQ&rMZte3a?_#Zo}nBM>Z literal 0 HcmV?d00001 diff --git a/data/pics/kmessstrip1.svgz b/data/pics/kmessstrip1.svgz new file mode 100644 index 0000000000000000000000000000000000000000..85237f1a4acbf535077b7d8c6bbb24bf182054e2 GIT binary patch literal 7889 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 literal 0 HcmV?d00001 diff --git a/data/pics/kmessstrip2.png b/data/pics/kmessstrip2.png new file mode 100644 index 0000000000000000000000000000000000000000..6baf07aa32dc81b6f2966713d373993bb48aca0d GIT binary patch literal 10059 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 bGMnvp$GtYc{_5>t^uPZHU3ywdS^WS226v=i literal 0 HcmV?d00001 diff --git a/doc/en/chatwindow-contextmenu.png b/doc/en/chatwindow-contextmenu.png index d9a5c8a14180ab9bc7e71288659cebfc7466c316..eaab9b9b400d8d0c691c3e7687088dd5f6175412 100644 GIT binary patch literal 9159 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 qh%qUAPP4&UGV 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 diff --git a/doc/en/chatwindow-custom-emoticons-add.png b/doc/en/chatwindow-custom-emoticons-add.png index 93fddac72b8bb9cf8076eee608911ce7626bbba3..16de678fba3f2bc984235478600e18afa689014e 100644 GIT binary patch literal 29266 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

RhRD!LvWjdKJL+Nu=uCnuUS zrRBqI@TAlbT`H*4hB`uo(i6zh)$vn51vKBJhz^&G+J%&3rj^9OdlLvaQ6s|_u3YfeBp6Xm!E6lR-kNl zU^?Bk=iH`&*h@Bgods7z^0v!OaD zl9H-B$14|#EUr5GuC5i!1QSk)_W#ZGG}y9!$sl4#9N&M@EQEt+Yt^qJ(J4uvCn%n= z=HXbXk&0nl_o)~)h4WaLnizJd!M9z(hO%f?GHWR#JYyATWfJFImgXAr0qI^MaJe&W-38#Rd?*7x_O( z`2RnNxk&EN-7Y*JfbJO$vT*-t6OTkcKak&M@Hr1rsW5(CjtO65{lwg IqCW!v7ZMR!?EnA( literal 21051 zcmeFZRZyH;+bs$qAp`=1;2wf|aEAl}1b5fq?(PW|JV3pCuO(PgC%z_tV`(4>C8de5=9DT4AL6aH#^#Q1)>U{F>)V27c19jT9>L7 zuiUBBX!asojFw-vm6lGcT4JNO6uo#Z`ibWkx%MmZKaD)s%SkJwgEmzIM<$M#UPA5% zh@^A9M?N zBm5&E05d`DZNeL2BFyA{x>H_DzSfq3w%|7giLnnN#_FEjdSjw$}l9jQC;(vRRnpNn`ot#c=GWWr*T1mo4WN$Z| zr&-Dh3Z#s~>FEq0Tq_1uze#>w24f~(>$}(E5udj1EnXGdZ;UN0N|i3rwy!72K3Y1~ZS z$^KkeZ#qLhOzNEaYawyh{?JaMYBOAHG7*b_;}GXQ6s?3;fGQTgzYK%;Zv&NoWWsS$ z$dp0H-c|L}s2(T`e?xr36%5A4bAG`w^4a~5^RgK^nt#wHD2)a(P_qmppPI?mDZ~st-3}*)2RBto$%*J zO7&}~;pkpnY&d$l3jLMRg>GUqns-M39w%h!DJVDA_N*_HY)HjnEW45E(uAV*sS`~S z5ZGxvc8-V%&E0)6GU8CwFz&Qq{rX|oo`h(^Mx!*%NBG3A+F?mnHib8thpq3V_Z(6= z?+Ev$lAsYHj)`ZljqIz@MsJ`obxb*&{?@f=*(^k}d}haVJLCm}7E~g|SbCeHjNg>P zRCb`(Y^>6t`)j&~B{gT*xAx^*fz))kgr#fRN59Zd(A$=k>AZ4v~J($@Hnr3WM6G3L_0rN=)FOpJASCUy*NsEYKnFAxjl+LGiBS^uCGYO zDof@HGB>QQSdb-)TNP72O+%_Gt!|;hsVBLGLL6Zr${1IoSA-kNWnVQds9xNGzAy7F!Zxqew%h#yBgrSuOE!Q2!4!di&NbWNH2wC^z}r79U764ZRoW?YSYME_U5Z)Q%Ggo%*vwcwOOmo^OPn7M{&j zSNf#q8ssaqlW<&@3JFs43;1S6kfx=LzASF=KZw_>O7Z=G=r4Ff zdB4{va%;6gB0XKhc}cw=iXyw+zk^fdGWhA}Zi60=ftJD)RW#rB@vl$Kw$}C#-k{^) zwcXt-(URGU42*tJm(GZKQeWrW=LdD$P}Z-Xc@Yi}V;HCo2DUjf%5ObzskA)uXC!_s zXVM^-mZL7+>^L9HVLc#t-}JD#UE~#(;#j1-i&HI4Et@0_B~!Mo`OV?Aj{j<=+%jDP z_mYFk^W_vOf_vk>M|w%)4-RZ{`7kCjsHd7;=Oo+BRtY^`Y(mtsQ1ZMrbw303v}Ioa z(Q6N4`kBMby3XMptw9!oi&T#X`vQ2<(Cm#K77e(EQG}<>AWuD;>bHk7wmPPNLYZB& zCumdo$;yXWO=VDhu1110Dm|nq;Y`!H!~2T7OJ=dG_J(ek@fI(!Qw3>XmNR$YPl#=l z(VK4n)_?D2yM-gYZ8YgenmxIq=)5QP+Jq3Xn(<-o3A#njbk~cycJ1r-D8kfsOACi+ zlKW4+5nVZAf(lWKtX=&K`RRUP1};&+8c$}5a;Vu*^xP%%Usno0FM{8S;JF|h^OHc- z!=WLkmy)E2%By6Y_JerH*{afDM{Lq{24pZoF{CGu{Yd^t5x` zV-VEc*Tb*2gfgrRuLca|1)PTxKlnunF3p=j*AM%V#ZQ)dbttj9*cJBbJQwC8ruO=;_hGkf2}u7jlN)RPXa5FyqPHyXR?C9tvKR zEO`9sa=bCGJN1BjAnQxwyO_~`Q9jXVAaCar);Y9$@YQO`sB1FBCLmu1nFMcV2(LdC zf1@iSL%@)T)Tj3Q=8)IF$On~&t-Mx>Ty%3KG0zFZ(uI78OSTSQ!h|e?85<*c@AD3E z<_FdX4OKDZ^ge=VE5V`5CtG&5yzs8aQDz={X`HABsFF>a6(W9}iZo$t;KGLCRs!FL z+|8`r3vrjvzo$cbj?KIDZH{iv{_^P=$XMDOwlsMW*Ilf7ihlE3k$SgE#>j&QQPYz8 zLi~ZqZ>Yv-5p`0ct(lKK;t9J51*LQaR4( z)L*3dDJx-}MyR9bR|xrmz8S9le>oR&a!qxianT}Gjklp}b82g*a=*~h$j;)9vqClL zESDav9#56IwGWo+>t%ROuQtllHAj2%XB+jeD9W0hs8YfP8;|GYZu`agZcneN?K+b% z$pyJICXj9f@TBWFFOlqPzSQJm$r8klgzLysNA8{O`)=aKk}os+`d|q8-V~$FtQ6ii zwB6L<)+q{Z3;9zxr zkdI*vs!OVG-K(4)Ryf{FY2}bk;Vv1jLCh!htcqUYzv4VDpC@R`%YlwS zZ#d7-S5jT-5n9pc4y>kj*pVCUFq%Al%wJi*Li{3El`}(V*f+)-U6amC%i%DKDJ5C_ zRh}JHJSSmDnN6u5osyBdfoZBXqM!&}w#$usL z)tY}uZdB-7|6?Og8q@q;?{XCG$dKt^8SC=hrRAbWFRe5UUeB?wJz|Eh(f}7FhqYk) zc0K*rp24vcStPRLg>E2OyPFY0Gv{;9rAU535A>aF2i{YiD21nPAtAws`^91(!nVGv zKg?9;Vd9)l1&;xIrZsi7v%y9CH_L?_UMiI@_E2>tWbRuwH4syPKLou0kY zcun1nXWUOCQ!E?drc-%zOo{eH=u3_79_H>deEelipUdQQ?oszztX^4;tVJ8=Vhon8 z=ysOS`m0||@T`r}5z8*3s;I|QFEBO>FxEqFUCZ*U#2uvucWgT1u%PI;a8q%eF}Us9 zqg;WeA|DbKQ^Pq)*fEwyWO9LW1gvhpug!?{fJr?CNMX& zN4#qx;d||yR#AoZ74gfHh*-ak+uj_)1;+fG{tNZXmyp-U zwHH38yL~4+=ua)y{HObJ4SZfTGxeVAkG0kU8NW!L>!lt+SakDc2;iQhpT);nv7S?d zJPxUC{=PIZ%HvFw-ba`2Ym2TGHfYz>`tUe+y-?DFa(o!Z*DABb=vB96H;H;abSA)X zZ$!^gEA#vr-94J}X}PP~gnT1z?9@omlJg{&ySz%o))SP#(Shm-+Vomw!fuk|bZfg+ z-D+?5bzZ||y>gwQaXwSfBXmP?`RddP_5axzIdvM+7uP_c*kr)i%-6I zXIyQD&BuvEEsXRe$L*A ze3{#kmZlNV<*vu)u0oB!K7YVHsTK{WiU<5Z(gK z>XjS{<3M@i4K zaNuXvTGoG0%kff5k}B_ajmw}7b6uoGYs>z%yr_DGS1N5b@eGl^W2Clkf0;IEQZN_B>!UH6rR+i-$v0zMg-s4x7-zjH96 z%Uo`hm0O)R($Z2|49fn<5j7n42@UP*Ny~SGI>3p^BoR8M+qTV#IrOdC6btF5jpvCL zx3@XSZJsx1npA%-;S`b!;{EYS6658?O3b$Oo*h11-B9Q5YZE740p1)Q?H~^4cgcBR zq|Cf)RX^mR34Pnrm&q1@o}4wikg}}lFfBhM-ej3#h5y?Ky+3Z!;G?)G*?=Hi+VaPk zeerU(fNCEaS%2{L+aIJQIN#kg_WlfH^yJ?DJ*m%+s5E(Lqv1;!`j$uF+jV^0f&P%W z&xHqhW+sY(@GhQ!7L^xz?J2|d#)3u;@iTTBNL|P+t6EkukRg<@Y-DdDrcrcvcI|- z4D&}5>PtRh^cX8%)e)ORvNa7J6^~74I;C3LY3-}2U2lv&>W~HOdd6=`w?SPz6Jq+g zR;;>XQs)X=#t1K6A%-%55x8J9R6JP=1D7bBFiy0_Uvr4;yK9DiiUFhiT|5gdwxMD_ z>9aY#ecOq32QC+HJ7uzfH`&eVG33X!5qK6IOX|Z?uF`u`elT{yjmcBr`}0{08651& z^f3+ppB{p)OharB=WDGN8!Gt>_PD5Il6x-pChmD(lLg$!?klcqHoGuRn-@!pzTH4NyQ+Wl2Z!5>tZ;;?X5gB7gtzU@9GY4<7;v|fv zl6lX@7Hd9{7abeh{fatuj2aRh9gX3rDI+5zJV?!|XS-jP=uw>di(btEdO5@9bz`^e zbAM=4Os(7MxHDpWd$yHUR!m(Rd2be}@aC*jUn4&I21gPVJU_1)E=In!wUsDM1y;nHhUTAjt$J@J#lOOV zg3Dwy7|-}SKmS@Y4N8k~k*^+z#6#zS?a``BKtOPFF(K!^^-IldEfCl3YR;6$Y4=TN z_6PkAI7C!}&k70{8~stH2eXyo#C-AJzdu7pM#f_^d2QGi{&lgz{xuj}HZx3|e*JY$M$Msi{O%a_K{%*z^W{7pMKC zY~FWHh-gHAz`b`rtettECmx3TUE=OL3e!6-t^^dO2DspE430K4$o8d&MvWN;pwDtE zDt_){_zD`#O)oG^b6N;wOzau;{J>a?7khsyN>8mRP+2E3=sv#?&sbaUo8hrf3)U&~ z=@a~50`pD?b-MoMpXhKBf#mvS4|;yvlFRTq5=O&_di41Pm&&?co}E-oNAJMh5>9Pb8}~8Lh`2lME+LJOvgU@3NIt*qcvv9aTzek3CNw(kC~9i{ol?^q zMnLC(qaZ6P`r_&Fx;MH;m_UQfaQ!kDLt4rkwRoRxk zkiG;n*a=A;S`Wt0FSNfzCozKFT{37?1z46f1`VfhRfC(2!>l`$=DLiZ&OGf=SKqpR z=zmqGQ(}F(?0MX)tw+Wyh0k_QV10ycYjXTmEjYvPVKY|F0j$rZ=?sJrNVK^cbIjh} zUJ6ReudGS(ST95szDP-R8?gq;y*iq$M93Ho?%#m_?n`Eo95lKkGEwv6x~ORV`u_AD z3Q}Z$f1lgy=0hyC-1ZRLsL_0lxpWF==|m-U)lp@ceQ%TM`lZLf@NjNZQ`0cJUssp# zbcu$Di3t@`LKvnTe>9_3UBC|Xpn8;sfx(K)C1X_F#)e5nMMWWBE}cIqjJYi_5Cxaj zY%G%#f|G-%2m zfAJy?AzStdt7p`*w0){8VWy@IK09*=7c&gL7Ad*>QIGzXvD%qI*eQ4n^Cxj|oxNLs zQCnl*7TB3b>*VybBB(qIhhpV3hShTwnx(&g|JG+s`XVdar~hH~`u^LtrT+cZp@_?X!i*nUb))92`VL)`6cvSCTsZgk_Fm(C@T;k*A<>$N)ZRd@r86unD>Ioa zP*}V6XcaW@X!)(8tv&QFS8A@oo*Ww+o5j=YSY()WwBUJcCBp0CmQq zO$#WGzw`2*{Y*}t-(JOLZVL@XK5+3I+FQz^Kkdb|ZKrHv6gll(XlH~Vd?1KWfY{m! z7>4|3o2|zcZ~%rmGdDft%_ zJ=~7^_JQ)NqJllXZZUU;T-zZ0a`*Rd3Rnr~^ncl%uMTo``1=bK?(-owPftuINpM#Q zIj!E&(iV0P>blGsYx~@8G3YeKm6R|zI64}R@VTAnAGJUEz zN@Vd@k`wqfA` zV=8oy{{&7E?1R|iMVj~396vZIH-3_I_ig+U!TW>6^E%ynScvzN`lbd2A-Wtd4@Yn< z+ln^F*IHCT4A62D$*+5(H;rmDk$U7ObV^)okq zWi_>G^9d@D^a54Y)%e_Y??CW@-lHTh-|;7!+>j|FCgxd3Ag(UbbLNNrOAoOK0#Qjx zcX#&|=+(laCQ&FI3Ur z*E{o6PO~k0^entgTXJ#S9$JH5uN+T$AYn+AyNuA#(ykSkw;4P=LJ#I^!zL${6_u3m zIV`YlZ*Q@%u|)-b1_6M3R2pMp;l)lwDL5db-iiW;Of4=ft1%gZr5g$k7`DVb`)|0L@1BCPwf* zua7|E*CnH;4{K@R#}e&4zGee`9|YgRQDNNOod*CHpw@p@;gIFo^2Cb>YPb#!X!^Hs z2s;B%n+;dm-adoJ4({%ZXVjVng#)x&N)C=+U0q!bRcwg;Mqk#%-WL!W zdhM?+SzkYYb_0dCs>2eCBns?a(;rP=TH|#&oEKG8e5;|MF?;9&J{p>RaT1Rqj5MwQ zzShFh@)q1e8YZT^tgLUKeqo7{y+H!t?L*42ee>^Pix0037u3E_%=M%TcmiCQG8|M? zWVPH90`9}v`8f;TYmC+^WtHw@bO0Pr-MoJ18h@}~KaGoz53nofp0L2&?$Yjg)CYMVro>f6VP+^x&IF?Je8 z#;mrs^fW%#>>@gHvGC6-Dn-S`-5Z#Q$4eGA#xI`1x9C1a_iXhZUag+Gb?a=2ID@LY zcIr0U>d6JLQ#cXN+mzvH!W3~J$-TUgTrVmt{5qV>0h%W$E;wy<*pdtYi)4)A9xan( z7tKfCSA8cpjf*?zUn>B$Bk|)qSdr}xky4pD5fJR0@Fx(=AZ-`&TR23eW{T%E}@$$Xt}Sq<@1Xucs#m${+ah<|Wy8Z}^vXE)gSZet%~y%g)X+OOERFCmgGR zqn)O}!aA5Xdfm5qQZ*bh7`#Ht{jUp|s;sEU!sU=IFOTZ(CkNDDW z{J>%V+SZveYC|FTo+(*azAmbEYt=GpI)L+o04hcpBB*pew{_ zo}E4VXE*#ADnMih0Mbm~fk44a?1E76Cgnc5f34e&`!=9pPc**f*qtgMn|tW)qB#Yv-dvemo_OKw4<0G+UYA&JwPUjEE z6a01kt(Hkpy~P1qPdFY+vg@)tri_-DwKZcz1S$q2Q<`k>oRyeD+>hYH+`K&4;2e-X zgDnGIzg~1i_kBFi;H!O*;acixy8^;BjLGM2fYZ)cfn25V{>_D62@ zV9FV74<)@O=4IdZ%6h(g{gO{CKvQ#=vFu|?yy`B2T17ARkA`ucH)b}0x%s9B^`;fJ zE4lz7(=s#Xw6!sT4J=U*BR!YLqFkf|RKSx!a-Kb;wBE&xuT-Zw9#_|mY`uErVVi5# zinFX~pAIlMT^Y=PT%nYT*Jmf-fs|C=^fLQkv@yAKy`ruFk%~6O2<~7E6E#!yTzH)P*Q^O^M3IYqk#nlE>SE?J*{Dwa&kFAeGdx;Jz`)t5{}CY48Ri;6Vo?9* zor;iJ<-q*DW)~n-UQ$BA$H(_RK7Oz!RSk)(&9W)A!KUqY+pb*r-Fl|3l2Uh*GvvgL zALHc$0Ie|AA|^H#vvz3PQnPc%fup|WJ7ak~W5skU61kRs^h`r?xig0xA&UV!81hQA zZ!wtElp4Yw0aNouObijgXHeY$iY2s{JO_88blO zGGcOlw4`uM=*UfEZ;KDI)les)+#V!S3^-n&c-28QfIq2XX&0*$v0i{^7&q%NVy$g# zn zEFHTa8nXH~Q9WC+CIzC}rk*fkwEyOGgO-Lye|Ib^aoB_*eid~PtXot;z0tuqxNf3$ zMt2ZW-aayCnnC<%1p~L++pJ%^o-c!m3J6VtH}BMRoUuWy6M}JzLAQmQ|L}4~Z)e`J z{7`-gES+JmE}BiVu1FZ12gta*yu1_sfq{XwqfN$s?C0_-hkw4{&PP*Iay`8sS>e~) z^@iLE3u(1!j^Z8~f52l&VO%q{3*Pt%nEI?QM5K0eASs9BlYd zE&df3hsA&+RnPz8b}v6;`>6SNdo7ssX!0yd;0jMp;8HnZ0|d@viFigo*utNoAppT& zyyGWm>C{Kcz1z_-!kdS}{iecYtK(GvqjPzO5);28v?z1*G*F1-656{$1k_)AH zVu-a*V|$i#ZJT$x>o9T2$jF|ZQ-5$fu@_&jspF$iX3r8=ET3)4z30pWr5V8_QtA~c zIbX3jrrM7s8`FoI(?sb!JJ)lw5c)g0E+G*R;rh*4II55>O;_)z_y*zQR$XQQ*VAOX ztvCaYCsg8-Ijw+Y+VT1^lNT_)AwNpmh2m_UHkLLVYkK0}Hx+8qv# zYR@V=JA3_0ao<~Nc+qq^tE7tWLJL$SW=m@uwG9>)bcF@n(k3RXjg2`2Lqo4K-XDa> z;)C@x<*6kDYB(Ao2rEwdal@8EO0QqF;7^MQCn7E5GXi=-#nx`uL<4#9ENW-)& zEG9+=^adj^y@7Hrp$&2_ZvPjK8UV6XO8K&&bOoUjw&hh+yeXav%HEa7(uo7*piuaS zYf*)B7^9}^&7X;YV06;#mWMY~v5_H|{n5XEg^ZiMj*^*8`p=>~bjx)+2LApv*q?`tKkrOCvU0$I7!ny za(lPVZ_U8mP*)cZC;`B3bN$X$k=LmF&QZ+8l6S%#ghuSAi*iXKP4(tOmWQ)h^7jQk zI2AS$d~*?VM+Aq>Hwy62;Hg8`dyO361f80woZQACiw!zVsWLL^;gsq!;D|UYTuon$ z^a(2-@XT7(oqRd@#{%53k%D0I2do9aVR65HRl1*>c(r*`P|vK{#VM+)4tBtA;PE(c z7v+6J)@6Ljq3`eaN@i-~d>+Y66-(52)4XR``tGNgZ@}^ zB_70lYzotE=BH6Xzd=d&+?&iHJyAFm7hEv@#{$~&oGbwbZdId5(g=a5aLF#v z`y}PSn(EUOs(bvYT<-nq4CYDxPp*#OCB^S~#r}RMS|2~Lef*e@pwd}toKq-9N6?2c zHl%FNN`Uwgo}GO-MEBTaEc0^r(nnEoAIvBI%LvcMHa?B>?{ZMLU0Aft8NVKNV9WUv z_-Uu}BTw5$j-uqDvQeQmOEuOFxjV9}q0ZMt+!Yh#W-u-IBcc|v|O_&}_F%}Kv>{~+^B^^*m$EE+)v#~FS0rawcA-?H)E{UjMO{kD2`6ZLR} zz%Q=5yy`iHnQC+OJ-e&$R+lRGey+k$K+9D%CM`|I#H3;)$SDd}_($7JcgUd3J3F|r z+(-;^B&yi>SCnJ>Tehdjt!kgnpN~D$zlzIx@iBiYlU72UL_FJ|nz+l%DK>5sZus?n zbWd)bTW?W6`b|gX_w3HqNjM)RKNUW7rGH3F3H1DvaiBi5&E$m8zxk5g=7VP(j8<`4 zY&%fl`De8BMLU|;oj%GR^qXg^YMmQ_AN~B;;CxOdzwINKVi)+#Hlef#x|Q3L`wR!L z)DomI0UfAWLgLDK%nrpf_}xrfLIwev&7ySnoGcwQt#X zV=ugn@`ali6ANnK;z<00#7?+}3yMe*Y><*izB3*_$MR3Qb(8}Hd90DlCk1w=rdzjG znU;rr&rBW`^ObBh?b$f!+C)Iozz24aWE~19wYBnUD7qP_?a2XZ8UA{v)I9BeHC?ZR z!qWpdC?kO0!4&ZpOe5KzmuBm%Nzz89J7crEU3-7Kr+zDF=>%yUQ%IDH@@?MZ#KWne2rZxIm5S*WcQ;%(4xz>z0#IH-F?`4U!`9G{9Q&6>CPy}k`Z(r0 zQMsGshL~RbI#_!MzZ*MZ}6Z+ylHX zAk)Y9oIrCAf&jwp={DmDu(b+$Y7!mC-G@a$mtJ*g9^d;oArgwriH%tNhUiZI<*xh% z6)<|#k>||j=jH}xEHfY+A(Qot=gg2;#-yf(4`4~7>6YUr3C zxY%zH%gRRyj!_op;}3ZIrR8%r7`gxc4W(%&zobwMhNZ7_mJ8?=hu zxubxJrbc1^>i>AS%mhjzOoV1L{)+`!4 ztD>A~iFRX5cJ_OK5^*t1ZLJB(K3~V|Ok8J5F}KFy>Ul-qA2p+cM6iHqeK4^oo=IoE zf84ozYcS#38Ht5ayWuC$4S%MmFVAFwZvG88F2)|A_vGp6sYyu#i;a%tF{(i5O3-$A z)!5iLlp&OHcXwA{+?z5Axdg(*d(Z|YzkVef6?)y_q)A(^8GJP&EQI_PQ3Um2A>xX-;}q2iJW@d1BJ{ZgQAS& zV$~nr;iz%v3>X3&Z%)<<&KH5=49Jp%fBzI=8X1Y(>Nm8}Yak=*SI^D1xU-RZoqW1! zYXSuS$>`W|Y3un2-=fomOk7-C1xzbxy`28B2WWqNpcOAV&*%U(iTG9dJwRR>?LGoh z@eFIpmStao)?A`hAK4p*>$sEVN~Qd?`?+Oq7Ur35vV%cPY>ta6DTMs z8r3GKNl8gSPLbt5{aj}?_w2bAN|wKM%Pmkc)LT8ACzZZ34w^-c?vMiy0U(w+2Z1{R zfLWlDMmAXux@$2f#KwvMZW+k-Haw*eQXU5iLM|H$9v<%PO~9nTohJ$Di{HJ%7QQGQ zBvFr|N36 zW*|AJ@I=1d=}jlz1!*axX3C=GK}_KbA_;AQ-FPjVuK+WH zArz?YFq;Uv(8Gs`JQ@_g&Fp# z>*|gi%vG}_Nds=89iCUv!dI=Q*cWJfEqD9HK%exvUsw@iNZ56eQg%(C4%p?10r>@- z3t$Z>rfJSNU<6Hd-%gsGnmPs95x4_jz2^;(@bP$^Xl8U=i2?OvF?<);ICQ4@ThIbcR_(DEjdcp4lxPt=HF>oQ7?cVn;Aocfk ziD{a1m|8Cs9|6H6waz;q5Hn4ipZX8B+eotfR0m`^!CRx|m(Uy@duMSgnA2+=FWWqs z0)US<(6IkLg#P!T&vi{XYte798%xyOHQjhH{ zg8)x}K+qUBl2{DI$|sY)Fq}@e^Q|BJy+ZB1eK;TOUtBqEIY-OS@Zsf5K?NEWZ~*}Q z!m9qjZ6)jTU+IhcDW$unNApq&V*7 zCWsBeyhjf6=K0Y{Nps=~Vix$L;L;wGJ#Rj^X`4t$+}zAcd0UxKeB0xQlb9YgrG$2WBGAr91g^CiaQ+jsU`uc?&v^rs4lAK^iEV^1J}zf(Eeq?*@6}Xb91bj z10fNXH-IBE8BGUFn9OHr<+_cnw^rX=)n+%gxP&19~W{%_27eAt9fRNsaaF^7STQgs24s(qiQVlg`f0 z0`i=VNc-rim#QrKW`q#F!^>8wYn=iW@GnS&v z@XulW%E;|bh8)l&fUYe7vd}ff9ms7@*S=5vsXUHd8Gx6u11#2wc^H6FsbKqYfSHC> z)@9!(=nqz)L(=}Ygu+_V+USbg1}YAt=4a54!*H3mg9vSYsF#7&fEre@q^{LJ@efo% z83zYeN=iyEV1x6zoKjme55r-EnGHaRu?H>Gv7gwL0?W1KG6F}c#G#3P0Y z;>T(tkGj>jYOZ~0rrX*<<8B1SuMkAnZSa@(Z*OgC>(N> zd7?MlajBmFBUWnC-gR9P0``s*)IXuw0j|oxwxm^O1tfix{0WJ#U%%dzo5IBo1OV$I zGjkMxSHQ#c4h~qgq&+-5ZcqdrHoq{nKREb2Y>>ugWRNPj4&DK67x-6HR2F)6&u=T# z8J<7;cH*E_Z-Yt-itjvcdb~3l0s9YN`ihN?9?u&AvoGNJVP+Sg2m{+fV0m{>7~k?; zUs$d)&l0hz=Xvd7dg(^M>^)!4o)fF*l@*}S1V^|x!cTTU1^%d_0{n5zptSU`rqQx# zT9J*nQKJR>15N}ek2EwiNP5g+T%|epA5?ix+Y(N%yn%5B7#F~8deOcT1(=J`1&7Az zV?!v(@ssNNg+ey_ApYCUSQt&H0D}pYbH!A+1GLDnR)hwvdurD0obt(YQj!l zicRPjO*o+XP{W!Kcr;B(UXZf#^DK__D(=#{3UBtDnLdX@T}-vjpBSHGhq0=cSKwKVjWw6GOcV-$6D zNos3r74m^t9Vq7utN=gL($eJryRY@VNN&tDX4Ta3E3OWJvw1+hZn$3dYy>c2A+FwO zPZ5Vfy#v_J7Nj9&N#h2V$DWFMdZfBLsi~=;a5$0n(dD;3iBuYyng*8#g8-{dBC*JF zGL@oSb_vaG<;EPJk&t*h!(syLqx?YBX;`uW>DmoUEw4I6admot9uqOK*Ry7Kk}m`e z0Voi@ljJKS9|@c`@P)O2g#bw>u{6jG^!r3US0~ zDD$$g90|?`aUUg4;{F_Tbn+PKQKlvx}I8uQj zEsDnRav$aitTGuUAOY6Vfc40_wve8;a;`l|f4s)m!)x2g-1Hy8WHB&0Dy|TBg7Uo; z*|zzRlf?JI9xmN&{naBV>F$KX2K0o% zsoW;dn8B@e&>Vh^0L~U;6n2#6TrQl=6Te(=(1pqg^SDP^WgS)me79T{6)c8Jay?8kp~PFeJ&4m9osAO zHK3^2kgommt5lS;~kMP}43*Aa2e7|9W zx$xmB+(UG+B{hMi6cE{$&fMN~U@!%fB7Bduu7fnheaW8TKyiJ(&6^LD7>?vT=iJ2O z0N_zRI~!z{T7TPGWc;rQjA3`Yse+fYhEebzEG7#QL!=_j1@K>ry+)N@{+2-&gd}L$9Ux}vLATLqJ>v_*!ZdVqOLr5K$^LQ6+`M#qPU9UeWOx+{&ub3t*y>M~Y-uyKFo~)Bv`VT{x z^nGDr+~b$wn%m(UWs{i{xwx}#7V&?OS*O~3h2-SPea-#L$gyyD#`7ZF!3;MUB_qKR4#l6S3_dEk6cyCH zU8k>JdqJ52T^dT!YpRC&?x$JHmQ%h>Sd}c@*?UkrS0}Cw5`RYWiI#Rj4?RiPkt|0@GGe%AdzaDMfuGO0u%hzYU3*)wQk2A}c2tg+4wWe&k{nXQFA;EP3~}bNbz)j5BV2MRg$8XW=y0-irZK-gPp7Xp7y^Shv+K-^G8u3y5G zC#_-La&~2;2=6{qIzlwN?Ni^%U<4go>d1G;nbmw>t~8xnvtL+hT?O~0UOtjrPNq&K zV2_Ra`mco5YDvOQ$xiXSBOXq7gd9ff(29pc83xs@RbQJR=;=aZ@TpBJma5X8S;Kdt zcK(i(p_~@N$(_7pP6Rl$r@x=gdY-+istRUf09qYTiPMVJ%6U`6z^gDz`HZe-1nAVR z?kmKt#sAjsVxDdNp;n-xQ1UsTh_}QYce~#p-4;K5X<2Z4j(oRAcp_h1$Vij_PA^36 z%+oE>^DTvF!h+XEA1cfzo+q6oEGvtK%dBezbl8^DK0*P4Vh>(f-eU2QhQGyYVoA@K z(O>z$l9aaDjPELB_>kBkZy)BPE91Xw6&V4=Kat8x_R9ILs5HaZtDvRH40D8#k$v;? zgM$$efN&$4K0iBK2e>;RD2Ua5{WGv4Y5P<>@5CSOUl$QX|EikUNaCF)^Z-Fm9TAdI zaK>n6J~SC$@LOXn1&^NptC6$+XL|4Bcqv6qZqiQ3+*7e? zD?;K}SU4AAsKv<5N$%GXMl2*wCx>!O$W2|HQ5qsQ$xRt@le=Sx4arSqo7^Xi^WHhv zA8`G+eIAeR_V_$LH}BW;{d#@T%~aQX<4waEqM|8NM4ZySTQVuL`ra<9r!}+0@_pZW zJX6?gr=9IkCw4%I@D6^V+qZmWWn~t?*E~1`hPVfe!c(+z!bNIHUEp~C4swUs_}ukX z=p2w!DJ0T@NX!(}g5AxDL2LqaC?+YX1%+)d`7g)kC3qQU(n}HB@}#zEdSjZK%3PCW zOU)kdG^FP5C7AFVJ2#KKn5!&vPtDr+rPoz-0O7hB`mq4bNH2D)&w&7%5D`Q82i(c2 z%!n;owmB1RY1*(gH6C8KFYQvW2vR2eFuk~v?wtV%u;b7+)NB9rE`tgFoQvf9@8+p9Qa}1QbZKo|;aL(S%$+9QO;zj$(vAOdHN+&oPxC=CcP~Lvn zlC=TZ%mm3YkEUIK3C@F0L)*E?e~tp{09+KpfRVbU=Flh`oYq7J%{u)EdGYhP&fHBw zDH%WhxX|NLvdiHYtysM*GqNb!%2L!wZt(Rsl^K`T%DH8?F`8qHy6*6OH8nN%11>^I zDOc}L%BlMAQwnt3+~2dZ6!vQV^a1qP9!as+LhI4&tUE}E>udbVBPQo#KOnL?em?rJ z+Ro!0=4`x7Y5lvSx~>v@$$Yv2c@5vm&fk^ z4uX;b00`XiLQ%=#aFCeG%v%zlLkvmbW1`?l=YQq1E0dx3Fg`gcti1sc;q(8U2+kgp z?oq3NxSOqrv)C4yQiPry>Oda7Zfk`i&8NhwAal6etD=Q7+BMDESy)iuQ}(W_tE;Y~ zv=j@N&7W%fgi!I`ZGjpY8L8He9T^z`#B11hE66d;i(B0}W(u`2>j=;>jBkKK|~>V*HA zJrs7?82{>;w*u|BiThwS?t_5Hx)-}zYIUsd(MxZQ^H_(Hx&KUD%j#}U3fjcCDNb;? z)>p0^f^(hU51tZD4Gp1MMeI0}r7mFCJ05oYjqHAGKMzw>-r3mNIlb?)OSj(IY6MYy zxx%BY^~hr?x~2i9M2C&c}s)w8K2pnTg1%Q)$alK+#= z?mQ5!EnG>^ZwR0%=?C8c=KQq7g>X1c2o|9;8u&7`s4z;S9b4LQOJe~+V|lHLp7>aF zmFYsTA=#Wh8Dzzxu|8f2%%cV(`wE@xBBv1Z#g>l?y&+t=XRVNuaWV*n!C)XjlbV&q zek5R+ST78~OfMguU|9ce8w@+@t2N^&@o}NW75Q8IojV9p)RJSuQr;JZ+(Cb#2M$_IgOfY0rK;O{!td<*-6JtTOjg9; z*kbOPL9EAaapvA&hbn{9BZ_Ide*Lpxf0_q2=ZVcIfDBnz>umJ@{uA%9_VqSllK5 z;p#L{Y+%J7os2ql&G}*Z^DjSf1%2Bk?Z=*+^E{%H-|{*BQx<#9Wz#tRb_~2qs@rjB ze+XZ*ueb)+A!*|7=g+&EO-$&AUpzDW(Zq!x?jsTB>gTDWZ{+Flc-+R`NXBsu&s3zKubi>H2e_eUjn8ccI zk=pkrx?YQ6?}-*fDTIeEqW_tp)YMdisMQky&4g(&2v{X7Z2`1uNg&ALlTqFfJ^uG> zzt?rBpaS!KOly> z5k|&L-9dQy4HT=Io123)cPk0|N@`#-DJx?MAR?4CG@3|Sus1AIH8F5+-a^R5l8W<7 zO1dwZ=uxxp-#-gYD>!DgjE!?3K4$aQ(zywD$ah_aGR+xiMHeyc9XdzKpDU6mqjgb2 z+5oK6;ClTGt#LJu#9|F5$~`mt)4pd^k`)+SD=Qz^x6q}dog=@}%P}YW(nM_XR)t6m%VOWwze9|=>1Q(=GnB+XvJ~r!O$8`1EW{=2ku1~ujya{WSk>zvN zyQNP{_eR9cB*uqLewlUnFZaH@E1r@R%k@rDZs+{quJO8XV_+#e=!~W1uf6<`ijCnR znsSI!P?gJYPyK6-13yHMZ0aySA3b@^D_-Qny`ddPEgPaZ`bMZISq|sHs?I-;C*7?w zJg%}{?zCQBzbT$N!ubR$QI#ydd2VJ2^S-Bx`u0AZFcKYk@8&bY^30Y`xLQ?m%zY_E zmDRJs<&jZ{(6@5wA8JUcRX0!V-D?`0mXabRjJm_cI5SPJA^=lVQBf%hY(CvJ`KvY- zdk=DVScs41E6nH4KtW?>VNqQz*KoS|?c0RJM6tX>!K3Xs94;|2vBYFYr!-6eDXbBf zFXJ2%@}gFyfp2bMF|=kaHG`y5sasT4Re9n(($x64=hwY>Gog@`-kn`X*srLF7AaL; z^w`+gsFdi(S*y~QqKD@v5T;VwO{*@NeU#a5Dzz#LSCXmJO=ENQBk=u0Tj^h|VfeGd z|2O;xGWq(|fiD^L-=7r@sfxuaiv?717ty3jiqj?TF8CPRo%MdNGb|?OiZk$BDMK^E rs}o|yLB`4(Z4ZUR+}d0t{3?~Z)#_%T_9`|` diff --git a/doc/en/chatwindow-emoticons.png b/doc/en/chatwindow-emoticons.png index 9c05deb2a2b9e11636e0aa0eb23848aaea7e1153..900b60b6502cf4eae80e58e20d09cead77c4c082 100644 GIT binary patch literal 46082 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 wCkKM3C86P^-~tVvIX6NK2!7&=E0TB3f+f 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%0A7}T51C>8;Ei%;Wc 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 z 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 literal 70872 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 literal 52029 zcma&NWl$Vlw6Kd4AV7jU2?2s@kl+dKI=H*LyCnp73mV+rVQ>u&0fM^@GWg(M=RN1E zd;i?3TT~ZQyLGSCd+F2RN(z#g=p^WHaB!H?QerA_aPTl->v)9%jBso=BLn|XjAbRo z;9may<${Y7fe|!EDJ>T`I1Jo>8$8_4Od?i;KOmfCH_Ecd6`<4-w8NR1K1_<4i@inNX}Z4WS7){ zxuvhRO91}wq@LK!{!UzaWYBU=@4i#G{@ed9^zp0I2Keg+GH@akanPu`8&YuyefD;t zPWjPNpR(R+uNaANcIlcGsc+$oJ9qnPw;koj2bFigQ)CT7s`?-mMjL_8wi zBzc|uY6S08>IP>{LvNGJ+Wd&6us{hXUx{>9Mf_0EN&Fk0=ce8ga>hSvP z;&H;wM;qT$+FC2hY*A4p{)^q`Xlh2W+ewKS-tPs|8}w&u*4h6i_NHOcKdFFaI_bM_ z8{fbC%rkpR&l;mdkmXXl^Pl7A$AMa{;7Puv_2~4dMdcw>@#=!kdjko9iGCrZ??7qm zwM_a{%%qq0Z(5Sfo{#2ulGOZE!p3P&I1OdLruRzLB%Mgn+27~S+0^bAHXZ&p-F(`X zlCE=JAIrzTr>~-nUXfLUmMc*1GpmM)1A^@b4+id zoOXG?%lFP`uOip$cu7_b-g;haM)h>xZ0EHd61Aemit4puMLXg5vQ$Zp3eoJRBB;%* zFT~tA(es%fHSm1-D*;giLoHSByl+_DzD&enRNYfO zSYRY+=9#K;B8np!k+0{Fl5L`TU)$9^F=T_`=>0fewcggHlE#M6<7L-l({_;ExR+FD zD-fNXAb}5ZcaAC>w0baOMI7uT>g6Td}ZaX4XGBCISwaFk~W9^ z>kLOlb9x{G#P^&@*_F%*2|C~Uqb{u*S5ePNCZjr(;h5rvqSRDLf+tJWldTh))%Xm~Rq&!+LH5-DxXRG%A6;y&8;H=%&}_wp*No&V6I9<}s%PG7t5&tF_Bzp0~@t zvB*vP?gx<^kUQ@1uk|tKq56+@T0$&7^kq2RhS6Ase!kC>U)LS75_`YvNls^cXnnYl z+scm`zv(+v!#}1HGO-PNhU;o^CF7Yq94b1dqIeh$m?r6~87#_;SEOKJoIf+!3w?fs zjONQxa0hbnV@RLPca3jDmr3h>)Es=Zs-MaK5j$nfaTH!d^0UIAYn#nmHi>r>4QanN zGMmMDdUj*p{(V0HIdgGCPBnyf#x%2DtU z1@79^PZKj)Ht@}xX*j;~pfm_bmDj%IUGv?ey)PUzVHK2;o9vOl$YkgEY*`urhBwg^ zh=rS#D7?7EZhlLV<3BUAnmB~<@=Tz$z+3cg!_8@PBe(G$BK%AURv5jE)g8H-E`2mP zbno4oSrSacG*;JCk=OL4G}Vfgm={HQH&SvWJ=r~59Uy%gkF(}=N|3Pqp_Ebht6a5_ zZ>nC;^Gc@qgVE^=XYH|KVo0+{*-2*#)9h~CZ_5PZ|D1I zArOWb921J~1@Qyv3h#JXr{B3r@3@ByEIa#KFchD=%cGhgYO}nYcG+(y`$&9xdwbQR zs$->SL*UDaEPi0Ks3Jfhj(OTKlQmEl64Fwofld3{oBG{vl99N6f8Q3F*bx(J58Q>b z%B`D7eA?L4Asb3tljA^MU;l3)QkQ9+t+-Dd2DVIlb?kzzhjr)u5HAj}@YOhHB@FSy#arEI^=L)1p zeFT5j90w+A7vcUZvKdR=WtAb6=kp#u4(|b{Gu9%fij~P}8B7v86Gdq!FHC$cd;2b1 zx?OHUuc3=2F08Jn2kt5o%AUg6Fvoqj#J?^jQ6FDgV{X;ScJ?CcTU?hmBp}y&QV9Oo z+FtKMx8!Ey0jFpu)n!4nUh`RRWCV7k`~e9drH~xfhhQ zNsGfD>g&oJ$ypyCBr)1Mq8CKtfq0sqchVkWrlbursuhku8BU>wffjm?C79>V3%aXm zSZY7|sV3e%o#3`Uu&!?^{iL9@@kn-tbQm%D2H=uJH|cFV-W6ngPlvbS1ESQ}Y^RQRF7WBxeVkBJ$UhQSX^}W(I$j7d1RLL`iw$aj;WZ#S0RfU$%@~0iab#H1MHfj0U4$X zw6VgCE}V+nyq27?oVL8C&TKh*T#(%3c9*mK>G0+a#E+H6Iqg_r`aEU- zvq~02({-uu*vA8?inr*M0Y^FODyqJLCH5BCRZzJnrTr^h^ZAPx`-}m`9D;`SnBu&H z{JZS{cj$u8N5Fp8dmfML#$gs;E3-H2uEbV%E-qDk%xiQ?<6ug+DME2bMM~Pp71P9& zqe$s*0g`O7V*{C8`ExSdR#N-tcpS8W`WI3Zi?}Iu8nNX^F`-%3K6yZY*6iB zks+I8lV>1VwX4fIh7GJM=bEIeWVN3Y&*o;&lX0_nA}EK{60*3%doKr4{;m4ryFb z2-PbKHE<;Ag$(!>wPj`-XfzdnSs^|0o9tbEbbH=VU!JukPEWK~wJ`8u4Z~Qzl_14W z7U)yI7++U9yM1#uY1ja1!@|y9*OMHmJt-**rXCUVpbVTKqHxa9AUqx1Zg>wFPwT@i zDIXRE;pZhhm_$ew@Op5)>A1D65!-G^-K-3euj+|V1odm!odD*;O(5>yMfmA(3yj%O*O*P z_e?DKVEW($M4Kf6teB&1m~JD?PeF~kf$ziKu<WY*pujSJK%oZ+uzCLvhxYQk?p-6kB)wowlL$rYDDpf~N*|TB_o;N)CSxSzK(4#mQ ze8%al(0*w(9(-o$zb@(Xb9sJnXlF^Ir}G(OSj8gm^6+z>maOZ$P8WEk1TisP>&Ohu zlwn+!{qO73(M^)nrkN>OQS=?Vw>#O{or`V>q4WZsve+tG4*hwG_AX$B7r!EZAetv_ z-&~esjozj5b>Dd>U_ST$TY82gpR~C(GoSZga6L zv**8j@>M6RYf(*Hi5p%B4PTO?#{R#nwIQ>voiG6FCz!HfI4qy@+l%4l!>{D^{$P&< zjqrS_e|c;$C9#B!oGgK_(hA{|dFTPne^>K2)qNRjlAvP!y8Sxak1VaC)pdMrUr#=$8s9?zrw-ACI0M8Jt=rgh831C>gRfYrV4oy z%_|hLwOM!HCHi;2H!yQLIy%GCl~!HXY4M%Cy*ihD1zLs7VTXW+WlG)cvhwl_y`|n% z1Ai~|BiB{81*iQik2z#gwv&D)Zrthw171KG)(8I&SUsDQYa@ov( zs+*cHHS?gs$HyN_V-L{>d!P59Qhu^wcXtD$V_-}ly8c>cXJ;SF7R)Hl_GW09uy1y` zp3_K7O6oUD)swKZv#WQrsW=!2r3cqCfoVJENKKfF4?YyP%KKK>a=vOxP z^{{%@FRTT;I|`z|GhH+I9+rGY7~LAJSngpkPZ=4RIJ4G)Pt()W?|aU@!PGP~%AmO` z8g8MS*n$FT21dq=;{`44x+cYO;SV1|z&^LepGZoptBWlrvwxiw&lfU6kZT;)g$S6n z`-^k@WdNDBTu$((^El{R`gHj}X?FPw0$OR&Ws!&`5qEcY2b6H)VY3|+ z2jjs2f~KF}TMz68T9YU=m;Et>I5;?{hwZ*pFXWe5AKd;D4Qn|p${^w}eFgTu{;Hf* zKmV6=HK2L31--BSEhqE+iL4cmb-xwoQRa2o zfQI5#H#ax9zqZ_f2nYUCG9M!pTkz^lz}=_;Y$F8Qu~k=1L!;hun#vy-X|j5$tK%qA z%!$#j-Vgtn4fjebB|SZTy}aCQslm$k`EK7+fI{DM^Bcjen;DqGa|2%J=}MJ>fdTsP zghxntc`?e$>3wye^t07v|6+pwY~$SXZ-*D><^H5YEem<&@}E-GJK&~JPl3m~$pHI? zlbdA+i{0PJp5V2(!biU;?RLfeyZxM@UFUOPkIS?;VR%3tVAfpKHy&=!CVkGpLwVwn zQi_WIL}k0wP&yY_qUv>jSe!28$ERAXP-xKQ-#<90qN0M(t>XY5;9Ah_TWNJ^FL1K( z#`5n821)>X8CR#P8Nd>2N>kLBhun6(2re!z{<9c6JEleQ8Q)j!9j@?t&-`!sxo!W7 z$jG33ta*LJ{itC3-wcA0F*NH;(TItO3yO<*TA^OYwL=GMV18^N*gL@Rt#_t|)Hb^3 zOvJqxJy@uwWK^%%n3kl(e=!BjI&ZW)>LQxIH=vIDn-f_tue;d1PCfD~I>2lTBP(Fn z%{JZkd(-;A`nX1EEf^qm-FDKn-12xan*PZO$D!jKMN3O-f7KJPzCDWR?r4v(yVQ@O zmHXJG`kdxt8y;N`jZxNf4Cjk^ebO`dzRML*1XjJj)RqIL4j9A zvr>Ipbw4eO-@}+AT}<*-|2ggbmv@%9OP9(kvcDN%&Z=m0Dy(B%IxUy?rIw%c0-Adv zW!vrFG&YlQ)1CLfUP)YH=RNrc1m@*gXDYC!r?2v588|sz6DuSvj-|V7YB?+v$$wS@ z&2eiJl9NyTtwo&35O$T{WU12ti-NR>6C@B5LL*RI#6IQw-(XNBwmlbqWl0S)8H!O= zQ4TRUfB!2lnWlmk1MQss>Nwq3eaXA(H~uSs90Y770|V?g&T|&#=I$lA$H$__t3Izl zcAEJdj)o3(b@#pw(Us*MHTKKzZx%v7e2fyyXIIs3Ky6=DP*cMjLXXe_e~$g-mq*OU zTR*!?{&;aKm(CNUXTWMckTJ=&U-dEIO^E-F6g}XIO`qyD1FuwB-r+s^BZu`l zZS`8cG4MS<(ZavOXKXUApL2OQN#)Xhxrb0HYwQ~iMk%lByp-v)f^6nDZasfw3z37T zJ(rMEavZvzQW|X*I9&GRB%+9d6pA5^UhrM1AJ#j5_neT1|KMQvRuRVW#)8XwD{ivU z4h}b^9gEbpfIGjazs( zX`xI*M1;QkW(CtDJZ5_+HS*BD>+ew;I@W5ljqYsn3B42=HIVfVJ~2C0xvaSU`TX{n ze`Mgv8=cVyr45gSY>V0f{Jk-qlZ27h_Q|V_<22k^|EUqfMy<>LkTizL#5T*}|KntX-qECIeAqpEJEKX%o{IaqAb~$RuXy z3@;cs>~y_6QIc{W?*yURQwf5%dsWm_B<#Q7tAqP%;17rE#yUljZH0~ompBu5jHZ)# zsgK=q%Qnu-kmSOdCY|z|X;o}f>6z$hxXUj;B8sEsCL_|hp#~H3&xx0m-G{(jxL!H< zfgzvDOEN`7L}Mw!v${g#s7SVC>wYN<`weHp42tBH7Jtvd#Jpe1(?7tWZS$1h*;WQ?f$eGUTlfq z>itR$&IbH?t?eSm@6k~pDxuKO_o5+*{@&XgqxYC>|4hoS&SEk#>3xxsAHiXObBVGt z7U1&I#}=EFPOJq3rBjg_h6GAT%zbluGHHg+Z&y2BiiT@(4SoxweZTi5|DIh}q!nY?g_e@`Zq+IDt` z?As14E~E+>Wm*vD5_mRqc@As`s75_9-6dF?iKw0ol_Fc_V1#lhnm zm!3_p`jJQB}co#gsx4X&wt&- z(3@v6d6&Dez<=(I_-F3(R|pn4U(6`}MlVKKjm?4)6_s(@&R3wp$YwGqW^Ds0Eq94a zbjh{p;OJ!7lGK9>Zp@AsP3x8*-&|BU^`es6>J` zWUb}v#s|Bx9wjF}H^)P^Tt>A>sZd8o+I)De1iJEuw}hnMR`tUwFtz8yrO%V_@s+i# zK5%oF_4)Z%{k98t%=!&0NbEhi4S5Modr;K!E%v|7dc3+*Lx5KT;e);fYV2ke{=|AL zwy6OfcUuce$dtV;mK{)U&0(`4Ldi$2w56rtLc#wqAikTFs)kFP7&CzLUJdHow86iX z5^%TcF%5}caha5-rWR8Mfg+iB0;W(9(2b1DPutHVvVBhF|JwqdH@Vv(k+P$ARZ_;i zB~AqcQl8XOKccBC7fc0&pl|Wq4dAG|A*zmZZ9fv9{v3|k{^n6K(38#V`8NAYd@yp_ z^3ZiiJAeDL%EP)deWSqC6slvJ>^@GaIwJ^LzAGLArViM7%n zeDN>JYIx$}AW#QI^4xmk8O*gbf@19dvH=&W~Symy;#o4VYk_g~$YM4`Cck z3nD}=%Gl|>ty56c)#V^y#3S6#O-4022)@kPkfei>hv&T<*K?8atB;NI7(`B&6xY;b zI&GtDxchwegnA}M23gHYI9^$@bL)^V7zoD-zua-9u;}$f^Gw*NdM$>b6A7E+Jekm} z1m*=JXv*W1p=4H}Ov8tb#tv@ME>`R+rKhiaMe`9%drezrO%6MHuaY0CfR*)S{>ZV7 zn%WNfb-*zCu4m<;tlVYOv8A-qt;TNI{}T!M2T611M^9v%g;Ud`Kfm-;VyKZ74Hb$> zqa}d)vC+ZQ7x}zXejKwiM`WcA3b^ms!J8on@|7zl&7XwSu~3A^6YYzDu56QCtFHTE zntL*7N!1|Oo2zp{zt0)^uBe3W_2vEt#q?kt{DBl2S(xQ0K@%Zi{j#~J!zX8mT{FAY z47IU|i58GCb5+{=i>N<-Kzo_4_WP-m6MZzS`A@)7eR<^ zH)Tye(xYV(Tvz(-=KvTKCx$=4YxmTw|D$-w{Es!m?tLfsEvj0q5dARq@-H8P#Gom1 zm3`qomfg7vze>^qKE`f;6KY5yC1$rLsH;F$vu)bmF=risl+y|bkiT+dav-#_a-ycyq-R(XuWoSK z>U_Mj?rG+Uc%D_%NQ{qH(AA}GY{X(|F;p7PnlDey(QC*0hBfxtWe_1QB}GnNeo9Zk zdB-t@No&nKXyMScMbKYlVMo#R-l1z$GHR|nn~L155%bjB@u2}mZVvUH%22!V)=PD* zTIVBcUXPh&p0*jjq8$5YzMc34|IG8%EDJ^vCw}?zg%~n_vN0q3F?Ye^6k*>K4~!8z zgzD;-1fDI;g-skUQ3&wv7R;T2&L8lPAX)DndS?nVmS`^AJl4X!uC1xIwx-5^ezTt- z`^3(kJGaH>pSio-bbc%7!$$OaEK@K8$e`a45PZ+0`!hGEtfKN&Tbtxxrq|Z?^XE^J zgoK18-RHGiO2eq*uXoh&3kTL6-iS+oh`g6<(&h0A|BkqLm6Utnnz2o{XT%1qU!o0g zGskbH7(%m1x`9V(Cnu*c$aaiN+LO6FO@}p_BBK+rMK^`WS9e4_4m`h=fy_u6g<5L@(kWAikVp-Wj%6Viq?id z65ifymdu|&qf{>pRq2Jb>?9<Xh%ueS?q_G{ zaQl)1XCU%L9sihuIF=RGr8Z|67rD&x{w_)ip3*)iY5@XCm>}o7wRc{7N=f)hy|?l- z3TTo)%YMFkU4Fe2e6TM3&16VMtJxlvXY~_q$S)T{9?X>Rq3tgqkSkwnsYgCW-f>oy z$gudjd36NSuQC!-EnL3v7z)8$Jt|5~@Xwm4*H=7iuSQ1xoUViq*h})5p)q9W#*3p{M;iz>~> zo{B{LF$c#x z56?x6Y3Zi@Nu*^iV!*KbVt%dq^wt9e zLZg$(03$@?DP?x0Tor65X?!tVp#vI<)A{_KPmM2mC=zZ8f_c2u*kz}2C4q6S&TJiNZ|vxaS5_v_uWgzs zBtI2R3713K;kMyc>WQeGkoTT`CM1t8>-29zh|XdyOnqzIODw%y>wbTk{%_a554rBc zuQ@e)Z}R1o1*c%3ePh7%lS(fHnooX$lC>Q5H! zj*dJJ2`gcd!DV31*$+Xk^JWi$^yhe`HL<$u`RD&sA4^J0do~?Ijd5N1$j$4C!JT$b z_QEZ}2hAsGko)dVKPBDQ_B9(11`{)m5WrRy0mYsMv9J~vd!;Q?w8BKgyX z<)wZ5*Y9o25ML}XZ; zT~}%6HNUWs*TR##(DDlQ2@AA#1KwB`5*jZ0u1>G`Vl00M#NU^c1F<&Jh#Rb?L?{hYdZelV!FS=gjK1eEFd zc>ax-EL!i|Njk}lu18cp$iKiGY{4)v=WlJR?=5EK1UOH9=tK7joQEJxz%UNK=&IS} zg^bkd+}~FyU|;vo4b{!_t$7i)rl_wc@${xW^@F+4-K=ls?wy67(rT0O4cHBTzRu?` z>s)c>`*ViWIHy{GKi8>f4#y|ezT?Gh*m1pEg+BOO`&sAf#E~hQkNi24Vbs#U3c1R2 zjh3T`afvz2i4ak)?0iTCzYzM_$hvI#TesF*#F{+9dR~+Kx$)Up!X*X~5G0szY;u!? zY)&;cDjCF%9=;X|J9bo3SC_awU5%$k3+wx0XU9yTIHWs}T_)O}W;4BJ_^!rI@ObH4 zz-4oi!Qn@$ugiIHJlY-+2O7KNALzjzVMBbC8j2UOd+>&A2T)WzgpU3pE#SKB{Gn;*ZEYoO}3?UG{5HMdbxj$`d9qzyg6 zXuzOI2Z6ZcQz~_CxupG$HLY-+gzr9DE-MQ$38qxGejC?>GDwahTH+^PQ6sXr{_&<3 zpm6*goTvozV<=_UKTTI2d9(tB66>nXweXwuwBIlfwpww7RJEtZ@?dW-gVk>cKbLAS z67#c%ZBy!fy}MzZSPHz?b=!H~=NQCZ{&u83Yyio3&mgq%kUB_I4BgbqYd_mApVZhA z>I{E4ZO5r!{7YlTD6`D;GxwUsjp4UG2v4n=zk%+CFDbz~sTV!z(K+eyf}p~KUd`VR zjFCDT&D1Q|T_PkzkwdMlr1|5QgTa(_2)4+=pWLMru_ITY4WX>A{(ZpsJx~z`flABE z`^@V%om=_v(m>!BM(@EtMhbD~BgsfNCxaRq5$t`z70QaZ7ph3$c<}(|<@jsJ0ejVU zbM)SL#>Bk*^0}vP&(NPwmA6J~(*o{izi9*nI#h@L0&y)TL5K5i@$S+dH$Z15nUrDA zS)I`<*LH$JzS-V*2INS-o~sOZVH(gAjV_DTpB`GxdtJ8cFiC`KRu#t`d24IyyWPr3 zm(2pk_(r~Cu7Q%Ed=X5UTy&uSu~96UDmm>VpkG#Q7d;^|D@qhEpZF0)Gbv zLTti0+y7?kj9y%~zCJ$ur7;;ZK3N45{If40my=-tw@MD=kwa!WAu8Ck_^$SJE6IvI z&5Cc5z25V=EGYhJ^*OAMnxr!tlHi=LReZ~1M{zo1cYw9_-7Szpj-!6dgR>v}*5P}E z^NwidceW^c)v1F%J`bl&j88b{-}g6k2)wVw;MCwM)kE?cL^nV*MB>#YC39HNth>C5 zp5WAijml8NR$v)ivuJh~fy(Km6ljGwaivq@JM>G+MXx=jWTixYkBNam-!VxCW61e| z;0UNc9UUF?b zKFCw>VnKqF`@GfvfjkQCIjpQqa}A;h4QkX_(&YBk)fceG*14swy;LGl9$H|xnQ?A& z<9tg{)MJ?tUb@!TgsGS~{i43L-L4uJ5IPgAF>>JcTJ3{?OE& zQ#dS4jSrCQJ?O-=Xndt$h#Laz(FN<+R@3lBQLda7?TIAqVYeC-`6Y&w3kr%RJJ23- zf1e}>^r1iYI^^aBj_raq%Dej&FC688+Z$rHAKMUNDz|&qHeV4$)R##6lGG*GT>%!B zP=QSx4wGn-1d&i_4pwajK}Ko8$D=4+=XKBJxoWe^$&^fg7M zzL`xSvW|zywWN%o%fL#}h>n8LI+>GqY>e>G>>J{8Xn+Rc$+(hzhUGIfgIVrXS5M)z3`~tPDZ9av5)U~-Z19Feaxlu2 z+xtEwHgjZHOuJLI<>C^@EZfobi|l>7rK9*1>FN~kAdJOOjx zeTB(cXS8o~uUyvb&^MEnP@PJk_;m!yV;c$u+$<$>=jX`I!Uw39mLFUC70?Fk?d|;$ z9le?DQ-yBF%ESb8p`K&<-ulWN24kRn6Z3z0Hu1e2m$0_BO_M|Uj&-tr<84+@1IrNo z^IAsC;dS;{mVUBSJxUh>i-RM(rCQOodfL>eY}&-opdgp;Txe`QWQkMZXSXFE;?>tVT`51$6Y>mxf~}z6w9##;8i$f(Pa>?Vdpyyk%I$)0Q*bFM!-lpuPnuI*wxc=e8OnB8 z1H4e9B}6sTlAG6`@v;;~52n*?*D^<&>=x7HB(TUC_S+y!7J3J+eD@zM|F%>ojPw~R zgP`|7=33&8IsmpHdOaD~Ae9_pP3hq09~biA?s%7kClQ?%+B0?cjn?&)qK=MCJ zv|BNVYKm;btnVHse+SO7z8<8}mvRh$1-{8?S}iwu%g<2nHbyDrnQ_8%1$ta>gn2>&}iu3-_Gh?t&w7N_ja-wVGdTr25ok`ulU%9 zxhZ{e!KheXDaxyyXY0jfrGEL#!QtaYl(gAPlo3_gmY`M7`jMSJo;jm=!};@%m>4qy z1s2-+^y<#%Of3^2M4)B(y;5=^#U$Lb5R5U=t9zBI%aMEy@les%|B@p_3?#adWo2Z1 zN&hP6)`Fjzw;s+|KMHq+%4fKnG;05C=LtJq-EKW9OFyw6-taGF(oPLko%mj-&I zxb0=#P|pKGWC={$MT`BcLWop&#b%HWZ9-DgU$c5%dWH?OKs8JmJzS?D_y~SF=#kb> z-m<@Z$UXxcRYbn8NN0nqi!J?nhF%cGNk*AN_fz_$MK|cs!<&OfT2@i?;{91 zarDNyh#fN@h(@{i1G8{W7Gwc8D?Vt|e#n%=sD2UZ4gTd$@!2_adnh(BE^cZoKQx-j z6O2zIfZOWKUjpBuj~vFHSU|6c^pauYK(j)GccI;kAJ831KNi^Y=3Ac3-&p+kX1fo9 ztS#`OTL&zHdnsm2hNt|B-NdJ-uRC_$a{E8xxcEQW4F8nmi)%Myw|PcO^uHUbcTeEY z*v+=@ZvNyoUb@V`_15ya7bI#v@2bA{`U9=;hiwk-i_>OxjDKt&CYhN`riE@pb z7dBi!kFfro{1$@EVP#4^XXYM5a6ZQiSXyg~xe zd`*#x{!T~!hYzu%@q&%NxoY2H+lRw;IE|%tiS&iv%<;Zk6Eh+|yk$EykRPUko?M>~ zRXy`hu3kS3qOlCxL$o+Ew4whk zMAyO)F%u(X^{UP$qjvpkYba6|SZ!y=aVMIG$eb;3C`4N|1e-3Anp;A0`xBAp#mL9f z%1ZI#S)*nkU=|pzi(0fbhi>$wjqh=%+Q|@!X=$NJw@FbOU%E2ImM{jj zXrg1RAXP|=fz6e->3VVu0*m=5^*lM~Q#-zs&6nFS->NQv@pUy^T`p66&oEd9AYn9< z;QnOnbyO|F#8L*&1=g(q43PPFK$+++Le2Sc%JPL#Nv86OqTo$b6q#uQb4afef$t}Va>f6J^KBA%~~d%vn)e?f|EWp%4+SN@)b1uL4#h%cl_gR2PTh(s=wGgxKO*a<#HnZ*9x!MG<(zB zhbV(mm~q>SNsGGSV{Bnjo24Jl`5%fO{KDae$Ot{c#8gnrI}OR z2l1P1Do0*!V2cP`VMiuHY}g4J8W|CHROsPs?U8Fzl}^}z@n&}r;{U)h!~htiS|sgugp`)@nL z)4_TJ`+CAkc>J76O1x_kwodBYk`kHi*1gR?@7lR)?8n1%+a#UNywK<0J_-tV-*clZ zew&yLDORyzG`q}RAeyUw72S}HS>E?q-Fm>7z1Cqt##`dd9jFOUOl0u`=9z|`{w)YZ&%#nvSBFrk-Urec-zqCN zcOP~Z#*dchyHck2y&9+Z9yQi`7;-zmQ)@HISA;EV{x^HLH+&xxwDN9+8ci{ za&m1i6RELV@lQ5ijQAckj-2&B3|e=aqUYEA{$cjVZ+-Gh!+B^)jNpLyy2N+6c02>P z=h_V#`=@O`wgY37mM7nv$;nBk2GU8UJ&VE>f?;N7=e~6;TqyD@7-ElN&dZKR0Nif> zKEt}OW+PM`Zm`?QG{ya#!@3b9# z`L~gg=hIU~83Rz!$$Br!v5e2WPLP0$dq4;p`+4%sR@);}OdiccSLi1U2CJVB=ac1S znPiHoeu=X0dy-1|mCJ~<|HY9ZI&=+w2QfMMoEoeB*oV*~@VWkUBQf=P2p=(qL+Js_ zHKdI%yl<&IZ3euqMPJ`Y_b{J#szZ1;zy3yD$*{QR%hX1UgXfuhUt3Is?@_WwU3pVV z$AP75zT~V0)Np2I26)4;vOZDz!;FNUVJ5%;KyrQL;%c0}xuMchc}01x!{Gjetg1_p zvL+br0(x6gSN&F=O(LE-^SCW?6qRn^;LZXM1r*%438D}w^xEnQrO+3y<|1e*cza+zTCQ#x(R%J1}aPVGj1UWFAlA8_3jkyahuMyM69L2U-@x+Jo zp;O*dp#OJ<#l5`HDEOLecPqYksox-P2BY!jcH_fkGHO>CFVx~ z#lGoOW$h}FFNA9C?m^Gg^47%V(DAl42*cigry|Lti0+|&0BCL5E~ogYU&Q=~G#SqF zn5oP|0P6!iKHWs0BLJ-ea+b~82Q+MKAVzSzpN}(@AM)+7p`$S{=6_^ zZJ=N9eL+?I$aJL4$+|n7T`Az(muUH5An9t`d{+1yXkySB2dvs_^76tKkpZ&MyU;A* zk080^Q}UlB2FK4fK(R0XbJUL#&#{yrxP)n2*ERcyDtiUXe-;ekfXj%) zC=oJ;JW8Zs?)rL0$?5+gnPK6Y|3BI0%*h5T+IIO2?pm7#mT4UTXzMT? zj(ZpzO} zx!-32FFsYB_eU({2ClB3;O6G$giAX7kEmWmyFRX)2gTyBCgTERxVx&7QukOoXK86E zeD|iKBfvr%ac89SdsH2~dw*epxtRwrdcpO>^^-!f^75F8wDMaUJpjhIoP&x;Y+1PEJ0aKqGrFTa5j5e{BK~n9)q9s$JDu_22)s zYZ@9p0gbhPt(woyJFno}+p`|dx^l+G~NKE|4 z&KLwdHNLr{3~$%}e}TlCRn^AR4icYapa47z(4m&!qwrz@`Y`wsw|-(glC^V~++$_> z)Q^*slb(^$WVT5D3P8LUKg9|^^I{OP*fyN5`J9;n!ix^oD4yNCyn~aHmNpuSA&(X# z4z9ZH2|-oW)ckAt1YowBtl}hLtt{;KvPH6%YtnL|a=s(u$GCGXIGkZ~8#Q$@_k1|og+&R%oB zy&V#z@RWKFA1tyrZet)YId*(JCXo1a>~X`-$!Wpieyn+(pG}q0@gM4GY08NG<8}Ok zn3EGb+8240tmlUDvKW6lpA>d(Y|F9#UHkbdVhOH=`~qh#vsy9xDmlv z)ootS?sZ{G5%73UatXYUEdOxgzjbC9|K?Y3F}XKL>VPMFL{D|`A5WV5_HenG74CM$ z1$$s%08mQmvO`yvO;syx0xcI8e&D|nM|I~t1H-W+wRG9FwondsAi$tyzC7*=cR+hF z08A%;5H;p@J%BQG^xra6-{xos0Q7&Uu>aHj`KrhIbh!qrdX?_T!F2vWtarqZ|DB~+ zkzD#$TU(~l6y|)thnq~NLE?WO0BrV!NzUkc9~Qy^FoBs|Chyz8^X;L92NKZP#97Cs z!n@;E?9E^IQBhG+d>|0Mf6^8*KfAOXm6iWnLpBRl(Ld5R z{=E4gYcTbr!Db-_8G~S|D@MwUy_UnJqC0!|m&?ax|V$3T?!AkjNCyB%)kH$oxZI_QcSxQHo@-W6kc`tNr-fGcxL(F#4@#bNlhCaW46v?(FUu@|rI4xk9yM zen|35!CYpwV`R-v{$jG{v3kL-!ZkO+GKI;8z>IQ8=n`ylTBcl-c7L>LjOu~EMkfo- zacFk+f|oY`{bDQBCz}VZIwl`{oN%#Xc9JBr>0?wHaDwF3$qno^e^bUgc<_DEC^ue= zI=Ae1*l*lk(-qbei))lEvk(kY>i;o9@v#=&wu6L9h)P0Atjw)DFZVL>qHIwAwjv7{ zA&oN_P5w3Ft8FJ}xkmL7dBnCo9kJ*0-0F~zJSh~|J`lhV{Yig%SaI3jD+q7+d)2dM z^XcGf#^t_<>cC+n*|T8&Z&48eSR@B%&)Mi{>`U&_Wqq^{9=Vmx(W-J$7`N~%rmm=I z?^HPD3Hvs1MZ7$MI6uN?C1G%psD=&0ixPQ#mg zp&Q%o^*El2u2x%Hsvgvo0?g@aA@2xoOzn_11jq$Zs>g$c#07etzan)7diL++@LcML zS|1+ZRp>-Tf5Iy*goZ)d=#0t!fe{xg96sMEkcEQGb4yHMw=hmamC|(l$oJ^U_vW{9 znE^Nwn}7OAn}jI!g(LI^q8W4O{uYlGeH@tTR8WY%+s*lGzdx4F!sTGFH}N90E+HX- z!?TYzUu)GPLNrq3=;_hzaX2gCvcG3s+>=6&>B&{#g||Vq&D0@Oj|YT@C*4jOacKxLp+^Lw4GZJBc??z1 z7W7Kp`0r$F)XZpY4HRVbW@6VrlyQswlF^y>MLypVn-R7oXn1@$nM8$b7lxbymZ7 zr-H)Z>AkiW&$g?Z$1-jgOnDPE&B+n>#T)0XxCFd^%Bnbfe@@1HIF{W*luP$H-e;Ps zg;|2jCz-JCNm>?j-dnEHyG)W zerWL7DxPPwlk9Gmu6Uisu|i~S4^Vx+j(wwZE>{yMNp)D=<2S9sZ1zL5f}Hafq2)3h z)KpP{{TjIFIMvDfY``GHbN24#`KHZz{j6_ysQ|fr)HR3yPW!X1o?*REkz8gBSggD7MaI#Fn5^b%8DVfOE(Ze%1Sb8~b3610;#@-}*f zRC`#oT)^t{@M9!b>~V#luG(x%yf=)X>xLHTedOpt7n*+2!&*TAG!Qp3|NMzH9BKtl z2DY!O1*<}Z2i zt{vfn(o zou|5jQRG3RSacxu#Jhbp^MZrnwO4O@#Z{Mo0@j+n3DIRv*Y2OCM`P0CS#DCua)ggQ zSAV(3i>D;Q?mcOOpEqQ_3}low1Q?AZ>wd!S9~m)RSNi_;v|B;OR(fhW3flje$Mtk{ z#`vwxXslc1oJGm4=bfCU(|s56Wc7E(iOETq<2x)|ch7_}O_$B_K9!4&h(#~$D@%43 zX6DzB*TCQ~m(_ot^Gmf)oqGi|H zag#;!b)AS|@swevyPm_{r@Aq;jP7-LEqeq$03nHqDQZN$E~ppvaqZWU9#jEDpf%Ql zsNf|`YGHQC?C#BeLG(phe&Fn0T9C+6Q0~FINB%}~KJUMpyNY+%tecu`t2Wz@H-hP2 z#|?!QQ3)EPxWccCd$cf4_6*s}Kf!=f?>xwq%au!R=RiHeQ=P}X$pO6YNDJN^kQxHhq@;ZWLah{Z^{ z+!%DXOUrYL0iMvr))FKm$$c@=@!nA%B<-ppJGI;h(6?%1i`9deC{A7WU=``@7l#T( zjiCFUZ3dmX$Mt(ZxejBWVSNNu9#u`d$Ttlh3aI7Zm=#MG%%c2*Aq1TGglaoRt8`A) zcQ-r;TtCpN41TE`J4EIFfreM159+H4WzhckZsbzRnb19(?6pE%eFy6vr}TTTCZxVN zBNalM@G;7L#Z6SyVx>7@7;}I;e|BJ@Hlllz(~jGaL_g>s|8Ef(~6C@WD_SqMc-FE-9MHCwO2mQwA)S6L46aybok99&mB=<_xZRF6@J zvR`%?ncx-qGJJ2*FE2{3IpY34<7p4G(d_zB>uI%l|7*W5hpd?Sq_bT;WP-ZAj?b$7 zT4{7cuA|~7z3u=wZpzl>#(;Wj1PvQyBCxi7BZI^JM#ep-l!51IL+HLFxDbri7w}kc z_U=7i3o0v5JLXLc=hO-{9d*|M;#h+^QVPe1H<1esP#A{Nbn?)9@xBL%=4@Q3)4Yt& z{cH1YVY-Qtc!(mja81P`+8`1Neriqk^{*j~|A6{A`HS(otapOTuj{1X--%ven|E|( zjB=^`N68|cqxl*?0g`dqpL|-Y$PD&5)3*2x)%oNI#%I$-B`YtwWWjE~q{;$eO@u6# zB4w&SfHY)KDIR?PQ6xWgZk31rTV-_w=s8andO?vw{jLZULYf+$cMeXu1WT>*xjJ-M zRBaJ#oL?{1d{$ZY3v7`wc(pgFZ(Qa!2lO-AK76l!1M1elN@%n+G_Pqp@TAu{qE8T* zlZpxp3#;*grBFoaS+^^E#VRQ-F79P8}Al96ldd5+{>?l`YC`VvHsK|A5X-eKw^LARH7td{Z zqvNX2%Lh(#W^UaRU+Sh(e~5S9p+DP3`}12b@9Q+R3acY&gkXUbBpmEv=!p@s-+aXQ ziRVsVklK#hvoJEzVEG75Nm7^5qIds}#lE0{J+hMk_+`JzW6*fC7Up#C=mi!;27AN2 zDVS6}xPya(3&m#oIah7I9AtZaI0v#g(SCk@!XIBc{rjvWKOPP>#ZzCna~v1+}Ab>`?eNN7M#37|Jcr(%X7rzEHv6e4wXmdTJyX^hYh|Q zzgeg|-WX1|{G={rk}Sr;O}$=(L`%%k1S;?c?zweef(!aK3P&=eYV~)xyETru?kv@g=*g;e>zxr;2$U?T z`LGerK^j42d4j5NdhU5Y>*}$Xb}3y z77^}+aT?0Xy@^cvuTfEu?Tk%Gm}w%wWYm&$cmHBJ|L5&$l5x83`R0IRGAkU2@M&n^ zzp5wsDOT&?KZ0mRK>%Is;reJ`WTaH7ADP}*bLXG(4ZG#MPTj)YdHeOW)cnu#18ome z!kB@uh8up_zMZSn;Zdi`*2~!)516a>8vB&Bu}YC?lc7I(C=84_^cQM9$P4BNOjE?E zbLA7YdymtE$Z;P2C5~3A9nrkia3$egvOV>1%Y?`n?Sl$p5uLH-TuamIST|e`r$tHq zDqOqk>rx)}zKw66dTuLUQ0xcD8y6KhxJ?=x7>t21G7wZZ3QvJ%lE~|EADK?5Me_h+ zJUg`uR{Aq#nvzM(uNJ|k-bc{;*L}4R9WOOC95)`kwytv4LxO`}Bg@5UH)Ddx_<5!+MoAS2mV;Z_{fPD@-GVZ-L@_TO3;$$K5*W)wjfj| z5B3b4=p&`x1lqsXt$}|>l`b+btykEFY-;#XHlv(Y}tosp5T{Hz0r7&XZe2HZO-KdHE;TekY7++6H{0>2YeLm%|X~m={bUR3POJuBT`c!GH?qGd;Ch3o$DzEAo-)QgxTdvp(Pr zClC@6GO1Y%0X3Q_7*m@~+0=4p1YGuoS6`ZV4kIn<7CzF`mpXAPDk`E7dD&P-fIxL{ zNQjt(M2Prz4Gl?v5(skvwif71{X9yt#F1OJHnLeFX+MV&q8oz zl(?f5)cxUiIV^cZ#^|U)Dzf0A456>Kf68G!&zYA}H&scLF_pil5KzP#JA8~8p z-k&l zpe$r6AGC;Tz`uVFcp5n+C81!MzF*Rgjv+f)8X6iBla?-XQYQzwE0-c<&=&<^cx8#3 zvpymgov#}s)WyG#0iz;pyTn->wwchj*OD62TTS6<3RyNI4_idH;F%3X z&aun+ooVyN!9fCrkM?weN;RUNSvD+G^oKvhaq`a$3|a{{g(uZ(Y6%pJOB`I)Fx2Mk zXF*E)UU4h({8Fc<%yc0=TD|(74Q&Wb`8PX>>&)+QHxH?0o&>-izNph)%OxrNQVQ-u zJ(tC_Q{)~d!Aoi>v0#Y-`fpyj z7r>Ex3N&fJHn45bXa+2Z=IeQLkW=FcyKefYbaQnu^W%EXI0NnJw_IHaPr6Ct;G)A# zb%8UynkyY<&f99ec4|D8iU+Y!ACxL1;?I-`1`@Qu1oSnS2gX}mhWB^f7ymLv6mymw ze?@ySQbudO;BnC*N7F;blHB?Vh#r%6G=0)02i!)hc5(`Wto$oCS-Gn>&yeBvO3sfM z-QxilG3gyUV(3oXKAAylupT!x+;!g<@e+I8Dm@>gU%xLN5671m8h>}B=q?|A`4 z!OT|X%h@{sTcIQ&@d49p3fNR%A1!>hy!E=j+*@=#D3#3MO}o6b2V$grxw#B@a!}S3 zo|=m9dUHGitgT8X*NGtF4=@Q4Dm$+<0sxKx8u*WsmYeJYF2GG8yx1Ngn!*Z-!#_9rs9kElD{Brkh-T_Yxmq zJKCPF%5g6^znp*u2o)8J^>TBLSp*n7r-0xB;$!UdwTO&x=_x5gpbw$F zsNvZ3BmYQ*_7CE$Oi^fqQ0i#Z$jI#Or_7%)0)&rm8F`Kr#9+g?_PG1UI(8~e2JCF9 zFkx}uA{Jgg$Qe>;HEe$meaj=7x8GOT!yd%$0uUcAVBK{Ag06I9Rm)i~-mA!6AgTWB zBY1h`277u>Fsym;E{G(puL?M-N1YN~yL!I-t8I)Cbor|9;NqRs<2ilHhUP#Z1y59* zpH+n0=C)+dffH2SCojKGYyyvBTsJXj(oQ7*k&aq0%J9A}LvEC7ch|2oWO-F^8nHk6 zEfg7-TI|*_Jg3|rPH3u;ciIIpgQR?{k7J_(i%>s>F`YAz>ptX47Q0Z(OtC?@qBP}$ z4;~Z|!S}I;ps*J6Ys`n+4XTsXA9RAq?`}yr(y=MJGXfkp*0-C?he^hXnYyj?DzYoG znY$h0JO_W`szSqs6jzI1jn7y>X^Jons5k^^-ccCTi1r$Vk@RMwWSI1j8tX(_T*cmW zJ!8XV?UVex%^^~RK#I;~&X2)6g68Vz5+|%{=g@mBOlc(Z!^!N8Ne6 z{UnoeVnvkyW{J#s$~r7E@U6ILY9!)Edv;xk7zO{s?d-R0`&J27zg5Mm)re<;W;wf0T&)~%6fTF0Og=TWO+~xu z5*j;buFs!*|7hY7qi=FjG+x4VFS)EOz1v99M{qd{U}fd;8^P?W_AM`{D2Y_1<ze_q_bg92vX|T4Xiu@Z!x7`H)>|(V;idIK;jrn_a~I zEB@xLtL;~;$rS7xwLV_kX+(Uz1#aVlxXGkM&K07$Qin(V(Ur?r|8VQeT3?|c?+X63 z&zS#uj$}0&{^;t{#HPDY0FSClj&!_1@j9M3oNnWAi(YqxK51>X$J=CD4wfX~y?dag)KUh4jRa^iMI z>R*io8*#q$AmFnnj`BT)`gFmZK2>e84oR-vWO(+ST(IoRKfk#GOp3hNu*T6tkEqEsdkn1>=bvas{PVqt+YC8y4Apl-L~$MYfcEU_7v~0 zdp#P`YPiPLNyS-!n}>KkY{aM%e+0?*AH7ieMRbEARxEx?P!D&zPoGnr)?EDlpyZS_`yJuc#YCol zwMx*4XH?~%`O!#%L;e@X7KuG1PBAB{d)Zh{u0G^?2T4T1H>A?PMM+E zhz42#Ve8?XbEDICO|;b0VafrqjY{*9{q+c^&SScJq#YJhHnCZIKw~{^F-cakvr19$ z)WIYjbv+Q(9bjmoRrK|&ZGF%`5=*u1$g}6Pe)l)JMYO6jsjEyV+JO0CrN6LsWcK;s z=Cz-eNvOALDEM)haWk;oYc*KCY;#A++|d6#?a~Di#WJ;#T9)aOdH=Vm`?l-Px zYc98$YO+yf(y8>v3a+FGNQe%T;B`J8ghJ7v;6gj z%-HV3x~!Z!>B~9kz|Hu{#_Q^(+hYRJu2(ZzrM@ESJk=#KBC+(^dHZV9sCIgFO2@}K z;>KsyNj#+CsLYUZenWI|#j%qjR&9zMw`*6}C@c$Q-7gx%7w$n(`sq#~%Hh_-i8olI z?W0{4c~nXg?%X+;e?ae_Qm=y})VdB+hl%?2h4?I%9UhtEk%*Wg-?Ho)*`s+Y8xZ`` ztah+2g%?srcUGn3U{Sgxd_6s|@U3deYPE7NlkHl4aw}|H1u<)R%h|dND7rBL4WktnTufZpSew4Dd=X=pt z?$bn@*NfTCC;%#fK77S=sV-hlbB!&XA!jqeYvI}H4=)7sSs1r3g!kO)UQ}cwo9see z4(lh)yBd_`$b>;}Ujc16>ADn4SK>ps@_oO5?H|6-K{#l^rMvEvtCSyDo0_wVw_nWX!P9Mica{UyA6CE>9vfbTQLQHx(AQz!y0%dTXG1I_Jhq~MSeUL%lYIsm^K{$A1^>|ZsBO4+6|CNC||2K4h|0S$B>Ya z2CxY-8PA3S0Zi94GK4_jA4vpwJbLxoT){x3=BsISIb>!~1(Wdbq%rCD%4%s5Dy6$z zY%@6?&i3Do@;-zrm#Q&=^9U+7nIG`aoY=L<^eR2I>+hf4t&Gw1h83Nk9*?@LVNG$# zn*L<#tDy-=Gb-$quWlo^W@mQxL`r|YG>r==-dnsFV16@wI6n%RQBE>vv{t68UT-w^ z{g3E?v3d_N^$`@eHH0=&%K}b=@u{kYi=!JIv_JB+#oDsV&{?3sD z(uBbBx}lcpO$=w%wQAFQlv*wlDz`PjI2u(p>VjD%bM7+bXP3tv0d+ zqw$+R&*Nzq0v>xP@S*+yE+C;J?PmZFj5AJm3E*+NJ_S-omHpm?YY&@WPQ&wB&Re#q z|4+#PfnO(W@<*`m+ywhmBk&G#q#8u&?&o49%CumJ(}rL%8Z9+Cz+CNQ1-=r#TwGi( zj}{U{2wlkc7qhcTdG9u3`fs*|5-z}Al?9YYfTqSkciTv}kkF>p*DB7zadjl{unm(C z>|x?;O-MK%h^ndf9xEis6R7m7;DOYMbUuy|~WS^TH{nH|6O4UVx zTL{p`UK-!%j|=MRX2K+%GZg$0s5=>4Ok5q^xS zReoTw>9D6XfI1IPar)Iv1LPR}x&>g)33ByTYj$S(|7j~99IOBoFuQdH2)F>`1}GZe zfIHPLS^cz6XZr805kcDt?bZu)y4Vfoc>4a{+4w<^)2JDAyNe}rcIRk6?5MGJ+IQIY zNUO@lnsf2zYFk?Kx?}xP+;<1TzEt&%`pSCQ=f9W&64vh6+U{*6%rp*di++Q4n#0~~ zB^g7)LE?qWal?-DdJvULy$#84<*+xIcOK9=@-&+qfgvv{ zDM<`)WXP>R6AyTdn8EpmM!;?dLHB)(8IP%UW}(mQ-<6g1Y62WObW9RQo#o_E z&(6+jrn{`_LM<-+kO}2s)Z&45ElVW&ksr)-J0$t?8;5zx9V{Xs(JApOdPTW zb2UR7tT$F`e_zuxQB!WR86^{U(STEo% za_*%5D9!^y25>eJGcS7VKCA-e>$DqP<`l?^uUttRaA8f+mXY8eT}8wL&so2lXGGs* z=8wsViNcbS61J6Ml9%&yJKzjE7#`ZQ7oNz^PyeD&_)_6?3Urzae?`wl46RMDg*vN_L^I~^#f#*E)L$$xpqQn0bh$H<;GN`E9~fFG*&zCk zU?6$Jo*4H24ugSLwJvR8$9*Wj^VE%0bH@KI0HTJ&1Hi`ykP)^5@T|aU_wN?v6VU&G z8Cd%_XE@N(ot9l-0OM?b>URTxXp-7;EIX6EJgmHcMS6;Erg0s&b6l$pP~$9?8f!Xc z@HlOVf$5C|w8H_!vXOsB3wU{6bqmfk=~o8W>zWjV2Q1^&MkAdkH?QI%5JKdQwZOzm zr&XQ+2&+U)mN6BpHC?eX(W`l9PYtzBR2t93GVW(xa@u^OsGeV8KXM~~p!WMl0p0Rb zr3Jz_4~?e-PM%_yYj6AM%cn#9XP2$7TDU72xhn7}?}y<06d8{HMPv0|?PPpM+60XWo+9}2>y0Bu{C9KF7(`j-SApZC-}$dB~n_O{_0&rUSzlyHMQbALBQAI8>&4LD&8SI6I9p!+ny??==}KQbPm_* z-Nkxa;5Bxtq@b^hclJT*|c55SrR_ev^2R6=qj;CB2{eDS?h4WmY=DD!L&bTxsC z4->-c&#Z4(#YYxf)4Obrx5^ZdZZ?S~u%OuAG)X%Id$gXhEJ2VhEHvpx9|kPc#v=#TUBd>JpyWH7Y1E8E8q)Od zU+_q%;KyD+<{CCG?MD2f{~YG1>kZ%dm28Zeq8Rholq1>RJz{p?e_F$3R*UX&v&v_O{nO*p^#?Fs9Ft} zEJlq9P5Y%#Wun^vt8VkD_`5xw&#H~aGBJ@?U5uAkrGL2=wr%&RplV~S_Y2*eFn?vp z;Wj&E#AjbC%NQJ+z8$$ea=3V2qBIfRq(Bklazk@ZileG^msJ_#==cxn=IMz1B?eR` z6A;?|^qh&|gF3QrCQav)^=MMR%F?0}Y7J&qvm6k3Qqy{^jPjs2j#GC1t-5+}zD%oe zzdT(ng!zflhEa9fw_oj~^1uG^IpX2$w8w7b+2|8Um8NN)ekBCnfpacO=+&8x z-mxR2IefIy_>UWZ)ta&Vjn4d(@dOjq+ZefgeQ8qYhWk?U>jd?N`|L%to#(2W*pN|E zpMl&@`PQ_abINKbU!eZS@g9S1eysbE)5^X0mhkCD&8nH))i!AgFGRFb-6X}d+_7u{ zi?p}ojZPh|?VZ5YASf>WGnrF)Hw#eJjj9aP!>ilsMuZmDJGCwjP6^IWIj7V2dOvs< zaxd~*F!j1_xsdzCq^%nC5huTv^SrvYV?k)((KJ+?7P1lgn*&{U&#j>{&Rql9%j|2ZaPx?aC;l8)wrD?L&RmY zt=a(oJMuv3)nbaU!}@~51Geo6sj@ZQdanc*0n_L`aq8i_&i^I^!9q(K4XL&AMMpwe zkNt(LW}AZswt(+xDN*=C!!O)zYVMjY@BjC+uj3M2nqY8ha!w!V9rzX(-@3ovREaX? z?2jq8=FB)NqSWMm=%fRIeWU?s%6Hi|hU3bQvmqjtM7{^@v&MXMMWqiyy++l#Oes;h z`ArTD|M{Ld#c?MGK=c5(#i8Rp+J4qrs*N9{{`eIUAu{1Wu8IUd|CUJ+(D$Zf*)Z5X zkYgj1HyX0y${`4UP!*0wN{3V;E%tr4OFV>DMHiR=`40|8o+8{e_RV*={WX*1@O<;k z-)y}uEg)WvrB#kqFzK_f0hi!Y{KXJBBpDLW%lkqm_W;Df!q)bk?^_6;HvoVdy{^|x z=(L$y%-qPM<#^0MOp*6_=H<@p{^meJQZf|fmQ0SpT?}Bw(J9y~T~+kC=Pp*9nJ0N`kwM;T<~U z^q5dVp%9+;9Jzk|d!mXi&|e;Rxm;{c_25YUY_z z=szTUsN(kGb~|^}WyQwvJoCmC0i64puPOFtBH)}QQ}V6^wWOCFC@RNa42|-w+binT zCf?pZl&f4U;M!}72na+IPa_1?a>_hx~4ojmfyvi z-uYxo`}c_|yPC_(vqa?%3x;`;!*TWW+8CL!W3kE<2+5(M@;Et~=@Gz4(>d3+l zha;+cmau*TFn<(8qQAx)ko%$zn1mxN4Fxt=D+}_owh@WVM1~5>euy+67vqoL>i@*I zyK9C*kNu4)1!=G-_aEmb;nmk{QxhLzaY?%1YG>%y+o@31k+-Z2UIVkl>vP>4Cn`R{nRO584EcWUOpLl}V)LOO5$5$S2qOI8 z>cBz3JUmPKfPtx?D#w7^O!&_I?KMU$u>_Ztvt#Q2=76M16+M%Me00j5P~7)Ez7 zW;SbV?=pk3+y`LDh^A9e(emp$3U%~E$Im|mSw!U~#2(_sq5p2y(7`kYq7lMF3p$@7 z6C=IH4c^Q6$84&l4MOSqa9|^n=aZwnSIj;zi?K%gFH~gnfweX!jV^FTfdd<14aX{b z;6NBc6{${XZ5gpJ%Nxacoc6T~K;Ha$h#6A?p^6lJj7?Ful}K(?s!~}#n#BfMvQRG# z?|-i~VHQu0DxmL{8T&-Sp?Ca!$)qv7G5cY?0<^T7vn^;ga(b!9M9Z>`Q`j@Gl zLoxTN6WV)B(v%5)v~b7ly4QV|+(e?ZBdQPb!udLZI}fa%{h$W3*nla_bTy`~G%|`kJOKX5y5*cHF$R1^6w!GwVvE1L?dpjjx^RBm^A2we1e5Z>NLHw*fZV{}%Kx|xGc2L5p z9{qiOcii{Tjpw3>(`OhW+v_SpQ@=c& zqNlsuqka$q0KMmjH7e2QZoeT$s8uhCwzZlh>x#n%fV|iGyXU~pqV49h=xAx?q1WoQ zPxknbb_4ii8ce$QjJz-8M%AD7&LEr5?rFbVU0ztsS5Ts1o+m)8UfeZo{CyxbOmgmV z1_1(nV5<1l!zhNf;?W}e82OXZFPzS2Dp!a3u>-QK5s8vTebJvzt?lQDr^-Na+zLzG z5{`z$UIzB$fgUW>S44k$d)2q9!ruh}u*2A+hp;vdqssb(*KxXi@EvXUxCAYC+?wv+BA9p>_d^U2nzUAbJ-7d7Z9 zT#xt32z3G8>0*gP+vd0dl9L12nYr-N{155rjdrf3EEdnXo5Zgbj%_yzZC34-(G-2V z)hwyyXS=>elRxqjsn=Qc9NCXkw6M+bD0H4oOx?GngUv{fPHy&u2r<~dkeo_|(o%)$ zgG11K^NbG;0WtFzuPr~@DAtX>FiMU(dhpF?qjw~A;f8d&>?v>h%gXai(;Di}p#QlDlnW2lG~B-$1)PMUGsat@ZO&Ey`g(_M*@g^rUdEDr5oN**vIn|%n%|On~Cwn zg`R*gc><{ZU@_7G6YetzuiY!U%97=K76~u4puPi=IuDrjqo5C1m{pcH?Cciv?GuQ6 z<9RMfxLi$N3}YMc>z9x;Fr@$KpeO{t6_iN&piX**1J|vhj~rZ0zIJmvd-I?bJQ#e( zbmG*QKJHsmpX&T;dbmw2-WAxVjz z5Z*!_y}g}MzEj!v@^^ByxqsQ?;f?IUE#yK|Ig0l-&QY;H!QcqTimW-|LrC!3`plQR zD5o(0hmdY$N>0<)$wG4mR3n*tre(q_to@l>YyyV3MkAtX8fdop*tk`1+8BJwsCT^=j;zkhucZ^) zPtL&gzk-HuM!3}>wVO&P^Bs*js26EAF8)siLcYIYyO{PiZ8`Sn<0vMR)ACN#Nnn-v zjMW=xWE{<-0ENlLi4aD@?n5Wu)kZw4E%1QK)NZ@DH5+(zO)%};N;qGHXTi1|*pk~S zc|D@ZxXJlzXU=d%G+eGK+qn9FRHHi=#>AOTaQ}KoJpHvB1R8XcEy2)r$xf5DvO>iV zWLHr#9&Si;J<3LdK*;ocB{KIU)6bW?uIza1<;FLE)9O>DgFUHrUy}9YxyYl&Ind4X z5eI0pu;ZxVwW28m;y|FAH~H>xQ%ylkPVejQa^>Crs-K@Jk>IF5ekA$u-hbvC3u1+n zQ^2L9BsExMUNH1Cp>L05eilo?=rkOcPb6~SJ)ZfOp}AGh*PNR^$Dc2z5?}OgduES7 z4@dg&nlk_y4-MmGmu%A6=6)m9!N@6p*$XSDPb+BQNLR-5E&Y$G-&;4GKXfDR?k=$8 z)s&^1YD*ieCX^6qCcBWABD(fA+lV|N+A+|3nVvd6%5iY7fub{s6II$VIp2ptmpzeb zfO&WRtieHC-rzu06QUfm^T0=Nt0?HX<{# z*+_g%8JacQBvT#jK+wpXdVPw=-5nHGscE55lYQ1+4yCX<%&HohAqhUsPK#I9a}ug?%|b^`o=EUIJWU#1%ZdwB)}$kM0DYbb5$YgGl_} zFvKR7CQ3Q7yRGyd&}E4%609>&qofAB?f{F6fyyk9Rl&h|e^x1~Da5*Hx?2G~C>!Y()m^NM?!-k^=*Af+&>s1sbXlDU?Y@*%HXLsqE+kyO(4^+f;Uy zjV6r&g5+wpkBb5>RCvq*(?YFdWhJSD@xYVx!}}~~)nLN?8y$&Jrlgm2~9H_>mi2P>!*#k7wwe@`<}dKOqD3_r)4(bkii{c45s%_ zX~8L0`MG`?iIxOJ@QX5v&bR5$1pThtY^`BMe#$p;2nOM zI0y{zyV&BS6D^9Gcb#n1L<-9ypG}>=RJvSPOEx@GQX(|Oa^~bMlQNo+`;1=De`9{f zgjcGPOKuP<$FuDWTkaWp7UtmriAg7q)+pDf-%mAK2PopY*>!O53Q)t245-BX2qYp5 zvoKZpNQXiob;cJQS=FH#w#>;M)D!3?ZNvc^IWi?qn74yFF;bd`uwoV9nu*LaZ|r8zeG2 zG4TRvhxk4D2@M}4##jk@GQSbhorheXT|TgkJEXz+_Udr-c`LWA-4`2{`L`2^T;Ip* zvd@o=GogFUO9q-#8?B$o{+u(>FSkwtRog0SE>qf}qEgq|ISQ;YeZ&0MtQm*M4;uW) z@LsC@=OeUCxFdgv(!yHI@$z09tsMW_AkBmn|R7P$|6 zR)Ec<)q9FaSu}_NH#ic1Bsh(JL=p}X9Z5EnPtY5|mKwHou9~H_C&Ml;D(a%O21C8f zwU_R9bX7)9#>Pe>7pXtCKkv*gvUc;5>M3uq1#bmYeC*|h&bs*cD#eonD z9XHkFY&~aZc925NXG!hSx0B`O5Su5v&5uB;Ps5rL-ZbXB0Wa-N*8GR<4_axEL9e$H z_PYS+vv`+^2ZCJnNmffsauAQ*aPSq+Qlvq*cRG9X($YYr)E%^*;pSra=~M3gp}6R{5%!KqLUg{Yk~}~WZY%9D zH;`t~tV69a=vN}?CeaWgP}Esz zqO_){H;S>c-K`vP!x~cYT-+Em4&%tn}8l*(B2+p`f?#xiHXpc~o%s6jS5#M-cE)+IJiz z5T9+zKjqDjv6gylQsfOY;L3flof43&Ih?xur?gXd9Pcy(XLWLAx|C6*$$t8ERQ{HA zQH`B}zG=a7PN9BpXD1P5J(Bi)lH2&cteOB@+O%lmmic%21&u!M4RPCBfULf1!dGn9#D6FQUCUtgIZeDjESEH}+F#t8V2{MGJ;ZQ^S&d zzI~S+>amZQ4D>eMPZ$E1LM>?q1s`%JDC6^xT2mH}A7VsyVXBX-;`tIiDK4*vt~B#82^7#+oMo3FrbCh_vZ32I)kUwN%yM z@h-akbJk{;;52UapuY7b>t^}HBGxEB#3l~B$S6j)kL@R|ZB-fB*;6pd$MhvF*Ok99 zLDOf~JbC(A#G&wn`=7(*w=aYRS*-!R_ebBzq^N2A^B2x;?FL5hL_PVLq(3HwH5ut#drCObF=ExrAUHBJ%+fbHG{U3ZM6mrn=ou+wF$M|ik@NpBW?2a`Cc`GTXFU$o zQOiSgIPFtEA8YaP4h|}2d&IQF?owb&AgZM#7nRHjdw3v13H2B}{9wM>R*Jp97r!(i z+X$YBHKffZ3EQW{A}X6Qfo=G#druCHfnmJAWv9!NY<5a;l41^1vP8u4maw|3CD*qB zDA=y6J}~v*o};qjXS+EOb|5P7c5GszlOjQ*6Wm2Fk3(feiJp1fe-7BfUlS!Ah=CV5N!25`@UyO)p4PR9> z{x^3V{dWFeHTL?zfi9o3nEOwyMzO5<7ZxYJk`~Wo6^~3fLm70BzNh`$*&lS_wZyn)BYd-PX7|C&uAFkhr+JRKUtXv}~c)$|t?q>EF3SdUeZUIXE_ z<1@$HNmE{pO9-SR7wObAkw1pqM2`;{&AcZr&rjRxAe84*Yx7HyRI;Qr{o4Wb#5l68 zTh8zo7bNKi<@n|ov^{&Z=V+mfoLC_)%z@CWGE;nUKIaI&_Fv;0{X>l3^5`pw<)?(R zDFV3U6DXjR2Rp@8W__jYqz4S!^YRe5-LU;3gKaqv>(d;Y3Gui)q1(KqcJliWJs+4Y zij~~&E?F9GxcLm{Pi=YdBeaiFx~bT1yIhSNVXc-tpggjmt&g0DeD6Quj!4xL%nh4= zftlob^ywc<)zG+I<8J{1&hgt-5F*=2S$Q;iIDd83Jg#H4wS!x-_Tm_yE}eKL0QZzv z+X1k{5gtsJcJ0~Q0lx_o2s(lQ+ZyEm)7e``#T7LDpGblPhY%cs1cJK-3z8tg-Q9x( zcL?t89w0z)hv4oW+&#F<;B1rUdEfo*p0ocf=j3GO&diaq!Kk$=>O! zRuj=8RWI_f16}v84X>Emqqn*^rN`%IC9L}N55xq#VMus5*(yEVe1283*6LHN@NcuU zu-T!iF*u>+hfjS>Rt?rVw43_!{kZ1%&jCEN=hM4xLIZ@~ZTqi?r$??g3A54{fl zupYE`xT~L#|U22jK8)?+!tNeHSnba6Y+p)<+jzJWwQU5A1 zOl{0LT2u4sTZI5`5Z20$PCv-ai=5Q+4=b#0E!aJj6NlSB1Kc6BL6g3@qH|P zdK#UFgSUgaYEP}PC0T6UVnpD0ok4;VJ0smiC;>;F|5TG%eT3 zD+iRu1wqe*&+^iv+Qsco1KGz7Uxb|uNYH3Vy1Ig6ugB56+Je?P3rdO%9=}?j-G_Qn zMTf1~|K{G`R6zWT{bx~j@N8;dHlcemxHl_Ik~IMjEhoz~obt5((Db9$moTk`H{KFC zU(5B}{Cf7(2WSH-JT{E!CiHh^U(E~YxvP1`8Of#O=y8Sg4=`lqmBxHJZW$JMJkA7V zMs*$}aiz0PC+QJh*-H-FvUfLC%dE;D$(g4v%*tg%gWm}w+i1?xo)0|>JpBbFY}-J) z2;9;&;=SF;d1kmSAG`e>NgsSxH1j-*%{&2Hs50zExVOJ&R{hPX!_%w{u^-Ui$a}vb z^Skn)zOYd0{_)Y8$#BQ8wEoIz*3wa$_vXxFTJD1`n}pVIp%TPS-8)rW;r#k~!(Wm| zyXPLqLzwb(r~|;36KaKn+9WW(xo~@2yk6G0uvWHs#Jxi&(#b%JBU8repUgYwYZgE; z>HR`D_QonFD=#`&cmkQ&P`}D(fXTm|f=c?lvXr4ulti6kZ(7(K6L%SQ1gUJF!CsUa zC7g$eo;%RB2CntV^W@G`E?C4TtMl{OupNV*L=#j^gTKX6f8PeW7}q ztJM}05?AtMVZA?j=HdmWfq$%moXG}G)ts2y*c(-(1D@;So(rU&Aj za_f-uDeyLcNYis#;tRYsWi$Sy_nH60K@l7kNQ(JLx}tXQZ3a?1pvcjQS0u99D(CGuEi z9zA*EOc|YG7gqSLJ+R&aReO|i8iq6uczsK)_*WlU-+6I3K3HBwqq|K|nBqf__RNB~V}enPB*jU6)i)P+ zc&iLf5tyEs8dM0qpzrs7r880qy49}$qDIUO#+ zxWxt+QHD2<1y;4S-yV_@IwIw=S#Si^sugSC<`y%EAu+{YZ^=Ikg~` z`!lOWzqI1!I*rrS7Cvy^lgyZEgvJ2NH z2;l}PQcOu@QoDwl8Y|2)3?BW8O6J2xl|osT-gmxbl!p@2ZP_hKqSuBB zZa}&iTX#bw4vXuBB(FA=rx$8M;b(^(_^(daLDd1`pZ2Kxm}eF1KfyGCxamN_GeMTl zf(Unh;{1@Q%+>JfB0x}rx>m_b&+6}()E0owF!t}4FQfnKV-f4$D0zXGoN*rrpwH{{e~=@%Zx1claNlwa^uhl(bhIVjzyo4 zLlo_=_smDugPmF^>BL69GqLZ->96j!*R&m6X>#SYT55imN8J`4ZZ>*|&d||ItPSs_ zwZ$u&p^BQw`;(QXi2srajFZgE@yod++-}TZZuxpUgotClEMEIYFj>0%b!=~L66A^z z?C=RAbRd+@k1(5`tM#BFX*wqm3NIU*cO|Kk;R^-9&aBo#t>*+|Vt!^u@d>g1@pZo; z5=WZPIL1nBKQs^{!e{4rbBX$*T(JCR8^nhhc%*ccq(wmUPF z&S3NPStNZAgsW#a)VRz^j~QGtRSgKO69}Yc#CrcwXkc+wF8wIbF6pLa11U;4J%(-k zCtJ5yjkLjKvibDc*QTF*I1_#T5)Qr0_wYX@&x3Z{5#%(;{m5w#)Be^mU)VTye;EHh z>*U5A_ja5+(%Q=Nq$~vX-X-t9cGEnk-JFsO?tS^metr~-ujQ1h= zvSrJ@0I8;6}oqQ+=Fn zlalVt=Fg&VFdM(#%x;1nxiF`6j<2G1fd-f8Hhw6r$-ue8U{5fV(vooV1R?5?d4eVv zB@Ud}{aI^FMM7VnXhY6vP-m1?Oi|$%G4%G`?W-?>>Uf5C&0OiVM~p=S9Y#*Fin2n= zj_CfMcdIeOz6&lD!X0_svA%#n#!Nw18#3^vi89l{ZnP(_xGa@^S zX>i_gd4Dkq$xeQw^T7tSH(uqW{S3|QD{SIc8xt~{)I$2Fl~nRYv#9B@m=B&*VKh|; zaC(Of=_#(bS{zCH(v3lQ2KiZ-%+=1-+Y8xWaiuvM*76G*BAn^QkE?bf8}=fWjK}c# zkmn+$Ia^)U5Fe{8pbfVStws)9W{Fl&3=>58*GPC0PKU10f~YW;aHQ?S3B6R>JI%d* zp*}6Ike8A5jzs4~&bm>^UOI?vyPU%f# zxMqC3omZ5;IpgrWytAa!QU2nfl$5f^u`c(?Oz(v+cGKf+>izlDTeL@R=)7PSsbc$- zTlLViCfi`%^`K|ybXhTHy0n6p(x>xM^8i(=Gt1J4?Yks1N@VMmKdHE2f80r_RJXVLj8@(N0M;F0H{Cj26g2wIk`{6ZOPu~bX+M?An;DviUg zb=ddS+c%vh!rFrT4SML(0n|g(ZP?%RSS? zme7+5(T8*O%#OkD{Z6O;o0egyThU`pY-TVqAMajm{Ic^*;)KUBQtpp%f>GAjkU#B4 zvlfnsC(Vk|Jey9RW0*g?hM+#!IYD5X*T#7euMdDwX=+M9x;v!w_%u9EGT}CEFmIh? z(^zsBLDN6E)FdUVVlR^Rx;Fyt=C&N`ik_S1{g7>}7{wLhJfB`61>)2^H8gXIY5S>Vr; zFub=>NK$3F{=rY4E==Bz{4f?J&b>Fc-t2^zpm04`0 z{Rv)TL!wUeCgiYQUgTeP?Rpg}&ul*&P@CCEWQI*uKt}ZF982*B18#0q&wMq()1hOx zVI&TVVfE?p8hLAhliB{g``lMI{l%qJHj#{2!J6IZRK)1K7BnMyH=j#|r9wMs)~ zSUA-6+(euc|NcwOtF3kl1L}@pON-gG!O4kM3f6&Oe$r&gN{MtgrrS=2I*Se6v+6*dQ9^RsUO7euwyN)iH2q_s`U(5@^dscLQW+UE4JAWJ+eR3Drbw+MnXkQH> zon`0YcdHbh2=6aHi=JhJ@3&9O_0mG{Voq|MQM9j%FgBv3L9oA@!!Ix_oUkyXrWNck z|J2zwX0bEN%*JDnt51rxC_rS(ksJ{t){}()+n@C4{B}#6(^>3gXP#E?I-1qH)o`0N zi%|bBnOi-ng}!G36K+915op~n24vK;=^uTJYQBztM}b@!%ZaP8{HYH z6peY+R)&DG6UqVj$f#CRo30Dvm~=CBwwfNXRCwI>;c~&sMIP#FR&rh??P^dNfRb5 z^gmZ8W6X8KD+Ko{%FYxT(z)`_P~Mj6U`2?qvZ5Y9G$ubzyl?nMQ&K`&DQd!e86lpG zXu)Q>v?w|J(D!CgEaj2yZQqI@EA!OWEc@A zzM{vQoGME&;~vK)xf^<*Ua@6{|NZOTp&y)GU``MFUU;k^b`gvFiamXS{OSetsbxIXIp>1~AP9@~zLmj1km zBm11eM#wj~OuPsU)9Dj-H;tR{phtgWgtCd9SZ;UjXd8jXAcf^XZkWFGl-P2y_rl++^BW>^jIBd?X@qzeD{rqK?YSu;0EgREfyv6 zT!({+IWqoETeZcca^2Y}90H!sT3YDwTOOYGUc=zt-!MgEb#fj%A(?7a=)~dt@hA4x zK~hH5w0byv{9V-$XOGt^r36cQ)uW3AW>H(-lstY?NX_VBFf1MgbYm7D8U| z$1JJ-HGSYWkBls($NHLwMxl5qjgpZoi8`k@X1m|#qW!W^B3FJ=Wd=R6*Qhdixu6a5 zw#$i?Cx&Nr<@k!G#SZ`|PCHxcK|oS=o77D(BmB@C#a=uSp8aj8%c|~JiBJii zu7g4z18#oQSba6$R_Wl!Py4q|rRina=;{5v`@ zA2;SRs|-(ZRIkr+=v?$LV9$h*-`DnyDDS{otRQD`gg1N+Z3b60(pqfg@ zD_i1EVi436V3KDXOa;F!uq|?!2CEh?MdeuqigRUM|KuNNNEffR=f}yk=g{HSWB8PD z;JZf#uUmz;30K8r?^|sqf%16%>O`5dOq?S2F7%O3y^0r$O(T{ICW1JA@57rHa9Vum z=h~q!k(8ON)+x@;UV%*vK>peLYs+HK?N2b6}u|E}~{J*r*H7dNmx$zEt z*wXBgN$Ji*p;c=&CoQVO4HGH-pS=L?B8G14s^ZA0STc?nx!71-9tXk5MYw={Q%lHo zS`S7%kMK-C>WeXy^d4EPq<%>uEt-0374AW@9YouKYsPZJOIvO2>o-ywuj||2HmGzC z+3NpBmbVn|2q(p~wCR%vP*!N|DljPnZ%3vv0~xljXhRx)xjb+9}*%f_!bP4wsnhL{yr{Y6a|h{;Se z9|f&b@G9OvjS3=5#>;_{t*^_P(lqHkY?hkbuvSkMiC$I%d8hS_ELb>%rX-Ul{aolo zK<}8B)KZP%I23TM3vIW=tYroHLf^o4%)yoEui^g?M+O7o?B8NSyUI# zFx|fkE5?=nB*<^j6TbQLl!~?V7fh>-y_S zp!OhSZbR2T)-=C;=yW33k0rKSLmUg}NG4AVD4I4%k8i!?QZ~ER(Gp$LB@ytfj%UpD z_z>Re@|tXoVL55ugoL7r#IvDv!?ylgy{0Wwms}BN>;bY??}m**-CW-l+_yQ4ReO!<}7uAAo=NcyB#AhnpO?j&If;J z2UUm?0%=3U%$rkZLg5+ee%cNzCvTVUdKL7snyIOz8A7}PzH!MyX33uWB^nyy98~2z z2fE%y>ghg>#uH;iu8CSl8VbWdHpAOEay_u{%bH8@J=fsD*lLaidnR6Z?1*LXpNm>LIYu(wcjvC zi^p+ne!8cZhXW&`&bzbT4H><8Auw-uC%`+I!_3l(6o@yy%KfFGDOyY^z5Lz1X|83c zgrTH)*^hR{w{9}hcw#>B&;^;_i>Z{Cs+8W0kU3n{AntDs3R{^q1^CfWG5>Oomt$ar z_&e2VhX%?O?yn`3k`%2@)_LD2XOiI(n@7m7*Lj~$>jXNY-rPa5$K>Tzh4hD`GNYZJ zDCyOD=rg1ixn}IKekHFBSv|E_9lc4f6@$jy^_Jm#Qka2G3cBD_&PJA1XtHJIq(FZm1b(I=9b$P&vfVQ{xMm zQ)7jlUNGe}?z~5TX<)aYR+SY~37u>B5=OPLY9f{% zQHUTF5qbD1ioR@({>ob_zhbHbqvqRBIz{!v(thC|i=t~6?u9sqtK(01SeL^nnoN%r zJt(*lgS+<^4GnjJxvx`c>f{&x1W9quqL-K`9Xh56lQuEH4@g#+Ehwi5hri&RqbOl> zOhqZ_{FRNlie?ZbFgbI*xa)yAqg<>tVm6Z&YW*{DH-e1#eyghKBzv&v)hPmp$Q|3zB z&p?H{*-%twxG-H(y!bl+e%U3VshH5*oFM4k#2rN{O)l74Dv8e)mT;&fvcar>X=ARj zH;?qfq0#(T(a;Os4{Tb;YVmvaE|VXYbW{?A>h={|6@)Jv*;VsCDQlxA_DT&$NFb+< z6H7qcGb&%}btpcSVpb0!Bs?C_A*TwmWVEdfPz);{F1Gv1@U;og`~GO#vWZoQ3LV^_ zj2HW}IOYc)5C>zT)?m{08LhVIIcvS4S@JW!9uL#Bh2ajvXNfDE|IE<1o~r4#Wn^dq zITq~Z@7>jJ^pukGyy4d(r9TE~P`(vzCwQu%`%X=Unht*Y#n_j8p8tyu1>hnn= z+lpLJEjMCJUXH?tikRHMtZolSC$D-UUAMqKZkqfaF(h~W1Pe4W|W}*pizbCWWamq zy5BzU=^DmZiZ{6~Rfp&2=pW>8sZr~{1uNXiE}CJzndPTbnVS7NUXNml8)G?iuOxb$ zGNH))&;#Y(u5K67GHfq0W=N4Gi%hVA9}Kl42^yD7t$U>NrRL|eC#R+`Ue#bC8^@+5 ziqgcBy$N6Y_Mv}pxN{p~qMa#WR5|b90g-e_?y8k!8lvbl`l|%rY20a5RRceu_#xa# z9SCCU;etKhX6o*I$z5zxY*K@4;rsZYv!y1}i4ytZ`SMA5!SX=;*-<5ih21T6*z^f` zf=xV?GN9C;YR*x>IyRXsvH;&5r*1frPJ8Gi`!wnxjm_yuOQphg7(eg9;#Gmzt4H1HCRz26|^Ify87$kf-NF-GBO@-v9ZaWX0%z`_BbGL=P{J5 zcvV;Y^x!(l1z)>czJaDx+~mg1A+ud6NtcE2LU#*}$}v@cL)o`-O^r=NW9O*Fb^Z_P zpyw;n2oJD9=c`OLkNT?@j*ZRDc|~UU4OxS$vLG5cIUmn?xqbbLWZ-nfz9&o5k0YHN zu9j=6t`liBYGK=!gN3}Ay=|iZ>*$*8y9)TG$7WZUEw!-6%l82p+&*=s&RDGRN3T<2 zseP++t2PZdTc30Upgj;aXecL)Ok`hLB?gKG0uFIQrch9e-ri(^ExL$6Q9Fr#cP&75 z6yByt>h$qR#^!rozYQ*Y4}LrV;rL^Fp%FpfgZ>+u=Hn2$*AW)*BR`O6_101kjMj}} z)x7RLPae6!N|$}6Ge7H0&DQkH`PA~{zI?aT`gU@1n4fwe#BR3Ip-6GnAH6xlkV+)8 zu$_d{_(fLjNy|oK9oxy!lUrN^8iClS*e>%N(}sX018cMvB1=vAPitxSLlms|y580e ziNA>REIrs*cLk%dhAU5p39NDs!_|qK{yN&TE_q<4S6-j3VqI?|F^Z#TBan&+lz=|f zTy0E!H4XD)=|puT%o3l$i)D|J{q?fb%wR5k5SPW%+07@_TK3IA<-Dl&A6U5EOFew$ z$v+MCxgK%3%rlXsmlE_`_Qi4CT{_b1+X7GTG>SNVJIBp7e^xI^&s*hVe^OPbrZDis zl*_K@(wkEu^+V6*BvLwWU->o>j!d8+xVi$Xde?uoq{YRu!J=cgJ_l9o<_sG!s5@9F zWm?3trZD07w7AqQtQMj)YS~dq7cw|_?L0GoV&<{N<$i(&i8%0m746nQDl@fxD#Xh(n0iOULkKbLyI6^O%37P2SPJ`fw^q#fy4SO!J zTvqb+xkJb73a&geM^^@nNCR9r32H)Ac#hO?5whT6<5l|)04l<_03UoTbfMAA9+QsV zYmd^>Sg|AOD2LBLjn}u?-{@7aGsj_nP*xAA&S7XfK0mz6@J-85?8(N-eu|;s85j6^ z@<6jA{vAgMVO$5sT}EG9Cuw9fhSC+7@!@?NWl6XMllzhv!o|eIam?C%qNk~ z`!Oqytd~Q5gpKs}Z8C%MMG=(F`Uf+otK=@okg!oiFnYF3bo7BpE7HkUDfcxHxy_KM zDSO&xmw4|q9L*|)K-yJ7vd&r>Mp65c+=G5QzCdw&Cc~7fYrJn-gEnLH2}7DbbSgSfj%KM0wJ>jvYXlVu#Fet1%vpOjhD4xtGs_LH zxja4?O6ziwD>Ey%(6g#f!s%g27fWlK{Oz(yx@>|?_0)9R;ot%PdwgX2#G&mt>tN!H z?O{#X$y8YcAQ1dz`Sv5zdC_pKLu=7t=C0|<6WeKtegD_exUXAes+ zk49O492c-ZzN5lO0-C4e##&?e=+M>rief!vN4mf&p`D zX~Q1Zj^@g z=61vc1+<{07QLQWrb{h z$Ni3x&Q1nREm6+|P(17Hv7EY9WB12N$7tT+y#C+_qFR&d(mIIt*^8+EsHD!3$z%lG z^RlS>en)fySD*zdvUlWSw_7qP3NOX2Crln#f9IlQ!HNgEb){XU^+SkOW5?m3j)w!S ziY7B^{zMNpsJ!1wtUG|517act3^dhtI%k?GTlcZ26HWV%P$Y(5KMMCInu0`0_(IP| z2qGrTzCGS_&Nb9*{eWCrdufb1wXi0CZ0r9asCIwklz-{m=+=ZDqTtD!cKP~QC10N`*XkgyrORd>D5a|=5<|uIP_4MF+f5-a%u}#pxph*rix-WWl`_(nMC(Z{S zjSnL0mgn2APj8@r;5Sv8{h#l|C5)UiQg(KfTpXOe{lgAK35QJ=e{g_YTT-HS!}k)6 zRu{4T_cUjiuii!MIDP@s%Y{qgN_u_%jgFV*z|}keMb|_js*LW(K|l31g{L1iA3rSP z<(%KF`F`PkyiL40r%kQjo)^Ev@>R*{`>V1dKf zT%D}*c;;c%Qg3p;l*bX<4B|tzkK^mz0Uq(efMZ=ak#if zVQtiG*>1KoNnmy|p5q^Ns%y$e?X|B^;J^0EWep%=U0KSYyTy{BGgxjKzQ3KJvb)(j zznLm~V|PBxdVM=13igM4863>=KAt7khvCOBI5M9 z0>f)XIv(CJm?VrX*YUpd%Q}y?Z}KxA>E`C7J?}SmH@94Vl}5|d)IbhG`=pt z{743Tc+F%m&CBx=Zv(2(M#FyT{_EAdeKE%(l^MIoo2Sj(M1~*PWTMhhIbFF;%iv_)X|Sgdw9ThBG*yWq2O1pQ5qWSog$r?uFk$gT(K4*8f3ldh_YJcZ*K* zcj)acu5^C;YP;G{l3d4297QGv^9uLzOmf5%Ap}y?{@*q?ycbbJNiNkfbRh5GdcmSq z90dXex`!ed^U`9#dxH3j1R@QoDB6%fULphoz8!(|`AOHdSj>Un3ujWlog9k)dF$u@ z9zqv-{wMCEr*U%s+g@^U$8}Q^o-rg!$)vXR?$Bgz zyF5aAQju2s6%PpWb6SX=4XT0wH={ap6_|=dDv2rULH)f*CgO>kPgB~W5W;BzAEIN< z=kOR`(g+D#G++E@i5eOt|bd%4Yr7raMz=t%Ux{$KR3&HV0#$)7?u_ z&TEdVYA8Q9l|<)TXOM}00@s?WN7EG|ui2uRQZy}BwMO*3>g>vjTEJa5rFu3vYV=|c zx+trLj1HHVOHkd6-&PQ!P22~U;!N(?%B#DSNdDU(!15Su|A0U)8UacWPVeXvL843r zbDy!=Vta$htuI8_d@26j$`>5)yqr=Q%=&=v%n$yUD5xD|z~6R^c=RQsNj@S8U9^BU z!>?|p_=uyeOs6%YsI=i#ZX98;@3;PUi6=v>qrg2qSb-Pcq9UFIZaepjIcCeiJ4;P$ z>I0v>_H=6kvXeBBHUH-bE-G3c1Lfrm)Aa1T>GrW$LP5gCpl|HJ_g~Qc^KnqU;DmT0 z{}%Jvzc9-;o%>HQd*9c?Gx~8A@9phf_se*8*z^*KN=u^x9MW?!3n^wW;nnEbjXU_n zvq#KMh^(YWKFc3ISNS}fqNnHc8#>iCp!WPMg^PA)LR8>^`Ru0IEAThzJWl#`3kzPO z{r!3)Y21q*kfp;x0HD4eP-zhYO3mOa7_wx4J#YiXQu0XNjwn)LTwZ4;00sH#Ra#q{ z0OUm# z`$3Kl!XAf7nhhM_B)R9$3}p&r0`YIq4erZHg=fSC51$v1i3R1#H}f+s&ziFHiLF2} zHO=L3^6w=p&+ASS;tH5(^j@-lu!bU;UUpjm!ldXEv0^9s3{A zQn8ksVQZKu01p96C!5A4EvuR3h2PtdrY2spXawTOz=VW1;IjvTV7?lc`Fh%XdEJiY z*#=~8Wwf-23KT;I1|*I^T>#h@vHbWfaDFzaAcGOvd$a0`_WSX6zi~M1`1;N)KfMRA z%*DVI0C44eWOwAx(Nd%p?MQ;!s_~HHS-BC6P|2(yS;encC(=apoa-WKEzOxhaH{~A5QN4Gbg z-j!W1ch$@Y0SpE z|9SY&dxb7Y(Rfe36Z-M*f!#HU!1cLY!-2dmP{~bU9pzO(?GbbaLmLlpTorWnDl4VMP5~MriFI z&o`THn8kkRnQs;&rrt6>JO}UR0?a7@@)N?!0MFr`f)&fb4yMizPv5E;mb%?>Dd@ zHzUBefgn0J;JGhUK_HXMJhiCy#p6`5;?MH#1A~L0V-x`X(*-?KZ$k7;tOsN#!0pRc z$kGF42Y@W*+tDHPymSYABPzki_hf1pLKoyfavNiRrYsTG2HkaD>Zq!)xESD%b3uk* zr0I58^Njy__a)&36v){DlL2X>ZJ2L>srD=@3|3*SXT1WC(LBdZv0$)7=H*e^+S)c) z;{68CPF2LM!Xr)@Se=V0tAp8^8g? z5b?7}F+khvwIZL18aOs{>}`IXN-OioEMaF}w+!d?IFIwtw(nGERIPVMe2&PE^Zr~C zTBj7V>dNQ)g9BFtivZqk&aDc+R?$m*Cn?y{=ypg1Yt!47CP_(6Lz7)w`=)V8nkD(? z@83xv4nhHiYgHip4M0b1oSb%`A$2(OSEwgMUL-(27nFbk)y1PKdOoe~V`D}EZE`~PPq1;)p1=rcTON=c<=^gUH%1|RrP%;@5t4HIOA z2o)X*+?;%XL~N{aa&TZGynq5?W{2%pA3;C|lE-^z^%;^j#=xOiye3J2dR|7Nb``Q2)Lz zd%9%=tLCRVr!r=#Vi(*t66I6O3hhF&AfFctn9>y7de~ATFHw4ha&YCs8U~axu#e$H zqG{w#F~bF6%?;4IOfP&9)ITv7d!E3RIuEwvsxj&YsYA2VMI{}<*P*~3%5uqS+}_6o zA8IbQAcu|KdqU%*K|#Ip5f>3uG|6K%&tJ?tVBf?$5kYoFMSXp;wzf8AUIXgoe3Xl@ zc{SQrR!GXUn^_tc?{Ch5hGrX%1_!Mz z8^E^Ew!)WMl;(MEA%>ZJ84^N%ciccU6052-)l_|t;D`vvl%l^p1ZS;h9X!e>BE{?6TzzXU`tL@+ zQ;`Mm2xp}6{_C>~DzfvQH|g_HIdHjtdpb%P#3-(BFN=0BvxEc7tylPQk>LpWTwh~gV7$3AY|t;_uKhj zDX6yLR8D|XmQ`1O1t^6eD0Li|gk0ut?L&@NHcmHs#lSiA^|MVgol!G99r~Ou-v(gw zVyL|%Cx?~D#RRJS<_b3Z_8&meJ#1-dDFPCbu)aRo)$s~iyad?5BlP0s%dFqOala(c z2?9?6vzQ+^SjB0$`wPfTLqh>>z;pUnw~&AIVO{Td6fS?Hs+X!;%@ zqo5!(gHDS@g@FEp1^4jv{M3}v$+_B|g40WP6%yBXcNHe1#DT~z|G91^iNPTu9r3g( zQHhCExQy`*Nj-}3>2n}T?5OxC@~6LK3Dt1m+t$J zgxg82{i5d1+|8tehvZ{@V5&axqU(q>FRPo!)plPl+sz=|CW%}jD=P+k0sY+zoy;;e26}WY|L`_zi zAJ|v!LzT@?w9dmLmixysFvGKG9ysGVVAdJu16}IkiOBF8|7i~ens{Uv_`*%Kb}Vka z-wOlzGMR)eLPsHwTYvxRgCARbY{2Dc>kh>s+B+7_pQwm&`XP}4e2CT=b;9|AQ!ou95g-l^5BG5aw!*;04Qgm;;IN#YnRzbJJ2^RNTdcQ}a)Pib zFH=dUeV3&4)no{i&KCv&I$+E3VR}Bmd011;6H-E~!LcjYJlt60;_M11x4XxkDLB@B|OX8(_vf6GrzgY7X zCr;wsajN&(k$>vNJt`K z;Zau~?jQhT+Y4Gxm=|NxhJ{h&L{+^0aDOkWp%GeVy#fOT5)n|Y$mHzeg4l6*eY)Xe z4V%X6f(alK#tW0X_CaA`enmyJLc+o}TLakb7r@QLC@_aI_y|x?Q2P4%+Q52($$FXB z{raSxO$X2^^bHKg>#TJEfMb2W=Bx69Bo2dS8+b$-Ew*}iNI&asRwfnx+1DEuo{W+b zPDx2A?-Vom1+YM8ZzKt`$E`h~fahXq9hDmz7=;+Z8NMi}6O397uK|%577C!4YY?sK zHBn_`WG49TtQUWK+idjcfjDElFtLA$%V|XjU=$&8IiIug@_G*3J#H_cPtK*idLZ;( zl+D`Kt_YDLWM&Wo)X!i~Q`ZkcU%IQ|6b=o@I{^Wb=eS&;h=799z0~M*=;>Cu9R&== zyvjZMcGYA!#UIqv@_IcIg2}GCD;R5G2#bWo`c?4IkR(7>_UOCG7rdUDn#vR2nbsUL zEg;(9KAWFc7t56|N+1Av-roLxWA*TOj;H|u^f=#NGjmuiBGjlKqA$cX2k^pX1ogoI zo@4mVj;V;Ks0MOrGOI~;Lj(TyNV>4Fumju++ar*fBzEtTnF)<+r7dIm#<2@bS zYr4d^I6vTlWN+U>0l!6eZvoRW$ZNd;>Jo5II(mEIfkFW)(OK&)tv$oz#5(eTKfy_6 z%2W1fBe6@rprx_IP>Ik@>le9{a~Z2c5l0#h_#G_>GW_G3kxd4bOvaDwY#-VpU!Kq2 z-rgK{O(7w#=+vtb&`9`2K$>!m^z9?SM+#b6mJADf+PLD~){D#Ct;tL_HFdtq=u3V9 z2RF}F{L28KkNv<{d%ix%PVmNz@w}t$SQvBOfI&b`Mg{|H$Q%9#R`^k+ywE4}YT+Z4 zm#77*mzl^_q0>^;lXcN%5Mb2)##HTJ;9rezeQHWM)fvq^<@{`zpZCBqR$YRLA-ue2 zcQUX7e=2}RMwZ=*d!{9B5$KIG2WIcN_nR90@IQ*?jldAacvz3Bd#C+LMnq&1mKmf^ zLAWO(A|hQNA0Z6RKGuA&&#!%ZsRJxuiUPV% v+_7a{`7+84mF1ffItIoiay`7t?|U?F=Eeqhs`MBr@F)IBTBKA+*XREN(HSBH diff --git a/doc/en/contactlist-contextmenu.png b/doc/en/contactlist-contextmenu.png index 5cb100f6454891194ec76676887ae84e3c9a0129..48cbc6a0f632bf0759251c091900b5d4d0c1a16d 100644 GIT binary patch literal 14010 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 EfACb>>Hq)$ literal 0 HcmV?d00001 diff --git a/doc/en/emoticonsbutton.png b/doc/en/emoticonsbutton.png deleted file mode 100644 index 9d225dddb1f129cc91f916b54de07f7fa2ffcff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1183 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

W9uT0= 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 literal 0 HcmV?d00001 diff --git a/doc/en/index.docbook b/doc/en/index.docbook index e5a05b6..295d889 100644 --- a/doc/en/index.docbook +++ b/doc/en/index.docbook @@ -2,8 +2,8 @@ KMess'> - - + + @@ -19,7 +19,7 @@ The &kapp; Handbook - 2007-07-31 + 2009-02-01 &version; @@ -44,7 +44,23 @@ Pilo -

amroth@coldshock.net
+
valerio@kmess.org
+ + + + Heimen + + Stoffels + +
cooleboy121HS@hotmail.com
+
+
+ + Panagiotis + + Papadopoulos + +
pano_90@gmx.net
@@ -69,11 +85,11 @@ - &kapp; is an alternative MSN Messenger chat client for Linux. + &kapp; is an alternative Windows Live Messenger chat client for Linux. It allows Linux users to chat with friends who use Windows Live Messenger on Windows or MSN Messenger on Mac OS. The strength of - &kapp; is it's deep integration with the KDE desktop environment, - its focus on the MSN Messenger specific features, and an interface + &kapp; is its deep integration with the K Desktop Environment (&kde;), + its focus on Windows Live Messenger specific features and an interface which is both clean and easy to use. @@ -83,6 +99,8 @@ KDE KMess Chat + Windows Live + Live Messenger MSN Client Messenger @@ -111,53 +129,68 @@ Instant Messaging is a form of real-time communication, commonly involving hand-typed chat messages. - This can be considered more akin to genuine conversation than the e-mail's letter format. - In contrast to e-mail, the parties always know whether their peer is available + This can be considered more akin to genuine conversation than the email's letter format. + In contrast to email, the parties always know whether their peer is available to start an interactive chat conversation. - &kapp; is specifically designed to access to the MSN Messenger service, - the Instant Messaging service developed by Microsoft. + &kapp; is specifically designed to access the Windows Live Messenger Service, + an Instant Messaging service developed by Microsoft. This allows Linux users to chat with friends and colleagues who use MSN Messenger in Windows or Mac OS X. MSN Messenger has been renamed to Windows Live Messenger in February 2006. - It's former name is still commonly known, and often even shortened to "MSN" (or, now, "WLM") by it's users. + Its former name is still commonly known and often shortened to + MSN or nowadays WLM, by its users. - The strengths of &kapp; are it's integration - with the KDE desktop environment, focus on MSN Messenger specific + The strengths of &kapp; are its integration + with the K Desktop Environment (&kde;), the focus on Windows Live Messenger specific features and a clean and easy-to-use interface. - Like many Linux and KDE applications, &kapp; is free software. + Like many Linux and &kde; applications, &kapp; is free software. The licensing terms are the GNU General Public License. Some feature highlights: + - Communicate with contacts who use other MSN Messenger client software. - Rich colorful chat styles. + Communicate with contacts who use other Windows Live Messenger/MSN Messenger client software. + Rich, colorful chat styles. Multiple accounts are supported. + Past chat logs browser to show old discussions. Chat logs styled as the original conversation. Fast file transfers including thumbnail previews for any file type. - Grouping of messages from the same contact as a single message. + Automatic reconnection in case of connection failure. + Chat Windows can be used again after reconnecting. + Non invasive warning messages. + Many options to customize the chats and the contacts list. - At the moment, &kapp; supports these MSN-specific features: + At the moment, &kapp; supports these WLM-specific features: + Contact list organizing. Chat conversations. Display pictures exchange. Fast file transfers. - Receiving and sending nudges. - Receiving winks, custom emoticons and offline-im messages. + Chatting freely with offline and invisible contacts. + Receiving and sending nudges, custom emoticons and winks. Exchange of Now Playing... information. - Transferring file thumbnail previews. - E-mail notifications for Hotmail accounts. + E-mail notifications for Hotmail/Live Mail accounts. + MSN Plus features: text formatting, tabbed chat windows. + Receiving and sending of Ink (hand-written) messages. + Option to block notifications when the status is set to Busy. + Options to hide received winks and to block nudges. + Emoticon blacklist to hide forever annoying custom emoticons. @@ -177,32 +210,36 @@ Use no gifs because of patent issues. Use the same style for all screenshots - (Plastik widget, color scheme and window borders). + (Oxygen widget, color scheme and window borders). --> Logging in - Being an MSN Messenger client, you need to access the MSN Service to be able to see your contacts and - chat with them. To do so, you can use your account details - just as you do with the official client - on Microsoft Windows - or register a new account on the Microsoft Passport web site. After you log in, - you will be able to use &kapp;. + Being an Windows Live Messenger client, you need to access the Windows Live Service to be able to see + your contacts and chat with them. To do so, you can use your existing account details - just as you do + with the official client on Microsoft Windows - or register a new account on the Microsoft Passport + web site. After you log in, you will be able to use &kapp;. Creating an account - To use &kapp;, you need to have an account for the MSN Messenger Service. - You can either use a free Hotmail address, or register one of your e-mail addresses - at register.passport.com to create the account. - After the registration process, you can use your e-mail address to login to the MSN Messenger Service. + To use &kapp;, you need to have an account for the Windows Live Messenger Service. + To create one, you can either make a new free Windows Live Hotmail address, or register one of your + own email addresses at register.passport.com. + KMess, in its login screen, offers you a link to that site. + After you completed the registration process, you can use your email address to login to the + Windows Live Messenger Service. - After you create an account, you will receive an MSN confirmation e-mail and have to click on the confirmation - link which is in that e-mail. Until you click on that link, your account will be restricted: you will be able to - add very few contacts and you will not be able to change your own friendly name. In your Passport Account page, - you can make MSN send you another activation e-mail. + After you created an account, you will receive a confirmation email from the Windows Live Service. + This email contains a link which you have to click on in order to confirm your account. + As long as you don't confirm your account, your account will be restricted: you will only + be able to add very few contacts and you will not be able to change your own friendly name. You can + let the Windows Live Service send you another confirmation email, by clicking on the Request + verification email link, in your Account settings page in &kapp;. @@ -210,10 +247,17 @@ Logging in - Enter the e-mail address and password of your account to connect. - It's recommended to enable the "Remember this profile" option, - as it saves your account preferenes before you quit &kapp;. - Use the "Connect" button to continue. + Enter the email address and the password of your account to connect. + It is recommended to enable the Remember account option, + as it saves your account preferences before you quit &kapp;. If you want &kapp; to store your password, + you can also enable the Remember password checkbox. + Use Connect to continue. + + + You should not enable the Remember account option, if you are using a public computer: + this is because others may see your email address or even use your account without authorization. + If you choose not to remember the account, it will disappear when you logout. Also, any changes to the + settings you do to a guest account will be lost. @@ -221,21 +265,26 @@ The &kapp; startup screen - Use the check box field at the bottom of the window if you don't want your account data saved. + Disable the check box "Remember account" if you don't want your account data saved. - After logging in, your contact list appears. - This is described in the next section. + If the KDE Wallet is enabled in your KDE installation (and it is by default), you may see a + confirmation dialog or a quick wizard you can use to protect your account passwords. This will + only appear once, and the next times you will only be prompted for your wallet's password, to + unlock the KMess passwords. + However, if the KDE Wallet is not available, &kapp; will store the unencrypted account passwords + in the .kde4/share/config/kmessrc file within your home. + This file is not accessible by other users of your system, so it is not seen as a security issue. + If you do not wish to have your password saved anywhere at all, or if you are on a public computer, + disable the Remember password checkbox provided in &kapp;'s startup screen. - &kapp; stores your saved accounts' unencrypted passwords in the .kde/share/config/kmessrc file. - This file is not accessible by other users of your system, so it's not seen as a security issue. - If you do not wish to have your password saved anywhere at all or if you are on a public computer, - use the extra field provided in &kapp;'s startup screen. + After logging in, your contact list appears. + This is described in the next section. @@ -244,24 +293,26 @@ Using the Contacts List - The contact list gives you an organized overview of the buddies (the "contacts") you can chat with. + The contact list gives you an organized overview of the buddies (the contacts) you can chat with. To view the contact list, you need to be logged in first. The following image gives an example of a contact list: - Here's a screenshot of &kapp; + Here is a screenshot of &kapp; - The main window and contact list. Hovering with the mouse over a contact's name, brings up a tooltip with information about that contact. + The main window and contact list. Hovering with the mouse over a contact's name, brings + up a tooltip with information about that contact. + To start chatting with a contact, just click his or her name Please note that many of the actions and operations you can perform on the contacts present in your contact list, can be performed directly by right-clicking on the contact. This will pop up the following menu: - + @@ -275,39 +326,50 @@ Changing your status - There are three ways to change the your current status when you are connected to the MSN Messenger Service. - The first is to use the dropdown menu in the main &kapp; window. The second way is to change the status in Connect from the main &kapp; window. + There are three ways to change your current status when you are connected to the Windows Live Messenger Service. + The first is to use the dropdown menu in the main &kapp; window. The second way is to change the status with + Connect My Status from the main &kapp; window. The third is to right-click on the &kapp; tray icon, then click My Status. - There are different statuses available: + You can select from the following different statuses: Online Away - Away with auto reply - Be right Back + Away with Auto-Reply + Idle + Be Right Back Busy - Out for Lunch + Out to Lunch On the Phone Invisible - &kapp; differentiates between three 'Away' statuses. - The standard 'Away' status is the one you may be familiar with from other MSN Messenger clients. + + + The menu to choose one of the available states. + - When you set your status to 'Away with auto reply', a window appears and you can type in your auto reply message. - This message will be sent automatically to every person who starts a chat with you. + The last item of the list allows you to disconnect from the Live service. - After 5 minutes of inactivity, most clients change the status to "Away-Idle" by default. - While most MSN Messenger clients display this status as "Away", &kapp; explicitly distuinguishes between the two states. - The contact list tells you whether the contact set his status to "Away" or whether it was automatically set to away through inactivity (displayed as "Away-Idle"). + &kapp; differentiates between three Away statuses. + The standard Away status is the one you may be familiar with from other Instant Messenging clients. - By default, &kapp; switches your status to "Away-Idle" after 5 minutes of inactivity. - This setting can be changed or disabled in the "Alerts" section of the profile settings. + When you set your status to Away with Auto-Reply, a window appears where you can type in an automatic away message. + This message will be send automatically to every person who starts a chat with you. + + + After 5 minutes of inactivity, most clients change the status to Idle by default. + While most MSN Messenger clients display this status as Away, &kapp; explicitly distinguishes between these two states. + The contact list tells you whether the contact set his status to Away or whether it was automatically set to away through inactivity (displayed as Idle). + + + By default, &kapp; switches your status to Idle after 5 minutes of inactivity. + This setting can be changed or disabled in the Account Status Options section of the account settings. @@ -319,19 +381,20 @@ Starting a chat with a contact - Click on an online contact on the contact list, - or choose "Chat" from its right-click menu. - The chat window opens, and you can send the first message to the contact. + Click on an avaible contact in the contact list, + or choose Chat from its right-click menu. + The chat window opens and you can start chatting with the contact. Starting a chat with multiple participants - Open a chat with a contact as described in How to start a chat with a contact. - In the opened chat window, go to Chat Invite. - In the submenu choose the contact you want to add to the existing chat. Do this - with all contacts you'd like to add. + Open a chat with a contact as described in Starting a chat with a contact. + In the opened chat window, go to Chat Invite.... + A window will appear, showing all avaible contacts. On the left, you can click on the contacts you want to select + to be added to the chat. On the right you can see which contacts you are going to add. You can also invite contacts that + are not on your contact list, by directly entering their email addresses. @@ -343,9 +406,10 @@ Adding a contact Use the menu - Actions New Contact . - A dialog will open to enter the e-mail address of the contact you wish to add. - After confirming this by clicking OK, the contact is added to your contact list. + Actions New Contact.... + A dialog will appear, where you can enter the email address of the contact you wish to add. + Optionally, you can directly add the new contact to a group, by selecting a group from the list. + After clicking on OK, the contact is added to your contact list. @@ -354,9 +418,10 @@ Right-click on the contact you would like to remove. Choose Delete Contact from the right-click menu. - A dialog opens which allows you to remove the contact but still allow them to see your status, or to both remove and block the contact. + A dialog opens where you can select to remove the contact but still allow him/her to see your status, + or to both remove and block the contact. Both options cause the contact to disappear from your contact list. - The second option makes sure the contact can neither talk to you nor see when you are online. + The second option makes sure the contact can neither talk to you nor see your online status. @@ -364,9 +429,9 @@ Blocking a contact Right-click on the contact you would like to block. - Choose "Block Contact" from the context menu. - The contact will no longer be able to initiate a chat conversation with you or see when you're online. - You can still see that contact's online status and you can still initiate a chat conversation if you'd like to. + Choose Block Contact from the context menu. + The contact will no longer be able to initiate a chat conversation with you or see your online status. + You can still see that contact's online status and you can still initiate a chat conversation if you want to. @@ -374,21 +439,40 @@ Unblocking a contact Right-click on the contact you would like to unblock. - Choose "Unblock Contact" from the context menu. + Choose Unblock Contact from the context menu. The Contact will be unblocked. + + Copying a contact to another group + + Right-click on the contact you would like to copy to another group. + Choose Copy to Group and then, from the resulting popup menu, + choose the group that you would like to move the contact to. + The contact is then copied to the chosen group. + + + Moving a contact to another group Right-click on the contact you would like to move to another group. - Choose "Move to group" and then, from the resulting popup menu, - choose the group that you'd like to move the contact to. + Choose Move to Group and then, from the resulting popup menu, + choose the group that you would like to move the contact to. The contact is then moved to the chosen group. + + Removing a contact from a group + + Right-click on the contact you would like to remove from a group. + Choose Remove From Group + The contact is then removed from the group. + + + Renaming contacts @@ -408,18 +492,21 @@ Adding a group - Use the menu Actions New Group . - After clicking it you will be asked for a name. - After confirming your choice by clicking OK you will find the new group in your contact list. + Use the menu Actions New Group... . + A window appears, where you can enter a name for the new group. + Confirm your choice by clicking OK and you will find the new group in your contact list. Removing a group - Right-click on the name of the group you would like to remove. - Choose "Delete Group" from the right click menu. - You will need to confirm the action, and then the group will be deleted. + Make sure that the group you want to remove is empty and has no contacts in it. + If the group is not empty, you will first need to remove all contacts from the group, + before you can actually remove the group. + Right-click on the name of the group you would like to remove + and choose Remove Group from the context menu. + You will need to confirm the action, by clicking on Remove. @@ -427,7 +514,8 @@ Rename a group Right-click on the name of the group you would like to rename. - Choose "Rename Group" from the right click menu. You will now be asked for a new name for the group. + Choose Rename Group from the context menu. + You will now be asked for a new name for the group. After confirming the action by clicking OK the group will be renamed. @@ -440,23 +528,35 @@ Sorting contacts by Online/Offline or by Groups - Use the menu View Sort by. - Choose your preferred sorting mode for your contact list. + Use the menu View Sort Contacts by. + There are three different sorting modes available. With Group your contacts will be sorted by + their Group. + If you select Online/Offline, the contacts will be sorted by their status: the contact list + will only display two groups - one containing all online contacts, and one with all the offline contacts. + The last one mode, Mixed, will make the contact list to display all available contacts in + their respective group, but all contacts that are offline will only appear in the Offline group. Choose + your preferred sorting mode for your contact list. + + + + + Show allowed contacts + + To see which contacts you have allowed to see your online status and start chats with you, but didn't add + to your contact list\\, use the menu option: + View Show Allowed Contacts. + This adds an additional group to your contact list, that contains all allowed contacts. + Contacts can only be removed entirely from the Allowed Contacts group + if they no longer have you listed in their contact list. Show removed contacts - Too see which contacts you have allowed to talk to you and see your online status, use the menu option: - View Show Allowed Contacts. - This adds another group to the bottom of your contact list. - Contacts can only be removed entirely from the "Allowed Contacts" group - if they no longer have you listed in their contact list. - - - The menu option View Show Removed Contacts - shows all removed, blocked contacts. + Enabling the menu option View Show Removed Contacts + will add an additional group that shows all removed contacts. Removed Contacts are people that you removed + from your contact list. @@ -468,9 +568,9 @@ Changing your own Personal Message - &kapp; supports the MSN Personal Message feature: under the displayed friendly name in the Contact list window, - you'll see a rectangle with "<Enter your personal message here>" written on it. Click it, and you will be - able to change it. To confirm your changes, press Enter or click somewhere else. If you want to no longer display + &kapp; supports Windows Live Messengers Personal Message feature: under the displayed friendly name in the contact list window, + you will see the text: <Enter your personal message here>. Click it, and you will be + able to enter a personal message. To confirm your changes, press Enter or click somewhere else. If you want to no longer display a personal message, just empty the field. @@ -478,12 +578,11 @@ Send an e-mail to a contact using my Hotmail Account - Right-click on the contact you wish to write an e-mail to, and click on - "Send Email". &kapp; will open your Hotmail Account with - the "Compose" interface and the contact's e-mail address in the "To" line. - When you are in a chat, you can also click, in the contact sidebar, - on the e-mail address beneath the contact's image to send an e-mail to that person. - Also see Email options. + Right-click on the contact you wish to write an email to, and click on Send Email. + &kapp; will open your Hotmail Account with the Compose interface and the contact's email + address in the To line. + When you are in a chat, you can also click, in the contacts panel, + on the contact's picture and click on Send Email to send an email to that person. @@ -491,10 +590,11 @@ See the MSN Profile of a contact Right-click on the contact you want to see the profile of, - and click on "Show Profile". &kapp; will open the MSN Profile of that contact in a web browser. + and click on View Profile. &kapp; will open the Live Profile of + that contact in your favorite web browser. When you are in a chat, you can also click on the contact's image - in the contact sidebar - to open that contact's profile. + in the contact sidebar + and click on "View Profile" to open that contact's profile. @@ -510,28 +610,28 @@ Open your Hotmail Inbox using &kapp; The contact list window displays a link to your Hotmail account. - The link states how many unread e-mail messages you have. + The link states how many unread email messages you have. Clicking on this information will open your Hotmail Inbox in your preferred web browser. - This open is only available if your account has been registered with Hotmail or MSN. + This option is only available if your email address has been registered with Hotmail or Windows Live. - Search for Contacts in the MSN Member Directory + Search for Contacts in the Windows Live Member Directory In Actions in the main &kapp; window will you find two entries: - Search Contact + Search for Contact Search by Interest Choose your preferred way of searching for a person. - &kapp; will open the MSN Member Directory with the chosen option in your preferred web browser. + &kapp; will open the Windows Live Member Directory with the chosen option in your preferred web browser. @@ -552,26 +652,27 @@ Chatting - Once you have a chat window open, either opened by you or by a contact who has started a converstation with you, the + Once you have a chat window open, either opened by you or by a contact who has started a conversation with you, the chat can begin. Arrived messages are visible in the big upper area of the window, and you can type your own messages in the smaller area on the window bottom. Then you can press Enter to instantly send your message, or Shift+Enter to insert a new line in your typed message. - The two buttons at the right side of the typing area do just that without using the keyboard. + The two buttons at the right bottom side of the typing area do just that without using the keyboard. - On the right side of the window, you will by default see the Sidebar (see Using - the Sidebar to learn more about it). It displays the names and pictures of all contacts who are currently - participating in the conversation. If you don't like it, you can click on the - - Contact Sidebar - - - - - Toolbar button to hide it. The names of the people who are chatting with you will still be visible on the - window titlebar. + On the right side of the window, you will by default see the Contacts Panel (see Using + the Panels to learn more about the panels). It displays the names and pictures of all the contacts who + are currently participating in the conversation. If you don't like it, you can click on its little + X button, or from the menu, View Panels + Contacts to hide it. + + + you can define shortcuts for any of the actions you can perform in chat. You can go to + Settings Configure Shortcuts... to define them. Many + actions already have shortcuts, some of which are similar to those of Live Messenger. + A couple handy shortcut worth mentioning are: Esc, which closes the chat window; Alt+Z, to send a nudge, or + Ctrl+Up/Ctrl+Down, which allow you to easily scroll through the chat window and read what everybody said. @@ -587,16 +688,11 @@ - In the chat window toolbar you will find a button with a smilie. - - Emoticon Sidebar - - - - - - By clicking this button the Emoticons Sidebar will open. Clicking on one emoticon will insert it in your textbox. Sending the message will display the emoticon in the chat. - + Below the textbox, in the chat window, you can find a button with a smilie. + By clicking this button the textbox will display the available emoticons from your currently selected emoticon theme. + Clicking on one emoticon will insert it in your textbox. Sending the message will then display the emoticon in the chat. + You can also enable a separate Panel for your emoticons. To do so, click on View Panels Emoticons. + This will add the emoticons panel to your chat window. See also Emoticon Themes. @@ -604,34 +700,39 @@ Custom Emoticons - With &kapp; you can also exchange your own emoticons with your friends. To use them, click on the My Emoticons - label in the Sidebar, and choose a custom emoticon from the list, just like you do with standard emoticons. + With &kapp; you can also send your own created emoticons to your friends. To use them, click on the Custom Emoticons + button, below the chat message editor, next to the emoticons button. All your custom emoticons will appear in the textbox and you can choose a custom emoticon + from the list, just like you do with the standard emoticons. + Just like with the standard emoticons, you can also enable the Custom Emoticons Panel, by clicking on + View Panels My Emoticons in the Menubar. - When you first use &kapp; or create a new account, the list will be empty. But adding new ones is easy, you can + When you use &kapp; for the first time or create a new account, the list will be empty. But adding new ones is easy. You can do it in two ways: - Save the emoticons sent to you by your contacts; or - Add them by choosing images from your computer. + Save the emoticons you received from contacts + Add emoticons by choosing images from your computer - When a contact who you are chatting with sends to you a custom emoticon, you can click on it + When a contact you are chatting with sends you a custom emoticon, you can click on it to add it to your own custom emoticon theme. A dialog window will pop up: + The Add Custom Emoticon dialog - You may also use this dialog to can change the text shortcut associated with the new emoticon. By - clicking the Ok button you'll be instantly able to select the new emoticon from the - My Emoticons tab in the chat window's Sidebar. + You may also use this dialog to can change the text shortcut associated with the new emoticon. By + clicking the Ok button you will be instantly able to select the new emoticon from the + My Emoticons button or panel. - Alternatively, you can open your account's Settings dialog, select Emoticons> Custom Emoticons icons - and click the Add new... button. + Alternatively, you can open your account's settings dialog Actions Configure Account..., + select Emoticons> Custom Emoticons + and click the Add New... button. @@ -639,51 +740,31 @@ File transfer &kapp; supports transferring files through MSN. Please note, that there could be problems if you - are behind a router or a NAT. To send a file to a contact you first have to open a chat with + are behind a router or a NAT. To send a file to a contact, you first have to open a chat with him or her. - Then you can send a file by choosing Chat> Send File from the menu. Choose the file you want to send to the contact. Confirm the action by clicking OK. Otherwise, you can click on the "Send a File" button located on the chat toolbar. + Then you can send a file by choosing Chat> Send File from the menu. + Choose the file you want to send to the contact. Confirm the action by clicking OK. Otherwise, you can click on the Send a File located on the chat toolbar. But by far, the easiest method to send one or more files to your contacts is drag and drop: just drag some - files from the desktop or a folder in Konqueror, and drop them over the chat messages view, or over the message - editor box. They will be immediately sent. + files from the desktop or a folder in Dolphin or Konqueror, and drop them over the chat messages view, or over the textbox. + They will be immediately sent. - After your contact accepts to receive the file, The File Transfer Window of &kapp; will be opened and the - file will start to be transferred. + After your contact accepts the file transfer, &kapp;' file transfer window will appear and start the file transfer. - - Contact Sidebar + + Contacts Panel - The contact sidebar is located on the right side of the chatwindow. + The contacts panel is by default located on the right side of the chatwindow. - Chat window with the sidebar (on the right side). - - - - - You can display or hide it using the button in the toolbar - - Contact Sidebar - - - - - or using the menu entry - Preferences Show/Hide Contact Sidebar. - When the Sidebar is hidden, the chat can be smaller, but you can't always see who is chatting with you: - - - - - - Chat window without the sidebar. + Chat window with the contacts panel (on the right side). @@ -692,46 +773,40 @@ the chat. Information includes: - Nickname Display picture - Current status - Email address - Personal Message + E-mail address (when you click on the Display picture) - Right-click on a contact in the Contact Sidebar to bring up a menu with even more operations: + (Right-)click on a contacts Display picture in the Contacts Panel to bring up a menu with even more operations: - A contact's right-click menu. + A contact's (right-)click menu. - The Contact Sidebar has even more: when the person is writing a message, the contact image becomes - brighter. If you click it at any time, &kapp; will display that person's profile in your web browser. - Clicking the e-mail address below it will open your Hotmail Account at the "Compose Mail" - page and the contact's e-mail address in the "To" line. (See Email Options - as well). + The Contacts Panel has even more: when the person is writing a message, the contacts Display picture becomes + brighter. Nudges - &kapp; can send and receive MSN's nudges. They are a good way to get attention from your contacts, but they may - also annoy them. + &kapp; can send and receive WLM's nudges. They are a good way to get attention from your contacts, but they may also annoy them. - Click on the "Send a nudge!" button from the toolbar: your chat window will shake momentarily. Your - contact will "receive" the nudge in the same way, his or her chat window will shake and they will also hear a - sound as if they had received a message. + To send a Nudge, you can either click on Nudge the toolbar, or select + Chat Send a Nudge!. + Sending a Nudge, will cause your chat window to shake momentarily. Your contact will receive the nudge in the same way. + His or her chat window will shake and they will also hear a sound as if they have received a message. - Unlike MSN Messenger, &kapp; does not limit the number of nudges you can send or receive every minute. But try not - to abuse them, as it's easy to make someone angry by using them too much. If you don't like the graphical effect + Unlike Windows Live Messenger, &kapp; does not limit the number of nudges you can send or receive every minute. But try not + to abuse them, as it is easy to make someone angry by using them too much. If you don't like the graphical effect which is caused by nudges, you can disable it in the Account settings. See the Alerts settings for details. @@ -739,23 +814,32 @@ Zooming - You may find that the text in your chat windows is too small or too big. Use the "+" and "-" toolbar buttons, or - the menu items Edit Zoom In/Out, to - increase or decrease the font sizes displayed into the conversations. + You may find that the text in your chat window is too small or too big. + Use the menu items View Zoom In/Out, to + increase or decrease the font size displayed in the conversations. Save chat sessions - Click in the chat window on - Chat Save . - Choose the directory where the chat should be saved and give a name for the file. + To save your current chat session to a file, you can click on + Chat Save Chat... in the chat window's Menubar. + Choose the directory where the chat should be saved and name the file. Save the chat now by clicking OK. See also Automatic chat logging. - + + + Tabbed chats + + Unlike Windows Live Messenger, &kapp; comes with tabbed chats by default. In your Account settings you can enable + or disable this feature. When you have more than one tab in a chat window, a little close button appears on the tabs. + To close an opened tab, just click on the close button of the tab you want to close, or click on the close button at the top of + the window (the one you normally use to close a window). + + @@ -765,8 +849,9 @@ Configuring &kapp; - &kapp; can be customized as you wish. The main method to modify the application behavior is the Settings Dialog, there - is one for every account registered in &kapp;. You can also personalize many details about your contacts with the Contact Settings dialogs, and change how &kapp; sends feedback to you via the + &kapp; can be customized as you wish. The main method to modify the application behavior is Configure KMess... located under Actions in the Main window, + there is one for every account registered in &kapp;. You can also personalize many details about your contacts with Configure account..., and + change how &kapp; sends feedback to you via the Sound notifications dialog. @@ -776,56 +861,29 @@ By right-clicking on a contact in the contact list window, you can open the Properties of the contact. - + #FF0000 Here you can use some neat features of &kapp;. First, you can force &kapp; to use a particular name for a contact, instead of the name that the contact had set for him/herself. - Check the "Use an alternative name for this contact" box and write an alias name. + Check the "Use an alternative name for this person" box and write an alias name. You can choose to disable notifications for a contact. This is useful, for example, if that person connects and disconnects from MSN very rapidly and you keep getting - notification popups for him or her. Uncheck the box "Show a popup balloon when this person goes - online or offline". + notification popups for him or her. Uncheck the box "Show a popup when this person goes online + or offline". - You may also specify your own image to display for a contact instead of the one that he or she has set: &kapp; also allows the user to choose a particular sound to be played when the contact comes online. - - Contact Images - - &kapp; allows you to associate images with particular contacts, to avoid viewing the image they have set. - - - - - A contact's properties window, with a custom picture set. - - - - Click the browse icon to select another picture (which must be in PNG format), or insert the path manually; - then confirm your changes by clicking OK. You will immediately see the change in the - contact list: - - - - - A contact's tooltip, showing the custom picture. - - - - To use the picture set by the contact, just repeat the procedure and delete the path, leaving the field empty. &kapp; will automatically replace your custom image with the one of the original contact, if available. - - Contact Sounds &kapp; allows you to associate sounds with particular contacts. Click on the button on the right of the "Sound:" field, to browse for the sound (in Ogg Vorbis format) you'd like to use. - + Confirm everything by clicking OK. This sound will now be played every time the contact logs in. @@ -837,24 +895,23 @@ Changing the sound notifications - &kapp; has six different events that are by default - set up with sound notifications. These six events are + &kapp; has seven different events that are by default + set up with sound notifications. These seven events are A contact has started a chat with you - You have received a message from a contact - A contact has come online A contact has gone offline - A contact has changed his or her status - You have received a new mail + A contact has come online + A contact has changed its MSN status + You have received a new email + You have received a message from a contact + A contact requires your attention - &kapp; uses KNotify for its notifications. You can enable/disable them by selecting Actions> Configure Notifications . - The same settings are also accessible by using the KDE Control Center: choose the section - Sounds> System Notifications - and you will find &kapp; between the event sources. + &kapp; uses KNotify for its notifications. You can enable/disable them by selecting Actions> Configure KMess + and clicking on Notifications on the left. @@ -882,53 +939,41 @@ if your account is not verified with Passport (see Creating an account for more details). You also cannot change it unless you are currently connected with that account. You can also change the e-mail address of your account. If you change MSN address, you can just change it here to avoid losing your preferences. - The password field is usually blank. If you wish to change it, enter your new password here. + The password field is usually blank. If you wish that KMess remembers your password, you can enter it here and check the checkbox next to "Remember password" - Your displayed picture can be changed easily by clicking on the Browse... button. and selecting - one of the two options: the first, Browse..., just lets you select an image from your PC and + Your displayed picture can be changed easily by clicking on the Change... button and selecting + one of the three options: the first, Browse..., just lets you select an image from your PC and automatically scales its size to fit MSN's picture's size, which is 96x96 pixels. - The second option, Browse and crop image... lets you select an image and then select which part of the image you wish to keep as your display picture. - Below it, the "Don't show a display picture" checkbox allows you to avoid choosing a picture - at all. + The second option, Browse and Crop Picture... lets you select an image and then select which part of the image you wish to keep as your display picture. + The third option, Set Previous Image... allows you to choose from some pictures you already had before as your display picture. + Below it, the "Do not use" checkbox allows you to avoid choosing a picture at all. - The "Login with this account automatically at start-up" automatically connects &kapp; to MSN + "Login with this account automatically", automatically connects &kapp; to MSN with this account details every time the application is started. - Finally, choosing an MSN status from the Status to set at login dropdown menu, will force - &kapp; to set that status when you login to the MSN Messenger service. + Finally, choosing an MSN status from the Login as dropdown menu, will force + &kapp; to set that status when you login to the Windows Live Messenger service. Alerts - - &kapp; can use pop-up balloons to notify you about the presence of your contacts. The "Popup Notifications" box - groups together the options to display or not a balloon when one of your contacts performs a certain action. - You can show a popup balloon when your contacts log in, log out or change status, or when they start chatting with - you or everytime they send you a message. - Balloons can also be shown when you receive an e-mail at your MSN mail address. - Balloons hide themselves after a default time of 10 seconds, but you can customize this time via the "Hide popups - after ... seconds" control. Here is an example of a balloon: - - - - A notification balloon - To avoid seeing the graphical effects seen when receiving and sending nudges, you can disable the checkbox "Shake the chat window when a nudge is received or sent". - &kapp; supports the MSN feature that shows your contacts the music you are listening to. Unlike MSN, which only + &kapp; supports the MSN feature that shows your contacts the music you are listening to. Unlike WLM, which only notifies them about what's playing in Windows Media Player, &kapp; will discover which media player you are using - searching within a wide range of media-playing applications - and automatically tell your friends the details of the tracks you listen to. - Enable the checkbox "Inform contacts of which song I am listening to" to activate this feature. When you listen to + Enable the checkbox "Show contacts which song I am listening to" to activate this feature. When you listen to music, &kapp; will show the track name in the upper part of your contact list. The following players are currently supported by this feature (And more will be added!): + Amarok @@ -947,18 +992,18 @@ Emoticon Themes - The Emoticons page of the Settings Dialog - Standard emoticons tab + The Emoticons page of the Settings Dialog - Emoticon Themes tab &kapp; supports many different emoticon themes, and can use those of other instant messaging software, such as Kopete. - New themes can be downloaded by visiting the www.kde-look.org site. + New themes can be downloaded by visiting the www.kde-look.org site. - The default &kapp; emoticon theme is named "KMess-New", which contains the emoticons created by David Vignoni. + The default &kapp; emoticon theme is named KMess-New, which contains the emoticons created by David Vignoni. - The Emoticons page of the Settings Dialog - Custom emoticons tab + The Emoticons page of the Settings Dialog - Custom Emoticons tab Other than MSN emoticons themes, &kapp; can also manage custom emoticons. See the Custom Emoticons to learn more about their usage. Each account has @@ -968,25 +1013,25 @@ Any item you see in the list has an image and the shortcut text that you may type to send that image to your contacts. - Select an item and click the Remove button to delete it. Click the Rename button or press the F2 key to change the shortcut. + Select an item and click the Remove button to delete it. Click the Rename button or click the emoticon to change the shortcut. - To create a new custom emoticon from an image on your PC, click on the Add new... + To create a new custom emoticon from an image on your PC, click on the Add New... button. A dialog window will pop up: - + The Add Custom Emoticon dialog Click the ... button to select the image from your PC. You can also directly type or paste from the clipboard the file's path in the field next to the button. If the image is valid, it will be displayed in the square on the dialog's top left corner. Then choose a text shortcut to - associate to the new emoticon. Finally click the Ok button to instantly add it to your + associate to the new emoticon. Finally click the OK button to instantly add it to your Custom Emoticons theme. - To save your changes to the theme, be sure to confirm them by clicking the Ok or Apply buttons. + To save your changes to the theme, be sure to confirm them by clicking the OK or Apply buttons. @@ -994,27 +1039,20 @@ Chatting - The Chatting page of the Settings Dialog + The Chatting page - Text tab This page customizes the appearance of your chats and how the text in chat messages is formatted. - To change how your own chat messages are formatted, use the two controls next to the "Your message font" label. Change the font's attributes (like font name, size, italics, bold) with the left one and the font color with - the right. + To change how your own chat messages are formatted, use the controls below "Your message font". Change the font's attributes (like font name, size, italics, bold) with the left one + and the font color on with the right one. - Activating the "Force contacts' messages to use this font" and setting up the font setting controls below it will display all the messages incoming from your contacts in the font of your choice. + Activating the "Force messages from your contacts to use this font" and setting up the font setting controls below it will display all the messages incoming from your contacts in the font and color of your choice. - - The chat style chooser and preview are made to select a visual style for your conversations. See Chat Styles for more details. - - - The controls below fine-tune the displayed style of your chat. The "Show graphics in chat messages" box, if - disabled, will make &kapp; not show any emoticon in your conversations. The "Show time in chat messages" - checkbox is used to display the message sending/receiving time, see Timestamps for more details. - "Use font effects" will enable font effects as often seen in IRC clients: Words surrounded by asterisks (e.g. *bold*) will be displayed + + "Use font effects in messages" will enable font effects as often seen in IRC clients: Words surrounded by asterisks (e.g. *bold*) will be displayed with a bold font, those by forward slashes (e.g. /italics/) will be shown italicized, and those by underscores (e.g. _underline_) will be underlined. - "Group follow-up messages from the same contacts", when enabled, groups together all consecutive messages from any single person. - + Chat Styles @@ -1027,7 +1065,7 @@ The Fresh chat style. - Another style is 'Classic'. + Another style is 'Classic'. This theme comes into two flavors, default and compact. The second lets &kapp; display the messages in a more compact fashion than the first. Take a look at the image below to see the difference: @@ -1038,19 +1076,25 @@ - ...and the Classic-Compact style. + ...and the Classic-compact style. There are even more chat styles you can choose from. Just open your account's settings, by clicking on Actions - Account Settings - (your account's e-mail) + Configure Account... - Then change to the tab 'Chatting' and use the Chat Style dropdown menu + Then change to the tab 'Chatting' (on the left) and use the Chat style dropdown menu to change the theme. + + The controls below fine-tune the displayed style of your chat. The "Show emoticons" box, if + disabled, will make &kapp; not show any emoticon in your conversations. The "Show messages time" + checkbox is used to display the message sending/receiving time, see Timestamps for more details. + "Group follow-up messages from the same contact", when enabled, groups together all consecutive messages from any single person. + "Group chats in the same window" allows you to customize the Tabbed Chats feature. + @@ -1072,43 +1116,53 @@ Automatic Chat Logging - The Chat Logs page of the Settings Dialog + The Chat Logging page of the Settings Dialog &kapp; gives you the opportunity to automatically save all chats when they end (that means, when you close that chat's window). - Enable the checkbox "Log all Chats" and specify the directory where you want the chats to be stored. - You can also select how to group together your chat log files: by year, by month, or by day. Folders will be - created into the chosen directory, accordingly to your choice. + Enable the checkbox "Enable chat logging" and choose the format to save the logs in. Normally you want to go for HTML, + as HTML shows all emoticons and colors you and your contacts used, while Plain Text only shows what you and you contacts + have said. + You can also select how to seperate your chat log files: by year, by year then month, by year then month then day or not organize them at all. + Folders will be created into the chosen directory, accordingly to your choice. After applying the settings, &kapp; will automatically save all chat logs. - + Email options - - The Email page of the Settings Dialog + + The Settings page of the KMess Settings Dialog + + &kapp; provides the option to use a custom web browser instead of the &kde; default one (usually Konqueror). + To use eg, Firefox instead of the &kde; default one, change the radiobutton from Use the &kde; default browser + to Use an installed browser and choose the one you want to use. + - &kapp; provides the option to use a custom e-mail client instead of your Hotmail account. - To use eg, KMail instead of Hotmail, change the radiobutton from 'Use Hotmail' to 'Use a specified command'. - Then enter "kmail" in the textbox and apply the settings. - To open KMail within Kontact, use 'kontact --module kmail'. + &kapp; provides the option to use your Live Mail/Hotmail account. + To use Live Mail/Hotmail instead of the &kde; default email client, click on the Email Client tab and then + check the checkbox next to Use Live Mail if the account supports it + Then apply the settings. - Two additional options are available: the first, "Show e-mail information", will display on top of your contact - list the number of unread messages which are waiting in your mail inbox; the second one, "Show a notification - when e-mail is received in other folders", will display an e-mail popup balloon even if the received mail is not - being stored in the Inbox, but in Junk or in any other folder. + There is also the File Transfers tab. When a contact sends you a file, you may want to save it somewhere on your computer. + Check the checkbox next to 'Save all received files in one directory' and specify a path to the folder you want the files + to be saved in. Use the button on the most right to browse for a folder. + Finally, specify the ports you want to use for file transfers and make sure they are forwarded by checking your router + settings. + One nice feature for doing File Transfers is that, when you want send a file to one of your contacts, you can open up your + favorite file manager and browse for the file you want to send, then drag-n-drop it in the chat window. - - Deleting a saved &kapp; Profile + + Deleting a saved &kapp; Account - Click on the Delete button at the bottom of the settings dialog. You will be asked - if you are sure if you want to delete the profile. The changes will be applied immediately. + Click on the Remove button at the bottom of the settings dialog. You will be asked + if you are sure if you want to delete the account. The changes will be applied immediately. @@ -1138,20 +1192,10 @@ - Do I need a hotmail account to chat with &kapp;/MSN Messenger? + Do I need a hotmail account to chat with &kapp;? - No, you can register any e-mail address at register.passport.net. - - - - - - How can I disable "other folder" e-mail notification? It's all junk mail anyway. - - - Open the settings dialog for your profile. - Under the "accounts" dialog, unclick "Show 'other folder' notifications". + No, you can register any email address at https://accountservices.passport.net/reg.srf. @@ -1161,7 +1205,7 @@ Perhaps in the future, but we have other priorities first. - Off course, nothing stops you from helping us, and implementing it yourself. + Of course, nothing stops you from helping us and implementing it yourself. @@ -1170,15 +1214,13 @@ Why can't I play winks in &kapp;? - To play winks, you need to have a flash-player and cabextract installed. + To play winks, you need to have a flash-player and cabextract installed. These packages can be installed after &kapp; is installed. Also verify whether you can play flash files in Konqueror. If flash can be played in Konqueror, it will work in &kapp;. - Use the Konqueror Plugin settings to detect new plugins - and enable the "Use artsdsp to pipe plugin sounds through aRts" option - if the flash player hangs when it loads. + Use the Konqueror Plugin settings to detect new plugins. @@ -1188,23 +1230,25 @@ You installed &kapp; to the wrong directory. - Basically, it should be configured to install to your KDE3 directory. + Basically, it should be configured to install to your &kde; 4 directory. This folder should be auto-detected, but you can also tell configure where to find it. - For example: ./configure --prefix=/opt/kde3 - Basically, it's the directory under which you'll find share/apps/a bunch of K programs. + For example: ./configure --prefix=/opt/kde4 + Basically, it is the directory under which you will find share/apps/ a bunch of K programs. - What ports do I have to open in my firewall to get the filetransfer working? + What ports do I have to open in my firewall to get the file transfer working? - Ports 6891-6900 (TCP only) + The default Ports are 6891-6900 (TCP only), but you can specify which ports you want to use in the general settings. + Why is the size of my chat font ignored? @@ -1228,7 +1272,7 @@ Where should I submit a theme I made that uses Microsoft's MSN emoticons? - We don't want them. + We don't want it. Despite the fact that other MSN Messenger clients for Linux use them, we feel there are likely copyright issues. That's one of the reasons we have our own complete emoticon theme, @@ -1261,30 +1305,28 @@ It has been considered and rejected. - The two programs may have similar functionality in the MSN department, but they're built differently. - Furthermore, we've always felt that those multiple-protocol supporting - programs suffer from the "least-common-denominator" problem. - If 4 protocols don't support different fonts and 1 does, - then no fonts for any, etc. - Though they're getting better, lately. - Instead, Mike, and later some comrades, - started developing a full featured MSN client for Linux. + The two programs may have similar functionality in the MSN department, but they are built differently. + Furthermore, we have always felt that those multiple-protocol supporting + programs suffer from the least-common-denominator problem. + If 4 protocols don't support different fonts and one does, then no fonts for any, etc. + Though they are getting better, lately. + Instead, Mike, and later some comrades, started developing a full featured MSN client for Linux. - Why should I use &kapp; instead of GAIM/Kopete/aMsn? + Why should I use &kapp; instead of Pidgin/Kopete/aMSN? - Short answer: if you have a KDE desktop and use MSN Messenger only, &kapp; is made for you. + Short answer: if you have a &kde; desktop and use only the Windows Live Messenger Service, &kapp; is made for you. - Some clients are written to support multiple protocols. Kopete, for example, supports many. - But &kapp; tries to support only one, and its developers are working to support the MSN native - features at their best, optimizing the user interface for one protocol. - &kapp; also stays true to KDE standards for look and feel. - There is a choice for everyone, you're free to use what you like! + Some clients are written to support multiple protocols. Kopete for example supports many. + &kapp; on the other hand, tries to support only one and its developers are working at their best + to support the MSN native features and optimizing the user interface for one protocol. + &kapp; also stays true to &kde; standards for look and feel. + There is a choice for everyone, you are free to use what you like! @@ -1294,7 +1336,7 @@ There was already a KMsn, though that was later changed to KMerlin. - "Mess" is a short form for "Messenger" and also is somehow a self-deprecating joke. + Mess is a short form for Messenger and also is somehow a self-deprecating joke. When I named it that, I didn't think anyone would actually end up using it. ;-) @@ -1318,8 +1360,8 @@ &kapp; - Program copyright 2002-2007 Mike K. Bennett mkb137b@hotmail.com, - copyright 2005-2007 Diederik van der Boor vdboor@codingdomain.com. + Program copyright 2002-2009 Mike K. Bennett mkb137b@hotmail.com, + copyright 2005-2009 Diederik van der Boor vdboor@codingdomain.com. @@ -1331,11 +1373,14 @@ Michael Curtis mdcurtis@users.sourceforge.net Diederik van der Boor vdboor@codingdomain.com Valerio Pilo amroth@coldshock.net + Antonio Nastasi sifcenter@gmail.com + Ruben Vandamme vandammeru@gmail.com For a more detailed analysis of the commits to the source code, consider visiting: - KMess contributors at ohloh.net. + KMess trac timeline + KMess contributors at ohloh.net Code was taken from: @@ -1355,7 +1400,7 @@ Dane Harnett (Web design) dynamitedane@hotmail.com - David Vignoni (The main and yellow/blue/violet emoticon sets and Italian translation) dvgn@libero.it + David Vignoni (The main and yellow/blue/violet emoticon sets) dvgn@libero.it Julien Joubin (Cartoon emoticons) jujubinche@netscape.net Christian Müller (Default sound theme) cmue81@gmx.de Michael Anderton (KMess icon in Oxygen style) mike.s.anderton@gmail.com @@ -1366,57 +1411,82 @@ - Mohamed Aser (Arabic) mohasr@link.net - Youssef Chahibi (More Arabic) chahibi@@gmail.com - Mauricio Rother (Brazilian Portuguese) mauricio@digicomm.com.br - Jaume Cornadó (Catalan) jaumec@lleida.net + Panagiotis Papadopoulos (Translations Maintainer) pano_90@gmx.net - Lin Haoxiang (Simplified Chinese) linhaoxiang@hotmail.com - Liu Sizhuang (More Simplified Chinese) chinatslsz@hotmail.com - Yen-chou Chen (Traditional Chinese) yenchou.mse90@nctu.edu.tw + Mohamed Aser (Arabic) mohasr@link.net + Youssef Chahibi (More Arabic) chahibi@@gmail.com - Lars Sommer (Danish) admin@lasg.dk - Pascal d'Hermilly (More Danish) pascal@tipisoft.dk - Arend van Beelen Jr. (Dutch) arend@auton.nl - Diederik van der Boor (More Dutch) vdboor@codingdomain.com - Jaap Woldringh (More Dutch) jjh.woldringh@planet.nl + Mauricio Rother (Brazilian Portuguese) mauricio@digicomm.com.br + Leonel Freire (More Brazilian Portuguese) leonelfreire@gmail.com - Jyri Toomessoo (Estonian) nuubik@hotmail.com - Markus Vuori (Finnish) markus@vuoret.net - Joonas Niilola (More Finnish) juippis@roskakori.org - Jussi Timperi (More Finnish) jussi.timperi@gmail.com + Jaume Cornadó (Catalan) jaumec@lleida.net - Choplair (French) pachilor@yahoo.co.jp - Vincent Fretin (More French) fretinvincent@hotmail.com - Andrea Blankenstijn (More French) darkan9el@gmail.com + Lin Haoxiang (Simplified Chinese) linhaoxiang@hotmail.com + Liu Sizhuang (More Simplified Chinese) chinatslsz@hotmail.com - Jan Tönjes (German) jan.toenjes@web.de - Páder Rezsõ (Hungarian) rezso@rezso.net - Valerio Pilo (More Italian) amroth@coldshock.net - Vincenzo Reale (More Italian) smart2128@baslug.org + Yen-chou Chen (Traditional Chinese) yenchou.mse90@nctu.edu.tw - Park Dong Cheon (Korean) pdc@kaist.ac.kr - Øyvind Sæther (Norsk Bokmål) oyvind@sather.tk + Lars Sommer (Danish) admin@lasg.dk + Pascal d'Hermilly (More Danish) pascal@tipisoft.dk - Matjaž kaše (Slovenian) matjaz.kase@g-kabel.si - Johanna Gersch (Spanish) - J.C.A. Javi (More Spanish) yovoya30ks@hotmail.com - Alejandro Araiza Alvarado (More Spanish) mebrelith@gmail.com - Jaume Corbí (More Spanish) jaume4@gmail.com - Christian Kaiser (More Spanish) k39@users.sourceforge.net - Christian Lundgren (Swedish) zeflunk@gmail.com + Arend van Beelen Jr. (Dutch) arend@auton.nl + Diederik van der Boor (More Dutch) vdboor@codingdomain.com + Jaap Woldringh (More Dutch) jjh.woldringh@planet.nl + Elve (More Dutch) elve@savage-elve.net + Sander Pientka (More Dutch) cumulus0007@gmail.com - Rachan Hongpairote (Thai) rachanh@yahoo.com - Gorkem Cetin (Turkish) gorkem@gelecek.com.tr - Barbaros Ulutas (More Turkish) tebarul@yahoo.com - Uğur Çetin (More Turkish) ugur.jnmbk@gmail.com + + Jyri Toomessoo (Estonian) nuubik@hotmail.com + + Markus Vuori (Finnish) markus@vuoret.net + Joonas Niilola (More Finnish) juippis@roskakori.org + Jussi Timperi (More Finnish) jussi.timperi@gmail.com + + Choplair (French) pachilor@yahoo.co.jp + Vincent Fretin (More French) fretinvincent@hotmail.com + Andrea Blankenstijn (More French) darkan9el@gmail.com + Barthe Guillaume (More French) gu_barthe@yahoo.fr + + Jan Tönjes (German) jan.toenjes@web.de + Panagiotis Papadopoulos (More German, Greek) pano_90@gmx.net + Dimitrios Glentadakis (More Greek) dglent@gmail.com + + Páder Rezsõ (Hungarian) rezso@rezso.net + Pauli Henrik (More Hungarian) henrik.pauli@drangolin.net + + David Vignoni (Italian) dvgn@libero.it + Valerio Pilo (More Italian) amroth@coldshock.net + Vincenzo Reale (More Italian) smart2128@baslug.org + + Park Dong Cheon (Korean) pdc@kaist.ac.kr + + Øyvind Sæther (Norsk Bokmål) oyvind@sather.tk + + Rastislav Krupanský (Slovak) ra100@atlas.sk + + Matjaž kaše (Slovenian) matjaz.kase@g-kabel.si + + Johanna Gersch (Spanish) + J.C.A. Javi (More Spanish) yovoya30ks@hotmail.com + Alejandro Araiza Alvarado (More Spanish) mebrelith@gmail.com + Jaume Corbí (More Spanish) jaume4@gmail.com + Christian Kaiser (More Spanish) k39@users.sourceforge.net + Juan Pablo González Tognarelli (More Spanish) jotapesan@gmail.com + + Christian Lundgren (Swedish) zeflunk@gmail.com + Mattias Newzella (More Swedish) newzella@gmail.com + Rachan Hongpairote (Thai) rachanh@yahoo.com + + Gorkem Cetin (Turkish) gorkem@gelecek.com.tr + Barbaros Ulutas (More Turkish) tebarul@yahoo.com + Uğur Çetin (More Turkish) ugur.jnmbk@gmail.com Note that some translators also made other contributions. - Contributors - without which we won't be where - are: + Contributors - which without them &kapp; wouldn't be where it is: @@ -1433,6 +1503,7 @@ Vincent Fretin (MSN6 emoticon definitions) fretinvincent@hotmail.com Damien Sandras (GnomeMeeting developer) dsandras@seconix.com Tobias Tönjes (Guy with a bag over his head) + Heimen Stoffels (updated the User Manual for version 2.0) cooleboy121HS@hotmail.com @@ -1466,16 +1537,16 @@ Obtaining &kapp; - &kapp; is not a part of the official KDE project. + &kapp; is not a part of the official &kde; project. It can be downloaded instead from http://www.kmess.org/. - The download page also provides links to distributions which including &kapp; in their package collections. + The download page also provides links to distributions which include &kapp; in their package collections. You can install &kapp; directly with your package manager, without having to download it from the &kapp; website. However, some distributions may not supply the latest version yet. - In that case it's recommended to use the &kapp; Installer, found on top of the &kapp; download page online. + In that case it is recommended to use the &kapp; Installer, found on top of the &kapp; download page. @@ -1484,8 +1555,10 @@ Requirements - In order to successfully use &kapp;, you need kdelibs-3.2 and qt-3 installed. - &kapp; should be able to run at any UNIX/X11 compatible system the kdelibs can be installed at. + In order to successfully use &kapp;, you need kdelibs-4 and qt-4 installed. + At Ubuntu and Debian, kdelibs-4 is named kdelibs-5. + &kapp; should be able to run on any system where kdelibs can be installed. + This includes GNU/Linux, UNIX variants, but also Microsoft Windows and Mac OS X. To play winks, you need to have a flash-player and cabextract installed. @@ -1494,9 +1567,7 @@ Also verify whether you can play flash files in Konqueror. When flash can be played in Konqueror it works in &kapp; as well. - Use the Konqueror Plugin settings to detect new plugins, - and enable the "Use artsdsp to pipe plugin sounds through aRts" option - if the flash player hangs when it loads. + Use the Konqueror Plugin settings to detect new plugins. @@ -1623,7 +1696,7 @@ Extract the source package - After you've downloaded the source package, extract it with: + After you downloaded the source package, extract it with: $ tar zxvf kmess-&tarversion;.tar.gz @@ -1643,12 +1716,12 @@ The first command verifies your system. It stops if a required package cannot be found. - This often happens when you forgot to install the accompanied "devel" package. + This often happens when you forgot to install the accompanied devel packages. The second command builds the application. - This step could take 10-20 minutes, depending on your system. - When this command completes you'll have a runnable program at: + This step can take up to 10-20 minutes, depending on your system. + When this command completes you will have a runnable program at: $ ./kmess/kmess @@ -1662,11 +1735,19 @@ $ su -c 'make install' - Alternatively, you can use checkinstall to install the application instead. - This makes it easier to uninstall &kapp; later. + On Debian and Debian based systems like Ubuntu (and all of its Derivates, like Kubuntu) use the following command: + + $ sudo make install + + Alternatively, you can use checkinstall + to install the application instead. This makes it easier to uninstall &kapp; later. Using checkinstall, the installation becomes: $ su -c 'checkinstall' + + Or on Debian based systems: + + $ sudo checkinstall @@ -1685,7 +1766,7 @@ You can use that package to install &kapp;. - If you have a clean, newly-installed system, without any KDE upgrades, + If you have a clean, newly-installed system, without any &kde; upgrades, you can share the package with others. Make sure users can always download the source package too, as required by the GPL license. diff --git a/doc/en/mainwindow.png b/doc/en/mainwindow.png index 00c853bb850a725c7b96bf63624edad7533c5508..469166eb4d053d2f05e2e59c61d76867d0d620ba 100644 GIT binary patch literal 102953 zcmXt9b984QF0KgCZ_W-5Pz~lT7$y~)W zT}91YOq{J8U9BAK0V1|WE-q$-rdEXJR`zBtuFhuMgf@0&E-tDxkN>Sg@!tehD^~|w z2Y`&+51o*X@c%|;dPYKHGgl)*CPLSriB|R&T_VCz001FCN>oVIGyB5NBRg5_&i^rF zDiRD8br=AdIGE@jNETd3Oi6u4C9R5ziZpytar_KxA^UE-FPFF$CA- zWxiFrO|Yr9d3`}&p7y6}`yDGa!(*#$`|PZ;EVuIN8IS4hyHu^p%dF}RgRMMc?@_pU zo4}p)qg3vP>v^AM_cfftEuE*?UnArILCEup0R7LjthB86TaRC ztGs0uY-lMcp11@1HJ81IIRZb7r9XGm_HNSBB3yw3L50c^!~jSl!3rqFpCP_B3{u!~ zS@qgZDFooE)kYYTWxiP83Poz*LIaHyf+$Q#Yyj8H2^ctm00Q$20f2%c0waYy3gi^v zAPVCh0r~NAl)Mk$1tS6@Dp3l75keR6Sa}Bo1bI}AAU)hJcs%mS^lzd92zevQYpcuv z1)yrqka1TLXBFY2p>-2TBXRzvy^i2_!_av&~ng3Q?&90n(-F^5EyVHe+u3lQZ3Q! zwA4HejIf=aaByNH5FORsNdcCf9qAju8K{{g^@)V2qOMYjF2*`ULQ$rUA&PKyrGhGr zff7daJ#nLcDWA>S6u4F3?k44WpwvjTo}utStkG}B+z%g#fWSq{+BIjorB@R;cj=LV znhNglFzo;>Su)aoVK0G&gid#pb2MxzFyUp-+JK7!CwbFra!gSKvO*`>3aqB8QmIV> zY|Q^bGRROx#EuzY7A8eCH)aGBiY2tkY`I^I1o+B@TZPR56wr#khn|A;C(L4wCQ{O6 zR0Zv95-wx}$%+w_%JC<*qzBe3ssn%}0Yt@TmDci>`-{_MZj~QOdSNffQo)7dQPrpeWC?VyH$`l?d_liDX7*h8@ON)LaUnp! z$O_{3k?`XrL~k&R1~BSl5T8Kai_D9r#lbCz11m8ic$2|XV9ywHBrt&5E|&L^^y4US z-JOBO3hMVCA>&4iK*=_Ujy8#<3{(La4F&qaACRh4=D`+6PPiF{H-!UZa^I1 zLaTHGc6OkM!tsoll$7wHB{S!b-XZG>aKJZ5oQS1vqO*q8)@Voc!81JR*sr# zh{)sTuUYRQR4Ib&Cm0dt0~gIUsZ^`fvJ+$`mY)kI_)ANfe@M5;Hx$9w%;ZnRe@0 zndVPMCz^r&2!{wyf00;BA85vq4yjAYwO4x|wy&HxYHEKhi9X&zwnx5&*x=?>KpQ1v zjJu-EhXzl_^=8wZx2EZ8QqgmBUr6$RDIGVA{EiyjQr&eKh$Ualgu9naBhyAg9f3R` z=cm+-Y>tS%%bBKHX?-6Bd4E1UK19brmrNFpI9YiaDn6jGS+rMuZv4$qj_Qsp5)5`8 z7>3pS9FTI86_UM|Ay<-2r?aYNqglMQZq?&He6;q!b=p(Zf%syc$J(BZmxdaX=ST0m9c$bhB1A~=w%B)ShVm3kU=s0Zw zZ6jJlsb&NnET~!W1&M8lXCD6m5PtE?O|rP>xaQSONZ_dOcqLm@88niR9(TibGs{yRL zD(_d*P(=tGG@Teggbvmm(7R(Du>sc^77_{^i$zs0k^W}VU0&%GGwlmuF2b5*hg&Fs z@)OrE6hdFD7#G!}#f?Aj5m!Z@1a#a|lt7504h;HVK?}Bi1F+J=Q75|H3!J>8ZSp^1p4|IpKen6i>vR(*&8E3vrJ5WK(y zdHMMTk%Ht1ZWnotG8Q57Q&0Hpj8(K`c~Fx$tTykGu~n)Ok!*i`Zh=7js&-S`Jc_|t zsB=@Iyjb}NLJen9`U)1v(U!=aZ?qc3W}~l8)TZJ<EmeG$avFxjsc3&mhBRu-2YfCCE<2n^e=S1Sc` zr>VhUw}GXZ1L!*#hett7UC=RlFw>T{CZCGnR}#7nw;D41tl>dxf0v63zI^rs74AJ| zwGyoK)=4bG*XXdCgH|PGYLm4n?}NKNUw%7{Y=AN2O4pzov?v?@@c$3Jb3`gy^>bmR#VFxed_%ChkZs!B6(qFNGA3342{96lI}Fh=qi{vwtxJP~8Q!-Kx7 zn*tsYtU-Vw<-xPWt%j_aRg|bsJSbFUE#c-)5G0{+LH;(u*yiz>pI2 z;q^1Dx7|E}))%NU0LZZ-YILHJ`Z6zwSCM!hsUG5#p77;!YvZG^1*Z+~M{+e6BT>CgOORW(_wQMDy<2zTFAdb zxM-!qN>M=;HVOxq!32Xg^Db6lV;^e>B2A*SN)FtKza7r-xY!(rC|i*4td^ISS%Xqd zN5+qP@xP9Hf4b_acy6(p!secLDt0C1R=#`J*3kE!!Q&v{_dN+05#Wj?krcvKpVdrz zEAqo$;R!tU6@sK0h;+BoK#4&DFuI%-J2`Yy3vMj-K38L@c=DQ0Wjin1byt{LvC}LC z_hilmvwP?2wWui07w}ERAm^(kaWB9D0hcP|zC3N~0|k72*5)z!F$bvv|4nB zP#To12?W^i{^wSX!m(L>#u&qvPMfnQ^6kG20+}4Y)XuK=k4;SxGiiubn;VYE zmuc9I9W;1ExG$DZ;A*|={RqdW#dc{nL0KAW>8Qq_rMB8@Cg&5LfWP^AM`7179ech! z-(0w7-N$r$Ym;MhrOM1@Ga`9Dftj{sUy{n~lEwzUJ&BL(?}Mlo=RK;cLfo1ZeF0-P z$7^!bQKt-k+)78>W@~?giNrwcm87P$#6*!qoUYe!3CLCZ>&>pnJHj_18e9m zF(}hWMYJGx2>W;ARaqYqqUzZ^1q|xT>esRbfvyS_b)}PaDFkmc12j+3NA4fN+t|x> zo8?-)vZa#PeNK38cy90g=SF91=d2~V=Zg(5>aM=y`?EllerPbRfN*2M`j8I{n@vn`fImKWEs(5NWHIR|+WCCF+fr&ZTxU)_EYHuz zM%^VRt%C8_gOG@w}3JWH0XQh>Gw5sQ5v&G@Ro|c|>`m^tX zgnRZ&>~CFp__ZZbD5%yJZ$8P&2hJQb&F;Z3(nm1eWlVsV>LvFa+_Yu+Pd7%u5{}80 zmHE3F>IIFaVWa7g)B+)sv&_EyI2*zKaTE%cwc=1bSRPDw(-o(aZWQUgz7NquJWqZ8^5)csjGfDMa|> zvQ77w$+rK}1o!9X@I#CV1=gwUmuEoN=6K@X*CgS=JU`&zb>xVVWD~T$HD^Y&Hjyy$muwOTz7xIfslwZXm!87ZE?gAJg4q8 zDhPbtj7i`d^tg`(1PHqPdj@PM$%M+9Dw>3| zqCwZ+ik-aWx02?~B<1B@$3;m=NkQ}6t;`j*ZLOH>l@Tc84l9iGuJtL~hz=tp!rue#wXG)S7j&6W3 zDmW`$y>b#{>I^D4sAu=q#|Q8)Ras|eW6EeFi1$sWYd#SP--j)nqA-Myi=yW+zLyiY z&nv|{&yZ1zM@V8wSU@rY6MBMDrS8MzT4~zSFPE9FoTKfxzOe9-OFy^$Q!|R+G7Ql% zmB<+D?amr!X*Sm2fWZPoVdFxH01`a4RHCzt2M_g8CC51)iLK?u9v%Uv8k!qa+$4TYt8V0CU!f^`DQLf_(tpD#L3$B`Qv8` z_p?^tRpdqI`{q=frJC`zcA{>*qiQdi#TM=2mW_J*$5OfT_14L3HV3My(u`^`uoy2F z3xsZmVxw_FKz(uX(D5U1{tONpbSNq|WZ)l4>zjHcr8y<58l4*b4q3K8#>0D=8Vh%C zMcnSEJ-(~PddV6jp^Prm1Jin)?;l?_KAVV;2d7tx!wMy2+o?-EBZ`(P@ ze|;5@99j@`zrT)N!+9CHN?V($O)84x!}CgCYRh{42(D(Wx%aDd9Z!Or5|5QH zF_t!MKu{}UHw2op=yw>2TAZJs&+NFByGXv+^*TejKjW|OjKrPWk3wpvxhZN7xjO?v z3&eIv0HAI;DI1jl7W}tNP%Mes>aY_dHT7Ez0=bu;QfzQD0iHydaKTIaN;+kp6@@VK z(Pt(#5HmH2Xl`KUZturhSDAe7%HyWG-VhKVATv$R>1bixWYqudaHxT%wt7%+dUEP? zwo}RbxA&zE8>i1xa};3a&xOo1XUdY7>lF z2L>2%vz2>_w~`;G+Zj;3$Mdwt_S?=vBnpp*EnAZb;OA3^6)F^Q_*{3BwdL-;6DT-45E=SFk8Gml(ZM-@H!|^dU=$a05H+jY>%ga)!NXaSgJ*!-Kc;0P= zm6-wRwaQ=sQfYj`X>%{cgo$o-r^xlAatQspv>079Mf*;>zRh5QkAqK+(P&K8+a#yp z@VK5HhhOwllq7L6Pf)+ny*6^4KUU@<^P+KlzfaEJpVE|{y6yV(erCCT=#(kss>XoQ zDLAcnWx!~p4+xqp8dR5nSUan=Z!Dplw$3Lw?~U%aI;^HIm2QqaR`q1RB#@M#q{?e@ zD?d}NT{lg%*G^&FuCf`yV$$@+O>b^D45zmT^Gu_Ekk$;*AcFhFwx{v< zjK`LLFO|bX2R!OLE00!3BOn2CJ&(iyxNkcmCiwVYL;o1mE40<@oi7E=EA6yTSUn zUsrDDE7h}VRw!4x?-U=1$t=Hp_%}N6O%@xv4Eceqdz|=w#`uMA3EcgJ@)zf`dCQgB z-y=BqQ4s(rsd1RJ+S}KUO1lHHykCyj zesQ|XW#4}pD14uG*O3dZ?LbuHn%AL8AtU~#OeiEjgt)iYYqCzrUFu+~k(6z*^)BGR zvT^Gs>vmZSPra#~6^oX!%3soX647oJQCI?`gXK#OinY_0SALyHuBZW6)bwk=@cH~J zkHk_`5|O1vjDk2h(vZBvL~Nw%dR4DWt}yG8NmXv%KL96jQT~n#`wV;>?5MEJZk7wp zuX|wknXFdwABdoWSr1R)@C2^77F*eMVOuUZg{Z(+e@d1chhai)NXg1T@9q{J9eO+d zBlzk&{G1GZef-%CBoqkas;KHf1UINDl+m~EJgcVpOvk(ABr!^C8Q@NrlpmEK6-a| zaB;24dPYtBZL(sq%3D1==VFl#F8N6W6sVUx=&WMmM?$81ADk(=iTkye2uq$4>-USP zNd#U@RuXhix=nV1>teH9|6K;_x*3=qj6;?5*E@T&!S}}}Wft-tj>eM=8f7FauO=*L zYlh+dym4KO)hA2D<*DW>BNvZ5?9*B%VPK2uPs&A^-#11e%&*lWJFkO;$A%2vy)+c5 z@P8Zj&4$;V`q```aBTQ4Up~Ws@9lfY=kQ{|PnsOGl9lW>?l{v&C}r)-6hp&66BX}s zxj}cQ$0Oz-6Qm^KX0?AEqlt?mdZUH$gGI@RI5o`S&Fg&CTP&|$1h6HAXR}s_R@Aqf z&eZ0};ppRGU|_(@{FY1!XGZSm%>Vn-50YdtrA|5W3=sw_lsj2H+t_>Vr=)Rq*)J4} zQKH(ev||xOQijKQK6G<@t#K8tE-(lX+z;Jbe~j?H4vg+^U#+y>{)-d%_%P7dXpHu{ zn<0q%)g_W8{$I9|XYhrSJ}P;Vz?!I%k;F}eSU*CR_H^MkXv6TGF?k@D$%+sf6qCtb zBmxHQd9ypZ<@?m+gNu^6VsRf=w)J0SysN^JD1N;iG%-}{v#gmtoy@}{ z<#~O5=lWh0;P|*zXx%dd;uBT#)!CJmVunFn2%02kPG*~Id;pkSXAKn@C|?g~oUQo{S_RhEgF?11twJ=h%<*|FHnR z1tE|D(!K0Gnz9N!31UbO^eJtTO&wqYIb(G1VE15E2L+V1(NO}q7~Ef9Pj$$`i{NbdP^4@~^u`0g#)W<< z$b0OzTMfSZ(+})5Nyz&lSJ^xA=qbtetDSsBT9@FDwa}<3pd!|8btz)Vzrg0R8v)R4 z<{X-5taw15f>@hWtt5=*B%JOY9-4WVT?n)R`^-U%jap`G-L>1){F-rXrfho zGK``wL~AxF%(fM$^pM3l_{e|R8PFC&_}u9~o%HpT0xEX^gED}=YG;c;PMB1Bx%05p3L8nzo5Tdi`=#=2T!Xg~676~_F@=Pa)Tjp&ODj*Pq`BO9unS?l=`Jeu7u zk@zPoIJryy*qb*Tn?rqF-i6UAn$CtYkkyxxj){EIkaq2;VS@8k(N*p=JBKHel^1fd zs`o`Vu_vVLx`irl$mU8fYtNs@vKW2a562lD0@=JR^8zU0mwf#k46Ej(rRu;Lk{+$b zgUTu#UFH3~6U)3z7zVi1Ty8)2?;buro>D!v_q+Le*f7!xaSljc5fSs!{!m6q2<%Na ze{V!U0ybW%Wf{Es8h%RdlpXC(XY4IIuslGUa+e?GRGiBZi;WL;;!ac)fbR{5z#Z0E zE767w809u{?BDo+1?8Y#s} z2arcv01sSO`OgP36%3&!|8EpTSah~Saee$Sva(_gNDU4D_d|M1l?EyX#!A`waCY@8#KYRMm;^}(5DufE2TNGwuduVkdD9@iNeE25ph+J^WtcS1j zBZpv1z>E3$iN>36!j2uWWJfsPNS&@aTUI*K_)xk6b z!H3Py7o&i($)=rb)kKZMi^L!*cw3svt`6>)D6fSJk&2cJqrN>|kT8=12K98kz-UHa zZDl$GE{cXRt0}!~tCdUs+!?UqbAJGH0Vjd2}f>40@y|UIQE#AGtR3 zD=rYzFhYB{EsJ9`+VN*;C6_9lRY^xWF*SVsE2Ck(TaX?P73&u?s!$JcOX9_`E;(p# zUnzItNHoyIrleG}!q(7(4MpnXSY6Tl30ya!e90`7gM31&6{vZLKKN}@Qw-CS3>AIc z004bOsc?iRVR(iVuWyocY+!@~+B5k~N!&*=YmZI{FZnx80~IzfRNIW% zsr1`-XjoKDN-Cak(py^7M>--OjKmjI>pp=D6K|?I-4EYasey%`{VZrDSph)QYZo2V9+xlx zM$cO+EU0Vis$0EX=g<=TdQF~8ew&e-+-mu2pNg!x%t^AuJ5VgFw#Pzq=Q0- zg*N$0_k95`SyR0cr}mq@BCh^7!~r$mLMGxBO4NvpfUnQ#|VdslDUVG znNGmHeZnCO<8X7T{R;Am07~4v^Q10vwqU*TtZoKiCsZpfCU2*(VsQ@^rtj`i({zyd zomWoJ(i4;5+mE9GP3jM=r5T=}rgbzic!+uxxsxPb`<~~eAB7n-R6)OIPR373!`4MXNVQ78+R)jhch2@geGC z1zx@6GO|)rT#vQVLVBnVG(Zxe{pE3;Y*E=4wxC%vkVt!_3vo^tU9l3l&VM#TutenZ z1u7D9fTS1{D3QR2_>l=9I5RW%FXc?O5gHUg^=QYO$Rp;m=z0%noi4~2mnIRFHfElW z0-6tzmsKbG_&YB&G79q)Cv#Ct+Zmg7_&h-v2YXmc0rmBJ{nrR$bi|h=K~FA_8OKT@Rvqk}#xLDr$++B{KwC003VoS{23!e+UG>JB^@< z93bQg8Za9NH4iAve1z100omYE!v+Zy_IyBd6FC7wsI({mg5FiCmDM($FV{e3%6%6M z2Z z1k=>Jp+Y={vSxQfbz%*~#aZcD8cC3%=h^||3c3)e#=xz-{VyhGgRBtA{r!xKd;Vgf z2DyJHTb{#|RqQ&wMCICd<0t7od+`bjw8#XYW)lJeiIHK~sh1a~_Z|ld9fQp0RuW#R zcWS3+5C8IK9iXhEM}wVQBKh7qV9}fjo_K+*ZvvL z;Y);dPnD4H>eJSpuvKQU<8ec7CRbyz%L2=~oxQP-9B`_$&6{pXX-SN5e~_rcoV>pc zOSkEfAJDNv!YCN4rQ(FvFgMkcbccEuB zHv>pwg^2!xJjN^Ew+o@3thfl$^CE)S{hg?$$&a?{WV@>UjxF3S8*ENNwdI%MVsECZ zvD=w`Z_oNZNM8fHk_jy4?&e};$1ZrP;6+TVhO4_><%E2dQ~6F9qL#&YId6?@R0{_< z%Q!vww+57=o0x<9Sd1PJX4rLCU?*)bQYtAfk1sO_Mpdu~!F0X^;ds3o#r7>0glB_p z;1K~*(SzxhVq7R1!()vMaXOyU=O9}~3%72QB$SI{S`Cc8?H654%%W~-n|kMysUaMR zDtZxcc9nU`&}M`vLqP1>$980Px~Ru&YzkzL9~dpP(!J+cJ&3Ae|PS!gTIF@H#auyKt8SQDAna^;s3nYrZ1lCz>-F0Uyvb8NT_e)?1 zV3dVrE~10^87<(+>rKaw5qgQNN@^cafS-^Cs={5&Vd+T5(cqHY-m_?LDZZaD$f2Xe|N&*=GqlB>6HHst1BLuyntq<=D zgm>PB_dyDT?I)iC0t$p#BR`CtP5@CplKcUr%FPPM3vM7zL0OiApVZS8AL&*~mNF^2 zi75PGX+SbmCp@{!o`R8`UueM^nDE{|i}from%%n)SYJAKLEG;g)GY=X$xjrp6S%vEW~nZPFW71r&8m$3 zwPpHe45PVI2so1;hs2y0(AK9oBG1XMBQN|4`i`hb7cZMeDD*5ve6EOb(Be@3%&x82 zf(=UTiyZA^h_L+1j)BGaH3q1qO5W_`3i(wlpSBSy=qACY_D_glB+3;D$VBt#d`z{R zm&tC{JmFMl*bk{1G5lg^BuR}FafC$ANLeqK622()tEj3STbtHbsFl*cH2EsR6h(0^ z`;@oNYu<3k5#4C!${P3)?XOu)5mdEQMK6KD&UFZ;Pm^qt(p;t~l}V#?hAJ<^Hzgnc zKnlLqVWE@Q?*+t3AR#Al0%+uiCQz!>3K+}w*4OYI#W+EEX|F_VNk%%x8N>sGjY?p) zOeM1lwiYDQzvjS+$%Y+C+$r=@6>vncXLUBzsuG&@{8_mDf(UNW!7MlOewBQv$F22u zvCY~|M``1AZoEf9un58Ys}t4%&OCgiri^Pd?b}zpV-Fax-HZANSI~sWYgo@m^6i}A zVZVaW-`Jhla3-pvI3Jf*E|n9emB1Fr39qu(TJ{}Wb{CRzEZo|X%|5Xgvbo0z)bI+w_|EbB|5hodTukMOe zc7YtaI}m(~kklA$YMMEzQ{}+~Vof9p2^1%;)oCg8m~rn{q_SR6mjg`gHcXR(>FB`&Y5 z7r-_SAM>+Tt94DF7)f4K7V0%|JG z8bi0qNlDG!uX>CJ>EZBjXU0nrl?s#d(Wfvu*qfzL4F2hyRrNe0jn$Xm8&ChWTHc!V zxYGCs$(t~uN2vTN3?Sa{I)AKQWz+JZ-JY+h$hC%GQ9uU2qxJh$5xJ>NI=kAVL2@H6bbm2}1e-#!aPBcvPsd_GFQztb9&38=0Qi+&^`5c7pYnVDPqh=$= zmnIJxBAGSI0M}wo#YDsi@j@mQ7*qtqWOh=^E{G!pg@$JGrB=2@W`E{|Xm=$4yD%a@ z(G20VOqW}XFQ&kg!Pi0euim-o2}ZZ<1Edu)qTk>?lmGDFmY>7q#l|4PVQ>2g8A6Pg z_imdDaqMoO>XKw-{LqymLWVba?^N>Q7>ZZ@TCzJS^udv$KhgLu*?Q~%M*afSX&j*a zJlE)7nXi1B3Oeym)5-CePlQ((APq_-B)!n<5Az^%8{{I8yrwTmES+T=VCemKQ{vL^ zVeiK8ZXxpX-Ccn7ZJglgir?=Il(30SG@n2~J?nq;azE;cVpq2-+Vlo3*hQQrTNNCN8qA18KN+UyMBWhA<0VUaAbA~3azM8UN;S@Qf) znzxm>N)arv3=LZu$auFoye;nNfWyRkx#;95&FC(Q8JPqVW&+^v`_&XW52^uPe&<>-+n3;EOSGM|~hM>gv8 zDi~*pTb@tRRG;q;Cvyd_nJJT~s-Sl+qrAM$65;43;_!51GY|m8pJu55i@WKJJl%EY zW9JXg`*SVjEDHH>#I33%IU~oL zP|!RpY~n98aNryQ-051+>PbQ{4D=n)PHWHdhw}#~Fz!~bK$Bar-u9*7kjZH5)>>Iv zEZPVVT?{l*L$D^VKZ}od+EsU9QDN6p`_=g>3!a|EJ2R$9 zrTec9`K}IkeYR~e8cP=vw$@E73#hqVUI8HnzjKy=Cs-+PD+&)s_&bAusS6_7_t5Np ze>8nD-!tqN{FR)P1#(D;wvsH9LRgL%$cr_qDz+FrmrdGF&kcE>Qks^iyIkD3mQvF` zZCbtU0+Y75 z?O!@u)4xx1z-6^PF!=fa1=OxK;{cXSFVzE4n}Z`fw%%+;>G{y>)_gDF{I>nh(WVvs z`Q2UTn;mj}PFpNS_^XLOSWF1;U&r<*m+WyIuV>S8{R(yUje8lM!2qXpXR8eShuv)k z1YbKRWL0gZ?pI7-n;by4I{?5+gUR|&>(Bji&Shi0uE75ZQJHp8k=Uy;b&?eTx`|zp zkb4SeIYCJn0$P}WqzD!9ht%L%7*ms|Y8I~oOYeu z4+z2i>h$qd+rrddvn$gO?`@lplbf5p+po-#^DoKb_f`K~gOhbxA^!OiZSO%N4X?gI z))U@Ron97fQ>U7g)~tc?bP1gcdHb0d4LSRb7h&f8O$ z$>b3nveDohn^n!f)s5;M1^(g=WC^L1ss6CXsw%bKmqZzB;sLU>rE2xhJ-BmqqI}eL z`>CkbOYRrnufOt}0y)eON}RUj*;gcl6L2=_ZWn8V`;TQ7rnNfVi6A$d&+xxvV{GzP z$#CH-WH{_{TfG_* z3d(k=hKch568~VF83j|uDdA*BI6Kr9T$XG6J0!rIw3B z$N>2?;d95(V9;wMAxF%*V$1|=oCTmJTkgYCLV6kM^2Lr=p;GYUr<5ib!t)L=Mbk_` z2`F@f_1}REKJR=>!C?3=DW| zXo$4FPpex_TH4%Jy*w!`ZM~@bO^xKnv)h{S$H{&4P)@i3Y|rQ7W#=S`;t+A+P~#F3 z9po2zzF7@V(hPj>{=(Gxaaj%IfQ0?Pkkny;4~~vpr5ucY8v!6Df=q_~@kAII)kd|7wf(B$~ z+vW*KGf)6cY^7{UHpK%8{xE;*1SKr!Dr-v^|65gDQdSmt>bB*Z@BX-#pUM2d1Y!I5 z@pTJJ;I^_;Bg+Y~PfUFoQcM#%xmN{2*IwTIT--Wt`Fzndumwu-ao~)Ske;4CKlile z3N=4Hl(nVKySzaaAx)cy1ksW$85Gg=8BpgSOjLoS+$FdKS@?zoY*Z77%qkVlDoa}v zizNLC?PXaJ$DOP&Crd3%XRov82BqpXhm~iRIwtGv4ZTCJTWc4(rA?zHCTu*vuqyN6FMw?_8ZuO@*v>jZF!g)XGfHY7W`+-GcJ_^=pGM-P zuG3iD{5TSY|Ha;CDPa&I&-bd1@TC;NjsPlBils;Y=-%oRvhSt+MaD*-$>pt>#>OBe zJzcd+ev_g1rPw{kdyZ+&dO?-7H9X1N@J3u~Y#gQcV!PL3JkyT9*C0@y5%XfZ?0sB? zg1)_8+t^r{68G-?BcDP%z;U>z2uw)O*x1=fNyt~%*h$LCSecm+jq#@tlt2X_>`*>i zC-B9G2FIAnd;bCEG#%G5SFIyPH?Ixa-s)`?ofaJ`SGN5y+0?7oe`ai8dOSHfE-zK1 z8=se_-O<=n3eZM{KX?ryPiRqL%Cuxt4nOgS)W)l-2*gog?K^uV^?}qCBcG5N3-Nq$ ztt{h93?@29MVzb2fld(Xq*GLa<+(UTT2yn$4E+~Y6HF6uV1|+p5bcXG zUan1GC&K{)ZQEwMd8Lrpek$|%`CG2`7(@zWwo`88M`t;XFY6r!e2g#fW>12V>X<@q6Y|Ap%fA z_PR);BQ$4HyM2IqdPrJ2Z1s@NG_YV|= zZRhuZr<|^;I&cJn7T?3z%lg z4@H8ne|a7~NOg0!e0&snjPlm_D}ZRXS$UkpZH6o+i?ZOOKDv5^ypR>a0!O&xb?I;B zE0xhNYuY=<*nmuS2Q_Ww#3gAA zW7QmmQI!}waQlFBK|t(&wSLdR8;*mL0QcBp0M6S+qw^{8s8bj}qxD-eLuZS_?f8qw z2>*NIUBQyw`sP9vOa6gmY`}Ajr|bBD7aw zIK131$}J4M;TE*<_7kzWJaZzvv<|TVAY6YWIxhT3BzoVEX!O?D^4Q(>P8w!dtR2&P z^Up%NJDWHEIBn(^AW&Zj(ic$UHY|-p=AsmKxv^%JU;R^P)50J`E-vip*bRWD0sY&& z%*Ymo#^SidjU9x>x@mM$e1^2EFE&O@3KV4LkKG#WoFLi8WWMu{6bVglrD3l`zjfl^ za2t-^jNOU7Y-fyt>suaaK|Er5ypnMormVue9FjxU*`x_mB}Ib*l3%blwDFglrKz*b zXcjGO^|x*Rl!#w4-kF+F7#Tp(T>&mD8bN3gzwZo}aJ$XW&+1d{e8J5xU$*n)$W0Jc zNy<`o+TVeHO-Iz=cG*u10`h4VzUHiMtv#!#J)ag-k2xvzlJCI9J#A7gqJ}k%Txxm4 zY?0nfFUV9i7(vu8IWjP1O!R4KsbPmVj>RkoJe8#S9I;J)jxT*cH=Z!LQvwPPC$Vb5 zlJ{V{TTi=tkAUk{!(N&v(c}5Ho$6j8RHpI`O^8hop0Xn(?9dP{QLEzR z;A<&SVw=&7tC1Kc-~%PFHMx9FWf_bOD0M7147ifwugND={(JK}B|196zvF+6#%@ngZhZB?`MaFr2=$R=&2sNX#E7Q5fh%KBXT6 zlvJ&qq3pQSYXfz1R)i1XcB`AY-DkoK!E^t&!nr+^Y7e#GsJXj*SMmu z7Omd#`-Gt31kk@eEEF8@w+4d<3v7I`MpqD&=$38&Q6teMqftd-EM5CO>LuIia;`ct znH1rKxgNn4U6n0ElXR<|ts3amwqZpwtXTg&NFvI49>U?AV6Xl+7dzm$5vMRPa#!=8vp;JgO?2DyiEU~kL z^51|uo)N$hKx>a6@gp~T5=J*xo(0oEXy>rZ?ahTOkaB9l9rtkzIXvRw{7hDll6g$sTpJ=v=e!k8v~ zfl>-V&wR78c`hQ-+^~+_>UX=5%}%*0i^@~_whU~5Y|Tn0gF6=SKJiLhHB(!*$_u2X;pRfCTtrmZ?b zU(m3q`6)XOV#IV27Ly9Oswxqj%bg7&l$m~Zg-H-#6KZCkHf=fA(EPi%KRU#?vLx*o zyoxCTYYe`C9r(-SQ1nojOnD~ZcusW;9gged{sHNcd zTI*={3p9@C9LS^;ltEYyY?Ux17zJ7#G`SDWA4g&ey2s8U4velA^jfe2KwwXE-BzS2 zV_@ZEL$QB7}R7xu?1GC!HMjwI_ zjl^8&(2L6Xb~}Bhpq^`g<*cbZ8dD}uiU1%twsNyp-}y@rx?ZcqLn{ArE<@CW<L_`zB#MNcd zn4{*kK-8PXaw85O09LEWh-rfkrz0e=6P4kfef+ty3~0g7E2 z1JVQ1yuFPnEICg&F#AL_;2hD2t+_IU1=UJGA?*5&%l69UEEcl-p$jhO-u_b|hBq5) zIL1X_ji#@f#9F*GlG>ETBO>U69D&V?E3ajOenp5=o|T~cjcrL*-cNgN=mEBRgFc`$ z4gyd+d)FMn5P!oBt<#13k0oeX7UMpG+|dvrPEJT^`f*jn4UNQtMYmfcHM-!_f)cRM zM9{1~*s3>gTo}*9^_-Yu3u1=CfVfrga^*n?f|ndvghiPgy7DQ6@+L09Xz4!~S$O-8 zhZx?_X12y6l>1o|Om1pJo0$$}xMBRTb2LUDb5;7UBE)ftsQ#}QbcC=y%|MIgeZqZ! zkw!V7=G=OZ5GF^kkq9W6Vv#f$@ns`qD?6if?ycP8tx#_yG#%3jB3x%{)@hD0P!iE0 z1_1Zv$^jIN9GeO-g^pt)RVE3d*rty%u)-M-_1GpX^q#75Bp-3NNcjGb-h5yu1^-4t z{t=rg(dl_8o78|!ZOB-xvWwM>4L5x6ov_#ha)JZy>P#f!Xwy@6C_FYesc%duR7}Ga zxP%KnIFd4IXj`;-zTl>KbHR|^HsNoiXI7xw-)0?lg;j}B4(7Pw11Q#8fTB)hB?$98 zPg@?MAA}}6Uu_Fu9qtjPRs#rTGR}o5?(uOUlmLAaAm5u-F05z+Q@DZUq(aEkpYCa+ z|Ln~k>i-@Vqc*Ay>zr8G7^hKY_$iXunN+##M&F#LBMt>lWAkK~HsWv%#?%6(?ayFc zqO3JpcFi$OLyuK3;$v8H7nMh=1tBPzvV%33mDzEABTqT^#(qNU)gr!C|H}w`VFa;S zu&5kKPP^?{BlV^n=d@X+1{6Jlycm)vpe-#CrcelpnC_=?p0M`0*h)km#3P2pb*xm# zGTQ$Fe2Lgx5M!G`PEO9Qox2JO3IHsR{7?OBWjMrJ5K(vpO4na9D1CxD1^^Nh6Y5`G zKc!M7F6CH!#ZV3AIT1|U#J{q$yB68ujZqJTO-Ul?iJ&TmrtRpO>tb?mK#B;zjXt&{ zF5~{Kh!f!(Xn{o;9APhYNsH!O!y!pdtGtZ_?S!wYHEUGV%>oKMZ1B}ULJ)5*iq_Xe zT_Z|EY9frOilRbDCurkBMQ6;4O3OeHK|ktJHqX}LQ`u0-crAKOVUl-%NoTA!K!0mZ zdl(GjO$a6|9P#WRO$+%fcS0A+sOAj6KynXD4!YiNw0MqjlIyoRfQ$8zx0h|i zmRv;aF9$&oEG2?fyK$A!%Ak@9P3&t3ll7R`01z=hD6C=Sq=p)y$_rCuFdvaJA=4J> z`-c8I^Pux?#0(u^4Wi}EPt2{Q6iRMUZ6R0!?ILMbfGt5z*fNBCOb3`4AHy7Z(#73&DS}Fn@#%B?d#ziGt$g`6VkI zEcAJ*REqB#8`Ur-`dDIoTttv}aRUJ|91a~lQn+Dl$@g1J5BvZC(Y5NtG-?{(x?R*I zmx9-;&cjIDG35aOh`=X?3>W%<&6!kFRwY8ikX5|2_UpG;j(5R%0OCBG1rU*~0(%-p zfTKxR%a&}c&n{kIa70O4p6VF*U1-ATBJE{BF(59Csx2J}4Jd}9XtXhi_IvgA-@SPN zjOzZ!H^gwrIa^S&=5*k_+~Ro-27I0>RTA$_jOieRPb-Oj+EHjfEwd=T^@@ z^++HPh=7Cq{J;~Vhxh8->W1!ZpMUC+?Ci6sgtmaAtNU>og6;w>D??7s*@^^q?V-;l z#l?5@?JnG3^M~xSXF!h%+K0IO9wT4b*=PAvw|0%(-KD{$;YI|s9t;?v&vLZ<58bjh ztbXE=`v9POyT<&wu}9k{N8kVRv7i3__QyUlENjE+zrP&-*Wmr02W$TKZHVZ|g5uE5 z?7}b47JObBJ|NL4bsT^wkBG5-ln4dc89P`gRJ>u0T(O{5TC*DI>2ZmPp29*;K|x$n z(j^%gwOgmj6$^?su9e}ip5`xN4PSWjd=Ihx72CjJBPV?D&fnio#O8*Wa*XA_ ze?xRa&M$%DMQ8FqD=1kmv7jjI{8&)RFr%%hXXHmUQpN{i*E~;^H(d_BLpMKQN6Zt{_0Mx%AJ!i(0{M_6-?;gs(9o;s) z>)j-v4CLnM z&hw9tqvUQ_{Q^W7J!0^HAtTf-K!^}bpa|sV=#TtVWVe#7fzvt>2!Y%j`srZMFZc1H zEKL48Uf*rooRFA!#T8d+$0XSj6O#J%A8_*I&wu|VuDIf=gv7+}w{JQ3VRL3onKNSw zTEPk>&YJqgoS9#i3mqOK@Ba>{m<-fLQ?)xRI(#GcTa9XaoF*D zD@XZi2=Jb_p~B^heY?Mp2?p`xNj!4~a&sXs5AyRNFAs8a@$A_+DSbceDOkQ(*)IoY zhWGBq-Ryxh?b-h17&w1z6NuRv`&MWV|@t5MFLfU5_<$pR+a%54U zWNCK6mj$J399f(j4DHMbY|qXu3_Ep`6I));{NkjWqWyJ*IR6^xqOA3?`T3=YxtW>S z>FKA_(oQ#Rda6m2)6JTlY1uM6J-tMT_~PQ?P3!GYDkTR@#bR*I%qhzk&%0y5kO=gt zaY;=f#J+vI5n%70oiglPc110qDDv_9ZwwwbYVP6Bim@Av2D=as9C zxnE5k_wlq_`rq^M`)?^~@bS1eh727wchUNG9l9wA7q9*f02ZzKPPP5&OHbW)$H3Y1 z*9{o-!29pKVo^Pv*EDaHp<`f~`Dp-D4|QF*YP&k=<8f~c9`?|jMeEyj=r-Ylw-xfe z`0VIm503d}$)^5y4SMY_PYVGHSE;kgc_8eG)ue|i^Xtn3l58vt3?V8Cm z7a#fY(0T3QAHMD0xxHR}Q{?L2zOj1sxh8$$gmINptDNK9m)sp!JDaDq*|=df0Ay`g z)3Qy5+F7rDquo2VpQEY7q{MsfxfcLFeDC#D%N7E_vc>ZzjDHIN?j1BJEXTKLj1;P=4XY)7ifimsE|3Zj_o_Ga)V^>Y}*l=3Y-6opCPu zSh{a_RB^GVv^24P{e-%86YA87uU$L7R;~EjwG-;pNvvDf7YfCM!zKIo@+m@CH30zt zF#D@1IXP#ptX=n;In%6sL7|WA(7D_EIWq*{{I6$p=+sUB(y2fIT)%dCjhdHvz23I% zI;>x_LUEHuOW%?JeNp~K&01_&yHatY^=p^cxU8nf>uqC62nI*whZARI zWOngKM|JMrD?dL#9ajZc&WIeP3iGlOL>eSS!1ZgFUvk;yUaz-JyAB)Hu23+f`o3-J z#+Gd|CQSL-GIA{Q9{S%kC?+N*y?w`UIIMPVT)#52Q+I!qzyIBX&T9|<@YgRtAFE!y z28*|F)pqroHGl2!hsREv^zk{mQ*Otbw`{X<-AVw=+PJ1gs|>ZX`b9NP9RK+oVn``R zJ~FoVjeV1nQ^vjh%FL;sjeqy`q~w%7eQzG|&|_$rr`i4&Sqy?KEZuUZ;L||yqOfze zAQawuHg{KUAlB=xo19oHDIv+{^9Tq!$E7U(4J*(PW22)ltYC|cjy~^{=FdODatmyT&(P*YRxj z8Rh?vKlM^caq%;cJ<#vE%pdmdR%8G8(`x5~{jTe{f8QQWr`%IQp-|}kw_bVhk*EBA zKLA)PM&`s4ylrw(S16`1tPE^gjOc(Q}+zZpWK6Yq|UT?SZ`9ANKBU*jWF{ z^Z#S-yyN32t_S{RwqCze@6EF1CRy&i;tHn3Kxm;85_&h?bOQzgKLViy0tq2hV=&bi z+t|h(_ipvxPS?xc?e5I)kCSCtKFP8y88G|(=yRXF*(q;F+NYT}Gw7z}M| zcBzzR8g+@HsAE|c5Q7i`;Fu(gqx@2%BIFGWZCEQeHikBDMl9R%gAgTzsw!0!xv43r zDB_^b=I}S%b}s<1EPMYW&ptf==Et6SIVSeVUvpA&T1H0JOV2%#oSc@Pk=3@K(PaMM zv*irKv^fC;W^2sze}7vJhksc1)x-DR{K1kH2!YwslDJ~oR}bHN^M{|W0BC)m5v5RH zSN-p|{&Cq=*T=-fw%@@5ke-p{us0O7d*k(2%!@V~I)N3OcFjewSff3AmoZx`KA+cQGCQ4) z6Drsv2%=632K5HRvA04Y$#hI`XOHWM&;O_ot~VHR`sV%j-8Tjf%5V8!0w76}D2km+ zLILWU0}m~D^!ewXx7(W&65{W^>#kb6zoS{t?`ssJsBUNA6IbBNuu?&R>~(oo)i<#i z^|Kh0bs~qcs!{;J2#H*-SvQ@%8^W#%r!|uUO$xRdM8)PAX|#2esN_Zo1?CrysjdmgTk?CZ92D{n}NN569kYW%QWw zl@%p~sNa3HJ5qORqRC?QdJbDs4x3`O{=DJINA9`$ zFSn$oXOhV3&d~$qVIxL=we-`V6by&MKdxLhWY|aw5Xnhe;tv4;eDwa?vLgSyW#hPs z)7na?s!Bw{NQ0PR+^&|_wW7Rq;?$Xg3x+LS{6QD{yd7<8Yu8-64r%-BZA*2|xCv9g z|K@W!9RBFPZ+B0^lOZJ~J?c=!<92=W!Mm-05-iKETeC70lK%JKw_5W=|D^+r7&-Rq zFFqMDWVYOeBsIa=LK^oUody_mW}JqyWmndvWxG?{<^~9qprUA?5{rm z`0793(ustl$4t2F{MnJ~yYGMenJ4bQ`qFb!(=)r+MeS%?Th}|JZK=+=>d!ZCT({=R zi_aREUx+&}LiHYl3kvt_+}8Sa)}+E&lL}`~9(vv7^So|%Yd=5m=%R&>&cAHl%(V2Z z*32FK(ua>4rzpzE(MMFwo}JqUAD%RIj;yF238tPg%PmnwCGGCERVk?1=_{*k(c-Nm z(URigjI6Aka(0)V{#uLT^GR#U z9XDO|mz(bDKd{44f?cF_ypok-i|#MxG#k`}l`4nt!$A0F3QCnPu(IB6=GYvQ-oP^9 zu5pwI>6m ziXgY`@Op~lwpc&8pp)v!|K4t(hk?QfF88yg)JzCf(N z3lzKDVU>{7SiMQd0s%!Ks!9+726G~tZPTA`5XStf=6V_$ziE2xUE&!1kn}4}VoE@^ z@2PozSJi(U{t}hQ$1mB_P)ZcF$sPRGEp4d@1UEG`*99aS%b_rJd&4@8NsZC-3=Ydg z3adb=$T2*FIczZSg*t99M*OLlSwrJ=rN>kZLfEG7Ga%(cjxmH4Z%Na#?UirUxwnRu z+MPPA^p4am%gD`FhI}lcho5C+J?9$LU-DtBV zyeF4Y5g?JX)3dU$RgzR%L2>98hEpg<1j`5Dj~8$S&T5p3T&2+8_>%VYH0kvI9kQf4z9Zl zMvTqSXK?BzyD4e#>`@7I2C8>gEe?d-1?d->#iU-fqy|FUo&L`h)g=?+3n^R>RElEE zyw$*mWfGK$N#x^9f{|lc1d2)mGC_cJEM{3z&kr!`W^qhPhqeDs&RJ+^^e8>Q8H{Db zB+D>DRfW7?=h~|h>Xqz!YQFM^Jfm{1u<6r#Ny|ubsl)$~LK-MQNFj<$1i-O2LC>>3 zzl-5SS#WA`R>j*_v zLh^g{?gJ{JA;rC~cDYw_P0qU^-jvhhT1HWuo&JwQN+|$P0EJSWz{Hva1|gR_tml|G zvmmnA8<3lo5Q~sWWUYGMz_S92Sp)zoi_Kj>^r)es(M5XepEk$nGh)UlM3&_LGs9~Ka=sL4tev+kM587o2k(`0gg7U5wSK1U5AOefSA=Twm zM2=B0Zg5IGi_9Wt(eYLtujd(_!9YP(Da%m+jFA3#?PzFdoG`s;8R1xcPTZuzjEl@- zno6ju(y$V)Xx{PJwkN!jz318?Zs}WpXal98$ae}ftPsCnX=;*!l1fx6ayZ#4X2%;- zY&xUBDhhG=!_8hv3agY-4#!#b=Q6mxmop6wjgzN$x3O}pu7C2(VVM^h_(YXbg;JTQ zRgS$MZeAeCJ#)ywCvEfwSE|I*nnEae!V0D+F;+Jq%hEr?k`k+D7-aW^Dw_gLUP)Go zfoJ24I*U%Q==0*uH|hC&ZAY($MsLvT?-j?0h3V%F&%99NY$~BDp|YwTtl#wUmZuc; zWFy)J!~0x;FJ!f@?Me>;8X#(Nj4m}^C-S)29V)8vHo8Jafz3@c<;I(mtva)g;~B&; zjKF4!Y_4X7>442`NNYiE`MZV~0>mDOEhuhDPt3l3d(Qc7;%TFcc1|rB%Lz6&_U~{gO@j>DCmR zUe7TMMubvXB`To+YDg*S!AJko`7<5OEpx!1)~uL4x$vhoEe>KG&GtWC(B2_tE3+pT zo_y;)Qb{{*y7rH!pvB&hT;ms{txD6ayfnKxl>YzZ=#q zwTcNQKGw{~n)z4@A8Qj6lJq$iK8|BV4hsz8+Zl!_B`OIxgX`?RC6qRB_^4>*lv0(_ zdaq;*;*?l@icM$WSq4x@R)dm4DaC+v9HZx1hT~YA5No&`;~q2g_8(kOT(o~w>_h
XVSH^k+1`a7YxPRoBiG+}!H?3Rv!s`#*^;eY;jB(My{R0LLp#Wa5=h?^a z+qM1Yg2LhVJ-WzfGyy=w&-R?jg;!jA)9RJqz5edvsM%UMuy6N2UR+pSR%|j`uKx3_ z)90MiDkK2RnOu0&9rwTY&g%eh>s=3tqV8|cEbzEp_dmKQ;;-A|az69KeGx~k_bqtV zY_S5s`n4;cesn&ikdf8r#@p{5Trh0T4~v9b!v(b==*5?LRM0 zY#)u`s3HI=rD0X6^OtUISo&4TlV23yzqk3z=3sF^ZuZL!HQu#*8eb`MEeR?vg;IqO zh0wNdKA}+M3ot5jy2G{hV4WkVs3g%Mu!GY)#s0uq@t|!-4DLH<&Fpc`_Ah{2lu`8 z{?hv&UG(&$^CNfv`TC0!r_B89yA9(eo$=P|FGdodesum{Zk@mMhfSAW@#hzxc?19= znx(CN0f2wK`SO(MXMXtks-gq?S`(vI2mmf;^PBH2Y1?$?&!utt(Tgg^FS|C>eX*@^ zd6psWqTCrnk_TL#cjm~rflQ}sH<5)Wh0uuArZG^uy7J`}6;JJGd~Zj?TifbiX$~naiL_=XU)+ppAnbKnP0>^~Hs$Y@=Aw`mjq7p(Wi)}oU z+OvwW})%JS0Oeggntb1>Hgm4m>w#mq?CQVj^oFq$r<9i#oqPTzI-P#p#A%A6 zMDG5)VeRB;vssp%I{nPe>()jR3kpYU-?CxHwk;#aPI&u&Uv~72TQ;tpG<7D&^A}%n zU29_03IX7fE3OwsUE8KRe=d#FkKVGygp|Ne`;VLIzxK%oW3?U3c3T?T-2mu9zz#Ud(pnYQv zI+mdnyg}Iyz+o)1*ub+KgLNF%v1XCaHV7j`ZcxuYHOKK5tIgwb{=8}Z!slNDfC-b% zxcio?FSz6?lf@DVh~;*<=1vJ4xin5c*rP2BJ+tFhB}%zx&rh|Bn}U@9U{LuL->s@VRB^-g*A7ZZ8*hqd zscK+Y17-w-C8GL>>LZF@ReVHoDY9J&DU>h-F^FP9Sws~=8AKIC8A2IE8A26A8A>n# z1_475gCgeu&|Zg!QIN+c`?10^*ub-9J#Q8{1J7^_W)NZ!u#7Rr@JEpw&>IK8`wuGk z_uH>pZ82u64FJqmTS8*;8-HKa8uQ#}How2PeW1c)={(zl`L~Q7H+j~X=O$ir<6o|v zcWj2vH&2^PmQY9%1Thfs8xIE(v{+)Ed--iS9A5GLSC8C#^Z%Aa50+@P#rXX`qtWDc zxjL_~8_%V2x^Tp{)+-YwzwF-KytdrE2LP;yq0O$^s;c_N#{CBmWfJA_)PalA^Pfx4 ze<8i#g^YsdGYXzd&wn;;@Y897pGq6_MB2c6lk+aLr6schp;V6QOZQ-P?14R>qTT}gXlrG&m?e3oXBCMDAef->sUtQ z7?EWVi#ZGoLI{w+W+Eh>_z;G6rCSCJ&SzP6?4+r!Imb?%`u7)}>_2F5B;~rB?s)d` z2X^n+nwF7$--4%)sj%g1=h^PO@3BRX-{LsNWM>yQWN$$ByU5|?GF1{1U$nC z7)OjUJc9)W^B4;l2UT@Nbrbaw3&$Bn)*vuufino4$YFuOJcD_L5tulU>toi<(DC^v zx}!IrEv>4k%<0peKGD$leUhCL!vge}DF%TYi+A=z|7MxhLwH}7l$_2|q)Lb<7iJ05 zvkh5HmEa>F2vigi%R;Atfhoe4nAC|zqf3#zVZS@))K+qkMZ9INo~* z49@^U9M5KOOe#X!LWYLMDWU_%nkRB*iG@I4=Dh*%x+z#D1l%-$BqiQ%8P;SQO+C8g zs_hnUEmjnyDxj(@`h^mp1PDbu4{ZA##$LU(!II?Vbt({+%7|bD7$JlZVi9BF#5mEM zYfakks48*SDpXNby4T_MJ7gpPW8iIi&Z6UtJj*kfV=#v?j}gb3ExH*xZb0`f++8xo zXlQ60#Yv4~5U6SR+ac`pG14v};39suo{T$Wx}sK?7G^9e5+M#9NcE=FuIpdA*b=P6 zstQB}LVysU6bJ=M5kRY!A%I=B)Mjgn#B!LbEKv}_Ey1P{0)!Ak3IP!zfw5SU^>I4$ zZhL7^2@bTH#27}QRL3%Uj@2=kV=#*lhY^dh$Yxme=Ng2O80mZ8MY)EC#u2)&Vnk>h z&OMr=ej<7t#K#q(KOHb%YZrzQBoN?QthpFu##o$lUQNoR-14RUDwpa40YoT{Z2CX^ zi9``tmLSF*o8^wpqL^br!9>MKRuIMnAwY2C2NWU$5P{(a*wW3sZgc&91_gKqV}LNB z3U`YCT$el%=Kjb%kmEzeW&>$uV zQI_%+DXBn8%wrf9Q9`In5Q7O;TBk@yq@ykFVt}edra%!w*_LF#BJH-9s6^!%tWwG% zq~l_2`q^gPY|Xf

c|7Yt%h~Q4EHVnU>_z58{zAo1Y_No)#5DDOITwxshi}ulCuS zgARqzkffSSW}`5{qB~R5FB%%ZEYbbN9J8QAIqHjnU8&>;Sv9U>UiI+VCv*6K0kwuI4SKJuxdq0vRUGKwJ_^;+p6BdsWd^PSuP=!v0$N|_3ejloPGTfo3G z4CXLm5FiRfMJgf~MaC~j4O<8WLMb6Y7)mG*LJ6fL5->a25W{0Gs7iproAHpf>n6qo=?^59(B z3!CmkDpTq*9C8?(5<@A%fEmOwn8S!|Q7DLE5Q8xj(J~k@7`0xs{InXIQw{MdB@|JG z_-mY7WHs310&8e!oDf~Hryzh{oN|OzrpzVoY1GyEP*_z6Re@53@ZsGp7$XJ)gCiHH z<$^h^Ul79hup7M;eJlW0Da8!&h3Y-Q%H9+EMt$P zi81QQt?e!}G>+w05uZ#UxYoz*Y!FIaC?Lx!RU#G^+TvOXA%qaLEMT{8mcb};uz+ce zvS#2!p5avr3`QZ@ZTCj^2-h2^sw#&=$Nf>&BYNci#UE^Wv`F z6;VUum*Cf;VgLXDdBaSRL-5JaH^yt=WJ=YRHKU^)00eC`PGnsv;tG!-P-)mJ z)dj=N1|i`Th)yY~cFJ{5e{QmoW7>}mWt9}y`BdO(2TqF>m72sTs&LekTkoEo@!t*g zcCWnf{G2IyRsiry>Vr$lwpDnBW|$Vv%Q1<}yjS#d~IF6s8+HN{lL!JD}XRxTLsAx^_bH-@dPk zh}ZRoG)gV)sJCjJp^yGLXyN%e z4=gT?q`b1C`qnd2SI-|heSqz?A8P?%bdGsbi3b2Sm3l=E|6J|?fDI+?v3=Tm=RUS< zgi?Fx^PBSTos;p;HMRTe0-xS^REv*)S$@^H@sm@S9wzJTNl zNLvos{R-}r5@Qq@fs3wToB?HBvHO~d$x&;*c4D%Q!&CCC3Tb)dHAU|1IFZ30{nh<^h1sW!{TMCTuSE0>Fk6&zPL{p1O}M8{yBBlJx?fl4mV$3|=%cQO`4N zTm1O1gQg9z@+>~HAg1eP>CWqnD#`Fn)7nF>EoI*Ext7H@4(=o|sz_^#+%pHo@GQP| z(vi;WdP5q$!3j*1?7rZ>x@NBwPBa?~0@vsb1ZAc7Bm)2rt2RM33qA^z5S0R@R3#J$ z#e{H#VnR7W1wz%xT>yHhZiGT)OhA<>=hORS|G}p6?zNs3YtD|f2yB;3IS7HswI~p? z$OU+2XQ>?k%tnJ*WOY0`oUOf*kyZM)WmWf{nZYs9M>xk$pqzeX?80r4Ym5*8jLbAI z{Hh|PkbQOjC;yOr?%#KNC3RP|Z{hjv-GCljHiA{h0sw;%0O*DG|9G4MdGS_zabw_M z-3jaiI8L3>BzgP~S@(TfcIQXMEJkl!k=H+2-%(;zksN+m$72A9GjiQ%NTWA60mqun zerauSZLQlkBsD(PsM}H9=QD}T?8bVO+U=ZqNROU1C z(o-$QuBsS7B8OB$8ytR~A^BN0O058Z5OVp$4!1us#=zkA3Z}*tdVN*xwUd(Dz7og9 ztYf~py@16>D$@%%D^B{GhY zkVcQu=9N8xi4r{=;8mp*fFg)28u#uG0tA2~0ZA~T7*UK4dv<8~N-?x#ra%A)06{Gjn$V{**L zN*lFo)K=PFFE~5v;m=Fm0rjd0Nk?UfTD;?Wj{6i3otgE-*X0i_DZ>aB&dcc}F{(&6 zOisD?v(o=IdA>;zMu9wss)T$1yjF@0J7sJPR^Te z5TY;EoDhR?X?0~~c24vlC$b#&`@BFq{ZmEAU^H=DXM1NfdIWbsIsf&&KioOwmlovr zPIg+%iMpiv#UQ}C!YK#>HsJsQMI{jxqY|nTN&rAo%&l!aF2F|de`opp$s~CZfWA!}8;G^Dnl?twK zrX+hpp)ya1^+;?;;dn;T^NLwi>O-}TPyi@p2t_JU6|7KOqtCLx-pyhJfOr;j4A%3k zN#soe&tOCW9Dd0ekV1+YQV6A#XBdvfI*u_3yh&`4pa;9CEu)^&j`s9Cw|`jFdVNAY z9DSCmanf|rCDrkvlzOG`-a3a@3R3`u5R6cwNuQfwWiYC8cpE%{25+Fr7vLEt!KBYi zv}MP&ED47dwZR)GX>!-Ne6C=K!6-&ArdSPwl4Gqpq4gzK390kK{yI~I-CFO3MjtCF z*ubmtMmgOg$$XV0Gc2Pr1eB0DAoUF>ed~OgJ8P@MYBc~v^h>-^mtr-J%TA6r>Gst* z_SQ9*+TC6$9F$c6U@_A3Y>Zw^wi<`0C-h6SwXP_2YKrL&o3y{_UlW=&rk9AQm>!ra zIRl|phpN^V*M?QqA_@v29w|I9DMrt;4c@@&qMAClpBy$-Ab_1UO=sj~jLb}=00$eK ztBb0O8eJjf$hIz#W2&;eXY|jAH|h{VVMRUE=v-e~x3{)gQUsnMCP6WaN>IiX4zaXZ z$8v?NK4dg)L`d-Y#`}UJD2M>SGdR}3a|{lvM3R*fySuo_9itcb*E^OUs0@S^0AMh( z>I9Kv6qQJdTIKSUJG>&xWW<=dxM;1Rq0xpT8oOsEN{!yYvV9es%IhhGehIeRcP9HmfMegfw^pl}>N1%fEborAgofj{SCTd7ayzY}UsabsU4e zA-T-%@rUI##WgHuE*O@p5?bZ-F5OjH;qZzaGcd_EFwvWAY!F!4AI6m~@uxDQTZ&cO z(-|fZ2Ji((P~aKVm}m;*rw&WCCi5%~DQZww8oj|Pr`H*fwpBI;!iq)5=cmNQ7(|<1 z&~dD+lAx?K`=x59*Cc9j3p6xNmUb$pJ5!}fhj-cjifxsR7(sq&-1Pn#2%#O-O#sl~ z4cL9b6svJ`R#LjnWEMG@&}Lt7*}jT>^^PWAaM}J!lfbzGp$WMugOg)p4I+!NFD&n= zZC-J((kscE%IhZeO*IPan&O%Yhu6Tf!!r^m<|b!Yn{9kGk6j2*gOBd<)Vu4(05JtU zlNs!!AYyRo*q<_Oy2*WK#2S-YrS*s926tfPp(=k^VKJKAH*I2{RHMkX-4-XwN~1T( zU?d(jgz53Al7`0V&&iHr4mLQy-(Ru6&Vdk&&Ptk=m!4`hmNk1KcLQN1GsZM6FMVKA z41f4_jW_BrLPbq3StX@*w@KiJWh6|`%dqH#$ZKvhh%pAS+~L_>WA}#Soi$Cd261O~ z6N6DsoaK!E=_Z}JrD-=y_l{05#E6FKV0D1q0-^|kaYTuyNDlxA`51JF#e)U*sKs>y z&*j8hmhLX4KpD&oNsTw_+OHyu9GekiI?0~V(9nRBQ8AR#oi+C5`zy=rZUS^h|BT7G zX>mqf+dMpj3)15HC0O~REgI=DrgWRB)b1vf+VsMh>}0E6Xq&;na|4rN4%Rz^M5$=@ zR5W{nvT7Fj0m(KM*MC#~+0LdP5xBx?|KaiJKh~DG!X6N}KyVaLhEfp#2o+^D5o1B% zqU_&^>?T(UEo*kC*|gP74UOKSn<_@7WMf(Vii1@(E+2zn?%NqxX86BU>`Kr&Dv;s%t0B}689LZUlJVhyyNRVBq@IMCo!30ZNlN>)k#q?jbL z{+J^~8X6iWOLtUESW(v$)f{YaHu(Yq%lx4*cSJ^_o{v(MN#KkEcdXGAA!HT>0N@zL zsuS2_d^iDsfp4*oxPl>%Bm;me7+71}6j1vT+OoyA8KAjs8PY047=Tl0=Kgy0+M3w(qEEJk;Ql6g4O-K^Z*3a7D9s zdsWlC!rYvAOBZKP4Du!Dmbn_X_Mc4IHeok zq)QD~U@a|Kxf&9HOaTbkgHdK$6SpG`#M9ly zX!Yah(Uo*z#Xdam(Pg6uD6*e+x0%3U-wbl(t4!PXZ%S!8?s`fExy~dCBoc)9l!-ia z;eY^$?1R>0bD?X98rycht1Wtn&$cx(2MEOQLlg;A2C|n_lx%Id^(Y_?KwUn%zyU@Y zdUUXlv;9?=C92L#3Vs?(ws|&^@VmJAjgasivu$)EY&xef8xb-52Xv)iBsjF3gFxn2M^&rO21?Jn}nIw5HHm{QW26lCPR&>DZ?3DPzJ zf1Lkic6W7*9MYCmalkD>3Id4TJb^pG)oDG?JV_BNomDA8Q`cxcpq1sO7y^pC6iFLx z>%#Ympstm7UH7sP5-xo`+*9!{(1zmuz1;!bblD z^tzY44u5w)eRywY^~TDHF6ZLxvA)-HlE0zNxCdD9@9QE?o~GZ|w~JYti+=F&ZqqB+ z5^3<=Z1}Lis{g^9CLvOOSM_b9H|bjY`a<<{s{5cCx~7aav4kr>DG;ywVP8%6wI~4Y zHJOxf=~&ijNOS%mn3;EXCjt6HJ^ih) z#MG6{#q4XBj|Kb{9J#H2%MFi%4P%axW`pV(Gvce!S(u=7qemN^UyanFRNcPVWX-rP z1oF6_kk)r3XhgreOe(?ETQ7Lh@hJEqR$4z6T;XxKqH_SAjYK7SOft*{xa80J3b*M%4HL?C^J+RbK{{%fnUdzn#>Z zc?|-@WJMMCk*Kpg~YVLfDJTR*$t--p;Yr z;X>E(hQ}Y*zb@`5Yk?RQ*&fW_4d-wDuGFvpYNM3U9}-};u#x^uNHjLfh)nKD(Xc}& z(QrkLR*T3`*ZM7F|BJclXvXi3&8hW)*&%t}oe8Qk+P8uyym(L4Fvk1l*Zic4wZ`%E8rqD0U~ zFq#HEp188o19l^{j!OeB@eqe)?PGRCN%)@!fM$S!`T}82RnY>oBw?gooV0I9vk?T8m`$#U9 z>JPg^Ufno}OACHZf|*Ze!~AJhOV&|Ym^#G22)e{8aTcMaR+bV}m*K_4pucwyd*lm8 z{Caw6my}6s{fh}2Mo+UGX;z7;Q?~pVVMv{;bgFVi!}3UqozhZ_cd?VwLwmE6ANb*0 zJ6w-{S8|pm<$mda>iaLpUb_r${H@qFmAU;Pop_wp*PD-reg`ja zxqHIcEVdlUOOWhJB#CT(I`t9hTf3?q`YPOxQ6-5n32_SySgyZMBz8w%tu#8LY+lQv0lySlI` z)4soqu-351%8WRQ8N1sg8SOT_olP8NW)}?_iMx=gx}RLC8EfB-88S|@f;}~G5Py*d za0~McjIR=FD%jq<*}ij;?uMs*6IVT?iTL>{@NU~&6?}aH3re8 zx8-W3v{zRnEdhT{>RodR{Aa(7att_+&*g7JM&)?J`cnxd9bqSZ0rOuiDu2EwZ@vh= zMueFaA?3UN-sO1_%zOB^in69_y_ELfSr&sz6D>=teAYX;qF17!fqYmj50#;rT}f0f zzo`9zCYFz@T22DIBKOtUbuId|*ZIu=CRu?Td#zvSHdzh)C4u; z2Is5s`E_TZW^li!Nb`%<%SeeAQa3-o<{Ih>)WKyMzNhpZ^En)M0I&@2VP9P!y`-cyO z99*6M9jXH&6LvogUJZh}UbBJN$b|Phy&w4kEMsF@w~x_yWS)K(veNz_Yu>M}bJe@1q^%Aw56{A>2}+j6%6~LeS9i=I#@#U-;hl*T1A)Q`6D7zfXHjZvg#?4%DZb+q z*XaXE*Cd*0iTJx-X_F|G&fzCPx8y_)WR zD;l5B&oy3a2$P+!B)?No*c6Faqvg$vW8Q9DdB^w0KgfRdLgNRmipFTvEaKbJ3M5CS zsA!C(GviB+EuXir{S0syr|%gW;YkA}m-On3?o=e74%@3<5Dnsh**HJT3r{Sl?vQ1_ zr|h=1y|3maJ9p!I8$8%!npk8$ChoTTT}M7Zct=TgY!T7@2djsbj8O+zgZFEj5qa$E zKNh%AW=Li+WPPWtpRfatC(xCEouhEtb0lWmk4G9o(JrpY2$y>c9VmpbNhXi`;K}osF{<`f2f?`HE_T4 zb)T1Nn9wWg+wsUZm$#Aky~)b;7r&yQ0A9k+HAhF?!#IMO-QjZiY`p0@IH2t|H<%Ml zvfY@T7ic$K6#lV86S%Sf2?XLqv%OH5n;-dOTc)KJM=e|#BDV{VKUll9#;{)ClIRw7 z{Sd4(-4hoVhjz8%2b>7|^M^19sT^2(P=AA`6KNpvto}P0SMBb~O3Na-$?w+%uV^M{ z`I%T*S;fS}$j;$gTevimqI?s#y|Xx)@qNG#>()sC^Cc5#=%*18{Xu>BDmV`a{p|ghL7y#)u#i=Wl zZ?ED!A5wxu6ZWg?xaD>(P-3F;fkt^5UK$p#GfzwUoo8rC-{hFJNZSePRPbWui;x-M z5dMfMJYW0-i1+=zHnCDcZWToV%jf2@-k?Lg#6h@gi(+V1P5I4f{nd@Q%RZ%lGX?#e4lVFP{qw01dZ7h<)B->7_44@J@f3_k;$|P&DE_^d~Y%>Tm^# z`ttUBeeqt&)BH}KYcLhdrKA79XRg`wPEF*o`SRlB-}TDhDU}s(pxXJ`hQ3UHIU6>e`ZPPSgxDGc%&=ZlXWkh~IWS-vTjXVRWc$s?&>E>*)WPXU)m<@}w=X zo%1{Jvs`e~th7rvOeiTSc{2cy#mtRjPM zrDnUiV&T5UCgG2mk`OM(eTS{Ta zmh~_kt^B=|4;!;MgIZ+Gw$p`2OU+LQrcZtcRn1*DJK5PTT~MK)r?hF48PbgZmNY1J zajsjctO=-*z|-CCY#X}2f$}_&mSoTd8eHb`cTxFX=3HYuZ9qrMS=g&@854v2$iMCm z4jwMX3wA;kFjlW0H4s%nHANjY9k($*rvt8}08qTOm8IpX=asQn`$OtGlj!Bnzr8pj z&dXEVr3ccKBF?{?UDk#+7*_+YR!}gW#nH+HZ4D)ZzT3@~%u9}TKbZ}T?db^M(uzAi zbv+mgyGWxI0*9;YPtcIR!75QgUURqQf2YeU8~JM%LHckK0MftMG*JDLU@4{iIp+sk zq-%qmT^Y{YT*UtVr;F&!XcuR{gZbdK7juF{nWk~n0>Y=BW4nBy@Ah*XAluv*jk&ae zO-*@o{O{hzxqT#iJ42-9URjTDNS#!Nqkn^0G$K|9BbL(>y6} zU?#feT2~-X*Y%(MiV81)L-dvzbbhcVb1FoP-3jb9$aOx`MhR@>d{vnr@47nmVSNYwIDb;s%+q{=h_~_)s1?n4U;{5)KyW-n7#yo;;!W#;+ zgGs}uv%IGqDeq&(L`i<9MM03y?Oudw(9O0-?AJ}7-%9+ zb1*2~h242ccmq?u8(VG93Mv%%(~2ym7cmvt(LjqQoQF+I&M$!}9U&Dz8Iu7E@C;-< znJHy6K?S-#tY>yQOQe;N78ag|Um*X;dkP5jeSg#Q31exG6jWAGi42PEC%kF1-yZo) zDruyn^Eid_Tp9e9)08i8=Y0PDh+n_zEvT%lOjHvFV7HF73%^+CVbR;eZ_zZzmPZ+= z66s(3K>nrjMlN1UQ`BXV_U%gN>F>t#tu11Zt)pXHK)g{g6zZktEiaG!lNU5ap*6GN z3X%;93Ie8DgMQ7=H;lUol7ZGwSZPEu)$cBk+HD@CieAOv-p5WZy`g-sx9KZ=`lfW& z*lW)U^!@(xc5>5vrLlzPe#5`DDPl*;7jR!C0|reeXNWD5UX8OF0woPWA?3QPC_f_cxP({YDMbKU>T=z-)tm)$q>zWZt9Sps($mwMJ1M7Mo$cgy z2i{#auLk)8hQrwT3gv2Tt(vfC8U(7Na@L5BD^=9N02wwp4v!w#@X>mz6gr_RB_sWC zZ2D;I2zb|~oT!){R5wg~{Ul}$ji-$nt6*x6z*m_rT{kZb)yK|wI<()ueQRR!*ozY! z8y(%b{TE!j;D`*Wfi0tCE5_eH$OQz9 zik+0c;LZu2ymzSSyxdHbkWBu&mGU&Xn)!L*4dmvjYTMBp(K)+!h!crVPp3*3t^rZf zdqFaQwwyu!i=6tMwsH@e-tu1&XU3sIer|y}9PBXJF9~!^sF(||vGBvk=1!Corbi3DLXWCNfy?R)Y>KuLQa(i_pTf0TafUB&8iKM0? zNs+s{>eEZPXru1*O_8aBK5(yh;3#meR5J_aw~yx_(@?org|q)HU9RgOIe78d$?yZ` zb${!VlsSBtHfiqLyY7c0m#1UzE{}!nbXvvBwZ|QiyqiNCL_4A@MN@n)3C6{=MH@pM zc${adzE<1e(x1MjFV^aLP<{8*=A~uYeb9!@+#6&njU>-5!1WDUyWupNkSpY{=uva7 zmo8?r7L&|OBy6gtnelby^v-|xyoCFE(1|IrXtl>#d zcL$N+9=o#FIURp}eoht3L-7edp_D@oT6k*KGPqiwS1;a_FU)=>bqCdEc#n1by|6Mx zu5P_t+#XG*HCo*seHZX}W-8infraHuO&`ui;_-U*W0+O^6c#eb7?votlL6-A>BmfY zw;p27SED;2x*7LLnD6CVD$9YSBt}$4`UjOh2$%r5=Q#*H5euJ}%lLZLwtf}aY`n8W z`p-*xdiolA)DW;XwlY5-D70W9&)&gf%b)Mx`-A|bS2T-M!Hx@V8TH*-MMY(Z7unmY z7zZRf)RlDXN=fMV?>Y@Cfy08a{K6RW01sznSc7$djkhsX7WBGO}*hl)m!W_`Mp|tSl z%L}+;9fi*9mF9N2_VkL)?ld$tuw)TVg-k{AzV4w))hLc&?G89ie^$63s{K>WQqp#y zW~Y7UW)9?f!kn&W^L#EqAwiyv-tsBRkKAQW$(6xZe?P}>)zx}NgE$NMLBATGB$b65=I$^!U|)Aq<|%-AVeXx2r{8!M z>sO!q>h@!Uu7I0C>Bkd#Z}RFL|FdzC#Il`l2Ywb7n=V0j*#})8S2h!69>-mRh~$OV zl8Q+Bbb=en5m7TFHYU>}hH9CFq&bTaxG1iyaY<07*P=~YfPI5eQG`Fr_6mKpL+nM@ zQy@a(q%Y-zwhtBP@pj7;Y2As`Ev(z5-g^Ar0&W_x#|-*ArSM#? zY=_eQJgn%!IXdg8XQp&kwVD*WlHx-n^X4N zc{)7RthT398LAxNH~AeB;fv;-Kg+*;LkTgGrVY49A}ZL)9C>$z>;Znadi7}AcRTb-#{EbLCjW28^ulBT zy%_AA@yjs^m{GDQA$MvTO*)$kjvw4yYrWY)EC+bRbIuLM$H!mcJ)`NqlR{uUTU=TS z_Jx&6IHCMdLUiml8M-XBnEkX$H+{TYdkPwwE6odPa}PMI9en%zGlt`82RUe>d;OlG z852vam#%2g@3~dW)lh!nj=$@I!ao5?$&!L95FbmKV*+X={|rJw4PD$=mDTsCA@J*T zG(P3P`tSW5lwGzrcS5gjeoO?WIa+(aGtlMFw^ z05DL#tlIi#!|5Un;1V_kIxxqY>VT(wl=hgXlQP7NOa;qz{4zZ8*NG*)z~AofI}N_P zQQTsWh(D|{7nv4oJ^}BM(5%2}(5I8&N4UE*Y<`gmn)5V(Mtd{#S$)>-*0SOM#{vkN zCx;!0f8i*>`j9ym;vj*p^xC4ltXwzBkN{iMa}g5l;HWZ`tWlLPvq902K<)?8$)!W- zk1Ett-DYHf3z}234QTuB`coz8Okw_FC3^YQ?>2srYpS)x&VV7=*2U$OVmyH|NQVO& z({FBJQDmhI#4WmP#Pd~#r18o+96xzQONjwOYn9?G$}HV-J$@S2@awLFHs(nlEu+^8 z@(DiAyvF<(I?3L%WkfS$4;*|+Zj=#;4&g8b6-7rWQHz**&2$DjnEKF@ zC$@O0VkLSormAs-sa=PFk@EjqPkybEe5Y0m#BLqBmx12Xg-W&hoQO6E9b-Ph011pC zoWpu=Y^K}>UPh=k6zyQAGDM)I!Lu_}r6W%Fr7bzeAWf58MHvG3Wo|#jT04_m;wE5b zOtW*RiKQSgE>a`$5HnlqGFC3H+l!lcFGv9mSJdFL&Z>eE35LEvc14YB|)=#ugs7f#cE;k_S$Sjebz7IxLHv^pXPm_tLyTh z{&EBNtnw<^b-r(EV^)5ld;%|K=%<8!b;}k~C>-Kcx^>qCm#97{G)EOQRi%fpMnL#Y z*>>E~2FOrOcWG(gdyNoQ;0Kz*4}U>lORlk}zs@f%_kekY!^g6OVm+Ld81XdXQw)|W z^#yY^mzt;(m9v0|P*+vgrd2&yERUc%d(w(OQ@!=jr+1KVa318mefSByI`B##?HMS+ zqC4yJNsz`k^Yvspax&XGI23Ug{;4n=KWx{& zBy~JBoRcHMP`Hv-WndI)9vCRKefX>Yb&mTme}lRykBfaBu9N_;>;1`~%*{2Cnw%iT z+RECf(0r}ElE-X>N`B68npC%T12ey}w(4=)m(UHiy)-9Xk^I)TPVJcQ6?R9z3as&Z z6U_)eOZg~!4MIT7Y`C^CEvZb@`?tl4ArWji8wGl(OoZ$ZILA_|($ctubCdpvWo)Kn zmwp|A*+JS-2%98p-th5a*Z5Q`yfssuC2!JM|LHVlTgz#sW4h_Jh6Y}flmAyZ4ne%~ z-R`t-(8CFCz5D7&iLzF!a8sv%J^tzRpQmzK!8jns(N^NR2LRosPB zgA~(}Mg==38eWj?tYM@k3xszV!%|8-3!E)Kdun{@NR87ZN(UT!$1EPu<$Z%`{^7BKOsgop3m<=jBNL;WTqQO190 zT7iqlx+T7xpPgv0AEFiq&iYhFA4?g+&vj3sk&a{8CD|0>tb zHe}6A)~~f(>f(Z04v|@e?B2}~ab%BA7I1wdd6aPdC7gNI}(`_bjFzNS&tqk0cW=Q?*e1*EYs@tml89O-39agXS-z4T& zwrsZ@%hK0CDr#!-q&@9*byJXsL_Mbg0_ybFP;eK*+vd*eaIX+skUduH%cwQ1+Sl!L zYdG(28GiUh0W-P!Z{Qk+Y~P2M>`>yWR)U|55DkT#PnaMN{8D;p`GuulLl0Rp;7j8* z7>GOdbf%|k@)KkwOd7+d{fjAlfNMQ5Lu8#A%#4JzPN3F(;7{=*0vr^HxErb=VtDrV z8T;C|JuOTT^uLyq{-O6Jk&ZI3_Bq#0jW^&6a4$v&#WKMjlgR zmJO=eYLus)Wz=VJ&90Ff7yElc+?9-<* z*|?l33-bkrXZ+N>BqF2)2>f^$#I9*(!uyawbjV57eme0{yw}cuEK-GYremroUwqhS zWominFb6%cc`oKxHmxJ>SnnUW2G7BWL_rV4Rx5`Pg2+na+}Ez~euA{8ZS}Ac@x!9z zqug8Lq9EXbjDy9lBh=O~c`^$&Cg!N9>H|XgCg&B3WoT=wSjxCVRtcWpV^kTWg5YXZ zX$U8LhiZvTauY=5kdYhSkO+Ahv5QRhQ`6Zy7v*8C^I0t@3B-2vgw#EPhA1MD$g%E| z3RjmuTw8<02>?KN1*f@o1NHo9dTcok)M#QTq{o})+(;4%LDras$YYPp;K4lE8AJ1W z#cFD5w4mUx@NIW7?HIli$c(4d?;u&sg7*|KTWuDo-fV*&#~beSySqEQSv@tZ+AII( zr`Yt$-{41a!9X8A#SGbqtN$qOsg$gs+anaL1@>zC@|^$Ds=CUP8YHS!{ti>>#as

TYY=?m$p7+CP7&B&d)|Tlg99;mZf>abm#~P4Llz6P7=lfYJlXG-^P?eNUlq%hr%3DBQo~kW zgybx5m*|)1o07jWWp?S{z-JYvxRLVR%=a$^AMDf;1K}uhiQRyCZGbc_UmTFEPG$V(d^HX9TlifEUM1L6`X2`}eZMTUe;d}N@|t;Iw*K0ZF0#^t}0 zX(Q~k*e5m#KTGdCF#eZt#gM$LTX1YO@}gp;h-WZYQ1}E^W8d~QVIo|pwRqKPRQ>JS zS>Ng;qpNEeNc)HYnv|485l6qn8@9h9&GPr>w`X0h6G*aZd%p5)=TK1Z@$EJb#>`&& zeCKj!X{o=~WRAtop0(u$7OT|xltQbK^X1rkU6$r%;bzI}^@p2)rgA6&+W_J8d{bJ} zrD}3Uqunfvyozu(i9EhqYstgaWboGs%Ye1#>d$cp{GbpaU`Ofc8|fQ=b_#vsQ_w>^ zV>UK69;EhO-WkufsQo?4(>+Ee0VI$yP(p!94MXpXt1FvW<_bzYu5qY)s6$)+y~gXb zYU8VsttR%Pltsv2*@Beeap}w7-O`u4VlIKNCy%SEk5^RkElD?r$wJ(Xmo9QYvM7kg z4yJ6ccD)mJ(o|*yVt=*rfdOUNa<>UFSc5C~E0v)haQ!D;C$q?(!Us7P*7pA4X7|6gcECA@`{RMwcd3HK3U9EadF25H@ z6x+#oe0&6QXR%Z@v`_C7Hr4-&a~;{}!)3QIv^~{7{8C{Bsh33$Z@U8pDI0%(e@U7= z5tpxm_I|C9L$$uP|-3HSk+c+28vpE5(mo zY3k=6j}jD%;9mou5q@{_UupA{$~7L2^s9ErIn(ES5wGmgPl)7d47&B`wTi3T59do%zd;FoGBy>krKsMx`N$vSo#2?DCQ(pR&U&8|sT)x_75=7(K%NjUw7ALVeO@cqL&>aV}Vu=qbwFPXNK97hK3YbhAf`PzgHI* zjW~7)_)^t6%_a`vuuAUq(LNT<1!qU+y`uvQ2ue|t6Dc;DF-&82xy7w$Q*^;mI91Kl z+xvf6fg>goczfuFG*2V|vyRDBAtH)aEQSCw`*3@4;*-NSzqUpj+s_nZUK8N(kU%*vWQZ6UnoGH}Bf=>na){R;ksGqnL-NR%zC5-F6`l?Vz_z`1!Su zm(RBOwbiwryA4vOtMuJhYr;G=j1dP1*;4+OX;n*<6cm_HD7d`28O9rD#LXIx85fIf zQyv*k#VJTeM$;cF=2%Mx^CY+U3g;UD{kRGoAPeD0^*|-Fh;z_`RfdKlsjwL1 z_xKbzx-89!H9FOODdbr}V3u}ut$Itnq~PPM*XHo_^qhmivfB#66%}(&K8mmW{;khO zEDD$9OCPn%+7Z>%4*k)l@jq!*8F%F=_&nT)NgpOhYYhA3919*f3)joHTjp+;FKcQ_ z8_#Z5i&oJQ(fH%n1$P^8kNETYK*Uu(l+C!b#Lhn1*2AOTm?K+b2dK7tMBD=rq^B`r ze^mo>@Az2y@j9XlfdcyS!5~gvaj6LjFqiw|5#dyVTeP#W^x>#)2b!GJ?55rkg26Oz zR2XV8XMN_I3`?4>E}x%Yetd;jebDxSf&o0PrzQpl7aJwHugcLs&7XMxZ1?s)HZH4Tf=lL&>XZ=lVp)9sp~5Nd#)XF^R_80ks755( zExlb3>@7~JDXfuUD#$X&sOFn*lvqNC5#StT8cD7)r~QRy-{26 zYN=#l+M+8zW{$u9)`OarL3bY-1s?g)0#Sp06h9J8fbgdbqlW(0=ZuU3b0lEnYKQVAJ-p}9#^$Kb4Rw|)6mcW z<=ZW`c^-u0hlae)ry~isW3!RRoM;^ovrvcQebt77hrI$PS`j{7h?n`u-(B)$w9{hx zH+4(Y$%ky3kC&6el^a#55%*HlI2jQ7_wd$NAEa6B zwLJr+5hNqyM1WflnFz~`s)EZe`2oc`5AXC$1|YBy(Wq~4U*g4GY7&Eq<^4zljK@OUv`z*2bncJmE?37Z+wKd3 zl<@qi7MlB?QAl)rN1G-k6%grjjaZ zY$(zRjhC|dtqeE`J!2xMvzw0@IPz$sSpIkzuvpEaRPzYFG|wae@d~Bb7cjk18Il9H z7k&Kw0w1?{whM94MiZ@^Z6k7Xq}kk@Efj_fn^@rdR$pDl=|jj4&#_zfV9uwEcmK%? z9*#7xwM~Bw!X`_cgJqXPCIJWLK~SDleefKYm|{QMz17_810DG^163Ay__9e=dqP-I zgD`%Fy2f^iVyey7h}Nof9|(!~$Su4O87$}+5?WhH&)CtpqY-zmm4a(wPww-d6LSL` z4J)WYUN#c2BNK1W;aB^`TA6Jr3v-tcqG;9-s_j5`xO{I@;xCJg2X{H(-A#eAA zjtFunN~7Yl(ccIJeV5q@GV^CtG3IBH@zDbVk&%&);9-9Cd;{qe&+u<_kYa2sF%`^E z16@RfNjaBIdp- zf|n!kIf%?6$AkU;Lxpp>wxEVU_5@nN8eKk-x@SS$^R4<9jD1|BYDyfa$)a zfy(k6=1MqCxth;?w!tMCxh?-5{~lFg0wE39PGcY=3vTMShc>#yGjiQ7hg9&U1Rsfn zGrPMCUbu2~{y6uW>eY)OAAtdta=j@*4cLV_-*Xism@c6)ObAy&O%?Mb)n%Y?+dVm3 zoLQekVqN0I_E&mPaPU)un1@)*<7yD86?dMU3iF#5HK3ceUTy_+x?H@<{w1UX^CP!d z=8t2UC_$u1bl4$BIMPMPN%_QMc~WPOn@?>19}Q;6X0>k<5ZIHO#D`yAvwI#D0wgEt z9>-$Po_qZ6k^xsXH>GFXI>PCf=I~8$_-yYgxa#9TZH2oxqsGURkYC_7{j8#AO=ud zP%?g4j7sgh%LsgA+0232&OJqjotrwReTbNcHT&LDla%*PWmM`=>Poy}lcqx+f1t7i zEb}1J0U|H|>`QHLXXB~nmSZxy)qq>zaqIheKG}Rh(4Lbe!l;|ZHY0voTo%bNma-Dn zdOr|#oD`VR;k1WXxuVf7?>sxd)O3-{#|+_Z?5wJ-O$HaT9gJINXHoo_F8dr(UB3%q z1|Twrd&{Yl=i@m7oz>hzq5u3{K;_`{Gj6SeZCq6B#vo31KW;O{~Jsj>Znm+f@^ax1)gP0EH_Z7O91qUqJrHqT%e3 zN}4z*aFYX8!%}A^%uw~15Yo)8duZPNrm25D@L#<&d3^nFHMyEf*-S&84Id5lHmBOr zPD@LiL5%{Ai>bog`j@($QBuV39Z~q01UTXr3mbAB* zzme5pClKKLo7|$ER~f6k30V3+vZif3BwD;BnFf{@^*oyY3qb}9(BHpApk|SETDBxa z0jHkWBj&#%3^h1R#T^*shG8na;qK;q3Ct<1iS(=XP{ zIeI3^ZUw+K^Fx4Qoz;8hn(w}6I~gRI0{&h=@!Hll7Nntf5KQjEcdgvMl8 zaKzLA{xH|GmBP1xzKevN^z65o{46jYRN`7-DjndE=?!B}?jZzX6gnp*c09;8O#0AW zy}vf)dUZ|`Kq*)a;6XRxd;vuELK@jXbF8mXkZEhknp3sn=Pw;``qsZ2p+_g^>KP%p zm=Ss}e`(0&gRrO2KFXyQYS^m^^ik>Gi?u1N%;GU1oc2uf*B>Z&1Oh7E~5Klc-Z zFF3xP6`VXX+VGgrnJt=TV>n)HbTGJs1W3#LFQ6fJhzD175ZRgw%QP>jvtXFNA6HBP zq2&`MDNO0gBaI-j;-N@jcHmnn;VqctepYK>W@F75rQ|F|1wr*(KV(_+XT~WqggOxI zPFwPmukZtBxpsapw|bcR1T`9S1I@Skf(!+fp>La@7x;Ptp)4h(?KoZ)?vM-og>~~{ znhY!m3cfZr1ZNu;_mJt*@8@z3s3PfjE;*Fr4jB|@52mBrR%iWji9N1@8E%ctmGR-i z%h1qJS9kX7qcp((5J*R$1M?holRsKbO8T@z`_V*w-9Sm4;V}f(_(MZ5G*y-nS@s9l zCtbQ$>E8K)DvjyI(H9)IZ$dk@)zB1Px0NG>Y>I{_*$Pr%CccDbWoH9UozFBwI;A`$q<$&{pDdcZ%x=O9hk%d60bcuaZ5;{&7?wHbT2UD{tTGlwl(Osuoq*eG8Rx;N;|#xC%X35-Sl z#ab%I3#dgnhbMK$A~DI0gl*6(=IcF2pCbSXnXHMY?zKU}d8=&GsRx1ZB8Egrl09RB zbCiy)C&p@K56rE*_5mpBe4r+>P@ffCYBEkf2`BtwTVkhV-o=w`NFmYgEg~pPJu?7g z4odiRQM`*a1DZ~v1sf)%_8x+YXrP{!=loLI)|ionSDIxhybhNgDwUe~9NTB*`gM97 zN(=uyReV;P|l-Q+bsk2jqlHiI8&d z&kcE~tzUG-p1sf_LWa2R`SOZ7peGk%mz;rT^T8>0#(#=nrJIuQr!?otBj8WXpPE zoLLyz==I5C@`?Ee3QMBRI~F@@^$&|^A9jaX^8%u1ffCF?TCKR+XFF)4;@cafIV^#Y z{cr~gD_l$zd4e#MLhVgG$ZO|X*T?Kh@q=Hw=``Jcxk@?P506L#ck8Z#4?ofRuJt3@ zc9+j6%xm3+57Io;7Q=5LMaX%)5sIMH)VxBfGIYIHy=qO_lO#Adghd$NhoejENQ9!* zXgSg+O)sVsC%#JEozH5Sp7r9S_Fb)dBf`*dtj97={xT+_+PtkX3GBInPXc*jACcDm z10v`hI~*?abhBWShX>01czZg^V+w$1x^MEHd@m-&m@IqAJPj9^4<)mW-dBG`fjlt&kMuM=hV6cBBWUWV-r zM_}%ib{ml}I$|sgB_?o$9zg}BoSLW^gcsA<(%*U7D^BI3-?DgTN}Y3aUMlkt9emgP&ct^c zC-3PVKv8I`W~#9uTCYq%*8>_Nxd6@Uq}0mFNFB)a%#j#A0YNdg)$WZ3Y9;cL!b&q8)(a8mC6p6F8$$91yVyj?*BUOG)tgOWBUP)cs9xXOC z|9fd=@>>mmVWymSxxS5GBm1&mJ4hn|&+!n{Xa~@*wEl-Ysb^2Owcof##R0qw@_Q^0 zkjt_HCvE^7A$RNf%;EY(E6DZO7tTrqe00wP^!%ZS8PA8cr-!xYdr(p9caUF2vj47crv&{O4%ZZHxAX|n599!Zu=h=l!3h~jLXXhL2R*?A z8nBuebGVKsmP!OT6qpF`kscW;djr%hmRO?O1{Q@54-fU!9`+`KyKa`&x=yl1(3MRuKH zRI6FBK23Gju}VY&VYaD+<15?h30P}nf7L8)K3=T7OiiEd59sms=MQX0Z!`Vs z|IE=uU8p8Gx;&2jx!X5UcsM>g^zZ%b3$9EdC!k8RG?O{z!BgqGJDGU+yU}BFp6g1| z^~p3{rnA1?VSJI)#H87Iq`0Y=#3_pP<)7?3YjSjt`zT~>V8)5MO6K?u!8Flk-7}Eu zcIvwwoCvkUrd}}@F`Mm}XY_rvv_aQ#0uyCAy#pHAtCyEJq+BKecSnrb86J~TSFrBK zM*KhBLFcBMl|at9VHqcP@N=tQuj}SVf7!1RgWILEj`iRCapbxs(pQJ|Ia3!0Fqeh8 z{+ak&J>x#!QcWk9yqPAmS-;T2F78aqT^LeAwuA_NLILF21c@>fqPS6{hd=aIRab;7 z<&%5LG>X2$Utosm!P468JU+>{r;g(`!(g|A95IisyWDJ-8?!33<+XnxmLsA((W8c0 zWg^_iUeapcpo_ED>D$j}WZVXQ#zp#$ zD_O;I2SPrQUaoTJGMX;ZG%qxea>SKV80}N8H{%(&agQdDAhr{2^LTti`usa_dmlbdXsKEbxSq<0hNg~0)WnUb3DOs7%jH1dvSO=0R8&3 z3BV%leMS@+OxX7ey-oBEdLqK_QT~J5(C_@s(sNrgb(JA1f|$ptvX?e#i2<59X3J@x z;hrV`N>RwdUe}?656J7CCb!$t=33ysI0?BnFW+#amKEH{yBeqTzEX@R0|msOvV*`$ zIrw_dhRpdN7nO459Sxr{>(czBxbbraNcS* zh5URFae)yXdn>MfRRS2mBI4mY`0_Qvo-_c&MgVF#o?3E~Lv`ut?8Xrc1qZ)pgFwjx6a zL%BS=6`69aennq~0+4PJqgL|S8ZQl~?>3(3Xz+#;w`^?#U<|i}X zO2=?0`ASnk&C2Je=Lss=>lvS;=xREiVSO~NS85byTS%GgSAjX6xuPP^gg+(chRo|> z`rlhovOBgGL?jT)N+IOPjy^HATX>kN#qoyO3B4MAjf6xgVl4FjC?CfcaScfw$&5lQ zXLjMLEXXjz+rx>Ez?VAtco;C=$i5$d=45Xq@ zC{;)P1x@TDEvtsrvZPQ&iAbGO&d3S4r6WWFAWKbg)H z^EBIiXn)}sSvb>So%uxAOBjmnjshrjn7g*yo@~1BPWd4RlhyF#u8K%yQCa(*fYh3H zc)H;XL6xI_Dq(I;>c3d~RJY+~Q+$(p8ZXSZq5eDMEX8s!C!HF@t9b9OlBT8`NLti& z2QnCOG_peSl#v->*yUk|unoxXNi8Z_5LZAI);ua}y<6RtYRTT${F4yALOPy&+JwyV zxkRmM?YNKbPxNUIe4iQbgbEGoh@$=})SVKzIR~$>LWeSu!eNW^hv8^D+$W=(v=QJz z?S&Z1n`cLtr{8xBgLJznvh07k*eWk_OIyfA_?L8d*kMa#8)Ucjzi_^d+Ew*1%>G#r z^3<=e>B#oND^n= zmz|$K30QkB-d{pF(~^If5C_#EbGvCh{`nzt3sHK%h2tox`;ZP`nuc?#I3B73@=fqWG#CjQb%s$pD9Iir+z{=k%^{{j8UsP@?*wVfci(X<{tP>X#Y8rX<4}2 z4sIQ%Fhs$!Fi|~Qb{NSfPk6(WkeOJ=@BtCu$Y0?QUD$pF#1gpguWkWPlYR0163M3A zZqSoOB8ryAEEY=a@5CwTOtA&8JLExIGWI`%5PEg*OTpdm&nHlS?@iWw4kEZQL|-p! zTQ}|@ipvIptN*A-@AGw29wSKXy*}MQ&ed&~z?+;F_x``V{)DduuSGvTAOHKO+haZi z%`PiV=7L@?4Bc z`=o9iam*3?lCywLkC3K6=Uy96qPl|$!h5=)myEB z@t6d5lEO8<5UhXC&)s&&!v>uYMGj|4m$C*BM3cipg{YDD zgs=4ahcD)d)W?kPZK7edrvaFomQKVAV~{1;9rMv-n&Zhy9Qfu ztNYRyrFoId?--7&&6PzBSOELIW5`@~BOAy+Lx^W6v6oZ^vbLQV$YW74Cb^T_ntRg+ z^T5l)gZ|%su}$NBz6uw0nCI`zlj7>Q#x*5B_M0{EP;iULtxkT(ey^%@rQXa!D5>k& zr0)DbO2+PKd6Dd7y#)m^ddQqRTPU9n9?<%F`6IV!>*L~MI-k2!z?B=4uXNw9I`lpc zvG%liIsNbEKlIe`XkF zILMPzz_arE9{UjQ_gs)J0xIGywIwM9ZQljujR5%+$^sOuxwvC@;Q|g6fbh4zMCh|a3YAjorx^_twlMWEF zA80^@uzP{^Yyyup3ZO$s1-&3<8_z+PgIO6ei0!8b4nRsuO2?`X3xL#Clf_a$?GKN2 z7hT7bH44YAmLcix=}Hs8^mim$1zHE&SLB*?2cI!<{_w<#3|7(oR1JE_OalxuFT2O? z$W%^qpnSGXL7??Y<2)h-g6)4hR6@{e$=wOK_l@*oxy$!PkTuB0 zbI0Df`womi=6AX305od0oYir8w5ORWS0dR80O$PRveX)>8v02<_A$I`;&(OFHyEos zMq#Brt&_n&U_lm;uTE1*N1 z)>>cxrgP5l!2rq?v#$GKFd)>tq1TGlV$zUXJLF3rKn{QCzVY~YnxFVkeOuaZPGiYK z+-~Aptaes1Bb61o(16+$TH*VQ-qY3g8-%Toe!Gf1p8x-NXjh+}pC}M{i{-4ELG9&w zHO7NP{N?0UzFwD)+Fg_W%4`F~Vz;XFc?PF*AE7ni{HDMP((MnT)V~aE)uIE|oA!sM zG3oT2g|=?o*1Ei3Tm+lsS^tiVyNM6{oe0^0^zY^i-fxc+jNXDj9)iEaj$F#4Gc-MW zEn1<^==vsD^dueof&bfnxR1U5&}+ui6LdNDPl4-M0ho)sv61^_$JN{0B{JDsu=l{qZ6S_%GPMzudIiyn}qM zl8M_3?Zt|&3(i`WjBhGcg08b!jn_6djM_DgOz*lQGYlDQp04q1a$N;bZ)B=i(Ry_v zh}#)8iI>^`U3q$VFdKNSM&XfQSJu7_io6zK6nKJHdS5m!xRid1w3?ab-q8> zP38$c;E;U`w)O_P|F^a9PLiU|T-=yz*TzVfKoklU1+LG551YK^G(S@H0y~d6e%RD> zjj(UYdI~%25gVrvdkP|A{>d<&ojBNtWsyggCVegphlct&^6&kH8O%f3(oHxgsH)p) zrE*tEgR-jJZFcq}ox9sp{H?h>Y)huWX&8Itiybj5o*UK#fFb-sO`gFf|72v>Rq7Wj zEIxxw4im#BH@*b$oO=?>J*|1VJB`oe~7>@BSNx1KgL|jYvPL8a5hzZc}CCV2KpiB$AcereU!6G+JWPa`=t3dhh@lLF{qD~N+ z9XkS=CQSwLxu*_GtTHiCy>ems&mg~d0G8vTG`$pH<|f~y$!oLoke0Gx`b?0xLeZVH zB8^?9qX$!(TAE=M9YO_=wrEN&&;Oa;2G>uXNr0kPgE(}z_!PT?8OHq+K6AC(?XZNCu_S8B zGApx~VbRx^uK?4_Oju&jZ&$~cG*8yaoJFDUw9*VRaynR5ssPLgYQ%!f@|D$9eP;X@ zPT>ZhPf2Y9GMdELTV6G`T@|gYn}0&0a1qNE?nsT66v~nhCmd;25G_*Wzvr?`;!6B0 zue|@lgP#iyJ{7db3DZWNs5{EJb+<=1$JSsoitXUH+4>apL znJf=in?bBDx)#=EwqB^}3rE*S*-GjeK};K8MEnXT3t&jfm!&xY*O@>{T5k)D6wCq8 zS(Ftf0Yg1Rw^kViZEJ5|l)4JalY77!u%6C+`WyDZs^2^c+OQPTW5!3KN_CSj(*44z zR1$6*&MBXYD~2c@D({;gb1YEu%d%}wU=I-i3Xf4HHOARkqV_7zp4t!FQ`&y&7*Ml6 z6l-f?oD!e>BllY|BHgDF>~et`@u+8Jz%r4N%E>!u?%b#h@*&`R4%@|ib-XXcg1zQS z<#OFABtPegkxhM}~KutNsc&N`DKbI>Yk+LPaUQw^76T)+XXnmv8^AK#9oQ956b{ zTkVlb+x0?T7XEY|3z^gG3-;7%hEWp>b3lqtUFJ8v~N+9Mf za?L>;j0TvhjN378E3D7|$RxcCQi-e(wc{j95O2>nJ~`bQ;?!*XjJl2;7!iFf`l-?r zUJwKY=T0Z}(ME31-IsIb;qQ8jt@IN=)c;E2T9x z_S2Nhc|Ny;Hiufq)Is1@hPpkmldY^eJcLV#kPu(;G$~Y%VMhZ5QXuZfvPw)8m#sD((c!Y3amAnG6c?P8l)4I02d1HoL~Gp0;Zue`&c zC8`xEpc!>}g4JfqI)htZRGRWEYNO=n$>}S@6MG=is7gU)-~I7@NH*V~E5Web-C3bZ zPmNPqsZr6><*Zbh+De&Tt|pH}j*T2%h&jilL@|5QrMrHer_PMu^s^)uLg;ikV~u-D zj@>KldK+V^kw430k;9jGd_%62pn(iOz9b|qOLClam{n7EEy~-QD&TkTyMWBXfnxim zNGu6QF3ylC>R;Y2d+PV?2XIo7Qk(gJWkR0XyypV?7ewhve|wUw)B((xm}Yn1`m_8; zk|FS5MJuwO+bBa_eLPJ9+P^j1GWMy574KiiIiE5keu_G6%Gm!{a0gUqNRRRtU!4xf z2MbpRY68_I7yuGTyu(Cdge4_hZnX2wrsf&q$`3ebs(r$f?f@vhWxM)$SVT$US$PSz zcq8(5Nlwf1cC^40B8#i${mS7^o~eFA`UWO1&? z&a_J%a`Kfoo60`KvJ%Lfww`D0eWk=~Ifyu1rBymQI?8}n7P?Y`h?2`rRda@LBY47v_WU=KPP+Jg+1JjlSNv-l*u_yxuTr3!%}|V*xdG znBk)eRpm{Vlm?KB26aMRheO<~p#g;n;cGp|GZEXHiA(GfPc)(~FD+oX3k(4Xyl_=5 zw=cQL^oQ^zrS@Uk&RgP?dT9t`DHh6qhR8^+2{(cA%b|7GpzKU zLTgXpPkR%b3ei66GL_*LqJqCdnHH()wp~6VIYQiX;aI2&1l_T`iUtoKO%EHcZn!${ zTRK`B!ge<9s?$gm$x+z+M2>8adXJWgMltfZ3xCDXu2*40T>D!kn#c(1F-O=DvD{E7FyLQ~(D-gM)|3)= zioj18_x;4>AptR#2?TM237Ot|5SPmU+baar&zX73q~&qk#QmwW?m1Eb38)2{;BJ*1 zwu}ki{1HX!n7~au?qNczRIXv!BV2A;i&(3YxUKbdA^Wfi`d!s9GmSr4&0D<3&QyR& zMRFh=mDQB5!43j(h3zn-}fVyI_aMHQF&Vm~UbUOL> zDq2kybHu*Tz z<;f}LB}-}lzEOUnKoldaXJm9SMKcg9A~7-;`;xHatAso86-LMSP+*O-TLoVCpi+s7eqg;GP2Oz`>IM9k317LpHI-wBls8Xe{tDHNwMPT&?UuqaDW^k#(1NcNN|j#71$V_c zRXE(yV<~hpIC#p`#F0f%aRppiQ4$mBs#rhag3NY@TeKFD7;+&Mp68v10^e*VuWgi? ze8jLkRBa1xdKTIbeFuu?r6vgUieab%2~BQj1lrMvqps<=AsgOikf~z-a?o}}VU!Sq zkeX#iHz8zjTRqf^@TH^V(8xGP$>Y!`Y6C?V7uKIq?86(nL?B7O3S4z=iX~e>r}Ps68<9e2rnY92Oz(5Bu&^wq;Wg+gGI&09LV9Bt zTo5&jW2q5F;?KFKQHOjLLu8C3<1LCj=_ny-9;e?e49!BJEkIHKjwT&9+y|4b#wY3H z8gW^wX&!j!JSGisu@1RVRbp>s` zykkAq=@|JES$$%p2Y#{&i~SsSHKaRD)cxZUJ82G!`lUTWE!IT1kJ105&mJ8ng^X$_ zcE?Yr@$`E!q0>`^%006$O&*5y65RxSNo-&^to()Py8q5a-W;3<)VH)Y)1Ye>cXJv> zCZao_rXV`*(Ch73ezZZ*({?zUz~nxMrzZ}}VKkg+nWkebfSkICW*ZSoTpke-YZ3D- zk7dlK3)DE=Xe~ysBB9#|OXvWL6iH5@d-&A?3X0HTC0iAef?+Dx6MN8#aq$Yi4zJnb@1xqPh_u`{j-B8^38U?N*C@-%rh{NusZj1~IW7+!%>D ziHXW*teEWMH&l*`8< z+2rwmbe~5b5|)4JYfF=tw_}l&Ms&;~UBc1s$hR0sM2sg?GBu`^OqDsE-P zoWqmXUet8n0@)pzT%bam_$q$-DK!|g=%6gJ4I4_$!QA%=kroBU96y^-y9o(pz!lEb zdEdyXVP&^s8hh@$6@#K3*&xTb&wMfFK+@b24Y*z&!JR$=#`YXf9f{IG!lJgpx2%-g z7i31rN3M{rWZQxsjwx`7gXgMihg{i=As2CupEvOXyN9ZU8yJgN)@HTF<2!fd2xEbY zDz`tt(G+1ygDZBLsVX3;IB*nnG~3gThGQ+uW&l!5N*eXrNJxJ)%32{4T&k|7FW*~J zCkeVw)XB+wQ#p)V=uB%}M>g$0{KCo(%@q7PQPheea^IgO`fg=D&}K(qRR6TuYwgv{ z{J4zp;H#_9bg@Xr~$Bj|spXL!N@oPn6SRU(H zdODjQrnHnAdzH|_Lza5kmhF3=1YvC%wZ-u4P4WNL0su;Q%kI{zmJ8RCaH-Bqe`Rt{ zU+5R;uNj&MR%Fh#0?RT*s{U#S{7xc!1B7G*Usvx)vAY-X;#s-{xm^4j8VPkgj0frD z=LfBd#y7~lJf+{3gVGTyW}f~z7~eRotu_{RY|#sUGvqkl5I1O!1TiCrW(uhw!cbBO z>j_?0uq}J7C^LvZ&Q1M4=Xi;RF4Q7y#9nZifPZ*48ZSufW=q+MSfA& z69?V39896?0r$}?e<*q=Oa*ay#>#N@m_l7KB$|j+b;imlSd!A z(Uj0K2638r9XqEn1P&BCwZ~%O^LtyoH#m#7W2*MXRxQEKPmzZUGr6yK=6M@|3EuY` zC!?!!cVt=|NPXXeY%W~pBGO>Bh(s$Ho|Hpj>#KIZ0vNkWTI5vf-iNC;A7Flci=X8Y z?%pxcv8n^GiM|U0;M?<_>Fi#h#kI!gv-e(*I1=szpKRb9X-5eUVt>;aGRiQJgeF7( zCA7@Nas^=ITA2faevvL=sSoH|PvE0shp_8Am^f^~)21P@lu&+lsEN^D;Ne%eo1ML6mIR8VSA^q*x*KX#Z`S$VhafE|^pTFxX1P!3J=K7vw+?$g10zNxcfy(q9>7LOh<96Dt_>%86loc_pc>^

=L-ywq81_DmGiV`KX+?r8Ec65urwTO!KuJMGU|sU*nrdKI+`JPDp~ zT|xsJ>IJ@*R_d_d#2;*F>ab+-hL{Vy4DkUFkgp>hY}A8c~$1bAeH1uWrZ;K2Eba@V;*rd3WjRArbZIG=wR_2A>+@q*<8FJW#+gzen5ZozMw5@b%9FEWJ@ar{OPo^*a(dP zl;^wa^>lW7?$57)&Hw`vUKiG44;FS!R~v$}t&nR6jZdXbyU*DF*IK0YbK{kn3(Stj+jC!o5+GVE-8Slz(x(0zQnl zCl`keS-1g9mp`*8u2})F`M%3S{cBNKm=$E%2b}&TslEd9KgNkQ*JzGW@4O>3W=ggCg!`;NS>-*R%UZIC&}e>dacIc zr>8&3KgzjiI@b(-f6K?T90=)G7ck|~=KQVCA}d!$O_&~wM!}-TM5>Z#B@sIhCuwL< zFMt>tOFl*=_;t7(j4ZPc@{9<4S_ggE9$ilD*va%3?Jat1$k^3@5Rt;xCl_SD&pk}K zz`kUC9VQ!Uim06JZ#;tby#Uh<(%z#w#*8DE;f{<|oiA~`%Ju^Hv9$^7{EnRWJ@|}s z1$>uyb7oK>m|s#ly@LQ~8k?)2yB-Ok(_wmVv&)CUZfYxy0|BZA82IRUd=5B1fw{? z_jTN}-X??`t-N(_I=4ol-nbTG^aRXN6^;qYMv8#eG(niqH%VSC>d+qJ~n|@>J|l76M*JgvvB~ z?N^l~@wT=guuV8EGcxkAK|+``Q!{V zax`XBF=-A}Rrc|jqTcUG?w$IAbO~fznq)I~o>+wGwe0!?iiGx}Bg2_&iRo~%iPV(h z+KA%RvFLJ`SS}y?hsZ}Fp%nF2ED zl6e#+k(KMAJpc3aFG>&~q~R%(H*GY|Z@zX4DoTa`)k(`{%VhqE0E(LO=EdOOG(zII zXbuVw(C+0i9e8qoE_JlV7Y~)#sIqsu%6)Lna!@_l74dFW+ot|aDy|zfWM}U^K*+^5 zHFKgwjvYZxEr#|OCBl*LULQwtM+^0YengkeL5%GuIbta}7)}>oA~)c*>n=y%fzg9! zG5Y~VMvro_p{c#2N**zzEEFj!DwU}Qt^u5$$)byS^ry83j-R?Lq~0>NP+|sMbm>bO z8-@6TYw3d6pbb|D;-n;Qfw3r`{awY3i@%T5&Bl!8B%zKXkwD?lN#xK-5@z0nwyu-K zE(tL{nU3Edg~IK&6gl<7@xvPShDcYmkv#R9s-XTcCsyH=uG>1i-E#Cm&)uYoR-jL_ z?@Az!O3;h!6p5b^?_D$b(qjAFShgG;6w|{fjOqIA#42c`*J8s3DxR8_N4Y04i-gW_ zp=0;_V5&EV?+wO(!O$dF&0xf6N-)?6t3dQN=};+!!%UHuIBRTD%|)B1S2|j9Fh}4v zPR(22;DW69Jhfv_>MbnGhd|uR`rQ$0Fqa=K+B;#PB*~fNA7kk0o~SM?`=m=BLY8mt zn`6%76S^y@DV0#?ta0~N!7K?*$(lLaTmg$-`fBG~H7^KFNx--NQR)M<6IQWU&|7FN z|90t*FFh2owRL-Er*d$!!nQ;rM@>2shE(bnrJHEV_`HsU#E_;rkcK={XV_}BI~_Uf zV{+uLo*F zl9V0qG7p~3PA_w!y>(^XOZq(NwN?l3C>AUR`2t1v!9js9kJ0nJkNxiHz-1QnkFFy$ z1l5??pzM|z@)=hONkR_A?}f2{lBo@-3=v?DO%}`INLtG~H5w!}WsewUGmi0+{^-i> zF=k}dCeDRNl1BhaQ%`jrN;O0Enykc!8>#L3)fuPYppn$mBRsGLm@m|zL*ixvdaZZl zw3K8BIGg~*X*d(V)#0UiAJQf47!CmHu_rXp4#E_%Xt=2!LQb*RgW3vo&1LTU zNanMfn_tby$DG%j-8Yl8=JcI@HCAOuMI>Tk?;)D?t?JWSThmfnJ2caVV#=$IQWt*3 zE~P)#Pr-Q6{Q=g(1a-+G6}p1qj0_6?tv*vnnQLhrmlqg)PUm2Q4|6{1#pX-&Pt~nY zQ;ZY?>mR79hMQ6I4}C^Dl6R03LmI)J?*3csl;b^_JG;Em9yHNWJ6_Zkja-=;qt7FN z7>-SQ8%+qSYhA+fb#&*RiWb23yJ zW-C+FAojkfV1%jlYFxQI-U0SizHtrp$YEWc&>GBqOk8^^I8#{DOwS^lm%&O->baB( zWe2+;9{g%COk$^62H7P%>NvCw+g#7ldhH*~q%@XSganO_EJ@_s^;9LM4lBr&h7{EN zNEO;IcK_b86ehiH-9JGvr*9+wnB=K){4vr`@=Qiwio8Clb5K(2(Nd;|#-bO&Y)eMP zhCs7Jsdvbb1ul?%c+3n&qvh!I&TSkr(G|l&IyuPkO(r8suo+lWnAN&b;)97%6kr|1 z$aM`;tqmy^6eYid;gn9JjAX=Ok#TU{j08tjNCiu_N5`%RuUH;xoiaQB^`U7(kg9;x zT+$L|Z!%^EX#ur;sb(bPh)vtBX?+D#G5LMI0Sej1In1BM4k)%~;My}%7EWtL*2fhM z{Au5-eWw<@WQx8?GgWrV2 zVvsmC$c$unj~Q1xD|%k9Czwq1dahRtZNRp8Ou|uCsjh7nxb7FD`s!+f3~Kj~IJ|PF zW%fxzKFDn$$CeN9`f~EGB`u_9hKhaR?+NdhmfnP} zJ6f}=Nat-Di>bDrRVDrt3MJ_*C9%Ir%J66m##tjV(u*xuFn)&;L^DvNk>g8X0?<9d zp1Y3CY1Ax9mTXXsK(k~GZr73FxYc@ej~-0P_0>(yzlSIim`GBWEF`y_6;_e6MVQ#s znc=BG45)p(-}n-Uq~U<166)XdZo}Vr;?8Ez+ad_iTe@Urk_p+tiV&=eUG*1qmhtNT2ODR%kdn3UoYAx}Ln(U&MbQa`vQ{%QwZ4Zc>@A<}n7J zylgynx=+u7syrd>=R0@H5W?NEmD?PT4Mb&j#NZ!RNxMn%jURs0W!1Ai#9V047{eAi zt>m3tJZd+4&2=%k#K+|b+oJ_}-*7G!z);fZ>v=E0aejHK`bJrj&bW&ft7bi7o1TrW zf>BzG`#h;Wir7RIVJTY)8xAc;Lycr7{^z|seG)=zQv%0uukVy_I`3{JJzq+*P>LIz z3_u{o9G)Mt0Ax$%B=Rvv^hiq-nLa`Qbp$s&8>(#zZ;@+W)Rp_NE<=~02@`C1RD9KG zeT#qHH7Dn(bF^8x|5I?c!)q~<^7HBz#UQvhFnBGQOqu^f1Hl~iK|1ru*#AW5F!&O| z4CK9Qw8j6f@Bk8VHz>E7V%YMla#-A2+IXL`5b-_vm3HeKQ0{krBop*6ctFv6?Z(@w z<7GJOqV2%bHh}2I7kOp$iL$-SIVO38ZzR-;+TT9Pp_1igxB2ohkq3|&QgMO12UdZN z9L8I!WS-r?X>dmR=Fn(f@DTzD-Hh=4ZEK!y{}A}+>pz{=?#CSs3HnfTp7KNSstm*`D+WgL%9gB%A((}KxU9EZi6H3{;I&+t=7i#ZD z4Ec^u6UJ@T{i367j5nT73t|$$>(6PReQ(a2)ve$b$PJwAx;a|Qe|u;Z3Opmqt9}lX zILm9iIuBO4(7ikLv}x`2x%kDh{xs>-f-)VKP>_)u6wu>N!s*iUaZpJRpv^aX+-_r; ztrJ(41Bs8yEPr@0?V{DxXT^@^?Qjo>FA{=8lv7F6aE#JL_cbYO~{Y`^WnA;D?pL z64}j>=z$=p=4r~t{vfaYW^C&`3A*rRA0b5p|MSg?ph?^Q8Mpfkt}`xG$xE6Hq*ais zHF{IGa#u{2T)UCO=h`g);RAnXY(|cB=X>WM=j-+Y`U6Ys@6SRU?weAF z{N<}BAq;nc4ho(ao(idbcalW4^d1+0zu?%dr`rqnvmE_`ZnO|p^sooztInM0cI$UNfhC79 z=ufR4f=x~&JG+N$d`<37i>Fek`A-R3D;`TNBo~ifQ%Q%CB;|3dO1+(Wj5DPFB#J6l zs)=X*I<7qrrk0!}1d_lw&Ai*4`@1AvRb^Anm;|r!5;Av70^JodPtuJC{+Yh~7R?L3 zOCU7l-Yt#ueqBpN5%r$qB_jicm62!+Q-sd)V5WxdVmkdW_tjd=nG$Pu{}8Z2=Kr8 zun}~$7F_2M#1t6=P;-)3o0%bh1azMi0CR(&i-KL>#_GNh2JG$xo3uM znd9c`6f!ps`)xvG?6b&!XHysPFm9d(+8&uT$5}>R$71xykEd zx1eqZJA^$W9K!$oAIp{|TzIhQ_|K+GRy{EU7K@x&7BPia+jidOrnrfhs=39nG0-SY zOU|p3H*MEhPW<#U(W>(I-+t-Ke5!!+`cI*2pIuD>vq5XZa zXKPUV_VUjY0^>$+dHda_w0RZNgH1FACYwBt$6_ho8pu-rX_X-UTZPufei!8H{}Kx4ZerZN?!KbGD~01&GwTaah>tl*z8z9)ru!S8 z9~Xn4ydSo@)(TS&+q{&$S>Sc+#YEP{1sHX79BqTa7MtsTVDQ$1PG?M$w*ft<%y;v9 zjqG(h-M_c`&9TPJ&utY66-s(2br-ZAJh6b%yWDc^f;S&;Gu*5ITzRZ;0Ij?44!VmN zd#}^{E-&Q~<-N*H;4JapZNiy;z5LbWa=g~l_>N&hQE6>>@1%}pttjxpSsi?(!f4F7 zOV(Sm(^3LXTzxfsK?#N`q>LV4`Dyd|yH}32Ki2SN*!Jz#{K_uFxanxxB`d&We&>Pb zQ!o*y+gVPz$+MF6p8nGGOCN?Ty|rTR>6*d$Q-Z`25AO=s8|fA?D9ox0>eBwz9Nkp5 zYG!F2C)}68D3Su6LCTZ?4~2eImzgM<)?{@77DSDK63KaxjPrm=cP=aRQumTMW4oXbWinXw|`05bN5_{!x z)L~i*hF{5_oJO0?cAY&&dI9Yw`ReL)pc#9 zO>~@)SI?_4g6Dyk3M%L)TQj)lPW$=df#yb8`VstGWR>VapO)n|BK^6lpuO5Mw?exiQ@SSXYPHAwby%5rk6H)T^H|rtQjI;z*=xj4w2F+PD6+~IRYfG z!&u@;2*1A=$1zTbRN^zVoaEFkge*)d7Q-O$1_%GpBGLrSqLY7@kDvuuLi!ZLP;z@45^9yL&9WNzi=FrVjRFuxuSpSu2}lpWq6 z7xF7ub7Ed$sX)e^x25zzxi-2DEBUy(HQ{Gn3B`t}m1cg0aJbWk zFM%5>fmf$09uZTpiEz}mrW&{geSP|q1^jQDhvx<9b^`Xp)S?;JDArA)mEA5YHZJWn z$NWczL9e9)L^5$Chgz+kUUcT3@i79x*x?h3@V|gR>XOZ~0EQ8m%v|J<6$yC|rXx!Y z4?UB-RVq8Bbk?U5M^-*r+#AVSn$*wgcjklg-EQ#giyf2VMCmwSA(kx}~t91NCG|NwJ+4-kC>$%md zwb+Yxq`IFthr^*n&iU+gnvb(7x@5KEX2l~robP_wVpUMkZN*TEas}jGfs>a**!r){ z^$9X`sO9t&5sg2FS`P-IH!ohd*26eamIUQ=4zXzUW zt%J6wV^*`i7vM?w08^$9n9QTctBy6RI_sY!9KXzKU+8H>4dV26pWXAjAAV-%3aAnK zzghryYs%vg*c3P>C2)96SXYa72Qcy5D4|0Unu3;g>Nvdxb?ot+TBx~vhEQU|Dj|8u zA2r+aDNu{ohzD3rKGd{EO@MjNUEq%-;Jes~&U(Soib$C`2Nnax;bh+3Tov~(OwzO3 z6griSE~l@|#1mlUN>^xP6w`;h{_+u0G8d7a)%ekj`s>QcA3Yx7}!hoZR1`akJX zrm-yli^3=!yvc2H26>$IRZR+#R)A@&7wx?#bA>pA^*{g*ys0jVXo9>!N={z}KwkqVPzs z{lSP6AIk$YTFBMIQD3{zB}VR;{~kV*12kff zP7Ktw9qJoUe-GH#e%&e#`0EIH%A(lmV{Y9NOEV*`juKkBGfx)B5OqUgtFl#v zqbUF=_x&P{=BA`*Xq7XYeJ4Phnso%x2Bgpu2v1SF?arD% z_#+dOJqWEi+X-}ldAu(8^aEhJHi>};m{9A;21`g|G7JSPsmfRm=>bCPk@{lfZF1>u z2W%}Dx%|h6^fKjeDp)8)7;Soc`5H46dXEwZCT?!tj?dYxz;DHI(g^Vctwp_d1}MwK zkZl_gTfPd^v#HDVxjwcN_}xrFn-KvwGn7V(I?E7#fDO}m@|&6qa&!%KSy*8WeVW?v z=yI_8g}6p4^JKdg3b^%j9ptM}JJUcsiWm-!2p)JIy(@Geq46)z7d^poFg6x>2xn?_ z2`Fyuc9|Pw7*9GQC8frzX&Dw{LyD0UavI1i{Zmh6wfRj5ztSO=)OF8wSRYh`2`#CJ zj+87$7?}>Y%=Q&gE#3Tofh@p}&M(EVgSamp^^a47wY%c%h=wG6s7i@z%ovsYkso(1 z^+cP1*O-ms{$9semm_#vubQ`l__*A&wZ@*9mmlAurgC*|wWIs5gOd|8wwVJ?gC*tX zi5EM{5!VG@mu_l3J(ik=;bS%xYQ=vk9#OK=hTzrXLZ28CgWt6O+fz}0W->uL8Sxjh z4fIh|(B}n94g?Fak|GS`6Xo!ViabT!mLH@~pP31U$T`2IE~m~P6mYYHZ!d4AfJ}~w zS(-`48JuU4ONf=gh!jUTJy^;N#n3Ue6zF)&^>wVShM4$>!&E;&%toqp?D@4 zqTh;h_D(C-O;9zn`YDnWWR~vTbH^6e!x*YI5Sd`Tv}s#6tB|K3DxruZZ5-uL>cIEn z%milO8&QwvOjUCo5gs4}w(9%wchtbXZn#2#B20M^Ngpirf!V!*=oZW^z@@Rz{oWiH#i{`hP~XTAg?*(w>(*a>}#Zk<#XYOAs-6{2xsFZ)(VFOBqEF@OAi z)Z781`9VUM?zB4NVbuvkf=+v1$8i2^Ll7BLiNp&|{Pin92_Uc#0wGm26M`q?QFsd@SKFo`T+cgWXjEhfT6yEa z+2fnnBdd$4>c3jSzL;?7xVKJM5{|{tAo4&q+&eweiGK_mv|Qa`^~ zHfA8;8$l2`QbIr*i=kDR!C)%xngIln5dD%1?Jl{L`0zA`#_HFLVu(gn zlt!lOGQ}LCkU}QC3IJW%p3sgkA9$D>24})NXFD0S2`^S=nLUu#*<3hQtK6UpP@GGH zgJ}$F(;w}P2vU$Eg%m?5g8GYFW@`rz3E53`D#|QUkQk_YB!1abX955SI*D0X*{XBa0R-UjE{X?|%2Y=gpfpd-m*4eezS8OlB~{rcIkp zKmGL8t5;us`Q>xw%$YrV_D4VZ(PCc~En57@!;kD!r}ha&mZ^zVDWOo(1hd;67k{V= z9ht6lAy;0iABw;fvO&s@ux_$9iurb@4QOq(?%!2QfD*z{LWA1Ebb6;;o?up$UG4F|2mSJtkHCn}{HzCEM2 z@>{?Ex0Nj~hZJU!P0MsvX0s~WM(s!fae_btH&psnr`0X~;hF!vN7)@ab_9X{{qO(a z=9_Q+%9p?L)1Uop?0x&jH@?x)(ecz%Pc}9-jlI+$mM&fTz3<(8`|Y=t&UXC`*DpSG z(Ko;Gja92(`O}|nPp8vYTyceRom+0cxtL+egGhps5mLy?NRq)_*&fYiFufGN^e1sn7dkSXKwX6w8}?`L z%?4w2CK$7dG!T{+00wLh%&axr;&wLz0ge(%iCu;g%eFt1_AZzFT{@8<)i1WtfVqZt zv$za^h6ts_7w_>2#@q^eU8EQxRV-f7m+8IdZ;u+SnTCGzh(OA5;_-?^vQo8`%GitS*s){q`kn85=dkHR@$}P6SFc|E;j6E{>BgIiDZcLmc;No~ zcTvpW9{l1LKYz{1*A#E_`85qT>30>#c?hwIK$@IyQ)Ej zXizO0yd73i`paML1~7Z>+`*KmpMDyE4Ne?sxr_x+#z9C6(O6n%l2-6%Pr~hC^ff zPj2rw+h7mnw|FTa5>Dmoqb2n>l*o0xcturBU1M#1)2_dUakcg1Dk`g7x0I8_m>PQQ z^kd$+@UnZ?-JfVmIL47iij1(Z$fHS*|M=vOojv8Ok;?kM|C1m87{Gbwo;Ni8-S2tN zNhh8N;D#Hnzx(dHZ@Td&$8|pY+0RxcE5G=~FYef}qeu!x0c6-bdsj7xJ&KQnWzQ`G zFn-*);%%z0@9SUxI)E>H;q%3mhaZ0E^wUloB*!z(JafnP?Ng>q{kLns4Pe5A2>_NY zTQ-Ive6f^P{+?DGYJVJOhekrDNE-dWm-8rdhe8kz$8~U)tWQ*rs@xV801?mqmA%h%k^246NM% z1X1Btx$-skh&iAbt2+1oGvD8&8nZoFrIpAFl~U+Jbx+M{&Z%EG`LiRHnmBRd%$YNP z{i|PH^7c!vz3w|hA1z+IxVE+yzyl9F0N{cPFSzi+3jy45$DMoEQ##LJRr`wV+qMI! ztgHmU%%A+^KX2Kx<*c*My6UQ{iW&aC2fUU{XWqGF`XrSp_nu`i88BHq`R4#S|OW#>&dem4?{{OZ@gZftBUK3%qK*_=7E zE0f8gMT%dONF)kC>kvRPS-F32-#*6(*IpwE|wt=zmOA$T!v=p*2QTHZc8Dn)e zOyx~(|B5s3DXtW~dyBgS`aN;QUN+l-p)aaJ12$kDYPId(YB0blLl&5Jd;eg9A}8)1 zmi&UTD@sMwB&vV;;h(p4w#U81|Gw*2jTMcrz6EEWbryg-@4WN*=bxWAapL*spTB>3 z_CPXO0U(`Dm&h}9%2WWoy{Yg2;0HnA-*El)M;~?6;L{~bmYjE9zy0VR{^7EjGiNS) z_SyUIyAQzS?|Bb^?(QA{GiJ^hV^3czIMS(&S0~&Uh(_QSU~lSS0O-!8x^g|n?u*s) z@Px5C8}{Y(e)9{PK?^IvQNnSA>j>8so-17?lp-N8$O1(Xr)ap<+6LMNq1C3iPoUoe zxPRSRl9J>|QT&r)Sbo`Me2K_tg;yO@$-|Lfupi#N3#T1--Mg+0S)V#%@oUn8?|kPw zj_cm|AODfd7ZxvGeEs#;?_ZuhaNYISfB8#azWVB`|MHml6H#EOTcz6f8T>6gEjk)xaOMm{epRZfH z_Qe-p-23U{k3T+meZ&z*+;-cZUVIxiYyfcKTQ3~8@&gJ2#oTCZyvAm_a=NhlBIhvt zGBhc)x;@h^q^ypNsF@ztVCHPlmwk2o0>BKcSkvy-6AYo2BD3tdtq}l&1mvJTRovnP z+JmBYRX9Rd3~OKK3Br-?tLe)@#2fZ^Y%DnT*kczQdF1lp_+>13Vfpd}M;^Iw;lkIp zRbvE!;%>AqQR4|`D8KBTb11(QFMShqWx6x|eku`%GMG6N_GZHLzPZ2*hrtD(U7ol@ zeB?sSerSWx1lnrDcF=G`kV3eQh$!hQ;V7X*kzaOOjw-R;aZtXou)Zl|!gN7r58v}M z-qaKW;H&@gFHb!2#Qv3i;)y4}{N=B_w(Z#`2oec5RvWK&s3?sNW8&SLU(oOBTIkC4 zzQLBUE!%X^lMP-2e&JnG42dBmV3|X03xNr>(Z-qqYAM=TTqUB8^c*p`>v~ULI~qn} z+5IEiQ-fmI&<2O^Ub8pF%0da8amE?@O)*bCxt|4JLkJR8(PUu4u3WFNW-R*F<2yb*qBiu{rbv&^RSDa&I-zqxlHe1S2ni@vu583vb!ieX}khTDwuC{GC~ zgmg$s5>m*)U(Ug05$r9*9|B;owqe@u&FLJ#1HuBoN@i3RARU%hX=|ObJ&By##+NB5s7DWK96N) z4Ve}JhnPs1os`|RBn3pT~ZQIr+<6Ku=y>|1uOgcYv#%vP?%wZ4|7M^r(P6sMMrmE z7>1tb8O!NH-s*5tWl#u{Im=+dU@63+1;a^~dEMaOd4aCmP7ROFtcq8dG$^-nA?>#2I+d>8`jhX^64~0E(OnuhLV|{qDt~ zfCES|-5p!4@w-*Ly1uEdu13jtq@p6*+0x#+J(JF@TmF&~(1ilC?cBIYD9Mb5@#F5h z{ZCAHPMb0*Jqo>b2V*Y|f$$3dZBAqJ` zM6#k%D&YsA69&HFz*@&i=Tk9lLICmDVeGuLHy9imoe6WjemWiIUQcgbX7)|s+kir# zxROG`6;4FD5#@TyQzRXsq>xI;14lQ8O+L)_`F)xL3@5X^N*_)bWhyboy|#Ml|fpR5QrosA$=x;3=Y8MV)H!? z+-val2fj82uDIZUF~&9qVFU8LJQy&TAP@o(B$SX)SZ&b8*)X${I#+n#_k4d;b#--^ zu)FG&w9I*Sd#bD7s;;W8_gClqPHNO+0BnN|1Qw+@Mci<#1hx^n7PB%|Atj#kW!`%T zF@=?V`D~^(H^;4#4uX2w)an_(R%B+Dpgz22rQ?W!q19G8Q#`V_GIyMb)P~Jl_w3j; zdGOHO-TJ2KmE&xCa%Bk72D3* zg21xbK521ah?;wruN9lA(MX#5EvEv?7*Hpc$N#JrL#E=_X1#{y@{CAg1{*T2_B`zu z13&yh1wyCY2XqaVITv7C#e;Z}bpiHf>m&PNygA^ugVG28V1A z#!d&Msm5h~$YOS(uTU^GeeSkxyDjg+l@|HG1xIy3(*>;MR zYa9T87P`fg1*=l2)bOsBY7wg(hR&Z%egl=7V;u07Wo*l=wjsi^; zh6r?{(p{2eX(CIbCPNZm;;(2Aw`-VD7PHb;&gQA-Xhu?}^bleWO&%NR?=yjy=^xCk zTsO9M)$S*DT29~a*hpZC3~1lu`!a(4Z2ZXj%^TKl*?Qi(%|G8$oEyD9Wu;sY7GuD< z5RA}bh)9M3Nx^(&m}N6gWbATXJ@(Yh&mSBA!Z+_JPaG+zU0?d*KMBK)A!Ihgsw0jt zKFm-oIvZois8lMS`OIhj^iTivQ=j@&?=H^CiKqR^+RU6+Nh&X#u@tu@6Pip-xyqbw zg{?84TU;U(Yd6NPsG3CK2sDRys$=J0k(wF-^tGn8DDtekF8xjJUp5m82G|{qF&4lWOBd=QAo?- zocmhaf^k3s7HAciM&msYh=80i5|-@dHc%8k5jjaQ;}BPLeo2&47YH1)5aB8Gi1D+a;xkVVx`1uh?+G`PnsN zk3GI)*Dvn><-I?+@B81I+H)Z5^sU*l)y}6^Zd!5m%Pzg(`Df=w`zmu6|IT%1zwMQ4 zw-%0^m77>=PiE>*IqvwXl$T|0mbv{7X05OYn9$mgL8T~AMj0@`s4jEw|iKES2I-KKHrXwr}6QVZ(-Rf9E?VeK9@lk5?v29r!Zj6!J3Ta7%J&bD5Q? zVY`sGPInjuMX%JkGAWu&U3+tWX`*`kXl0_}S33&7b&p)y0tiF$JX6a zv=;q>Rxw1%G*Sl;0YGW;eB%Y$S0=0k9(P0vlLj2gZP7>?Xu9#KE68-b?Sdnoc0*6p z86Z8>Vun|&J}|z&JbrjEC2Jgbu1`AY+RX8s$QJU$MLfQ4?LaO+aCm&*{;BgH_|AL3 zApIA<`Attf@kGH%-TB?GSYTxeg;XXh1HElywveLB&ppR3O@zf3cA zW{4Rp>(z?7ZcKUh10VPwpZ&)#Y0Z2;?UOykYf~zPOS5c=XliQe_S^8U?RHh=m5e)*%f-uj^reJC7x@Zf>F?z-zo zci;Ux?|Rq1efv)0N-CodS0>9rOS3A$c;3opM2aEfj3F`r(puYG_FFkud!AluH;+@1 zcEbb!yC^a(tc@Y^$q#~{uH1}F6`X=IPxLAgRaLd<&iN)V6ve+Kbe67)%&GFefgu9~ z2n-=mCT__VN*u;3ITJigp-$GCf|kDvN^D>PL7O%8+)aAylpbm^#nN%~>ypdE6D1$z zu>*&xIJau$nvpeYHN&bZ9-bWkkN^1ko&);H`+xHC7hSw|>lnJ(mt1@8&+hy-Gb9}D zm1l*tFjd&O_rN1NroZxyJ3ju|+y42V|K&UX{x7>9{OVu7I{n30d85a_JqEinN56mL zmD>zjufFANNB2Kf@vB@&Ek^n>!m%b&mZjAq&xEi`!J0K|Uhsk!?0jujoJcdk5MM$+DCZmz9c~p)n<5i;Zi?Txzk%+`1yMk%=$DUFj?KDrx`RT} zq-Wfj$=al=Jxz`JejR&iQ)IeM%@dlhp_K##N|7I!MvGVg06^dj9mz7buq6`>XH!Rv z3`HtTGI68PY(R(qB7>{D0w_?Po;FFRL3(%^n^tdFyK1wO8Ie}DIyDKpGPq%-HIlE_ zYftUkl}Qiod+f=|RJCvTMSO1G6OTQ%Y5S!Q{rpG$j)SB*qVn{>z{tqzvu=LNo6kDy zid8Rs^+lK8v~}%hHqSkl-n?~W<|kyN~>6mLStuUX4bD? zzk2oR3of{Da&j^rx#+GI5KZPtWpd6dw;2?I@r-Z;f+0(B$9aY-jI<(7 zV`U5SG{z7SfNz4y+SK97k&<6lMj0~7s7g>hS~)u7&g!T!S{D;6-eud)8=66v!&v;_ ziCo<%cNdp{LEwm%WEoqeY%WC$huc+Sp^$_k(wYKod~K9A%24xU7Cf@F%$^xsFZ9$< znwtr1+cr>T!oU2b*Q`BjqhqHhCXQSA)VlRo?0E8l{?V+HdH#KOe)COldi}nm2fqAw zw@GatIcJL>1csCV2B;-tKl$FB2v7jA`KmYGedjkc_=Ta7wd*gORz;w~c~@WgrQ5%i zEeu}!vU5~T9iFK5<@*nfAGqv!mvLZynWIN%`uY}%_b>neAOJ~3K~#m93KqZF7-O%z z?z+i|iU0nd_x$5O{ZregvokX-Z)ax*2M0aRi<=+x>L6^ERwsJ?uRHqBWPCzv}$62jBSGSN_`TUNgM< zx;5+jZomCY-~Z}&v&e+e-}~C_8Nu_J!B@Th?Pp*1!gJ5w3bpE*u~mJ8gZp;gH|evt zy!j31jOAZ3Xub8rU;o%0kFp>$FuK+wyzu<<&br{zAOHBid|{weDoM$JrP5ZdsN_Iq zKQ1YC2LRwVe&aVv<#J5TN-4kno$u7^^}qSVCz8WH`N>cEzW1Xa-F@A4*M)0da_zOd zckfn8{oC!g-+c4Ur+D=YnK`dC?Us^#WN_9(##cW7*P|;|+K9HU;e?5FTCQ~hYo-1p?mL{ zot?EU8&Du4?GuNzw4^qR-(InN^rN@_#&7)Qi>|pQl}df;@BjXH-u13bI{n`Fy)QZD z$}6wD^2)2Wp0)MwKlSNw%?Cd4{@?xGci(&Oy_+^~`nyk_QcMj2RfGCeZO-eahHzw| z5rlvMNR48#ajP&y24Ex;lF6=n=!JCAAliA~`4pMv=J8SoW!(A|C#c9Qpxw0WpD673 zhzO40yfdmdac0R}f%xXaR=p;!)Eme3CIj<2cPmh2tUmiW)roCU=^@1I-?=B3&AQX& zy|jl5<_DfY$xsfBj2_DDo2+4O=;g0{)lKJYUH#&h-f-a9q#B(&prH zAvo=xK91?^p$T{Q51_a@+szN9fx+8vzkPu{FFhdG*TIZis?F1YnE^^BLwpGWzg~Bh)(FHR$s@ZrtsPu3Jhc6)Yo?}M8|E(Fy6V1% z9+PRDtNDSZdeK@rlp9^Yerjg+vtPZ#kt}fN$B#cboE9@#>xYjW&E;3m%^jaTK5=OG zqki?s;QI6Drsr<`!26sJet7%2S&?!MPKx2ebEc`YCR6gOMXxenL^2{u#sR_iy}4qk zTCHkrIA_^xc6ewg>f{c{k@3@evo0|b53wT#w@tt3RAk!mEBat@RO;Mtew6W}o+Kbz zi{lW0(P0g6i1QmEk#HSS?qNi4q^-1SDP16?xr73REgYMtE$*B#6ih5VgqZ4Vxki=1 zQ%3m!f{+QUV`^-0?K?7KLlaZw$-_?$tr(d#!H>W5)m-0TrhjGM&_I60il6LvWu4yq zs!RXlyFYRU#+;!o`%A}t*S536cipq|tgY+U7tG^($45q1Y~H+v;P~~geXY&;XKwo< zfO4`cXZAe&p1=9zd*Aun|LwQlthozXYIH3oOU3Elo$S*nuJWepvz-)7EC|SuX{}4; zN~KZ_qXe}!rBd0lpA;{rGlg9rjk%Zy|eM0`$x160BoP)JZ`Ms_qcdzOkadd4lf3r5W$A_Me1zgDZ6L>UJnDi%w*Y)%Lc5zE;9 zRu2R9lEteTAcYh|Sm-32U?+af+9r88#k*Q73$ixd8JPt@YGFlYDUo=AF`<$kQ$@>#*%GAtkbBp5~I29zu-oDKda4n1Pzfj9hd>#a_(= zPw##xonL_xiA=RtEG|({lvlP%F*%J z>FL_^5!drc)9j8+c5o;^I5v`9N5to5jsusqYAI_<$0uf`j>?uX#>l{PqWvKOm4n)h zS6Vb_(~$8zzcZFkDOIc0!cLd~U?KK#A(2UBk|77=h&;-n=?*_hH;^IHL<&d~DKY_3 zK*lE%v^Y%WJC|0UbzbO&bg7EW0<>|<8Y16B?H`RMPw7Sy5SqLr-Q>X<(x~edpUzGG`1BL~w02+)8 z0qJL|sMzU}9zu))tFYn4le5Qkt;m#XP^33(w^Iehto%^F0fw9nWYd>jeD+g&o>J8J z7oU0bdD{x_ee-z`;QpD~BRh}YeAR}_FIq8O(n9DD{=@yq$SAUH8vyFAU-ttkcrKH% zZJW>_s|bO!v$GV`yp$K-C`1(2eSh|Mx+0+CwV99k zgf+n1RKIzw%P34HzR$vaH`JiU#Uey#5JRWhBH=kBJ%kvsYWvLWxCxAqq_iA8?iJK}1tU5^W{NtG*ABnn#sl3{=f=-E!!yUMQw^#ukX zfIzeW^T=%?Z(jJI(7<6pc*;!?PgEqb5#bCAyKeNf@=IDN3L6m3tH^Zytb@Mo>cDOR zsV*buQHWYTA_@%oCh}F=77N`;oxv>8R*kE!8wGkJIymWUS_19cSj7Z;+A>a_ozg?| zq3Zjxf2}>dUa8cY=ifMb_QiI(kjmw_w4~#N%1Gd=y6exn_0N8L=iZt6|9txkD#t4C z|MtDnDN<7hf-Gv9Zso*O6=61hY)H#esO6$Jilan_QOfgwOk zaIaoXJR_d%`b#K9uRPyJ2w)-RkgaBNi*QDnuz?us{t#?X1%zbq8LBygfN3UHTd56p zdO%oKXsji&iK9n->rd0RlHynD9Md5kV>NYyL`4gg^rHhxAGuJ4o{YBA2>I*C^G@Z&@0T#;G1 zNdq@JNZH($7PlRV29asyTMXZQ(^(gvwQ|oy@dv+{D%MLMdEal^%KzBE-CL}d00aUF z!5QPm7}pPsAzvwDvxuX}#rdv(MhD3#rM(MqM=>U3bKIG3I%{DGhCKvN02H?bE8 z8DItE1>_tfvyTIbZhAH%2qB0FiI7y2S9m5Q1RC4oX~n0NUnfnSW==N;cGu%QX+@^% zUSsVhAmeER00J3LT+&9}OrS6>CPArmT=>Yl6bJY=7aAJPd~RvUr92~QfG;3DgqXg* zk?CFcW!Ie3zj8ya&|fYVbJ;91p6knT0QcdC4u1TL4_E0yujUVqRe007akZ9|5UW=6Ghq|bzK zzyV=dj7=%Oq?-xvU5S-8MrOe=^WaT#tmb-^ z(%g~b#rvP&Myr`}odxBB402pQ`M^Ufw_I2&7r$`lu`hh*k?Ss5{ibWT{p+_L)`nEz z6Or%xq?AVV>Xq`;(Y~P(6?j2;qFSq?4j5{!JV1{TBAGB9AEGS5XY~&mJ}i@KI6xn; zL10-3{mw~04RSCJ2f>)qEn6|hoRot^+yu<%c>FVqG6^SyC?Kx>k8lXsc#;?9RJ2rO&m9dU+R zNzhY>$*(+1WSr5l^?~Pd1cuVK1Q}DVmMfJCV@z;qjP}Zv&;7ympZL8umeyTlXIBRb zYV{+f>6uhv@P|9B^q%7zhchcz41VjUj}t@CMtOBofpPuH)M3ZT0C#KSyG>?5X@x=v zLR%06(|8I}$TvN^E1?pY3S$)4rL_SDfb|2j!&^Nr6&pR52>??Z(~^}e``yVC9lqR&a9owQ;S)j~Vxs=F0C-m!6lwNw2`U^w3oIuQH z)1DvLQq*d-Y&PqcTU1rAN<6pU--uNeD)tda_G?4m_LUIqJP7h7rw=) zg3Hp69-RKg!D3%FJzFaIUcFkJa%|feEgh+pR$e8j&5>;};K*zWJk&L9bmS&&$g?#@ z+kmN}DWa*QnDI43fGprJu`D2u^p6HWg!)M1tz?k5nXj3vqUmYdRzBay$cUhhVTx18 zR3u*kp26E%5Lk>cjv;Lm|!EwXtRjwb**8D@0#e>I= zddfmXZM0UJ3dIS&H(w5jH6MD#bYFa-*8+%Ai$PQPqn4DhFa31t^~sx3bDh^!j+#lfE5{0^1&mNmYvNw4l3chND87M)PXYa3>r-u(O`ox zMPkGlg5V6I28_lKDPw%CJfng}HQxmonJ(tiJc>-4C1rqWjRKlsxE&&hu;Mq1Ord5h zOb4{Y1{BPHDU;ldWR@))!6Zi+Rz5wGD#9!*J%pH-UbeYbt&9v8v{9pj;@I((MQ`im zOmK8+_QA(@A1{?lRaaP6P?_;+rQiDF4;40EJ(3!#T{ z?hK&OI#5O_9biCSrOxszJ-04QV1xypW{jaWj7f%Mv?&Y>OdV}P%(E->j$G8!V2S_% zQ1l=z2;DFAkS|lsXLNKkNBzL!=!;0BCkBw>Xs5scAX8jdQ4$mSwT6p(S1?}g8zXfGX%Oow5WTp0~-d5J!+tH?$|0)`+3 zi&6wS0i_F+G zqobQw<>pFmxvr#b-TUZ@O1bjmN)b@o7H3R|4HvE%TEkgdB6xn_ST>QaS4x~S%W|ZZ z*4hhv*YmxgT2b{0o#{s)Lo#Cout%FGeVmOP#HnQ&`0!GJuEJGsH3kr}PYXyBIV8!XKov79tR zqm^ssjw81TBr>hNip6b2u9Wh9uVGsgJo8!%0T?uMpe6vKql`iHxlmF0mGERkIKc+KMn+RZouQ__1&9b7cuMe;umYoN z%J)=YfZ7$AmfWVs%2u37YI2o8g_}smB#%_Scn6Jn;!IL;QkUnaHPBw00zXSO+y!6d-hv5ja|^6 z(q3SkTo$#`>Av#h!QAj#M+oF-+?rNeah@p*jE;>RJ#fh49I|-}aeDTMB}8D^o;EB9 z6gNWVNgxFk0NeLGqfd8h=lMm0si8gwRB2)gbU+LN5HZ^)Pm*ErV;&&sNQ!}`K`*q? zz(B3g(?pY~+T7_PfC)h(54g}xN+JeG0E!frc-CTfl!*l;6M0K$p=-+bbYRHP0z~ip z%8skGA_4%0C|Pu!8wp0u<^iE@g$)8Y!l9PDP=NT05@c}KOW9ht_g71L2r*kOzU(J| zf9nf3UGk*$^$F*mUw`2n&KZ*KdiUEeI&|~)u{Rx`o>{wM)!tn@ zxa(z{oI7zyENn}Djbz|i#-&!z_l`)7|FVnPUM4-Tvfszob5T*+os08ju3egp4L@+sFopRyOh*8@Lm%Z$0La z?mgpkk>-;gLd4$8a0(P<_2?x{@G(k>~z{m z=M3Yu;_;1JE*w8PAw=q|Et?Ac7v6v8H?=$EyLB?Bsq+3jLO>pxGU#alH=1ShAxl!V z0RSYF3b+P6570!zBF!WjER(>L?xqtF0RmFn$WFfEXoIfm3_t`lPGDqR`GHY7k!U$j0yiLlA*$=BDhwLXhJr?Eo=8oJE&xSng3bEg zq2HP%Mn))6G0aZ}X0+k^y z!P^NjZE({R1mGY9N&z52O9(UtUgUd9VoK5_18tbn@tQEB8ndu<%+rA~n(;tb23eE0 zfJXOt!X(N7gtZNzO`So&d8nE8t0b8alKDotDhP}+$vCJEbIAaCx>2-&fDGsmZ5x*_ z3fN_hTHlR8-bAcj^QA*i3D2s_)sraGR^B?(6Ok5>9zx7LGe;_;_ifwwuIb<~0-yol z5XbS80nlI!Y}>r?TMz!j%WwL?^dkq>u3fJ&KXdd+&-c>V0Y6Z6#txHvsI1&WyG+L6 zHBZ+nh1KhJ?|$g)H5;G5_52r7jtv#IU48vGpV}=@Ff|vrfh~Yye*d%zfvKUH1ycg@ z;&qFdNTDDDw1GRoY+#bm0ww?@AcG)4zY1=Ze7A*{i8ky|XSz}|m@uPS(svRgPXT2J zK{KhiG}xGN5D^;Dd4}3kGqwl1sWVHYX5v$4HkX2NPX(?HG-+tFkQ%2H7!%jELldD- zlnTIF`UkLtM$_e5oXF*|xfAv+=>^;MT#+6^%-E*g<0Vz53GTZ<00QbWP@h3SNDome z51@e*l(Co|@b9?y9|n)DKREvI*yf9@>ZmlzpkxmA53epNMVhAvSvEK55@SXi#yz(* zxOw|c|MjhpeDU9}zvik(@BZ$iJAV4M*S=^NgFpChfBdd@yuS6WJS{&kX{1@uGeGq? z+9i5jz%oJ(%mJPTo+4(2_|ksB76)mAl}5i#^)e{0Q%{L}+HG1%7iwmH0yrLd;+KmM z6_=XJM#4j^!axFOqJSN2x@fu@O(%vj0LYQ21QU$cmG2wXxWvtr0!L;L5B&Q1Kwr#`McH*p~0J>O%LF*P)k zpeq24gz1GXBV@pAkU8QRU=}b7aKYaK5v&wQ8?6+0HL90D`JFmTyKd6eg|q<5oRl-0 zkSQTGlkqjiX2c*QFrr1Bd0J5h5Ygg-BXf07S01$*O@>GV0f1y^MIm-b;gPfxwAf{- z6I$B7z4bGTSsAO(=BYEaZ^;Qs4x)vFULgXv2inH%L10?X=W>wLCtnf?W^%aHKE) zkw5vv%dUN$HM+@3z4Yt1eId7MEag@!l@huxK})gT_*U(WXw)-JS{D{X76L#CRv(ER zFb9|nQ<0YXRmi|ffw0j|gIA?m8BCDODu6a#rOWHnj535w2}^SsA3_WTiOb$aomr5Y zIT@4zK+bp?kt3@F^`s)h5iQ0D$>K~j{67R>y4)4iNvb5HgF96iY(XWKk(rdp3U2+% zda2u_mmLTo3QIcf9-gaC9Ggk2suY3)f;L*Hz^&Jmui{99{`|^X;A6FR^ntrXuAi!I zK$Ob%^$%^Boj%S~`P>)0?8w1K)~(*MV#T^0J03=v-L>n94M%4#IPaU;T=wvuNA~Z0 zY3bNFmDAc(QBQ!WMn36T@$hmZMrszCnocEJfG_shLu?jY~mz9^K^blg!7tWe=r!ocrKx-vemyZ7eV=ZQE z8)*$dU<`P57-eH;r93$(in;Z3)gwlv4clbbE4FQ$*@-m+L-m>3%)WzweLuV7o0+~* zY31MWmUsBGGf&*}z)=6t!RoUga(Lui<8MiBr2AOJ~3K~x9~0yHe9r}2j;Fm==uK*g3kqa?Th z05JdwvOv}#u%2;#$k0xMod&mxl_^pI04)J!y5P<{fqC8MA2FsxD#n-C!U1RjnwWnH z9bOHKuEl5yzm%SClo3qiWV#a6Rcpp}^ArdWBb1@WXV_(E_d6%Hk}PIrt%7|<_d+@q z=^?~ivG#`V?)iLe&g*l4I3R<>)-IrFaO)rk)7*?3sZ+RMm%t8f!(U&5>43lnI%RPB(V9S0Y*p$`IpPI>clv`GOrl69?%=-`kkYFptr+ zM3h;o2*xtfsRph#I*A%>UTubG7KW@=6$Tpy7YC7&>5P@<%a+mn(nE+@ky(4g)^~pA z;NMDz90UfyG?0kyb5dYjaA#op0KV~}-yhAa^}PDVP3vvTy7h1VN=Qcl{^X}W``kZ% z;_%)*7hH7l_Lsf+{)xGJe|~>`ZX&}S4s!eUOSW$vICt~GuRL|bvAwg$56qQ|$KUam zn?L#S54NS`K21Vk>S$)b%s}LzXj5JgKmv0>_7l&+=?@r3giHbKG}h+GtpTYf`4T&r zU=fWbd|3cxh;c1bh9&hE><%>T>dXR0(^63;_OCBNkpTddjHiWNQ=T?q$V?YSCf+YV zW5_~wQ)C}Wlo`8_66s~jXkqCg#2BLMx4iZ7qxT)!_wzxI(gVO92$?}+z<5xbh3SL1 zHGTE#FL;MiCh!e1R`%-1$gzA|^2;v0=ml4N2{{B_{bPUep`U;2t63)lKGEtlla6lQftTs^dUafKIar0c_wY zk_F&7cxInz!h-A&ST(E_De!1W?~i}@!yoMYI(iohj9q7Qf+%QSHr$4y6y z26P3QHg%?j1MZG8NB|wWOf!^u5g3|Z&|=bXQzySQlY{`8#eK1xjVCHSgc#t00Gw3z`m^75_P~|*9{Bpvxjl!*cLTt>zOC!}&%O5fuiiAgRRj7; z8Db62kN`j%15fE#-ET>x;^ z1vkI#EjK@%d!zu(9O!8v7bsz>hu|VYa7ix`mHW&JV_;{1TVSQptB_xhntU&YFD>yh zfW&12U)m(0#zZUzMUk@ru{slRV+3v3f!$ChfhH}nzX>!+SWZiOcrausZfTNc@F+tKHVH4xcIFQDqrsni+1DZIfu4&!GMpF!9(RSS|CT#4h z17+GsnZ}k&xD1>zM_ARsO%}1k#1a7*(^9Q2ZoY=d(lWD*FDD^Ayk1wm=(R)ypu)G* z=&skO4!O7oGVYiaFU%*+YVQqUjKyace)^+3|IgA6+<>m2o&c&xo});A5g-SM=YcuT z8E|O|g0MhHl(tbWC=UYQ@Fvc{+%}rPE|xWl$VVw4Fs4cMZWEf)gaT1$TD~?(Xhv zaCf)h5?q6O&;){8fZ*v3Lu(sPgvM>C=FZ2 zi`}liq6lVqxEP^55nZVHtko>>*SKnIiEWq+au$Hdn0I2o(`}4!jdoVzFN^_i3c5{M zY3QLK=U7@4$suP!NL&qVBs4p29&w4)9po*2h-PM#szzK|ZLuV?!uY(Ww62 zkCW(%4m{%89MfJDp$TQhe26($0t?E;{4N3(vDjQi$_l&KjJ=bn`f@B|TmPnngJ7Xj zP$a{k#}yg%NB+D$7LfNWINVj{hpJlccGFG#t}#FiL2S>$3NBzE$P$`A$)^hGu|sW09E=_r0w&B?U~vM{3^WN!f`% zbGPlxYo+N!B>YiH)L1z2)_T0rj?w8vX7+{ zQRAFo_719TW~uDbXZpmJL@s~bpCu+&&4`yUG;iXU;u-NNIt%)`l#{>oJ64v5mA?hd zZTcrhK_Z%yu_kcODrGRxXod;RP*nh~=!^vZOsxW)oJEnsdEsW*N8QN< zw@^0NvY37>FfEyn*D_P!iQv2G&ckh{_4B~Dm+6mwnN0YO4>x)r9samYd}zg$D_u8e zm}dn;*w?u{vW`DVO+UpB>2bZV)}*P}$+S>tJ@1`~mC2HevTB`UO8hOM z@HC4lF!KAwGWtDD9o0TCD6NO4-`BQi}h#dg?lFeiJwl}%&yX= z#Gjmp6pg^=mN=e^IdzoLdg5jyZSTl3{jKW2iT(W zyqoSb|6aBfOH@J_v%X)Z@@S?N#ZD0+&P+7k;=7SlK#Wc*Hrez3_*dtyb zk%Xch#>>dcuJ`7Hqx7510Ryyn`04iK9oc^$VW&-zy1HMSG$!JO;ZrdG zyjE?{J{0*=d(KaB9gnlOqC#*Y_M5u+YpNgM`5N1@)KwFs^PRHXK2#v`|NZ{Z$SmU{ zcV`;1fp(JZHNYvQd(ku_JTb0aSk7jljgJWq3_zf^T9rHqX-HI=05@YvT&`woCRG+P zVC_qz!k)p}A=sX-bU#ICt$F>vJ;{I4Cy4SMYgs;B@780uactcPxSCQa+q=KNuVfbZ zM6>;6Kei?AGl&*8P*1tc;KeR*)#8Zj%`Ktj>Z0fU$h>{L+>Sq%O4wIty?a90(-p1Y zZ{2YU>0c`6^rDa+(!FlY2I>ZhTo5o`ueaVg_L#U$A;&ro^O?!B(XyH9b)Z=OmftVS zHhTCg9?zi&q4{)AQM6SAUv8QKOS%0*?h>TAdUBT@_>lf~*16%osG(*5r>)^iLg+mB zF7P~*>`&vD2}_};8M2qZZ|GV=<>F`fm~ay2SL%w^=(5blX5U*2<=-*P%Px7)bF4v6 z9iHvn7D%pEqK-OYk-5S|E6rjRMGOqj&q-q)MRlL)A+Bv(te{BIR!rTMVE}-=x?z1A zp-Fe>d>qp9zmYS7H3tVR?9oyHp&}Bj0l&F9U7I}pcF?WEqDP?#yQnDChC^CMAyjXl z9>mqJJnLRNUwI-X&b&rG4TNj&5E2r0z1*&@e&nNS$xtqeK{eN<3()UkAi?S8%1pCT zaAEW~kiaI94^4~iN#p1EiXX6gE7ZQj655%^BtD#I&G9}}yLc*kR4uPg@H21hiM>vT zw4?Z$E&+8A$FPJgA0j}x3H16ojZi_+lHb-IUl9WXHgY$5lKp-V-ywk5OyR5u9eSZS zFg?#%@h?M04FH(P$#~WcPtw|N6f2lsHX7BH{N0EXbQI?yQ7eJ#F#n)_&^&+zp(X*n@)vo%}C^1jCO^X1`7L8)g3gjq^1n|>& z&$qzk2IBwJ$M#V=PJmY8o>)}np9>ph8+V94w=RBcy{br8kJepRxz`t zIi_CR#ImSy3haA??M7zW@*m2SMaqey2oa|74k5)?672 zxfrBujSjI^jTlKiU!{nkX+#{*(v8SSPM`fEZch(;f;v_7>2Mg1wO{i{Bo>DvHJv=M zN-pt=pE6hPj6i%v%}}b0?-P|7t1o?dYOE*>x`^?1l%660Kq!*1At0CodaN(f%}y3k z5cU{yHsdHFvji$4b8-!R)u=27Dwy?c$q=VEJE*MaVCwym-wMmYFjowII10Ir7+a=O>`Or7yi`9(X%xy^U?>674qpj%Xz&zU{Oc%<8BCOG zJv_3aDp*lIS<^fO@DB|}kSvrPgb}CYXd-9v9w642pA(81@Pppx5KG>r=W6Otn5rmB zy#Dj?{=5;teW?eRPE`%=h{g~iG1l*zqr|$dln?LsgO_-#vcWe-{Ez z&UH10G3rDGu|VhpFu!XQQNj>qStou%!Wr64-&>&03zLh2Er4I=zVl?%)G(u~ahn_n z_{Q?CHL-1BGk@j#RZ96+3qR;<5rJ;u?^Ic(uF+U3gF_L**%and0J)7ZIgu{JF3vh~ z@4e8hV{S{oZr~8j)0waO35QUT=#Tab7+SD@F*g#qNfc_xp?qlHY;LoNVAU5sylBB+ zYcLH|(ZA-sh&q(6X}mj=Kh8v(%q5wgCq)>Qj4HP(=w?mO>Dq2)5!?8-;_BrOs|jF^?;8i}^yLC;cfSD>bKFRdEGJ$ciQULCS_=)QW1f z06`SjosaFO{{Xb+Ui_aHa=yw0MqatzfUHIt%D5YB%B_2OZ9DT2N{>3P4O}2Ahqg)q zr0~n~O*FL9fHwJ*iW1<6DB{B)2DEqIOAK@K;By#*@nOgM68|)ipOB|}G>Ekb&Wo-& zZTyO)U>`c$`3jw?vvPg2cC1Dz)UPZvOZ)!9+FEp6qDBs!-NIk@Bub6Uh?35V{jsf zgCoh=SeC63ZY5+Ddwxzk2|nVT7JV|7>KE6KvL}^&7wvMmn1qyO86ZkZG)NSfkX(5o z`$Npqk9yycOSGSy{otkOl~6VMc3#H10MMF+({v1|U)vG`3vdD{qi&XXKFoo-Nx zL&YyC{M+9L64#8tA*`piLX)Djl*Z;WqbG6>P6HwjQ$+OG^j!M;cm|nGm{{h6k?l%H z7fZmfHPI4%eS}n)U*j5?Ld$X?LHr$fm_YhBboyQvet=2C*gH5_qqA?D{GPJcsYK5 z4nIjz@B8MTtL~@3_P1c8Q(9X88MPk0zcc8#9N(l6?%wmN)(%`xUdP~3AwvtumCCDK z+Cz-x7^-pAnH(5tNIrey;hBK%HC~N4Nf%PGm6f4ffc&zqIJ^7yp-?X(2>XK?rIpU0 zSe8~lUq7t28=YK8Cc^k6fl9G7Jb!{d%RIXrv}j$PMGpuvo9BEQDbM@m%$6!^z0>KC zFivnwCiu}Hv;8dbeVSQ(Tx~^4_u(NCUGBDY=0H6%BtbMV5QG(*TI5^p;?*(Gp8B3N zr&g11%*S9+a8qCizOF5AmNNCoY?OJmu^RQ@`KJNSh~+7JLEQUnPFcM_?}(?m|Lt#_ zu8pyvNF1SJP~q-pP9yQmBklFDn*5vJeu?X0l8Sd2L+U}FQ<@-nv4P65#Z{U{&eZ{5 zcDpgj7e*QZ){NW_zboC^1?XsC(TV7czWFZkS6&n2RkXXfpY@piwv*Cb+WHZhlk&&o zG|i6x<{71xl7kg&VR--pFMB8^^euHuf1yf)7L-_3>v7yaDsAHAH0zpbANnx^+V{mb zS=RLALH2JglSPg>3Oq#3eUMGc<;UQbFHyyUGv4G64gP`Vt9q zFoe--F}CZ+u@A$O2)cCXIzMsfm=8C;7xiH?nm)Kfj3>!u!cTo?_oq#Yu+`AR{?p=e zI!n6j-Rr-A>48Vpw1gz*GB@(D&AIJK>?CXZSwc!|n29|XAz`)vrw+p_gosB?$i67z z4KdvgS{>=%|0btebj<mFbhpB&0drJ0#L+;&2KEKtELhQ49+?V6?TVF00E_Mj&jE35M zUioaxY3bnp+O6oc`h>HOqcqnUfB!qZh?_o#203HGRmDM$3uYe+r=qaa_dfdyJ6 z#>bp2oWg_a196N3_H%@g*5q>vqrLBybz4$2@hvJDC;h|~vBEkW))((D-Hok&S2n93 zmd^9fBLccVAx)PR+6S7WXw4e@0?iy4oAPJBo80FkjO0gc4KEv8yHD(m?gt2tnnw7D zsX`K8d%8l2BEOg`-=v;-r}7hvjWjfy#C@>OoC^aHa*$Jph_cScfU(+h(d8Bv{3UT| zYACi{4rb?BOdM%}*~Fg5eyxls!-98@I^=`*73B4RD_3rPTDU_<}9^15AAd#b# zQu)z@TU6uIqlx4c{#WNeSuu+m}GOU=Fac90ZXgMM3>};skm-s_4ohKtGcpq!v^IUolHL26Q0uQK4v$D?Rnp!Q#O&p8IWR_0&C!Fuc6AdhTDS;98Rf zR#nAkj_sl&1(Wkcg}99RBO%97!o(0nZ8tD6#dOrx9)yrr6x1&JRL6{57M&tPfuxY5 z=qpGlV_Xoy6rQxMN}lh}$P^-EIFjYbVZk>qyEr~JRUO~5GmY|ms*b$d01-m7YRn?j zYW4_)P});PnwucNL;{S-BozXv)b&Uteg*rM---&9$qAUTf+**zZ0cna5O&%c;m8X$ zAtQr(x=euy!UDAh`4A(4cfBl3+<21Sr|k!fOiWO;Q8i$6YN~}%O%@g;%nkP|Ar6G~ zISW0&5gy}#cMFPer%w-)!H}_8CPRdS@LAt!IAg3v0U7xKLJ30-Hilps+m*I`=U||L zP75uVjS`4LX_~HTS$V`}iT5dz@bVAGqdrk?n{B%#gD)N7aloc$claGX zvWYYKvp@6;3IPiVmzA=I$L;OOYOBMVu8xki#(vII2&glJec&TZL_htn+#oQ*Y%tnu<67LQ<%VtdyOb2)Vt-<8H)m*upc~mSU5QH4pdRe5qB0!Bv5gXTX=H@S(XjfNNi2d0S11{g zfh|IQ6JiF`(@KQbqvA(k7I7Eb=o)r84SXDn2KpJngS<6+>Cx?}l^tDqxnMN!h~v;u z-W;Wm13r~+`Usrnm*2gl3kKOJ?6Qh5Dcek5>MAp0t6l_3^VeIo?;OFq&aTV$t5Q(R@PKJ zA%tyKoDoNX{0P;+W&!Kw!*DDIlnaUlT@F%#H$(A}wp`VCn<6oAwfhTyFg96Gw_4jj zGOBrgb1MK-{RB|{=Y)WU02tP#XP0dX7)OX9pulI05V#;(rH)iwMnV8IgiNBM2$P5m zaMm9-)OoH-ldP01izw9}#ArkjCSM@~y+oXR&*|z({VR>A<8GCr zFhfvC&D`ARNo3Y+l@H^h!B<0Pf7(tw22)NpnO@1H|u+i-wn zLxl8Xfq)f<(d_lRKV(Iq(065Qs8AMEcusg8UNjXOZ@pg>WT??i)zN;t5_7?19? zZ4TuWjsn-}gQ?)^ZE(ucBo>hxHDJd}@o)%`u7{$6COXYNs37#-K)F)Sv1&TLTXv?w zvI_L3-qrCaWH}wSH8#xz?o0?$HcjNeJ*U4sUA~u)lqQt6swz6}NR1d{g9I&4WMYPJ z0-!MV0I%d@3Qrcq{u=#cR9LW$WJj#Lds5qK3JDD%7Ch`;h`4!LkyY&R(d4~E7v6-F z_2v-?T#tS4lhjK8h@<$tX47rz#8bmzi7i$Z%O#KL*RPANo!<`^OmsawjYy|_ z{5)a+AGp(v*ekulK+v z26W_tnVpZ9%SWl7=H@tog2t*p$F-_k${CK+nIhzvPPC}T>jg$mnX)vpCq_&np-V~hf9!`@8tBrUUqt&WCpckA9D*|KrM*lH-c@#$ zG8lbXx=7HD=HpUlcop1SIa9LznnOg*fC4xhA>A`dKd=m4b4}PA2GnaChas^um}wis zg}8)Z8k@UV*nfeGqlXPsCdb^&F@rFeMZU&?KluH$35C~SJrTS{0xzfL)EkFsnDSI< zAONPva&2u(6H=X~ZI~%!F>_kBWgY$A%;TA~^WV88U}*LyX5O;flI0X-*#?Lk!nHS@ zwp0E-s+vW-EBY(9tJ{$Q2BmNw??!4lFI|of+Mt9uBS@TXIs%pbNjNBwC@DK_?T7km zBbDpYbqdus&9xuIPM8)gax`f_q$I{RRM+&S=i5w52Bj5w!K&&-RKd1G+F+&gg+}GL z$uJPW(l(}3Q|i$|TTeBu^AtI5FY7!Dj()J4KREM$GTiQ z8*346fy>R*P=d|*S4^-~+Rv?)ZgSKx`Y%*)qf<*4vu(jif)frC4e{RBbI6Wg z1Q#z&oy-jcvc9)yx40|@fnaOQhJOu4JgvJb$^*a zYuX=aS0PejDt3O{hnN^Y$-Tl$PM@5M^zhc6mz!0jqopt;94Kd_?Ry^0Jkth;wUrvZ z*4tBebU>fWCS~ThM$htrz$lK;`&H>3)Rt?z*rD1uS}Z3fUhGIDFhXJx=&N{&_)T)Oi0k$Vj`i z5ffo)j=gS<7Q21#pwacG#u=feaVEy`|5h-bRPgm?yVn%0TIkV=0dV7gaRYdvK(P4T zO%RQHlbSqWE1m)wRlp8=e~a*?I@u{1)B=YD*k1tqAe^PH+x9(m9nJxD}1(; zkhAF8Y`IG2C(r4*QaQ`%3_i2{N%%Teul-C*z!>_3*#VE%d*gVH-8V~6M4wleWYKk&sQ@u!f*OII=?50IIEL%nk?#|FJj&IbZjG;?D$By_6-Zr-Q9=jgCdq^=H(fF z8yHVzia;f;rjIGJ*3r>9>w20F#SmyS9f}zt^@SFSeYZmbgkSH?1Uwn7RTDzoUFaQE z*0?#K`?Wv57{DsAsLtAIT2NF_ZjCFUAT}GKH~qBI6MFWG_*X}%%fyVN@LT;((PB(e4v^^3<^gfc)gxivdnYdZ<`o~ z?SrED!vNOS)nIV=X@G$^1bmhOpJSz~SLxRn@@Odznp_c7U9QkB^GV;?$;h0|Uq^lk`tl z?Rd;~j6i!ws*{nG1OsSjXlz9kCO|&9`t?Ow4H~|uVJ*ABK1g48B;E>EUU2t;ZvB1= z!6fW?wyzDQ;E^e|5)iM*JU7}ZDeu{<17EzcxYz zzx#2;c4x$BzpAR^t>=k2kRVbXwROa-Qd>P|ni^o6`dbMOc)l2!&i$m5gDs^2dwi)>A$TWbM+h+MG@Ad2K=bzYrurNQ7xWW~uUjY{3At`QoOeWoj=~H` z%g7)A6EnmZR8r6jW`thcrvJ1z95q|7AprWdRTXC}Mm>ImQCLeCP+hUw>e%aXvJ#)h z0v}}ZBN8McDMM{pCVk0exHsD_o-9_f%!SqBZb z`LYinI>%n7JCBXIR{_tNbNg?ZYa5q_#}GF?1eYsCOac%8_P zIw#Uuh2Ng9YIZ(D!S0{_o#N0bW(hm4f8|-@Jxh;j zp~Y;5oa&y0>i!)+-lX<@s@kiyq=n_5xhOM2`-<$npB#Kzm+QP}ru$WD7z&~C_5dZV z$md~gWMgGLJ88A4t0Us^fTrDcj`FCNoTa4plZIkJL9VZTuo%>Ibjv4`zvM=GZjWqN zTkVg37Jpvjgkt*eZ0&GP^O{|3-`R3+w7b#)kPa(#h;J$h6?h5A%(4fcx8zKa01^OXp9> ze9|_=#1!miD_?sGkKLn>$A6w*&(A!c^}a#brdM~zk|WXILp8%st;e^Qo~Na19ar;o z?WX-z-_!Ox`bT!?Is`w#YEA0q2tT#yu# zF*0m8>He&ccLd9GN@&Bjbx-jfp5#4>IZmXZIG7CVNy3bTSU2aUT@ei=-7Pr6QqR6# z!~8ENJl3=H&AG6M6GX%#Q>aWinfHT4XByt zXM{)CLMhOJcx5b7sLN?#!p16QP@SjMLrgRA#G(Lh>s+gKZp*|ft!<=W8;pe6Ed;F5 zU{wJw<{x5FL0DGj7-O!|$<$l_Lk-Yh1-vI?F*~J5{5j$frZV)vbVWXsn4ZXe7QeR;1lYY&2czF1n zD~)fO3V8w#)1OZ7?~|3{dPWj2JfX+m!^_>VjYj?Unb7lQXs^S|$;;i_!G%|C`#!Ox zT7JM01Jmni`;TeCM+fORR#9S?aDmzcx;|72xbjIw_41hGVY~);LMo|Y6Wh+dtvxm@ ztcs#XABiV}W3or@P<@AlP#+6<4kCn!Mv2R#Ii*Hak~L6^W^#&diE zM8;<>^UN6tN<0w<-?wk52$mq?sj%pPTZHv^F0-hV3|^~yqA$Gj2Z~vpkJ*b=MOE4w z2}Le=sDQ8tya=jnS#a|wq#F@P z)7CKvQ`AN`6T#G(S6;q)vhioO4AjhQ`_nDB;+{Wy+^F=O)%Bxil{^i^n03F80+_On ztt@}>_Bu9Ec^A=5-R*OeK0!q(E zD9)l53!33lm!EU7}(Kp&N#FDPIvcZ{ zC6YcJa;-nsIHMdnmR22UXc@r+y{{dMj0`M{FhR`=>T(P*F)@_KmX?+{VnEOweLh5L zXv6<-FI}@%`**cY6IA)@(LlwE44uVGay0jhg&Ct`igz#sMTH2NhBH2@hH4pjz_I6a2Z>b=HwdI`un_;c-cFCAOms)9!F%08q&S z@-#Rc{%HgEUWcko`C}zAI6G$|&ljHgfm`rDz*D)LbQ}w1(B=LdjAZ!b{8X*qfLi`OJCir7N-%XqJ=O90Za=0GOocR%^rLOa}Z-Md_P zGw``#Bn-3lb#JM%RsQSSQTNmBgZD%lEF!wOrRB1}CzOrIgzP+hA|19b*K^JNz`#?7 z2C9VqTi+0Jw02ab=(?mBv(%q0)B5h+v8Di^PDw+{61U6#^_cs6KmUz+;S!fURJ1rP zC#%b4s`sHQ_rjnHC=dnS!9}8+a>AAd%WBb&$CQT|wD=4ee05ez5mhcZh5B*H!Wq4? z!yAIp?0hxg4wSB;5p^SSQ%T3K3NS_dT58u9$&84y7Z-@hgb5d(N~+Hm^}mb^|9(K5 z{oC^_(J%RdReq|}m)$*5nu%8E)hk{GdaJR`5MPLhPQifLV|=h>D+1+XTrdJZ1pu;| zi;2c~$eGCWO7K-psYlR4GfRWVWA2w0xCQmO z+78+A2~8xWT%s_bN8FBh5CTefsUfj(!%i19CddgFXPa1MucMPU5u1u{35+R3RllK! zYrgL+hc*>=)RA?4GyK(0HOUN_;LjJYJKvbN_zP3f_*r-yDSp%K&$5u+U!r_W7#+y| zUq+_9K!8W{BaEskv3QZ`9ZVn89<9suvxgem(4?o!{8ygSwQRD0<76eF!{s`o?2q=e zidlr-Bt$(t)5<*;#^FyN=;_-$E?c0d*FWe<<-Tm7rL7I-$U0-E9)yJU%7cl#Q3xPQ6wK*A?p;XnU~H1e6#h@YVZxt+9~<;5}(x z>Ztup`Z=$#pr9b{tKtO?`rXq++6REmd^7=SHv@fX`GE*TQ#==7Ov4|6vs$`eyy9=h zJE9c1QhR`)kSNNvZs+8RU)@W8ivxRKmnH)IpFn+3zYavs$~yC?W`PzyFw#=1=Q-O9 zMIVKpR#3Od|F>nn&YnZ7CDfP9<##{w+0Vofd`_^=a(^O2zw^BqDh3%(WpRJgtU(Bp z8-{?OqxU=YuTcah*8TDSr*#^E^|=MEjHRP!{Nd<6+BQB3uhVlTP7s-%Q7u}go)=m#NJ+`Uc+*N}nw(%5LWP>#LLM?Xj)P2hHm3ULOt)@&jwDtL^q7M4DrN+FhZv zV*IYdP`A~R#mm2+b4Ea|RfG4>8I+b|2@2^8b+9*_e&A|okOiEJCj9iniRSiJ-(|X) zqp$5SlSp1+#qTH@lVrd6Zymb!Q%Y`-K8?r!E{Vp0TKe#dkMO|%^F5EgBS${@AB~km zU5lH4O)~;d|2WI6g|7ZJkrzMEqB3Q9Hq=di4joZ2YO_juDApZ4ERjlt-n|`K-&s&n zGU#Ldes`}$AgiaWy!=}gGS;JpiV6sTatj^*Y3BrR@kuLI8A(p>ay{`uec=Rg#N0=e z!2Ox;SukWjn~>R`?=O?^(rOu%2~3f>h7F8c=@#xv5*t)xKH2?J2DCdpYHsFaEf#ih zc>d43Gpl`me(rD|*a}dPg&O&!)+S?CJqmHa7P2?Gmz?-N-a{0`0tEqHJ(DU>2_=pT-CG@KhqJ5JnQ?fyY zPI|S=`wAnC`9JnMs3`yjUY_m(@3$hexotgm1-}kM4`B@j-|dT$m*CC5VAzAnOtn@; z=*ul`vNVH`1>Bnq|N4?{VDSL?!nHvw5mW*0xa)`|uFVRvvZh)(au9G{cQWsxgYcJ1A0#{mmP%`he?Wm?Y5$ z=lQP3c;^P5LIPmQsL)nnt9(@f44{~V7 zS;%C|;-=D%`KVTX`0WViU)IaGiN;kq`wKTW$CSc1yOfXd87+*wW%#p>^+$@hEfJ*D zbh^KjNjS(R_YHOW(YFe;gti%067$hjrW!PipfD_2LM%8qPB;?s@#)243D{X6heS2= zh;ynch-X$J7I?3(CGXeR;VUCqp@}Xpb}o64cQJiwbnF-f9Kz);cf!(+ED;oc9|cuW zPAY&ie|@)a^*zDpCGP`*8ba{IFjd$@kww8&5U>gxrM4s-h@ya=@n=-gc8Yqrb)#_t zLMX*_kczUraSjYPECHB?ho&HLO*nvgF8`@4%e$k@9f>lN$20G3O-mou!+_WA>p<#L z3niU@RUhUPYl(!CRcsAEQ&mN1DEw5H0Mimugn*^~68g&E$>((Zs6CR&`tkl!<5BSQ zVX;a=5&53^VtR#>6ekBq8RYP0@6kZ=3yAo`W`nG>V%${@`cz}%9AE5Z7!IE@HZr{^ z!qNWw;OJHXnVX!1DRk|iJ}?p}#8_iw?4yDPZaBHJ#!%T|7$!WDg5<}@s$aMoG-2w> zjJzX4Mp3Sl6=0$=QHBE&lW^5>1~suin;s>heHw5?znJS0zk41lk8`4^`B10YG5R>~ zA1h-?Z%*Y^VTP%-l$bB}4;3ETK4&A;&~Yhkjq zJ@+ikM?9)?O3T$-yE!a#aB>Rr&{6%io_C)rGc{0g!&}v;X3*Ba)B?ce11q#lyiUWx zD3hXK=6YJL$tI0No2ET;8++YSqULU4X@6*vP)kFn;L><2IArJrk-F6LJHe&Fr+^oK z=_Rm{bwbrm`-^U#zsJ3{Mhd~f)H`lJulpL7=5UG6pJ2l|;v7l!e%#1OaVB;T-miA44@5E&U^INBT(6-z|Y*r-L|4R7)^R!T{%B zz7a;Ac5*_HB|r!w2Z=e+@`A^)Ua8~m+Pz;IO z_}uwW(j0!-$tegwHBY0fDJa>_v=>D+^L7f_+@BxpPv<_i_R^e=LA`xs+M2nn176N; zjEMrXJzNqRZX~1>!iWaCQ9?EO{4w}1-!aKIrOCO?L)hR8!&Jy4`e;W|sFKZ+aU}3$ zu?_&}j{g(jsi7gGvNgRij*;eC>!OJDBY>6{21NPy&V)8f^jpkw=ikV+&lSFmF(045 zUqKw+&mk>^sk$gnuu5O4iF9Fk^4r`yF}0yeKnnF8?zq*;zYCT_e;g|>NgAUW8JX&y z=kq(zi5lrCHw_oEK0t$m8;-q#cF(*Od@M~~r;A!-P?9(*pUEUD5LM2h^pwJwqUyDm zx|AB1Mg$xp5M6((vWuVbEe|#j-0We3-z9JN;P% zZ3=qrMxpTjT4V3DcsjM0<7xFXB1Pjj`KKxPZr z=-~={J7C1hC=KodtAR48;6j{&;Sh(zMfteNWq!Q)?z&Gey4YJVwk2UIG+3vwj|aO9 z@*R}jO@6e_bqT6I{Eb3rbEn5G@plwTjsM=`m~_96av++k>}?M@o2vu zn=g^y?eQerjeoW0*Xe%23ut-Fp7?B3RC#p5v!NcS0JNQVZB>qqwJ1KFB0>$8hl8fm zR6X{1Sa2crRNl#?^n5OIOeHxSPHIK@O2>M~{mW}*;6v=lv7C$o^xNsa!o_4`{{q!O za4?{O5_Jk$A58>`464?=4*R{k_+S?(U}G6uFz;t|;EOS`xr=DHF-axzQgo$R9g7(H z?yTsdMx;!5zk(W}$XaEQUmu^&M31kT>*4b3z}*AuG1PSzXUU>hiJq|&Kf_wH!%5^Cb|duq$H1ZcJC6CGLu3Aw2n&AB;|3TpVLOf3qGZ&%4IPj=N@mIpPgN zRU?S|x`BsFCf#bR5Q`50m8x$sBq!WTENMz5HHb7+TKMxL z)xN&@-UTAYPFyP5a@sCY;jr}D?N1VY&}(6#XV$r1f4bq3FBl{Tf<@-J4CdVxB*E`2 zR(>1MB6P_rzI)61%1TDBL**6aJV*!yAQ`S4WkcWv-ub((A zmE6R-Qy%8>Sk1<*b<&r{;e?KC z-`ELgPAdCMBO5`*J(8)S^+mnfs@x+&r*7lz=ExDWdBnte7NE&9ZB>`IR@b%70cf`$ zWgD|Sb{NLO*)&lCn40Q#R5BtJ(QfY&%zY1XeOG?x_~v+ruTHGrrkpGnCXXDS{I&(F zaU_nzZ-2}+5$}(pDnw>xvqJt17%LBnJ`1iyE9&f*bk^B%H_kU21(?$=olt+Gn$ptr z(RFx-*9AjVh`Iifjku5|;x=dyLIv`9=|-EmT+sC)*e~pbW)?Qi^je`_?RWdPoBJKj zt?t$hp_@Ek1PH1B+x21HqFxgz+wh%IzR=TQIYIZe3sqiSNu>&#jAx0lJn}c$AMdi% zt9iLrD{&$i85JXUI&AAi!DyshB2EZENK@hg#xnO;Ow*>{N7mUQ(O63>_C*z0F_^<} zuBmK^OXX1B&xfsc{P+FR;~NJLn{!L)YtAqBGtBy(oz2udbsq@86b|ANL((*~#>1Eh z=!9*uOnN1=J!`t_+`gB;#T93Gn3$^c-}C2SRaF?H)9|#?@MKIFBrPz13e=*BymIr6 zv&aw)M1lcSHYmUOEDeNjjLXk>9qg@OCv3a1JTLcF?=%!kEvj)|VsGu7_s@b}BGLaE zo$aKMps)>Ce=H9<2YE)1Ws3i7${`x-c=5VBzUMSQ7lG@e!e>IBo_-JQosaU-Vxx5l ziv}n}!Z0OqU^wF#unEnmQrO$hnrE~&@)xHMHO0y7{mzVkPV-?rU$q*fIzDgEbu`_8 z^2>c!=P@ziLSV&UoJIN+I>B+oE{{t_y`z6i2tAa@|2i&qDD=OE)Yj;+7uy5|1U%u} zU+Fe0Tf1n`D98vIxRambQ=p0g{M=$uvT>wg%8efm-Sk#>))H}0`iuWH?K?BaD^}yd zf*Gn}>M1c1`cjZ2Lc%bU%M6`PUnY8dr1TUxr$=H+z|abJx`|sa!#7gPwMaH_o+VJ-82 z*68>ol|L5@czJX*d6#jHCEnhQ4^%_2`s^Xd3M%#7Yf*7(x?iGq7ibGFOho{4vHB3v zAWVJmWLpFg60#bdyr?!>i46;@5=@g|`;{;Tqo~3cdWoigg}ZVE<=guFI~6_Y3KIyTMiSAJlnU_0&|lRqn;K%5UuD?C4#3nSw!M0P4gLYlfMare;Wx17f`7g<5k)y}x*S&%)ok>fOH0JbG5S!P0yK z`vy_<86wUd*ah6Qr?Ps=JKWqc+|BsDsH70dA4U0%njtbP&x(`itIfN2)Ax#uO^qwa zG?`W7G@IBL_(!rku&TrV5m7H;!;}W2Z>t+ElP8i8VE>El2b+Ykp@)k}D~XlOBZ!tg z=1w+UmM`o0p4k`EwW!W%)fqI#!bKY+Y$JOR8{a3YB;um}N-V_PxY^o}mMdIot4zS1 z1^-|?$W!hcoMkM}R8$i)^u#-m$4g+Z;huG}Pq1_3ZZ1%j2O_t3-8&_SDzEB7yiL+|s`eDkDuE?@U!6kWgSmG}PR~3VdCTa^z}-t+c+U5@; zTPB74W2Ef2IO{pFUbm?xV}mI{-VC`qdf=cKti>7dNyNF#{9fJouUGnLq zpChX(gMO-vm(7a!e*&rqRreEqo4r!k{VC2QqU3SzbY^xvXK*D8{IG3HNx;Q8ukdIeukw}gPA^!Q#r|$mS-?wes z{?XE9E%RD;>2mtKC+0Sokv5ST2mmlQ06;U#vnt;B^C+WV+q4ZED=NJG`d)Zlr;GY- zU;oRJS05eGMKr5Wh*5!fK-im8JMr66N%M9gARt26^x2S#X$T2**qMEH7VrCM$JTzQ zcL8Cf>Nts$RGPVSUCEhUrtEd;1`&ud%pinJ3IHbJf&<2;X&|m8?oK6=QvrpL*|TTO zp7VHFS$TGLvj^|HC!S!&iS)&A0Ip`!{5Hy)_ubL`vrl$Bw=^RoXWR=<-kM}qg-pF| zpW&^$4_Ncjt6zWn*|08YNmU@Y-Nz>psrNjM?yyRiZ{)#o5^8JR;g5c+zVMY+MR@})6C5fbINKUffeb*f;SFJv8 z*w7@0EuJh6(Iw`rmg@Jryd83rj<_qNBGjh2(Zc-kl3p!UmV5Wp9(VE;?q=;uiTnOH zmR~lYTaS*Zn&3$U4H|!A#o)^yzUS_z9==i644#!6#3}%?b5jK{6efg81ww+epkWiZ zMM_pOvIi-{RBxfQz5VLDA*5m=CSBaQc)^we7Y-tma{-(I1t1gv1Rw#hzpUx=s7oX# z4SOq$?{}GJx2!L0g%F}yX4;h##tF{i%o2l2$~{|m6-O5J>(=78f~s5I*w?AKy>Exw zfgmLk$w|rgJ3ZTrga4j#TBjB%M|_fXTM8pzc4?O#-HPdwm-_OQ)-NnCUa-12Y6Xcz za*}aQYul?gwC?MsBoavikrE@3 zND_#Y7>PuZK%~S-B$5OoB}O8VBoHYv5{V>%NQse1Bnd=Hj6@?%%un%~ziO zb<3vYl$0^!uN^)9>SNh00B}{7r=@4cS^4r&eg3!XhlKV=A~|XBdfm@HG2_=Q>j_cL z?%DUosduNPXGSe-u$8;2@`kG}h^$uYn;6}SDJw00HMqcvP`zvNX@$%OzKK*vm?$6C}Rl2e3_mn>@DqUGz0zIgfVk8^TbF8k=cScMI?+P`I<-?AUV zKebv#mza;<|IesPt{6CUq^fGUEn3|&{r;89KTg1%)`zFcb&Rhlk(?rI*}VR|3&!X+ zo89ghdGYw|zyA`eu)$XQ_U>-ezH>d-iY_rftzX-3(6I2!_8q&-d;V?f*i+?tp-w81dETAJzXrB@#&_2MhLPH*aYjr>1A@ z-Lo@RAw+x)qgFVuZ+Dw^o$9$(%z;v~oEDKK;p8cAzV>YY!RNib`0L>#FL~>=XTueW ziwpkw@_TpQH|OcO_t#Un@bwq2yYcpgOTO+u`20n0zGxNx=k@0YpL^k3@2|Z2x~czq zdKOd<=fXx;^i~U=?{QB5R~CM{Yx{5Y+@VAwsfFL?(RG`3tg4#VBPc zeFvONDXpjQ$91b)p4OHS(!2kVAJ?t63OD@lO|O1~6h-Mj_`IiHTvYd>QCn^N@w=ht zU8Jh&Wmiv$+Es}}5)~l?t`5745F!M}Dr~UT{(ZX#4juXWJ74_!|CV*>+T)ey9;?+V z`ixR`PHsu@!Ms*&te4a@zW;93z@Z}nz~gb-?G6CYblvNz3O8{&qXd_!Tj;KGT{*hH zb&N5w4ys(0s#;(8?x?NYRh7vpX#kL(5%0v4L?QuzBxj0g8rGMNQPbgY#wu*E)q;1v zu-;V^W$@4uuRi}cz|6>2(Iuu^k3K(qyDIOh>#diYHhll#|Ndi1j59eU5b!%3Nugjc zDY?-xtCEtF|NWm&6{W^?lbk8kG?dsX6SY-pT868#A|o@)Egi!WNn>c4*Tz**W;sKA zeqYO0ZDJKR*eVjnIOnxTKhXzD7hihi(j^PO{rU^T2<_ay_4SvY96MpM^;VB_`hENL z7nIWV->>d@PXETR4*F&D2FBRBZ&%)a^Mpe^!^B-x zSx>7z{fBz}R{<3TLb7B=X*y{G1C#?Ve z8^)MnguY(!Nwe(cwOU1&n4H|ayB~P`!~eZK`Lbd2XWu*Sifac9Ip2C~^38XwS@rp( z@#n7m@{{XtzO%9SHu>i1Z~pt)iDL(U^5HwTOn=}|;f=R{{NXzj#}0n??U!%=+aW8f zSDyiYy7rQKT3vJfU$$@iW!eqnI(9y@vE7hJPG!y?HFn$9&DURX{`FU!ziIt<7hQT~ ztU`#GQHomOZx24cbn(K8*ioEfbBN* zcy~r3k(_MU?Dj5ao}H1FipyO7FGL7UxvRE;Lgdj*Cq@=rBy1ToP?oR3E&>hm!-6h@K-Q6wyZQl3ZA9sw;!2w*H zeb!zz=X_#^%E^c#A>bfDKtLdgiwP+}KzslLFG)BUpoMlDLKye~Z!4zm00Hso%lqpC zL~1$~&}YT# zE2yaaADYlV=4?y+di`|i6}Qc{(l4V@LYWMMXkZ-woL{TZ(N^DE@nCd`MX@gHXv zjDsuFFE6N!CiaMNpJk3W=Zy+Vnv2(pQ{9ifN?IgwoR2@D<8$OizT9@heT4M=@j0TG z;Ee#E(OtZmv)8V4gu-0-+h@3s{ANiU@vW;=EZVE^;9Q-KSFlWCF5AY zTYDInRImjIe*q=f4oz`QUon?(bC=gUXdaHr7%<)|w&oWe#6bFPl=h$2Zq}<#mHY&& z6jpil%hvgqQ{;?J16O=h27Sx${3M2hihl(!yBt(P-DEX|4)@Vdv5fmf#r>AMY0$bN zlV`Dgn+&mFfK~QfYWRzio0!5iR9lYgWf6kuXnzcP!UAYnE(e)#kgbNh0vgd?qDBM9WrC%n@`hIOBm&4lPT+`?NW;&<@Nuh`z z)3{%T{odRLy*1A=&gW|<^+_ti{5HSn8F4DiJ7*a|*=XK8Tw$%J%JTAvcELQq?N6yO zqI*+!o*+1%PjcDZqiRmC9mz(sp0b&AX$g+aw0Bh#ZPZ z7u@%q!(?1MQuw@OBhi2hu5FS2>73 z&QmH`w^y5IYq`Gn3O``ko@PO@WF6^WDYs$G@?p2hnDp)mymI)UfGQ-$ zZ%nOQ82!g6zLJnQ<5ykv4iQUrv{k%4I%V;UCUj`_yuI=wH>NY7jEi2osXt#O)O{T! z<7%WTq$)*oQzv1yx9hlld`}fK;sCL2M@h9&KDgH}y(5B+1hb)nUGS8ER zXQLIeLD%SpL{DPY9FcAsDKCa&R@V<}W*lc!E_CgT8V9z3zD@(ZU&(G41UswVGXspvoow ze3yMJh>k4?^0h2nTQ5Oxrb{$yf+XRydP6CX2SdjKIOzka10Bx}3=Q0`$Pg5vlM7+@{sngOD%=p@ zk$)(%t^d?>k8y`K@733s@qQ^EyZqvf2nldR7Y;6ca--L1HX%#Wox-0rHWtegYJc$d z$Ys>Ala~nJ9iuBZy=pDnfiTt3YwLI6>?}Rp&!y#SlOfFYLU-BE^Dq6)6vU>9LMBnu zw5?SlYL`v`J0NCtfs!ga{+4EXx74@kbXb?qjnZ13EpG8gay@2rXnMwm`M?1rA4EB~ ziy|;Nek8$=01@~sa|+PQ_ASJUM031h>q7R0XwIKflu>(%uK!7W2# zTjiwd89p}p!zuFbI+>$wY{=XFZNl7dclTI+YK%xJ9iCK)|Ds;StH+P~_MM)7<{j6A zdhn);7Oz;0<_g#2CMkS_eVD=odv%cGhX$H|%u9RQk&-6JoVD*khEd_+aXVJZbC$(C z#o651J}G-8vlrXsK3=$KA0YBk9bO#FL>s3*H`K-BjpX})ky~F!B5y{e@{4VG8BRR{ z^%UOH_x!Mv9{BdTAG9Y*#u9*FDVr#|yt0I#aB-udS2mwNpLo@Jw-Fe*VvN$-%$a^bNqx$_`Ska5+j`E8_L*@gSvMMi52x~BA#cr!y#22%R}?!#yhFK}NP~YC>_Ajn z`C!Yo#teseQ>@Te-_1#770+r&ekHDt^zc#2|E%|_J+25o+sIU?<2HtqQ z1jD(0nTPDko?C4t1P5QtlzAnydXSO(Hn3H!q>k^DRR23#zQyXod79KDzQ6Due0~g* z(v!=56g%)lMayR4NamG)nMI~EPPlP1}ZRoeJ@Y&Cel97BRFealiD{QmcfLN0Je zRk=Km_R9?=g7cfDoohNP;@+R@a$q`g&P<=RdP?qpW?eMH>aI_frqx?fgXidyVdDzN zly5hVHJ|r&y*B(zcHxV;HO#9YnE%-qf!n+9YADa?Q^~TeKoVwhnd;#vdL`5*VjYe- zL?b&G@z;wvvkMYe$#n;xx1U5O+9Vl&S3UiJxAAPmQ@*`?jcr?THimg|ch1>couwIj zU6(}uf_av!ogS#3FF|v>nE{rlW!SSx4h==i268QAtDC z(LA`1>0D*N3Yp14a_ral0_OaWs%Bi?Jx{^`6i6U=w+)^`ZC-yO!t6 z3$l)v4@Xet!qTCKzk4(Zy!5RB6~_;)Lhs0GQ%C=v2Q{#t!<5x*D)wu;wC?0>7enNV z@Myj&+ce57lr7_@z0pC%LiVGfmkC@=H)DzQ-&f2jqWAh8vwg3R`ggl^C#T^!IIxk& z9C&v$vpSfeYlyVYE3OJi$sG}yW0_o9_w36$b7rt+Vs2NNCsaM?GQRbc?uGl<1I4~hMCw8x% z_0*g0+tOTX(!N%yXlIkOlN*S~!`a5s`#h+ZthL_aEsHFX%lV`SZ8>{%+QP!^Xdjij zwCK4+0$Hxn!}ypQMfs{q{Ebw23K>1?gESrLX$X(mFtMJB1|5xq5>a(dcd5I)QO27- zhPq8p>;ybG7eOu>Bmd4COPK#>tzPJPz#v+1DO2_XcjOexotLXKWL!{P@RRr5Fx`_r zrb32p8@xJh0ok#%+SW9KhQZ`v_eC@Q2Row-kfZ=kSZ6>Ud1Sdw%0YF+_~ znm12NGW50&;{GB399NKWW2uQH5yXBUNK3Dg&R;Ce-Gn++0Y{^7ck(pHjz)$od3SQ@ zMkbhBIuLr8uXa9;nZLk=-m8}3fCuJom@4#^H1kHlKuJM_2_suC%JQ}C$~`xK@H%Yl z^9B)cKmL2FZ%^qqSB>UBNDfc8tCYF^nT*Qlyy(Ph~_`FyF7@- z?T1L`4-$&kYA5B24Npx$t-4&lhqou>hUu{JQy~RMtnM7Ra2fu&w51(iBHtgj&U)27 zm(#K>sgAb+Ls9r#4C-4yVwbtwm}q3vG(a66iO{&V?Uabb5n`#K&^Y~@oI90fl785( z{bm#W2RkxnfC#=VoSr+(FmvMy`I{6GJrFZ2k=Ajg3Hp=7syZw#?a9L-Qt* z7+ljVbpv$z?ej;VSC*e{Gn7#%nJ0AS;_o=>!wR>d;4etjl6C-VeKTbcaQhGHB1d_@ z0B)BMcnjn^q5}RKAN<}FaP{8gyAe+T=JB|*?M7mo$QFd1nx1aj&-5Utq~xT6j);u3 zigTo-q8c0<>)W(t#IzGa-`x6kQ*+xdo4mNHsehf2IEh{i#Ny zOv~rxmV}JVVU%TFPFZ;u#i3`8O77S&?#|ueFAf&NcLFye&<$v&DvtAK1 zH>V5@4Ye|G;=Y*>gn0iJSqh$;)3#Xtm+5h~`Mxx6Zf+yV4F1N$i5ZDepwc&HquZm| zlZ7h(^mM!e*(_QSc;Daf&&v}aYR7;Z>yn-xAp`^jIrRKR_LP*AQtg(+g9B4aN=htd z)6Xr=r&r@AM=-<<%hLAtjK;>sWQfBp?8nTS5K)Ii6XnQ5Tk+ zoc#S~tW`Gq(L$RC8?f+XRI25rs}-8lSd2z+H9yA-G#jiVuPn<~Y+5g2NJ&Y#pH6C4 z?E3MAgoNa@wMV(mTf1)#r^O{Ct~5WD8INc3NM&-ToOisf*-RqhbH*>${G6_{nEyJj z{c>Jrwf%{%HCjCGyWO-j+hn`f6RTOAp2}|MQntREp`js%>%}*Dd3hxzC3?NT5O-&* zR3ZqSbeYXAn#w!pdA9dMiJBl_|HmgL!bB>nsE8ODotFF}CMJG?5*0**@n3gx$f>NZ zW^8som9Vs=E-ETQ|N8Z@J1jgrG%Sph1|vBoMZ7->|0R4}*XtI;%*@QYcT!24S^4a8 zyT8VEQ^1p#fbaPNYPvw$a5R{>y^nORXKCG>=Z1cRB+a7$fQPKWtP zSG}0JA0xkDV(#Djswydc#>8})f{qLi-(ILPeD%$4r)$=3aaJpvn^rNqUFEx76`-MT zDU`{mRHGhAVG1rSrA9+T8yFecX}ez|W@L;7qGzTO_Vx9(dW{K^u(0q4D0ARQH8nM% zqob!Qt=82?aycIS1*ZKk5J%j0Vnma<-LA~cYV=+T30c!d=~Oivk)eSQ_p6`4Cp}5m zJ4Kf71wFW%-_4DK!1Lk*uptWh#(*=E!ea52HYptFg~9#iAdc2lMg|#JWnQ2SSYAfs zA#|UGJn^_>4u|ioX^}5a_YQ9__fOr;F6V1|*1;d3U?47*EGh_x88NjT@W8myV)au#=FrfQ@9O8D5JfR6f$KOVDGe?x2NSxCT%&l z$fnh~<~W-UNYb?hbZ_d7rE^$Kx%_7oARhONL9(oiPFRA8d`Zm5`*T@qYwN#|JHQ?t z939P9ER+EbOuh71{6g8Ru~ZfdF-ghoHIH-SgNf|d$|A)=1z=wRn;2Mk?w6;xR_p7t zmUDX`%16h=P4CV110UnBflo$xudJ#qY;2sb>lT5-5;in66h~`eY)pE+KfXVwX=BCs z416~RqLY$}N`3R0#&Tb-NTk71ty!(jdS*Y!BZ6(+^SajYM(=bY`sBnCh@t=X(rjEG z4-0#NAjZrejyVGDcb!t--YM{nUDvcxuiWAg9 zG9bvJ*O35M_$8`?R$E;94XQ#?(cUv3fwm@9)I2YFjsDX0Ef2hpHNk}FbOLYg?9iIEh3Q2^ST6P}F zgCJ&SXCb`rmG941(;{2!<8b|T^hb;@KS&s^kp)-H{*yBzxaXUykwzDN87=(i*Rby0 zGV8T<+OQ5|S_QdSZ$-D0rY|`9rLO*F}Zvdy1!R^XuCN4b&evAMQS@d+G%*QfQ}g;Uxa_Y9vb=cM7$U;^4MOICXQF0t=YSfRaW zbM|g3rN0X#F%g=bi0`^SL3QPE_I?v57a@)%A#`gSh*f%ea8+B~PsQhgTW`kb55vgG zg&T{wg6j>OB~;%EUZEViP3`Rz0+77JaewgVcQ@)r( zMDx3jYYr8%ND%$=B?byM>guS3!0tef7dVoHKs-x7TjfIgYI4)R*u(^`=y>%7^Su&S z%vtVDirVB#CMBMV(mi>`FIfs18U1!|`|wrN)txiw#xVjOJ^+7xIIo~IA~lET#N*ze zs5HQRs5?0^$fFy^C`;B6z4K5Jgru!Js*dM$Gd6ME`y_h6)Cemf&9eR7xqllPj7b7- zgk3(+^eZr{VjnzSZtz&+uUW<(uuEuaPBfY7jT+X)VY@*NgeDx3+!VgoOBW*(XNbSs zm-=-}FP91mTaBmnml1dzzvgwGqJiTTlceL`DvTh+rSn}@8Kbyg@kx*+Ewts?-oX9d z8hss&08GjYa=+WTXm%pUW!0Nwjy5Jq`XnCvS&^pGtbto*r`SA1)@hrjWMfJ5=_5Ik zI*fSPi}&sQm9CvV4Y)TVN6f?m--6A04S6kEM16h7=6fBfewxVB zb#KW*Fy9sxCDD|rP*S>-<@s735{^*e2dGM?GpW~(S7ARHSP+VWb}A%4E>Um}yM};} z+Q<3T1!6ffvHpaCOTk#ZlK}pB)uVqW(`{u6c+&WMum6Zub-h@CB824ocSilLkM%a| zYnIPJqOPuuZ`Xh1a|POE@P59+&C$s?ri;0aWOeun246MprB)?N!CYO1iAzcn5fX-l zA!z=!yD??p@hH%zKd|LoUGco0MMqbmKWu$MZomCHR!m8>wJi^W(x<2nKRavM4+sM?X;*(7 zl$BLggKz$BocNp?JqMHr1Rtj=<2bETNtD>myAF)IFy8ZdXs~FO`kXA*1Ous?$$Ev| z`Fw3Olg9&#%b9w+FVb+m-79j7&1pvVzNDfZ;Sk3z9beSpg(!YoXl}^ottCAof|i6t zNKsk2n>6W$gnLCwOA9@Nv+kNI>gtM8B=QL5$Nm@vR%Bg6fv)3Z;7CSGUT+++EdPhc z3)?Naa%}>w=Y767=M4x3UIGm#7I{@IUq(wTnG%fR5(dlVpxc-G4+B`7@wp5PdJV+z zlG?W4<3%N@Q5!^!CrFF<6N0D()x|Nc`5t_S`;BbZ{rv}qOZK+G&h`KLmEZmi>%MmR zqwo&kyR7gF34Qz;9>{gp=ue?oKyTQG=+indAZ9X}Dx5^CeX!ER^a+#J(*6zy8ykCy z1t>GLJWlIKNJwmfdd09#BaqYb{AdWUaZRMxm8NlI-TaV=MSENGUDIevJI5U zAD}R{TxpB}YIO#uqnYnC;GnFu7L&)DLoEQ{?CkEo2jJJ6LOyuO4eBcHoSd9g9)UV; zV1FNX;5W3cNVqj62#2fGIPB~Dq}SFuOC{6yyuA#>5M_E^VF2#}$|X_=82=a=P3J&v zj#yIojGWJlHFr&apgv)usVWC*C9|FsF72n zbRMd{$2BL~(!GmE&m9c@rn*b_U=n^ieGG!OmQ<>~+iy=@$fh`daFR#d3wSxwTe)%1 z+ZyVW=R|?}3LYLla*T|GL{3KsL@(&Im+})R@>T#yiO1t!JGf}kJwB>kV>(IH2POc^ z6dL}!*!-Xp$}Ur}J6WjNvmGY;od0ejBLq2b9=72BqxlxOQd zNy^HaI5VS!@aa>pp7+_GesX25XBXE67x*n&ZY=(+(7WF2`r1+!ghDX3 zpXIZ5@cc8&tFKbOJJnG%V?Y^Wh{ev%4v)h=AT|~az?$UL)acfEHI|*Nd3hgy#m2^} z&?L8LSq}|UK}L;?jIB7$D@Sf2<1Zz_613J$y0x@%?j*pT{sRkEFBgpsLwze11#9$X zlOIHN`1QOIm)~=usmIbAnLx@p-H=b}&}qOiB7C&6cB|d7rus$Z!x!Cq?epzi4BDDb zDSp{)J0SrPG#L)^;$&69>8FY23ifq=Sr7uEXC#n(2zIuPw9eeU64yID8dHjrtJVaFD zLdMJ@XJ(3|rJ4#L%xs>B1>3vi)YPHEEbpNl;qZg$LX(Y> zjiAPSwjKi7{$W>e;?Pk^b(uabQp=Vf9KEW7^Lv1CR?^(&@|4AnC;?OFz(u=>&8FaS z0F@FMzxsZ1@qfJlT~&6(Lw3X6wv)nGqEV&F=8}n@eYD)*8WMh&P1eN(I^^u2eKqv+ZL)gngkjFYSK1rF$W(^GV*b+?*4l*(_qW?LTUa$($PeD#@dgno& zh3k!ig7R~&RDE=hjQy4wSQH8}cQMJSMp9}5G;Q#^s|@p7pRb+< zs-=Vi0y!LB!*wdQx58U$oKIy~Ef<0oEe+1s46Ix2v<`MTX#I(X*;UJOY%dL#BJm|V z_+CQ&$9Y6&5@`mIVU-)!Ws3T{g+&a@wi^Ed^cpwh-}c^c@x^+ij9$NjVgNSCR9u-J zwv^#8Ivss0;Jd~LIq_+?kUk~|3FgadD2(#yyuwH}WiE12eMQ3Z(`7Au><#(y zJpv#zM$s{oCdxEnH0w`4C*&+&$;Qwwwu~npXTzg?vaqmuhVucDh+sy!%PnwKwj5 z@uR>q=rR9&9PMp96;|6aRKIES$L$OFG%RSVq6UJ{Zg$+sPXg`tV*b2-xi2}KEy2v- zaxrB*YxfFXYQoV_|2AGPRBdtg-VqOjKy!M@-+tE{JLUj zI2SmgQ8elTN3whj^wiXPRXW0@Zg6A2b|+&qJ_^czJAd;)>S%jHGs5l~wLOr7KAywp zub7TmWrG%sK*byqAO8y7AvK)K@r%8jP-7-*{5yd?W% zK;b)b=DCOES}XpE9g>(h6cR;E*V&znC!Ny3RLOvJ+dpOD{`Z%ZTB9}&Ao~Csj|q#V zmwBn6(soWU<>7~L>(2@`rC9g6#|IJ(VQ-yUSL5wmNfYo| ztTrxuOCU}ym}+tHsIF-V_Ec4NAORD|ZeH#F`4OgKhok`45n z0o(^M=>!e{`ZZd8IDR-g-$!Syn!*cadd8mn66}qOa zoCxkTtxhTk_Vlu$emY?ja4)VCxK@`_zJvR80)WPb`Ywrw@xVo~(pDY0ZbkZz-E}`& zwa5K_r>)0)1lpG+-YEdTXzKrx+y6iG|6hJ!!;>_RY{bFA0hp6vx?+Rsni_0ZPf^zQ zu4?7ncJ}sSlUzydRJ9($|9nP5sxUV!)cDxc#E%g&s@cstuY-_JgoqV#CmfUQL^6jL z$X|ik_D)1Mq)%Ag4p*@=d!|CQoPUEZryFqa#!_-F93Q=pl0FGt3vJQHkl;dTcZDsX zVy$*MXT?JfKF|ip_M{SSZ)|hH-m_uibq+9bl#k)9buW28blcvqZLGjP0do>e<1rj$ zj!zW12o&O5zhB6Edwa{)evz@V-UajzPSHoc6YtfJR>iHz!T#&ddu-3wS#LM}>h+fD zar5I@d>zt8))Xow2_3Ju6@z=xZC5c6WCpVUmOPmr{GfF|+D5 z=qM?-%3ID1hTH#U2ImHCJtJt*(&>LC z<}C|a8s$nWbWlSWEO%D30uABI0ACU%C$677d$@>0LPPm|!Z1hIJ6U zqdaye(&>%?bXzw-_Ni4FKvSud!WFd+C(>-+cf9euz20{m0{m9)g+)bM;{BQj-Ns7C z+l!5L<7NKAp8Z z{M!aYtq20s-fhav==skUsMN}$rvY{6I}pqJj2JH$48c`S$0|MxfGpwqZ!;J`@r1m* znV7nsmjQi@|iK9G1K;AHzFV~KbkFWeW4l0nz7`h(k z8wd7xFFEn&q3snX#RSCz4Wag9hn04OQWad`z=QzJ2$K5nJ`)Ey1yf<0iQIYh==?p* zCS_?u)m!~U3qC!Wn1k3@DSHEEicp3d@pGy5@MisC=U9u?u{r$Zi}W4V9I~9>zyF?l zQ_|5D=H-$66@C{BU=Xo@rhBe6xBU!OK$xGdQ==FIM4V;omPkN4%XB{~GTGJ!RI`yx zp5^n*$J+{@)dKshV$LG)q^Z&SF-&C%C(Cpdh+qWR_c5Nj&ECD$QHFhPO73G@P5`Kv z<`pc7+nZCv|ST3q~P8#v!AjiA=L@4!vLZ$@-b;wznUYq`7|c@_4%qC}XeZ zDkUsC7G$!SQow3J4Jl*+x{QLB)(B8}Up#m^o~<-V@AAs4Y33ADn$)QO=XU+x zZGLG+={zf#KhGai;|Hm#{#X8hvam-zQt%dLn%}A`!)0yoxS~S_*dWd=8RL9!>43h( zq?g#{c&MO7i}{|n@i`qYf{{Sn$*0Q=4V3HaFJ~@55j^~g{RV8HrJUpQrhO1lCZ{>+ zOQ$l2dYm;Cs+VjV?I3@3W?XTcmTtWs!K+T4Is{j&K#@&F#Y?Jw)qW(J2nDW3&kBE~AbZ>fOMs8{OohhMb;LA+9< z3=zbQB_8|lY5na#NHvG~tmDo5^%Cs!9t{C%WAInyad}JByO;z2<$G<@N@thGP%?v| zTD4K=dd?#NOnL!5=-2Y;UaTbTCW_BLD6hvGcn&1r4K0Bq-jjx<1zo<8P661lBSv1= zYM&ng4QuY__ckVt7;$=pd#YCrAFnv*;Dh&JuR;?YvgU733p zOK5qLST|r=2(!TC`X;k~k_k@3NyD$WpujCwR&+O#6U-=U4ozOp+lu)8h zQPxk69ZlL4L*!&;O%xT#P}%rJ6{!g_ZqQN3C1+?z!u{@K5J=)ZbQ0g#Wt-gkV5Ab+ zDX&}<0E@>mk3Ow9!lb^}zxEBqyXCt$5L3WNV~h|Mnr!Y?rTo@oqW!qUi8GfmDQiwn zH$xhdQoQQ6okyr_gutv40yu$qn6U~TH8~QMT)|b$4GRN*)0|z{7^D@O(brCa)K)qn zD_vkH0gEooan3nu2)q+N2w9&G) z2$?L=>J*YNXPu3JJPQhGIfjz!oPt$Jr%BxxT+9zY?DR*rQid=bGuoqlwW+{QVY=ITQH4X|R|~BL2YnZeU8Ktrz3k zNSJsYMLN&bCbD#qLO zOlkt=vQ{5M&$bUWL%+lRDr$8(YUCu?rwCOZr)l=Gn zo6irdoqIQj_$ivYJ(vD)yphBk8JNLCQ)ZF}A;nF1mglZl-(3jcWv0d{;-v-+tBQpl z<0_3J#|G>vR$(Es91lx6WZ02_JVVv(FWwMyd7IUPdrRR=NA;T>Jcw6?|HIB2tgv< zeS9mgs34tJx?$&5bTzY~$U;Qab>Zfvq<%^s7EmDIX$ce4tkZS$pO2SzgGjzby*XwM zIyw@#`&!Dctn4{vUVozbBZoASb`UDs7+>L&mYTB*uV~5Ft?0X)gM9Zjy2yY=xRHTx zzDLS-E!@CP>Y_2}>Ov%UhZbgtHfsKui{_)kDq(GXMrV5N3K)J^V=^*E|N4@7qi@Dj zp)@oEU)WMaxWzxmVL=00(Gd1w*;Ok@h4 z&^cpbhdY}1{k=U#+l{}`II_T=klAH-?28Xxw)nYRMQS;!8PRXnYb77;Pjmr-a9Z!A>uoJ@py2- zq3vRuT8a7J!(KgBv{hQ1hUM_GrO>VDiw9;Sbs}0`gqpn7B9wQ7$TRG4EBXQyogM@^V%A6j{QH^Ni z00{vE#%x#)-n-Uka3t)cM}yBjAOxz~2??3ds|n_W7gF4ZqYa-6m4!xftIz(h5&Gv{ zg7HhvxdU=7CtlpVGv%6M|He6#soc)2;+OBfm@wzc`|F^Hh2tM=~S0*`j| zhf#(`FdBw3f1wz3^`c~%MYd$cu7Q(?LP_w+Gfu#BTkfb+V)-a{@~ zSSZjfLK_01R#jCQ(1lJ<@OJcYe)W<)6zSw~h zJh&j6(@RJ=l>x_5tU7{UF~%q~6^G0^DQV!s*-;A5UtWg25VtfhF97)Wl>)(c!!u{o z22kxyuPGYG700T!oQw`Ux#NuXQcVLHc!&p4n#0x6C^y_X9w>d?i`lw1@N7l#@dQ;KSXw@?y$1kNW~(NLN?(-(}Lp0NW7& zF!BI3MqRS#^}gV$h@f7t6B4k%JkF=IR-ni8yEHA`*{#c{BR;tp&V zk+?li(RCV+SV0{pl=kjgQcnTs2seyhk|Lx@X$5zNm8YSM1xULF`}p?8`G_e zt(+ahVgf3|%`lxw!;ClzarT#OI(7lqNxp7}H#OjH^8iGl-f=TVt$MA za+;G^T?e#oa0EVA;ycy_#4eMOWYlO8U~>M-_=<~*zq?7wG#eo68gBCo3*(}r|JIE2 z4g*C!hvUI#!5~C4=aR(&(_~pMl?t6vz$r8^IH(Uy-s?561T+mRT{A_B9QHeKfZI(E z2u!c8WR&kqPzkKon{z8*mD#=QCqNOOGwhG5((i@=kOQ`L)9zP*4q61fVt~<4_itiz z=l@QBIn_9T93at6$(`^eyz27WQo~z}hrgZy^>`w!wnT^bOXGR_lYqjKU;S>L3mWr4 z0?E<*)cggJc=;`RI9gHh$X}I2kp)6nc?FC|H6#uZe&i&6G8UePd*8k3i-5X*z@=Z` zGuFt$#yhKtdvYzWqTRV9xcqQHT3T9hObbCXE{3!BJT0r%fESX2 zipl~#F(IM%XtpFYJiL3;_T7?JZ?(J!ZZH{r=k6e{-h~#x>japFu6n-6Mgwnt*KAEp zzFW+flX7yV0+Kll5>8LKc1!9_;QZT~7O#^&EDDH(k}~Z5PXK^iYxB_5x&yq8jDQ2v zy7}!>Ly#e*mQ5%fC=4l}3YTn_WD@+j96wE@+l@yM)wox*Y7+L|#ht!P4#VB6TU z-hJrcmp+ZmIhYV{-i8rBeH8XIqTY5#*^QE{*zLOG8C3KV)8}j^6OEhVO^mPo7`xPu zhD*Tj8UP>8k)kxslALh2Zv-_47$yM)8wLe*lBHc#ydDm7_Hy!<%!8Psf47pZzJ1t8lm27xYPvY16y*M$#x$ zIX8=9Cbe+>9a#`T>jwL}y6d9EoJJc%3&+NgVmIldl7>Wvn3(SUC_k7W zE}~2=$Tq`)p@cGGEk|JUG)hSA+sn!@4nj!);rGOb1ebRh-*IQ(q2L`%w>i z@5+1pRPpcBjSXQIr7vI3zmYxrK>4qgcjAXYA4%cFSh8S*Hw5FOLwn4K3Ddl`3%XI%)1{_gifQco{X8_zI09ixvT`GBlj}0&q1MZ5z z;avkjfqSQE2@(Mvk}S(p05JD~c^^%~hn}V+=>Q*XGSg3)AE`hb1xUToseDPhmQ{e( ziUHJNg(iQ%!rHT&q#M<#cTo|?{ByG|Nbd?dj!aFhk`au@5&LejOd9UheS4gb9-jJo z6@cRc+@>e62JZ%r8 z7w_oVL6a05$A%Uoh~9q$L@_Ye;O*p9~lxGg3tyZ=A# zNJ5m4fH@rSp0D{>133f`0j7!+$>z$naVr~N3IRD0uvbR`rv$L$G=3e-$jFce=qJGC zhy;w*@rQSIqSwqHd8stkNMwA@3m~DVxU74z<=Mk-2V&}M03_c}fC~qFgYTYjet!P6 zIv4r}zriom)M_bNK;GFK%a8;jUIwQVLStEb-3y75n?NL$^)wF`oLMLLZP;LsDc3{` zSmEeUB%vI(_`4x}@TT*^fJ@0i@NS1 zWx`wo(@IjJEwKeAv6(zr;wtpXT>xA5yNKMKm=_$*W6|;bIJT;emR32R=8vTw9>Jf51QqkcfN!t|I7xt26$9hy6LCEB zbuNZ zv-i3)hjEM;2<2*R?ks?m0Ax;p>!PI;o^Wqa&QA}`a8mVE&PgnbXnR+fU-J=n3@O%yewR$T`+r`l+IO(s=w;a2|P{%^V3%C>sN0MG^#ZU35+4Ki$^%!} zmRcNZC`48#dfO;G&i(Ui3tli@u5172#+IZy>mB|htA9)JD@9>wm zBz4E1HzzL-B7w)Qwi$$lvJa53x~SQUDJy&GyY&!=sVR|#Ra?ZYq9XWzG8=|U3)vu$ zG4etS+x*>kGOQQMeN@7mRZ&vzJwp09&w!HAa-UaA5B|5qj@}lLqZ%R}(ut43-yr^Qy~lqEER#@jacSO20I*&J-WU(zVO1q;?T5&l{6JU~ z?Td)5XAN%-8rScGn}bLbBXvR|-bFq+mm@EV>YQk&L01xWLRJoZB#gq*uueorSrTnJtb%!m6l5Kl8CO?j4)z0zY+sUcNu49y1R2)r|g$WSc-8BSvcL{DmgF6Iw_XKx$_uv}b z-QC^Y8CpAWxa_%8HRVYt#amVhXlR zT)N!`_V4RFmw=CRJfpcgK~qx%Yu2FYUALH{vdezino(i9(_cZAvRYXxHXtkP%PrxW zSJ$OocThTI6j#kNZaRTE;<3)9qK{>Yj3ue?_!Xs}!owOyYHUU1L=7u}@QO-U0EkNo zO5^erkBS0q(o&T2NDPnHRQvCpmjFfC!0;F3-r6PYbx{*X=rFMLxB_1GB1D>^4)VT} z5uQ@bx0EC?#h*ONqhUCjF@Y2Yp5E}Mr6(okh=$VP8BUza&{)j1T-ahTvL!X06(JDx z*5&00wVh(*D0jIQNM5+|m)_!#5EdaUjn z|JHfvL9m~H@@x66tT-g?sF)VtJ+wm*#@fDwVfbIgGP$cO-CRsSyn2FkA^nd1!!B?}v^a`M_CSQ5lFoiSPeS_3Y2Ta&ibz-&7YE@BS9o zU2B4#t$lnAfD6JhzJ9N?cty=rO}vYsn=ml^0C$+xc_inlvMw<;{YD$@{r5Aqftw-{ zI`m%r;oTHgM77o8r-nI>I^anh^RU)w)n{W$mfxg5HQ!R03vlEjrDPhv?Sjxpnr%*CiV*0G?R>C|o)1AKu_kUAcuGB{0|*CYv*Ii! z`l$XO7F<2eE}#J03aT{eJWDFGL(r|3R6|!+%h&!2>!>abY6fVc$UpoXak)-}CxeH; z6!N%OIASjAhU6WA>R>8oN_Pi}Z)xU>Fq-#;H4{EKafWeJ#w9JBOpgcs8T+cxG048Z zFV~D;RI5Tm8KT%Mjkbde`KcAu5I$d)UR)j_XNVDbLZ^Ald2*`NLf=|h87LP1F3sk# zqtv@;*ZYwX7kpCDxNzl9%r}JWb46m?UVl*Tk?ZqzN*Uey#+z)<^S06PNVjt2pB9`D zM_)fqw_FYHtA02#j44Z~lCfjwVoB2rS7*^_rVa_m zJK3GrJG$Ra`-0XleNgM;HOAQF-d_)so9|b??>c2|#H#^5EpcGs05AC1%?`%*xCPHe zfHc8tJEn0hvhIGE{49$5XZEt*9?P64DWSZ~VygyIYf3JjmQsz$ND_8J_Zc?h`iPR6 zqBfoRq?F9gvS!yaeU+I$+1Bj}?wt7B?C<5aI(ME{tphZhP7JcpYXY@%&u4 z6t7&4q(#_lDN9_GQNwqn>P=T(UL8)r4;Dkl zaIMKH(u>%NGGS}0sg~9+-b*hMjlqTnFwTuf{FPORVV+I*Lx|z?39dC;K*aH}J2b^oRQKx?gHM6ma_HC;N&1S!+N{Tj8JeW%nq205)UiAd6|Ai#qEA+%s zOaO%jHZ=r(lO(}#FbaecazhD#CMEYLsYww~5ZNk)l)y|55y*! zz1*lL`5VttR;x-%GWA|}ps*PDvH^K+T|BG}Z?ZN^;>*Pg2k0<+H2!)0dUg^rm$Or%Otfep1)aGrc=?=%i26#>Iuoo%`(r| zw0i#hSrng{*}c(TZ=c(S|0@#T=#<~n0*G989m-rfWRt%I9UQ3hS2h`PAoJg%y*w<| zm`&el`#gPqeY*^{Z6)81mC!vXEo0buf9V{@?sOwf=Q!uS5RfI|U++Dd_J7>+m!p2! z^z}vG9Y~B%IuNKdEv=yMI&ajoUvsXgu-)djbW>mlbm74L_1xTS>N=2dOrU(hHXk`Y_)F5RG^(FhRdD+_Az!BtW%p6&8=mA5*r#^HY7+0ydjfFH zzCmY#-xjhJYu_W%?qKq^6sdeLYLiK7-=#iYF}1nqqH8GJ_ljE0Va41`4?kUadJ^VK zJ2ZoKhP|9uBo7d1P0WO`Y=WhMc|!Q&`>xV&ztw8nG9AO|Js9_l z^Yh;6Gg#j^ljQQ5!cJ1gvBpRO^Zfi1 zU=1Bw>=d|cdZ}h*Xfb24ZL8rCv-ARu&jXo(f?b~?@dzqjQs?&98x5{ZJRnUiANLk} z!r^j;vSvex%vT+7>%^Hafm~a7e|!d_x+%1u-!l-E3;*-O#_0SV>Sl(2j8H@T*?#3r zZZwBMU2F&jj7G`)6DuJd@(>I-I%X)1p-)(`maql*n0iP&*=PUS?HNTAv(n@!$pmk? z^H;}n`805Y1vPf2vOGa$C@kiZ@|bFy89ao#mf9?!@730{z^>O$wJ>)};j+qUV8Lt~ z_YHk&YqjFV?1h?MS_&(|iy%@CGw2KHVggfJ+)PQ_H+g@>eSJNQzPYQ?6aSIKx$h<+ z0TWH>k~_HDbBRpoD`9D&RNdDBp03g6hWm0qKfQn@Nt6y$HXz}Pw&NOkzT<6vy@8J_ z3S0&5KxG+uP9N*r4%{%o`NPk|(qAQ%2eU4??F~Oatbttrbznl?dr*9~SK`O(q(rPz zt;=~7QD>az3;tg>T~<}q=+bkfVBj7e$GM^2Z|eiXI6fx&*X=MdA)?BVdGnjNlF!Z% zIBeF&mukK(HQ96a_XDP5z^uutsubtCHmOz4pU4&40t?mK?z3??o<1?@b5Hg0l&#lD zaepjJB+`|$CJVK1vZH`0z-t5Zq220VxLU?UKiqS@KPXQyW9+>Pr@LMk5W|c(1X+(4 zK^Bsf%fm9AA*U|?`$DA}&Bq0TiBMm&Nj4n(JF5J6rODeyF zUm+C2vW^x7-0e-7c(f1mii@ZPlo}+z?Qs4YmvN_Zl>mn44Iy)L4&|Z*^iYC1k~~F{ z_Lo|~lqvlskJX@OieZq2Wd<17+}h0{!429rR5n8mQq0oArZX*OWnQFORRCc5UWT-Xhb-`VdcIyT*ma07;i zOu@I~&pt1!wi#2&Pd)II*8})vfb9*YsYia@yYF$&`FEm9I z({kYl`T;FbDgKq*C`Cp5Lh77M^q~|KsJ#WH{ohF}wp`5kqef$Xj8#o<*xOAba@HM2 zm@Zv8@Vt`kt24n2#&J5FEp^lBv|#CQs<${H8Vw>z5seNH12RqybcCSzhApETiu%uh zB!wxh=;{?T8drq$%W(p?JDAw!=STwTFo;sVd~4lx(Fo@&uPf2kw8Y1}bu+7Jl+pE$ ztGV^v>;{oB@E7;TtNozLVDGwPPe3l;!y1ctG!a5qv7*1*MYD-)ih{lDer9pQDJ-(! zD;h9(3^0xDsojST0OCG#8=J$o2Ts(`qlDxK-jd0=*sC7+%iL3_(IjjAv!xr|dF$RF z9bn$XxxtmK&*Y`jL5A-=Wi^kBq-yZIWvD5Fs=HYmttPl3A;A?!A>-I<-EhIb z(mP&2O(Y`H4Ng-lb9I1!R_;85M>n|46oYpBg$93#cq!PXK)9G#UH6M$lo|Ks#c)oG z5vNVCIFm(nYfa?aI3brxplYJ?S-Gu=q%hW#E^;ZE8Laq{(rSQB+F0pPwDLJOp{KPs zq?oGFZ=ITt9Zjj*t<7s^?|6BQ<7p5G2v&Dxzu%HIuHTb>3%)-bz!!|?bLq!)1Pn!s zZrA<$+TM5lbb1}vDbMF4w1-!lA8$D3<~9eDg2@pPY?@kc#-^r#pIHG=pWR_p90B3n zEk@rbY#_eLvAm2smMxgS>M+S`i!fb0QRVvv3FdexZ!i#H1V78a#!o4SHxNg0$!wuA z1|{HetDoh4Z~axioU7AkG9p}(`hlLFCqG(hQ0tJ5*{ zeSp^LKIGrr>)(Mo-p(1p?8ez0n;$kzae4j%!y`8{b zw47RKg=Le4pw`(WB`lCV0wcaC+3t^QP36k@^<)J7 z2WDAePXG8`I_a{syQBmsDRA+4D+t$U=&nV1#OgNKZ7071(%HXC7GKK#Cl8vG!X-%o zbm-C7=&Is8dgH4|c=4FSJB4+;?RFh@t14RxlzC=ZR(W0UUJFsRQaeeAej2gau<3Di zG;vi$Nmm|VQrKJFWA)>_tgwY%QsPUPiN-aH3d^jvEU|juZFhe`{~L!~)mvP;Z3nl; zrT5EV_>`aL=Oh2!wm^CxcX$8n zV^#$4l~4OLYa7~{rHu-$*2~l8MENo|N7;$OEy}&Q1wNUc8F<*pj7Hj>etQC{sK!Ok zm>Ix=tAooOCn;gC|2!RBxTRO3r8k&@Vo`3qr}|4EuDMxhPYxgQTb=iuE2KG60PL~& znrW`WY;8t8`zb7x1vMzM_wP3LcJxU~Qs4R1kesXXk<2$`jDh>nd}@@UTyjY+8(k0& zA;#kjupTAk*lQ{ulh8=LOu^qIGO^q>-Y!b_@%-_&5lr;lv3~5mY_;#qeMR)uVW6bs zcJiL+sVGdufHHVFS0NyWinUz}U89qZ@eL_d9#7K_cK^wwt>)r`ijiQXIxnL)Z8^-# z9E0%S{T{+**Qqy8%$I^-;R%@UF~4*9{QyE;27Al^sN(+Nns{452Vn?*lp_A3>vV$O zU_S~-g!qV9Wneu{M_1P2cZ+Y5MFT$7?%Tc!`CJL`^OTO!0m#uujq{=${>)RKmSqx z?@g=(fNmX(i|jYSv{fPr(y9OD^=P5S{fh3YrKfe(%ni2E zZ20eUIE?RRUmn&Rze~Fyaz&vY@S_H+$_(eA$Y=cJEVJ_FL=Gk&y!iazcSqX& zIfT-8ubNPes+_8%$^?-*cFYZ=9LJT+@@oq)CO_#_7B;(Zi+|C7`0q3_zH;H6#yRi> z(uir{3drU1qvcZXn7ZzPMS4J!)4<_!j~2B5WSwC-C;G1nX2n5V-FwqIx$fk6=7_=Z zGBR9!3tPGtWO5kM%1n1m9@X;~sQ(I5%^vL!1NGT@8z9%>+}H7{%UH5;JjJ2jxoTw* z*_b}Pftc^?8VBY0`)*zi^MhBBwW>IMn2%HN%;z`HsOhbNs@+X6BeHI-Q)Y|qQ^K_P z`H;56*OylJLf4Aa82!5KSghOFw7Ltuz)+PRIqKkM=k`8hzu_!{vBr0QR_B#$hNW2Z4xv!ls4igM+TB0;-3w91 zmpyX-qw&`PKWz*BB#dkIMe3^hbJ=mZ`^}Gt5J9nTC95|)mRW7};RAWWE9#&=`r*@C zg~^qP&le`purX9dnfO#cEaL`Q5*rdg?b5&C*DkZFC)&H(%Ln(>nK#T$k^hAdrRMm+ z64J4b&>sa2n53KkJWKc}YvaFJ7w z^_k6h)+2(S-j{^6qhISl6)#asM7VkW%$4J3>`+QZSdo=|kc=Mds5d$$Rfd93w2EFCo*}Z(=u>d9jX9kAc}PT0eU48>u_D zegx#jvby1|>b?*Mjlb#MxJ`6Xuj?*08R5>_zEg&s6nykeg1WN>CSiP*j55RLG@r{< ztwJIwq)%i+6*Kmz#@V#Ejj641g4ygFW=8A|f5gN^-^KpbNZl(PS20_)52LdFf%P)} zPQ7}XXXLq_+fFU0Y%Yg3#JdfOKke&~&QEyP#3U9gLWyMnyGeu!;%=NZJ5VfMAdD?< z>zTA0{4paML&YEv(KoXSd>MkH6@-47fFBkut^4NN0GJEDe^Xa`1YTVTc>QndXC}Nc zzL$yygWUpiqIUelTtd0rOxQk+chY3<>0#qVx4-iJ2xQq(Ci_+|w;WlX_O!h3L|q|| zQj^3p*3HN6{@2EdQ%$@4H$f8x27|3`wa@WcoK)`eIp&P58&Bkf^Tg<|Y@~(r)*2o; zfvy+LOwIJ7rH1p$gtz*%X|xCF(`&l7LZb$&J%5}~`o+@F$SexuBq9}M10A8qW38af zTbE4`a@8y3h!|bZ^ktm5(7I8qu`Tn^aZAs07U+z#6@vnM*cQVQ&hv$BM=oUv)=9st zmxo801{i6@H9_&--`G1riU{Ruy7qY>xLOqs&=sxF2|L(XY?7|nG~oAwNi{dbCrY-x^JrH%285b|2z0A2Zu1<|2*T$;q(bl;r&rx`JZbMb1=_=H;)dmF5m#lPrl z9yt=-h)j0R&S&b+oCD2ka_@Wc(+V$gja``;nRuz9n149|B?3cBl=TWuoxiwk_kzO)g32&o z7F{`QeN+mXXpS6be9It|x$NH`H@$k|ygS+WX6hRrIl0-t+R2?={%IE%)U5Y#(t?yK zT%j?fFeu+}iaGpt_w$qgU;epN9dCZ#2!|lvhFz@f0zsoTM~GBuT7%=CGESn&|FzZc zX5Wnn($zO*d`F0kP{=d1%=!8P*!t_^5@Rbn3eLqp_Y$t+>$w-`SJxX7KfMBc89cGv!1|c?0*@vfs*cNQ7yuG7*N3MD`gZf)#H}5&&x#cUi%HZ z4`>2SJj^@WPFrRVW^g`p^QHs3 zs?MGU1u6J@`Q*O@&L0X@C)5FvzI!5R0x6|XJyQb%X$WOJoFf7}B1YpjuUL{u94Qzi zdcCRjCS6htwrwHQOmYtE87>{W*S+ZlsE=oCHV(g8SR&-}x}V#$^!(O%-AsOx%fC=m z14QbNJYdA8?V4Hax!_`1ut`~dv$2hv3$k;_JMy3gqfRrUF){BJ7?2c(Vl0q4kw*!s zkjYDen~&fy!z#@A2RJBbp=MS#4)30kMrXev(9m@4{w}Axda@I|$GJo%8as0D5scOO ze=PtA5P*2Md~)K4DK{QX;si|CjJj3GjjR6Vc#!^|dbXKxaf!qu@x%?bsbuR2#Ha_h zCF`<@@V(VnQTSn={12#%Gmv;PEi};32_Xp4(L)0xN^qni$uvs2%-T-0e~6IQ6o_h~ zjYd#YhQ(>pQq$8J0I6scvY&6Y&AW7@(VefKYwL1zNgH&OAqoq*B%*(IrLmXOQEmCb zGYHK-S2~X|oxlVp<(v0wI}FnwwfJ@Be^y2|)Z{6JOPkH9bwEE|{0RRI0U-XqU3)P0 zZR7Zrww(PL65q^2qDJMHG@wR*hgO=1m83IAqwtf*sNNBPL!pu^e`JS^mY_t7WjW}T zG()wYVM2sO!;lkJ>=!nSVL8TSF8ocSqB2KxYPBo-C3-xa6h(4~1c9p;ntA4pbMzay(QB`{@mDN`=A z0#ar<*f3GYVi<}GmE>!YK%p4B3@v-In$X=dR;_vGcms9}zk{D(E32z7Z0=3kPbzAN ze~RvLS?U&;&8A@ZG@(5D0{cSqisBPfWw@;Day(c+2ks7y6Z+3KLw0^ZbbUp}_m%}! z8_Vhw3-gj*tWKFgemk*`6#JUFE<(e+6B_T2l1W}>SY03rLs8U>!(5jflfwf^b!{0V zMfui^L;sn&tFNyoBAhH;XoBd5iZS?M^RlJ0B(&wd=J#*!^~32EZGX&-uIgIwhV#ei+Zi7`@YVSUnY9;A>-)HP#E!eYM^gcTuSLSwF#MDvKq z%)dgQh9AdaVWIVNXl07+0qn-B+u3SC=leFQ>hl%L;jyu^SxpJ1DdGJI30xL^M6BZo zVx6%i#om(g6aC#5iE<>9GqWGnBW7Epo1gT&7_574erkB7qV) zqS`r=G)}lWCuq6wdUd+`An07SxHfG1@VRZ=$g612ysu?x(DUI=H8F`G-fU#eSs+sP zUu;I`J?g4{ebhn#-)6FL#bW&v4Rl3Hf|`&co+QlAqe9LwPQ8)5-lR`Y`+p*s(0m{M zE`4!WD8bDX(c2~C-R6q6M8(2_;z?p-4oxjVi&e?2_v@9gboRKXi}`wuqKzVbcDYB= zm7qwx9v>V8@hwFXmEQ{NI#n7kSnHW5mVnsZ>lU@`g~8Z#w`m9N=2zQ*xR>RELcJs9 zCA2>RK1am++l#IZ?I??RxlerD8AQOVA3wXzOf3UBttmzks^LS2>$QgqDncQt;_wab z-afY?CcJA){5da&vWm9Pj0k)yIm~EnHC@^0X6X6FUvzxaq9W3G`HQ|sINE0VPcj2z zDlHKM<0|XlV(p>bqo+0dvMQPya^XI!z$WoY3dQ+vx7&NFM#w7FqhitzaET0Z$!1Ql zfuoA#P)Uyfhn(z^e|C~K$jiZyIpk91xG`xSNJ!( zFTyE@S~qW+ieYgWcAh_h2`zl_v_9|;Fj8=9YH7vy*&jKG#|GE?@b_E>zrPvfHuHPs z8LO%&v{_)b&d#>RNXW>*0|o?R(7|{?p);W!HVh;VzXuzD<|O6ieW{l9q0?JzAreEL z*B2v)yt~G@OP5xj{gmalqn6>i!3Q8)c+ zq{x9a{1?eyHaXeZh|5j$PH#Zs)374R9V-bbH>;qESwB1IrpKX07#}=hVJ#+_ub>4# zKhMv2cgJ6=?Bc?a{jzrW&&S=${|>DA9RYYKaS~V5X)t`CnW(-f8BPl{DcgyKtFl&I zI)W`ykOA0LRWk7w^2273!4bw?wwR11Ym%bG7Xnc#%E4~e;*t?IIfP!JMdz3CI$%&1 zV#A}ri_AOa2{O=6`x$oJ%$SxP9mz++(XrbFq=?RZN=p4&c*@QG4m#L$zPSL&xQ>Dx zfnv;~HQ$f7HJ_JrFu-8{p?|YC+@#GgGCJ!1cDLxM@&=GYgICXg0#4w+_4Rk<4%`{) zdBm}Hkhq$??{B=tI6e%5kG|2d>6`)kwt}L{M*KF7(4%2wg`%qKDISpgE5cM~{l|Rl zUuo0%fbd2gF!r}nM0cFE@^RE*3VHKG`cJK_peKqrvi=Yjj^4k$+{^|{y3v2KJi-8V zK1cIM$)7AkfC74Zx`_M>NOfcZp5XW=&>`roZt@0*_W1)&U{~tPe{cnWxcN_4`Oo^A z{kliF1{f>WH?#mp+Y_sKvDQdT52DrER@vFpBMaNONI=q##wlG^Z^MOG`MyzQ$YziR!#R_u)+~2RSuNdb$c2tCHLEgQc!!41UCdOjWWgN6zY*PJQ zFdJ-%uTGg>`=oTIj7_X60pPr@rtzGQ>Bf)p7gIMA??|(3)6VN0TFce;P_YuGGeDP_ zWs8S&IEazZz)el(d^lNSZs$4#z^{A%9<`$kyMSStz4K|@Rw;^6yD0{UAD^yyKdb|M z+bx&YR(eVREd$WRoblV|&!ZRFCb&Ps+f?dPBhx>|y7ItIT{XPgFfss1H#M#xnmAIR z0#i?vw@n*FXZICza@HJ7$b}aXEI1IH8b}obj6u79uiS58jaC4fH+&b6^uosw`{$UU z9<;QuXu6$|v2WG}*j_qPzdfh~9-1ewhsdLW=B&}-#jW==q88J zwGRok@6ohJ5I*`7N1IK9^4sikwW7&YKeL+pOkX4j$P>Yuy7w5^qyf~p zhUYIab|IZW>2#t1CB-`VVl5rI z#X}Zuf#*LW0V)aH+_KyRQ18C)SdFhv)M~yUgP(dH{QYlG**C?(eZ6xUFV)kW_VcPB zR1sim!bkz_m{v4A`@J&&#jmU~4Y>I832eVsDZ@%IOj*o*_o`*UD;(}#slDF z3&myq>Z~;o?c>Dh`#d{4d=7B^>{(a<>_PHoJ?{lZyu?m>13NMxh75K33S1&=H9bOB zISN_T?|e01Oa!|y)wD-?kw4<@@9(@G4I-F+RBg-|rTV^u1mn`iu{-Rfq?&4q)t-HhbZY21*2MGJN;T~sTFK$>SDMLDGN$$#59iV_0mlwRBL$y-i5 zK+;SN$cybi9qRQSJ6!>Q7#{Zt&Q5oFVz25TSo8x{pthxiXV6Q_PCpHerpww~>?L?- zUXR<}Th&&SS%T}|pP74|D6@VluCT7=Jp)eWFyPO+T!nsoa3p%^@1>(wz_hamkP340 z$-59aUt^-8z>;-&!q3je_P9X@I+Ntlul_(%6q}8`g2ynmxmg2@@A;@IRJ@UFUtYG( zvLSH0*K>kPK_vmY3rLkr0z^>!&173wb>b;L`9CEXR{!El=%PKMcWaJSMOKv6uC|z9 z*t%}?=H~gz0aC6_dvWk!k0)xEea8e*DEnh+cZK<-$~_vs$Ax;P-G1pU70E!@-hHXs z9*)`foxrPODT7uZJ9(5LJ=5V8yYmqV7xx%ofJ6canuuE`WH3On;-t0F{_viHZ~ICX z80c=6HWGsR4e%z?MwiNe-03v}Y<|7IL(mS$z4_^Y@fsi%1+QyxM8TPw{8csdnDBRG zcjdGM#r|{v*5N~TtvY|}D^9N;ts8X)ts4o)<_{ih`SvvAGRr7fS^c4jwfp>$8BVsB zH{AQYZ5mIjO_q*4Z)jA>?hxIblVXC;igJ0shb^!3jhYhKOH#u^`kAE#t)BDjdOX>o zngz=*)1pw7I@lounHb=G4SiCLugXJ_ltE)hAV7*lsCp=n2m85OUJy>y_!8H~Lp$_M zI#kR{{_wH0QjQ)eE)23S^^g5oRrwzABz;j+^)GJ6pYh4r$Vz!Iu^CG=q`!=oJ>}@k z^Ca?df_@j7b7jb5RFpb8k&w!h| zywr;3DXy%pgo=_uzWQjct}@Bd7J8}9U%l{Ny}XH%D{5+L+O=o{dCBRyxqv(vO-)|2 z^0ICwga8Ged9j&o)3HWZ zdO}x3j^7e11(|5VeCl5Y7wgNym|sQ~12-YZ{YHX>F7JR z5zHat`Q?vxxZ`qi#ijbagQq1eRd~3Z+a!kI&0O#pheCAl4xk%cehV~QB1+w8fBn9^ z%G|J%Qg*B5y4X0Y*jFW`jKaPB2Xa=*?4+cx;J-;C$5qePJJarCMC_Bg!pbPpJekA` zSfrp>Dk;9Oi9q5M6?Dik<+w3@4(x}C&CV;4p|%w`*2xZ5FbI9P$FCl z+Y~(^1iZ4iy*dq2ZZ2GX`UDE}eBbO^z`jE>6~p;=1#E5BYcc_TD>RtI+bk$@XOKRb zC|#45qdzZ$aeR*oQNo}FCGPocUzMs-;7zR6Uo<<7_Uio+F7Ba%I{aUfTrSp)5Y#5$ zBj%k~axQYHI46PckPmB93h*l}HVeb!tQrKDc#dmRny8fjg!wsm3I%pI@Glcxd~peS zy_4)1krKqv?E3>Y7IJ<^QEX693oA?7S-c1r&d-kyo;7*io{@p!WHn9VL^acC5@FmA z6ihA*#9o%E!dRyT%^5Na4M{p6B>62e(CU6=hU}#+iN#`0ly8D9LJ}hbDWrJ)5yFa~ z)LT6%u(KlbUjMe3LFez0n9ps#I!%laNlzSwC9XhQN+|lMI`DGG>pp<_IQTMIRb_ja z8=Q3AORVc6QrclQ9nMcAGk0nRKt&l2TTXv2P4-JAsbMk8wJ-vgG=xv|&j3boSdan5 zPBFS1b!f`hqUvf4Xr%t%c#ZSK<`XxfOWJw^Tfg6iM{X4tX95tMNZ6opf+_-U!IJ`n z9+$q#mR8#A&#Q5=xL%k&-;K&&=yiBO7ZxhVuU>Yvz6E^kJC#Mr3_Vkqq_VG&BcN2) zrNH{EimKjoqI`35Ci~q`iXbeA!Fg;#{)b_M7$Ld9)_6}zOB|tywsk^iRN}R~f+))u z26n7gTYxYCAHDj`*^w~PdVKE?Yvu9?l^83uwA9%6Ng*MhQ>#KtZ8!|GwfXtP+^zj0 z!AKxGJ(Ks8ijmQHv*W9F<=mqE!vz#TQm0S)oUA91Ix|Dy0>r}lu@`qAf&oGH{+i>c zazj=7{hID#1?T?d>SBTjNoJ_=bRIVMWm_&_=1teKNsXMu9v!VWkwIi^{~NX48?Mpm z^MNW=R#X&;t*b8c?He>MuFdCVx@6;pIOua^UM>3M3qo$(lm zBJ3JV{btXla?$>9_rD1_!MKIE#KZyT#c}=NxO%A_fHX%>r_F`>>+bY{xQ2+atvU&4 zhAC|3B+`GbX4Lf7$4muSiALkvo=<+-G@JamS?UWlfo2Eb-M~HN`lJkhQt}2ROh|J2 zaBp4%`)?K-Jd7O`o^(dLaugxKY$&N*&yR!{+<}CjYX?-^Z0!TbG5(u}Aiz0m7+dGk zGq|CNte}EOC#AZ-lHc(TX=F`%^P|Kb^z5PYk;|n5?9dkUFOTrm5wRfS2&y z-TjhnwdkuL@Q)%CXdxMyU%w$hIDA~$Nm#zvGt&BfA%;-M6Mrh`twzh@sj4RM#=i~7 zp}<<^qU1<^7Ndem#d%w6{vG-!GFEalVi~{2jz*p>x3Bk5p3!Y)W{NGcn2ouBKUU>( z=-bxKGu0TrkaEs$N*JJFbr_~F0#uspz_tqfS=e;B-U&A&wD_s4rlQHG4i0VF9>+K% zBM!XhGKY29nOzs_h;$mYNx)t}I}EGsVz#4ds-I{7DxG+{fr^85TJd7qy#{V>SkxOU zYr_u!l+FO~0ZHoNiTiuEw8!1W)&qbJ;s1giU{R&V%b+Su=;8KkwoEE=7uD}Q(ODFL7G+L{`be!yc zmfHec1Asj7OHFqf*z9OG?nNT{VsNHV3x~JCH`$V**_aJzGEof;`ZL)8rSP)ORu4Tj z)f{M1|93SY#?m>H{$%TR&#QgERBf&^jRx8syNXJIfF6Kx)LL^GJ!3co(3?>dG7G>) z6zKp8XU%0*3=9yThhgh!Blmd`@f(~jXg1hX7!+=z&1y>jHE$Kvhqqk|Pu(8XGF7iH=bju=@3p#nS5) zoX`!2d?6K9WXllgE#XqYyhG>wblf8U1&x#d2^|6I`sMBM%?HQ$0^o%>B9LPO7QE z&dX+J0I=znHy~3s7)kg|c}p~iF1FyBu~)-WArVh0pk;0cGCQs% zcY0N>GfB`_87tl2iUD`5C=iN>urzHdH+w8x7n?JXTPhdD5IKx#R2LZS(({?wC&xW6eEO!>kLU=%}Tg$rWpQ{IL66h&Eln@TtQX{ zTXjqVwZKaDb2P+8_=%W`L|f{czIDBKEqu1I^E-)G7m=lb9c3+7fkVzwMShlZ(*-<}g8{e^*c zWM%$yHzHAu!~HgG+Nk1Gfo*L@Oj7fjsY(8D$e*8b$7$izeD) z;GrYC3(c%<7L`^PdfvTx0dfR?t7Vy47?io~Mc1Y6pNa}xJ$Z)Gkdm_+cS($UcFsEU z!5ZLjn;LQVDSW43S>1fsng#K z=O~n%E)p&RBSg{a4WCTu%(s=a&4$}vG7ZV(4UqbaOIS(hlgV6NPF}Gol~*OZ;wN5K ze_S7&JitOis373WyZm5?baqym|8X-&PYfEkcWzs;g+UTC`Cgn_6y*Y*i^QY38sZXQ zZ*0N!Oj|&W6eb-Un;M^J;jDzISq3m}ys%GQtakh%h*>?yo=^}UTF_NUuUgnK#Fq99 zb|aF3dM1D0w4SYn8HFkOdqu^-CKet|8|n@9 zWgs=fX(vQ{TF#%3B9gA(8I3(!{(RSgQtmtC8=dYu-s=5jZWBrPj-S=cEZp#|NqlO$ zoTE3nbA2M;-St7j%yT5Y!PVODVtK@4HbrT}QZLO=>`_??(OkGWD5+T=VnX3eyjfqT zF?ypq+M-qh`|)wUFo{w=BJuUN`x?Pg%AySN+>(++fSG9k>^;Zsa#`88YtL#vW7ct3 z!3a=I*U**zd_QR%%Xkvo@P0UsU(q!UYpWgJRe%153InN2kJyPS)Of4TwMvS?(BD1P zq~60EyOzzRDlIh^VW71SEZcq;^gF{f5fAN65hjwTR^H}$F*}EfJK-K z2JI&|M^J1$dr$xRQjZPu`3-@AFkoExFn{R;oKpqWS@fK%r7RCFxfmL1532KVrt~ z*IW6~3jq7c)o$H68_<6XvY1VQiR3cbcDDNwza7~m(Q6I!KfG2?E(i(}G_>(}xF-e; zevQt@bYdQC@FRmXFAXL^smc2#S|eIpLqBcqR1|?YC*>kSSs?<)#B@CMR!~Butx30Q zV%Ro3EKY(V#2LXwFkAcoT7bRcx$hCZJlqX6beg@NELPLat&0u%57^sW^;s_~Ut(Ik z=kio|IvO0p>46HQgs-z|iMEx4;3=p2i8d6hPi-|Jha-z_GEcrZe1yW9To18_fJ08l7h2Zvge>&>f= zRZkEX_X*F($J5i?H2*{Duy=d_N{k(BNNo;Ta2Fg^^++j9-cU=+^Xlh>-f&EN)ww%O zp~XaJo!8nXTEAkq3T;~bFQj`&&6KIBWBjx0s&`MX@5Lu4Cs}2lDFG+~j6`w|1*K(W zC!mstQ&0!!Qqxu>gdB*?*&aA%zd(t=yzlGT7y*2GuM5XbA?abx&L`ZB_j^aM$Lna~ z19-hhq%yTC(~GrKuT!n;?eaQZz1W7>QFpJ`-H(4ZRP@r)8DLtn2}EWu@gCYhgNzS+ zdgeE!XM<}o;yp=Jq8T3sS}r)q^g01pM_y7!pF|{vxm&I@hTFoZc8chq&f)rF@O}>A z55T`xw;qpfl_P-%Dy996Co@?!@U>;`49(IXvAO~MBBzDtjZJkl}?ofwMes? z7~xj?`uY)s-El<-Ntob#?yT-Jg;sG$eJDwbav$X_mghR8we>3>m98x)XM; zys|~}eQhavW`ePc3*M4UK?--- z{R~NSBCO&*5Pc5zSi0Z&%Hz^l_ZEmBCdd&yyde-ar;xN<(;{^=Z$Ic!UhqgmQfvex?JHEbG-J5{dBsxaA+3U*Rw?7Q?5b)S~*^F&|>|oo1 zZ4q8_MblP3asf(j-Y6r`gsbk*%ZBT>woL%0@= zVrEvnd(kSWckiC;nN`K+ZZfn>fgq`y84p8noKvA7c6$|WW2?QWlnkSEW54h;!n(~s zgQrr#jwdz(=V^%{p-0H&sr3CjBR6AhxV%9@;$;zPx^Hi%YXfMiuFUPMF}k+V8$0S$ zK}&7WkCPzMTQ=ox-AM&r^H-g>ATNF7kFZLgt2TzTQwY1Cehgn@qc%wCM)TT@DBHbX zQa5FJuza**9RlVrF3nPPOS&H7K9jwf1Rw;83swsj9J$xizgCFFDL6!^gf zg&->T4N;Rc#E)1!kiQeHx4#)XZp^_5l9K3rUPjP+eM5daS-i+;{DV(Q@m@U{fnLOV zSph1}(hZk4t~(_eOFz?Wr0Y`pxrl99?bUP%n@fKWdc=NwN=VM@O%!Sf4LMcudIn|mOP0S3Tp_(47{KHhTJ zruj;1c7C*SHv0S9zY5rD-=yRmh-3LiRM&YyeNKH#Yip8RfvSJT6IqKA3JM0N<6PJW zZ!$?5J6X;MqH^@W`Dc5psCGzJ5Owd{wn5S3(uvX%l=Pm6^u(&wK zhCD++5!LlAYw#xhrgJ%e^i=#t$lA^B?@$>OXY+fW{H^Wzur#mBne{=o;4A0FQ~$7s z+f5hHQGo_dcJ|C9W=zQ&n`VHtD>;Meq#Hmgl+hI&Y@QlC-hrmVg(vuf01+hu zlVq~Vh|wccLAFsAYQ}|)*yUFlV8YS@_GLWjiu>C;F(TpRNx9$nnxHSkXMDe{I-J`+ zb2KuaFLD2YNsPX-FU|+i_+1mE7OS=4aSUQ%s+` zyL!C9J|#5V;C9Y<=>5ZJz2}4S-Yg0RaBb z;UEbAzR$UQ;mx$2qQba+zxH#||Kq`(3+O#lf)~JG1_E(W%j1*yy~g1@;O!5R4Yy5S zgM-(b&1oF-?&g2ay*E?YTze_9Tt_9*fEEPId>Kcx_40<}Pv=$3bj-K6N(JALsVTet z3GP_7DG#jjoTjFl8-ebMJ>|LAt1 zOc`{M^g%%op`q!bR8rgWos9t_^uYxuZ-q_bOq;q9b?rYfi-uh;x2ON6B+pBH{i&SI zCrj^=Fssbfwih}JDQno}R6Ue}YcLm>Y_)%nB2Y%^S+YEjlB_oo(?jI-4<;lo~F3K;BKqS+(MxbklK9Yh-n^?y}%;#^*?|GJdBn%83xkX<@LfI%Nk> zfOB%BceQbg+Nr#w{->4xSS6NXUpN3xM3hoGAVtqmwr-y{zHgDWBqFbOwu`?X7Yxg% zUh5lY!2d3(OE;MFGfUn}iAQ@;gY(Iy0Hw9W%8TRNprk@ed%#eGD7Xu%ADo(|!eBw{ z>=ieM2aARxH=75@EiUl$LbD*MZG!Gn?55hx{*#1A7nd`f=ZnC;#L33BFul>!b+o>Q zusSqPDCm7#zV5m4G~-16_t);47PXf_9F`lhrkb z7e_^n$P&zPmUZQ%TJqT_s(JxtiB6SbZ&akEg+qdFf~YnoX?_HkgrAh2FPQd9$^4zo zpH9MB3M#_Qp|PizKOH>d7w&C0zgElJw{FQAL$QPT$UD}NUwD@rZAM+@Di^B%S$b@~ zZ1e#vu#@S%E?)uo<-?z@wqzHc!GD7{9&aZKyF~BXxMZyQrq^Q$!yZF0ES;kwRM0#= z>FtpTTn0~M!#^grnNW)?e9l0ce&fX-I@DivsN2_lFI=*XzhlX z0(SZoWVkWFfK5NAw#Z71!^+9%juG(6bpee0^k=Gm`gjR}WDF3Fp$Cod3 zG&-AT8klaXFf4FM+IJ2CO%o;JSpHp@Bkf7nGs=?c$MyrnsizT=x7#_{URkAeRe4!e z7_p+Gs}c!u^60GK%)qMaNoD={ev`B9hRb)VV4TZum=!|vvl}RFC-~8eK{*QkOXAU# zHxby~R(q)=@s$boJgPXQ2_rl^o%Q3E(vB7u zmK0MF2kc8zPA^tRZ%*>c?ft1V^mi{?+bo{L`ftupVRgK}<+Jo8RB$hW(LxjK^DrlG zZmBWU!+Xk+lpvR!q37LSf&H9$PDCA6{f>eB%pEmOiG?PkxnQ$09g--Z{Y`qP3ehRq zIYklzvDzj)?0EGtzh&;${;2F}rFEs(s{l*8FMza%bWn~3O^f2___Uz8EjRAIr)4T< zXu{HYz!@beZwhOr)f7t>mo=va8Xx_P*T(I>^zrG!S6e%)$MTJUYqN<2%iprRR)!Yha$$%~-kp5UP?NhqRWMhu*<>-O0zh3Dzg7bDi?|XQw zfDa~C#FU%}K7Ygf@XR-vw@R1fHJ@3|-L7Zyf=XxN2jjb-$b^B1N2L1POcTRHcOqk& zYheN&*u5IIn`~b>iWO>Uv9dk_9mJy_CW>NGpUM;KCf+gB-k_0h@{GS_CU2ne=rW92sbv8Rgff=`m@v?g6n4T*xi@R{qaT=mK2&UUx*!U{N^FZ$|COKE z5^CZ>l4!CT&hm{O)c?%0p7Qv5d(QNLHH+Px+PBSAKeqIJ!q(Ta+7J~cpmh%&_07cy z3&q_1IHa=5XPe+KASa&;Zx?mHdJLwZnMu@^wxCV`LOnD{A0%+Psg+yTcU5N;(aYpR zVb672iMEb_&qC0L7&qi7dr`>n!es4Z%<5ns65akH z6T1}-#W5uM8{Rr>bekTv0oEJHJOkCEfBoBAb0|v(W<1DgNc6WD6I4ee)zw%?{>4F17)Ma+Ey&nm#P7JBndA>cFggKw;wlUluj3|0N*q>1>CyTE_xm$&zs5kiD zxbZ1CzFIpiELiv$7)A#aW16&Yb@O1><%nMN{%v?rNT_1GAZe^>P`4FCE0 zJU~KK^%Y||Gz%I_$W6#Lx#360=jumv>^MZGob*6+C^kSTSb z!w@6`eg_@!yZx{&H(6_s6Q=&-&Hg?y_XiKm)_;JEnJSWzNAS!7pZOVCe-UJE@ySkl z5$LoWzVu1&`^NfZ$;!(qwQ>&L)+d|CdFIwB*7+%=Gy<6jW+fGkX7`sVY1e8tW)F%{ zIwp-gU6!n2)hu}l`iOyyW7@B=bZ14rl&FFTv`Iobhq-i#jZET@mCV zg0Q2xs;Y3X4|f2>-c9hZ|5!3!9>vIBLD?7Et}Q5hL2sIR{xc?QeB57aHN>*JLQqC9 zzlF2)a0!I$3?75knsrtLbBcP#%X-F(>=m1=jL{z6YvMT8s<_@$R4TJNxG4K0Aw^ag z=j@2}QaSUSg9r5WaVB@RkR%&Bs0a}Qjk%4sMeVT-Uc@K&Wo6?dl;VVuNq;0$b=uh1E`vzn0ox$dgd3C$RCZ% zi5-8#k1V^@{g$l~TNmPyyMqSrX0AIU`lmoYWS`nUt-SC(1naAaivtVv$SaFU1Uf#1 z?`OpEwF+0OJNna-On!nTWqpeNTEbx3!7cQ-+ByyR!*Z^{1KRpH*IXrG(*HCOX=;B# z89XKak%?~&BXkE5AMM4coql`cV#ShBiwReavc+q?%FTc0<-KoJ;jND9=~K^p+%tZ? zU_-iTJJ21vo@X)}jUn@xpIdeUByw-6^FN}7`0uzD5&JPcdbA+HB4N4)UgzrpcsgaqEz}L&n5FdhN_~vy0~hL zz#!vAU_Psi#eK@h?bNp1)QHZuT&~#NT@Vn-MVel}L10|($i>@mV;DDQ+UK|L%=qv= zrSW=Sk6%0eH_;#@+Z~86>J4e3Ij8GbToKh07c=~;PN2kg8=}E}W?wKLEDsEOKV?T@ zPgFzySLkqlUsUG!OlIJMFc^KGuN=t@fDlO)s4BG=kB~FnnKs z{1PK2vig^`9q#Luqu0Z2qMP3O4JmU4UVFhO+lkC25%XmM)&bE_>xj-Tgbw8$sLb?< zp!;8G8Mzs@GRO)`S=N32SeiTTKoFS>#!wsv+J$Hc|4vEKJi;wen{MS7_4rehIROb7 z#)k-MNlkE<0j)B~V43JPSBMEp#va|Rp7>zCJE?uDR{MAO^WlZ(}6V;Y%n z)~dqh=c-3S%r+AK0SMV$-qR&ohTp55!Se|SP0t`#%9=Os7KPSm-NAp{?)nE_G+wWW zFD$DU-uC79SqZT`x*#qG;!WK@-A)R)Z_s)iWJYx`B(3>f>%H%7`$N$n_gC4JmSWgd zr7htM&ox>|GpRG(Gj;QQ%_aIpUFSJ!hlQ1deHJmGZ)ZiEY^?@2nVcJ|ywDm1Dl6uM@#|$Fq!Za6` z=!TLAERV-A$s=N?49WeP_CJ>q!3orT2Hn1>*PioX2=GWqWaC;|;9tIOJYc*(R1RBK z*_XX9a4+O)%Btxg@F)%*RB*WaUf885dvsiPqQgqg0QWV7Akgz-I5H0n;l#6$lTzkp z2ez8szTBCXfE!ST#nDC4I7)wEdIi>(7~PZuD0EL(>+h!je1gCtdVw^X%77aP#^BRU z?mdHqtmpdN1)2h239jx`^+(!Ya8A3R_0&wF5zL^n$hw#Hm62{w6o89PoDtY;Qj>W6L>{tfaAEoNGCNBRa;s=_!UaCE;H&p3RkY zwGs!-4FfZ*GB-!O@5Rvs)@>;8dx~1I%7tmA1~UtFmB#lh&JOA_$5+z}xCUr2MG%>-eesydAs&oePn}?isKi_@m(s2HB8k(}EK=Hx%1bcs*0WKUoU;r3m z5AHCLVC3xp>V8T(96{NF;2Ay&Q|fN<$O{p2L`4yz!v>oGjGhwsH!9_^87AevXOT*n zD4Hlm()x`Hwv^~39D;^9%(*mb`x4^x*5HU!v9t!{5k(mFEL9Z@4rePk6V$#7#F0BQ zODkK`XHVO9XZ)~xc;0$8NR%%e1kE{-j!qmo_8_0jSR& zngzzQNDAr9mtNQ+f0e5)($^ZL!iy46Dh)L?j?6xz?yF~4YXVLmE33VUuRW1jtGL~^ zu>JS63yfCQGTeWKNW@o?PkhH2rSr!3lk*5$A4(37vYh z)?3jRB~|C$j$QV3*|TZOv!>JtY8L4(zU?)%<5 z?fc6%p}L&Gka&46QXSqsYvtBalWq9(vjpS|)MzFjQt*K8XK3h)n5AE6#Dt_a9jktt zO#+2bAbMfLvXKE|;k6wcLPdMMr#^@bs%uS=*==9|NN7G4K`k`US=E8Mogk%ZK@%$1h zX7VlA{P6nLWts-C>hW{|Z49&73iahIkr3~|c~Wn>+Oj15Hv_XHeMJ=ui!tD1=9zO* zh+62nhvcGS40hxab$|YC1R?lL$gRae?@I^%I9APWk9}{5|N51h+q);0GoHE1VhU-O zf5vT#l`11~vwz0M)LTW4$Q0=U&saijKc>xQM}A=*J%EI+)KQ98QDL^X#NbS?;_XQ5 zc-MVQHJh$~Fq{OAEUS@x>1X$%*;m-W-|qtsK31lZMZa`_gq@-{?@#V$-587;}pjoqKEX*GTirBV9surgNd#LyYWSN7YkV)TjINth8IB+;FY zJc7)QKifU!WW|Cys$DeX8$HDgDJd3)6+-%2VEawS01O-b$N0Z70o3sjcPjYJh+cno5fat8xgLRX71@AIm@R_ZM3J zy$ArbXjFhIvE9hPRzvFNlP%(()$l`CE1j7w${?L1CPj$+9hI{UTN*@}&7rNK6PpmUzbaw1jt<_p5~K<}Vp3t3H`T@H0cEYPI~*pj1ML=EcaOa? z8?KXY_Hc1;SZ=$Y!%b1evRzQi>F_yMkDu2t6 zp9aTAVBoS5r)KDte_>^j^UfJpikq?3`l=Ofvw!ly4?G2YFT7-SGdVuC&c#94`Z$MH zf2}p9zAC_$*F8H-@zcAfg))0$#{kG{Z2GMAPW8m#D7I}ZvmRbK=5ZGU}$-| zcn|fP(+&L@8H)?RVs-XdAKD>yS+(8|s5XHx=_K+lF)uhR_D}1gmZEg{O@^+^rh#+{ zQyVx!+^O$P{P2j@pG){JQA-R;kY}8PBq1?w$5FL5OetF<7`$P5qb{0~Gs7+#-8Nde z_h>n7u~Mlh)TisIdkbCDAVu25?>d~eL(`soU8W2#FP;6E%_1QTW|H2c4VdXEsFpe= zkYR_b%aJYQ!Msp^-kS;9)fk=ArX{tdUvwVz*{b8R{`@H9Oq#GnZ`jq7+*;sOwY_v; z3)-F{>0EZ3dlSI|<9&{hZ54Z=Q)s+AgR9Ka5?hf*V*TYCb- zwP0SU<M6eKKv!f>re>k5w&T$g>emN2r|AAG|-SE!=nYsj>zSo5$``sAsr{Ckxrvy{S z!7KaSn&NLom31r==S)Xuc+`VC*7=b|tv2s7H>7xO_Ec;+g_U(#Hf9+dcuQ>T>yol> zE>+4jHfx-wGXEP0Al3fdf|5(qLx@y`Mc(--mx*XvQ4L=m1jHD%Y6jf&024|aA?hxD ze@m@KhL)(2$~+og-;?EPoqv#MAoyGF=g<62fY_YZ{jAJ>MKtaooT5yl;jHddmMeQM zzmfNH9+uak)^c!a>m^@&?X-Q+k5G@RUDI?_JzYBr15Po^nv}uw%~PWX`-cKhaZy>c zMOThfKS!uETMP}PI37qu){%E_o}EtZA9t?ot(^0{zF5wflcLtKrhi`d4+Qtx;`y-C z^c17^TQRfNv}a{l_}C|U_0A@=*z;}iIE#OnE%kRyWH+PBx}rYvyYSc=ao`;1W+voPacx#OnmG#C` z-AC-p6-5I0-rh#T`)3xl9ini@S$G*;F2ZuUb!Sb6=cs8!KZ5>tJv6lWeyyEfO_(d| zU>tN<8gQz%u(5%rvg4H0(4exF|H0liX>x=DHz4Op^QYAp$S8PQSW=zktPOpBhV=4! z@i1G&<>Bo@7HO~f`#ZW(XE(+DMqg8PB*H5~%rZfMzR3-Fb0n8#2$-C9+a& zl~0J;kt6LQ^Uwft>B~LAO6%n7(~W}) zjhDCAm2ZC7ki=@)kL`BG-V3xxfi%-VWKHD|$_lBqv3j2%;$LZ?mTT>CXmEzp4@!xD zXcVYrXc&9gC6Ot1JL14V@z)}&LA`t9FFe7811_LSlo^pF8evEr@$tr+zV}^t3gE^X zhkw|uwH`?V=ctR+pU&+UZ0K5!ynM3qqTg8|V^l7cg_MGPpd_^`nre^!eSR4CXCR4R z-*z>it`NyEvB}OvObZ$t6NiR|njQrAGnR=hcyI;NfGs zy)6H$z5$OGBjjqfDq)6F6$L4Vbhj9@Da5r}^Yf~R;JBq2T7u#A!HREmb0F+q=z)wVh0VGF7f&Xv1C3|v^5qRS zys9Lwy9l#J9c~2T0x_k+amR2h%*@Ogpn&Z+W^L0w;UcX{N#H+AzGAZ|gdNipC^Z=Q zR~K;g(0|;a4Pg=%ei=;cmgn7ppJrQ37G9$=Lm{dedalnp<_;|;z(PfeJwOBrDWNal z_<7_DVP%k46--Q=4QKtA4u$eKu>mJ6h|k_kMqMZ-rz;QZNA6t*!IvhJqVPgq( zTyxyeQZkQCOUiT*CTD+>Vm~XGsi7frDbPO2L29n-e`877$iV46ZAiyxdz7Yhrg842 z7IXtRmxT{|hi)N6?F?y?ByGusamP3GKn%ZfYH8BvijZHZpgPbtI6WY13s68?udSj! z!%otOQhB+ezCtMA0{UCxxWU-7w5=;=C5@p&n5dG_^j~DCyNM0hnc5g!XlvN9+5`_ca=1oHh0Kn2Vg^<_!uK`)Ko_l~r<4b`Z zdBzDMrcT?W=)gh^q$}Y0mWM{69SmY*Jl=5NamW_W17Q^iz#{~IHLCu8FA^gDZUc&< z5QWNo`?4&#? z`mNeGk!B&X(9pA$T_-L4BT16Z;*=r=k{IQG%)3U04vz_v@0pAg36T*dReL~fS&}p@ z(B3b{0i>4t)I6aex+GF?fgEZ1q)G=fNlCP_$&1Jqa7NPLu!ZP#gB6hi#wb!!_#~d1 z>a5eo%{aVZ!5Z!RiR6h*>Roz>HS1r3p0n0ga=Ulc|tnWKBN6VFhqjpl(b}p zHBHsO=~{@9k2M@nsrwa$uEjG4n;BlhhV5{zC=DLWLYn|EN+(ZK_V}VT9Vc_i7ad6v zJ)r8e01){C;gi=bOMGGm@>V$@`#c7H5H6sdI5VX^>GJD!>6dF<$!iyx&c76i`EpM% zW;&Sh@2@{`@bO^{M1$cG5ZL(m8RmAl0xKRiUbcu2=@huP9OU>-*=Z(T=*?J+(2R{^#6N^Y7{JZY5E?6##baKN zJlXGvk3SswJX}&)RaMm4nFW*#J`vDFN8Z30_F73#Vx*dGFSSI;UPRS}1x8H1rxxEt zk1^K;`y%B2G7zK@5=B*RLTzfNFS|aG_5Ftsm4(_8nOn0f7}6PYJ~^`4$k?`VA+e!hEABo`-$CyWPonY7{jqCr z$KqIV=xh{P{{zul?284_2xx}`vkUn;3N(W>jQkjkES|Saf-VS_o?AS<; zC#zi$nO#M|?s;c5%SY+N8Llny?|tNz*o5>RvBj)dmMikZRs>x%1Z|a@&Jc*4vf9L&pyqwpvbm8T<&Es;565t6{wE@hH<F8$cpMMQJzeOE&GIPKzL+a`<3-W#Gn} zq)T=2hvmD=9rU1vF}Yg%le9u2ved1=XcOWC1CTVH%bK_KZJ&r9BeQ}OkHoK0o}~Wy zB&1;$CM^z%jD=V`7}r!M>1}WUZ3No9L*3#GSo(f9`sxn%A&LB>Ui?POsddB>QiyJ0 zSxEX1o53xX6m}V=%a6O+g?twMl}xx#p-8n~mn@33kdjr8!s~q~D{e{2AoaJv=s^o{ zy}0rs^}BrHOf}$sh723TTg{>lR!O_qG1Aa)qpPQg#LToN_c8{HqLq@|d*++I?{(7X zE)O+Av=SIh|iYMBs`1?aNGVno#wN)j*T_?I%a9Pb*5Qew9nwZ3?=ZTf1wAY2& z2HJYBv<@Xr-869cZ zh;Hd~noSd;h6scTB;qOZNo~lFOiYBAD+oPwEGfgrsmgBiheeUtl)~W|O%72aj`KlJ z&gScWxtGRkoJ=RrCrai_Uk2oVSiTNW_F zhaA3#%2S6@y3fQCb(xRPGQ1C6h%!=ilMYRfubWv#{JJEjOE9*ZNR_~hJ0}8+HdHB? zw6kqZSURsX2FvhSzYssB#0hvo&FkYuA;Qpb3Xoi3X7u|JAxbH-zHTy`@FEXl7iw}x z-4>UbxhU{x_|OL1&^0h56c6H8W@M4-evpb0a?-sO?TCt3o`Dh)2u<;Cx5Uu$+$5HV z?K;~jsNuH7^iULHE33-rIjfPaX2xL&SRW;{EH<%BCZb76#yMsGofJc>VuL5zJY9exnZpYxo(G3YaJQAitGGSSxgx?O! z>0yNtlZmD9EtxQs4vc{=PBwc?1I&S!X@X>*Fn1P1+bs!>#tku?2`Q1}t!pZI zEcGT?hvEVS7%4$R?xo&H$QjRtp;}`y8cCm%@TvtJG}PcY1}R<$_TN)ck(FbXQ@+8e zAkw~s91j_o6j-VVQ!Ns$6_|fQ@%DAN7Z0*Iv#U;ubD$)W7|F%8zwY|7#T|#dfN;iU z@-o-p3RW4lz6%9eE_l;n7t1o$HGd2B0c`Q5bmG_L%AiCUENBXUzQA8YgBUdQMpaM* z-#O#b>FcjIn@i%6fk2aTr_p6{E9qQ>i$Wr^)=@BhJ)-Y5w&gI65oW|`=P3NO$nVIg z?*(j${$x_?AWAlMGGVQQRR+R?^ZlTfBqg~DkT@(#sL>}g!ud=rq+%KPRJLMUqR1g` z;%eXXQz%MU@-T}e>ullfT~Ri%Xl~4CaGr)?LzJHN-R2Btkz`x;3Tl1CQmMaX;Drkz z5_(n?J)s^lD^)34vOir)bdW=*s4F$;IYzj%YUL%RU2k6=!J2o(Tqv+U=t)N7CN|(} za&h$!_Q!<;L{{)D$n6>p!gANa^k|YOJU4=dj0E13$^VX&FCis)ym6+aL~=#mTP&0( z97G&psilqN@KHbMmMvSYro6QRV?VHwo{sNZ;Q$9 z3rhOMCcY!+k!vCec%p|i&1DHaJ<>+x!4M?pEp4-s#i*i>p!Cw9%tqrEc90V+>?KA- z1c8&HiAld^O1)Oc29qhTj8gI!!;%E2%j#nkaqneZ(`ucO-ix1z6y-1 zC1HZ5C6$O>2u5WDDyY`Pv17YU5KGedROBnMxF7|k{mzmx4<_s~O08T9zG)Qx+-@TJ z@wbI#?g^yPi*guIL=ypQqYzd;9?!#WOKW_UznZs+2DiJSWN_@LsL`RZbaO^MRp5@h z{-P1m9_$EZifhz*qtQxo+Jho|OUnOX?Pt4M` zc5N-x_&`c~V^-A32eQe@UJ6=dMRRNg{JhMB#@7!g8R3 zD>Wh!P{GC#a`B~UiKzOhdv^U`oaC4-EZ)Gdq&LFiogK}#i3Jg4e&*DE6PReIR#>W|JL(1>uFfq|$aPK8lxm%tp<49Y6nT~M z#~!f_(W~yrxlBBJh4q+~s7_i+_WDS`UWh>4N*pa2M|Q{`$=?v5p@i0<&RZ=pk*Eke zAW7ZaQmfD;SD+|Q!m50N{kwDhQ8iqw8u4E1G8dK9(vT?PUQk>ixRQCgVv!%yVoE*T z9*d)NWf6Qp#^|Vu0{`HN{zIpzA$IPe+LzZy|8VG2W}B(3xzPIs5@Kb&V9`g%JUKgY zO|miWnFo7RMT;hr*c5@&%dr%VPhL394yQd?s(6)e+!O)@fTtSRw;h{Gr!nO8L6In# zCp5;L@!!R2u(@?mu+Jh&2>DsU_yETgD4y8=m21FJ2MXXAeilW@A^1hTHah~HRvQ-g zkzc=lZGn6T_yqAicN4>N*5&gw#CID_$1wpKJwCRk&+4F%0m(E)`Vu6Hj%>dAS;GnS z&#RCa0}0{(eSaWXJV0gT0FY9$xu5G|GU|>%2|fznpa1oi(pPnMz8SyP1MV%jvj0=_ z+;Ny-`11$&TkpPACJxZo^9e7G9&k z6;9|Cq2Tim4G_-bH%mbPnpcMWu;I=0u<0-OsXq^*q34PL_%L*U*wnghD*nN&B$4Ue z@gg4pNxZ$ibr{6Z*y2J27`nC>EC~Tr3e>W$GXQAxr1RuJ-c@RRO@A0TX!fxKk2;b`;e(+ZD@Ge1WNs@qY*ZA8&_R|3$EC~5kSybrz&$4^;z zfFhG;sor4v`R-)0hJ%^e;}1Z52pPwJzw&s2L8t!v+Opdg1du&)&>B9vxL~rPc3pQI zZZwWWgnfLl>!WcNWO=nCajsCeV8w4 zY)qD$n=6+u;Hw){SzixT(A%3=S68R>;H>x6j#_ZG6=*;jy%y?+tybv0_sjiRabaO$ zO*H-mS5Hq*$-E_qm9_Q%Iz>rE1<2$QqE~@}f~u^n%yiJ981~%3+l2nbeUKw+U_kUa z;uL`KxL`$Cp6iB-#CQ3t{iUU)<+oql`MDjyJf?q*U}I@%v|Ojx2vb#DOt!&kJOuCM z?QL-F2yocq;NpT7l$Q@rXn!7i5sarXM9W`+STEO^9?g~h*HBMT&wr6r9`8>FS{+Ul zRJks53rWL(=+fp*DU)v`FpuH^EXd~&2h>H!7XiAz3ui!8-FaEhJ#o^k*ciB z;2NPDn0k+WNPa?`*?Rzs>c7sDy684NucK0*o9xXJAQ~~5{q^Rn|IOE{*1hrcX2+eO zrnsB^uRk-Phx^^bChtM6y*6nF zP={K4J$L^}mOg%UAo!7qXV)GG01pRLWCCyuUsHl!GdOfLbln6XXW)!uS5T^Ev+j`q#911wsA|H-IQ|esK|iJp%cM zuQ%L)DcG?Epa~D3WA4+wQ1VSNw5|68;*EO1L+%GmhOJpGU}wkU05cNwIn#2Sr?_)m zm$U%!z|ig!y^AadybvHR8|Ms2jb2A8_yl?0>|Yfk`9|p2_oOB(2y~n}qmNIwOXNRj z5Sd!PFlPobp7*ez_X8$0q0$yOfi-jpNKE+=p0v)upH3(6!G5%g+3EgM=;e7c`}@BXxqWCk|8yUrj$krw|Z JRwrT@^naWDe@XxV diff --git a/doc/en/picturechange-dialog.png b/doc/en/picturechange-dialog.png deleted file mode 100644 index efd8c9c060672872e682e30190ffb600d45ab196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22234 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%0DQg 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 diff --git a/doc/en/picturechange-result.png b/doc/en/picturechange-result.png deleted file mode 100644 index ba8012cbe30fc5964e030f16cd9d7f12fe8a442c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49178 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 diff --git a/doc/en/popup-balloon.png b/doc/en/popup-balloon.png deleted file mode 100644 index 1dce6eeb962004e76ca7ce8f1721af3ff464daf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20148 zcmXtA1yCGKlwN%C#TRFB5^QmIhXe@;!C{dg!QCAe*WeBTf+cu@ySuvthv4qVe^<9v zvokf-J+J%g>Sy1Z30HeBkBvcw0RRB76%}MO000En*Xtr6;_JVp3-^!L6S}>Ewi5t= zN$}r+07%aSzurW1R(vOmHit=pAt(^CadH6w&;S%=BsJX^k9^$xDL*bedyOXPHq3op zGv$vCrl+4qmO|TqS12=xHh;>bghy26i})s&nHl3R6NUnTrABZZazb33oad4$|I)+p zk=agjoA^$0n%5WGg#^Miur1a{K>z>|v@W3J|0);&+Qy|# zm|ucJ03Cbe_%9q*t1Mx(08qZSEJ#fs$6}C10wE4`v|I894HRI32~@_ylW0>zLnmGxiYm=41y(_Sf4IbS2#YF$2~pJIBnb48S2aIYx%GJvjvaTTDpLJJCjCXr5+fi)X4Q=ytCf=Z=g+Q~x zgvVk&Y}l08dWNp~4f6c>8$?jp-bfA35(=rmaqZ_&mHqq@?_hub{v<|1e&QG8zw)#i z_)m4`L$}rylCZNuFNty4lT>sHb;v8MgG&Ost>4f7ea?~V#+z0Qr9PkuF;2TTQ4UQB z^IXY}E4Q_xUqP3jM#IBX`5>thENM>xCBxw&QciqZRa&2PE+sES&#I>QmsFIDoyZ##gYY9}oDIFm+>!iwPa z{4KPafJQ9IBzgm9A-Zr}_A_3Dr&%MlKs;Z%5*-1>xg&UK`gCjz{WAFA=`>do3jp{o z;|0@i2&BK0t72D5@Rfz#P~9lvD@z0sm<3y^C#YzM$tK`0^~NWuOL2VxG*Swam!P$b zDuJLsN}-$950j^tU*vc{fRyL`8J=7N>~OZ@D+@idtjw zF3H+Pw@~{)rQC-=fCMunEb$>RybA8+cuS^!1(52u_!R~IjZAvsfHcpbvw{Ke=VZH0 z&@{0Otwb=tf16LdqmbDN(jP6?#F`-I>`(Pnlo|3W&`$=f49avD8gukmP$B{HlYV$+ z{lJhfo!>hEaoQyvIKWp z*+Z0VrP@`==`+TN_9AcQ0R?9-ns8&LXddY=Zo z_(&;Uga#ciO~cE3(>o0feE=x3lff>j{_>KGf_Po>D~%BS+v6-pCHx1-5*WC9Q*}(` zqMu9g^9q>cvH2yUC}YC40IXG5?VksL3ZUse7MpJnX_ux5%-!_lphcJo6=Oi^S9u_( zT>jT2OVZ3q`oAB;4y-f|ci&Wy@P12k|CqWZRHiEz(dF!whzk2;V;kL$s+b9tN&rka zeC;7bg8jWE%6LENS%F?6;g2{$$?=gNB-k>n_PuitsddyD{{ROul{3AM90EC8zRPrs+Fdj9cuAiPt$+{#2EwDBGz z+?k`!tvnr3qmgrh4l_PGqkPo38kC>?ep1SH`EC|qjtskeQMMw(oXW0#In zW$G~!p)F$=9%0~vV-+QGo;4~y)_g`E?!O6tl3(FANs)CfsWfjqHTnfM$KO0F@oB4#3~}EbIXjRxR{b zSVpcoc3YSjRYA0R!wQGdBw_dL8l9@NIvfy%I0S}9Y?1(@%q3=QHTij-(A3|Y6buk( znih7Kl4g*4R}WYeqNu|mb&kwm?Sk^?n?pz^M!nJ0D1APXZ)spuWQvk;;usL=WnD2li#qx>j2vJ0za z3|NfocUC{YBgk&0mmjdOs?Z8sqz`?hhpd1lRh)k@0KnKNlMZvWphS^X=GHvCZomW` zWvL*|yAB8VL@d0czpZ=rr`bm#5JB-8>e1&4fj$~kQpOMHE;3kLQPzYds>ZYoT!JXp z?e0TSIN^#QBt=kA_?A8-O+7z1iug>2LA|!a`2u%882nB~MUMM}q7)V*Ce&iy7?-a* zH?$9b1rGi=o+b1fxG97f-WuK*%t}kgwL%_w?Ha0JdG7rwFr^!m);;-N$_(E*1(`vn z>r$~Zs%bRyyKCyly8w#l2Cw||PalxnYn6MYMG~Y(ffM_D(7qf5#1AmL{F#z8O1bV^ zw1eGrWT=Cs;)xycsvNK5C}#@hKhE}OtT%4UN};S*>Mh= znx^e-I&9#n5lM%h$&2g|pzc4GhZ{Fnr5lSp2O;psmbihBgjm`6@sW#^A2ov!U1*2Z zqIr=`!x?a|?@2OwyG_};_po^sfCzG%llpv8SXRpdJ{ScW$UsC%sl?i-5_iP}Bq0P) zWy@vZ%O49@nql_mUPHk8#6#=nkAK~L?kaZ;bcuv#45@yLtwCrdymIXNTC?X~nts%H z(P+cfe>8-PZX95$J}wgV9SLwgM(2p-{7doKysyc*?L(83!pir(EF}|?$@bfJYbYIR z+02`}=5eFP#W^UA6typ2xj*mXC)|b`w!ZY(G%ZP}HctypAOlHcweh!2cn-{HtMRVH zZ8is8gxCc(fBUuGoyFtfB@V+hMH33i(rMJ;;XGEv2qdWO08(0fQ#{HzDCN623uI%_ z$4`d_G~Al+m!uA+(Q2z*9q&(FCETO8FEZ8s&ou zJXNu##pBEtzzVgO0u`V{bJN%66Fxe@_(>*jj(~LrM8o7(E&jm}8hb@Sd_VW?i4HRXKXT-`||WnSp4~Gu_JNYSft~gU+eGRt@-QQ zH~hY>1>1kQckvcZuG;y33SWs2)&CP7#|9WS-WFmK^PN*@*Zp}KAW2qCaQ+vyn87Yw z^~b5-lB8I3$8KTip<(V5HrAibIp%`CO$2|Y=c~Kp9V)=T1JZI<2j7dKFSkheV-pb? zyVQnycMH4k+?Jh>%Ll%@i9a6v8gknmG3`*krey(?o`UOVzQK61&iT}BFiKF_u;8^lOoL{$~7JRW2E`qhed@jWU&?+SZ?eZ+B~c|3+Ra=aW*b+pZ!KfdQ7hDB@4oGvd!j z%JzlepJ&}BQZ~d=D#4x1hm*j5IF_0mu?Ipw$kYhqo`!zxP}WTN-PXs1#V*iQ5f~`J zhh?r34Bo8rm)T*ez2G9-PNI+PFTLBklp(Iu3Y+**Hh77ICsIUoQO9IEf@GsUW| zO?m+PoqvIpUXB^p)W3IUFI3aCu|NR-niw__*K-CpkyERW;VrGegUE9P08Q;}YO~*$ysJX$&^Dq!Y2Dp6O7hV=eRA;=G281c?QgXHB`R3UZe8KZ$4gqeRu%nb z{05GlYX%RdXaA(6)>&>i`#TbgcXizf;VLqzhIWZ~t$t6BzIO8`E@NNIpP%1FB4=ZU zA@cSlpRC#++=R9?-PDg-vod6=sVA#?Y>>}owHE(rsBdh}E%{aQI~XrrS0U$i?I)K% z1l_jnu9{zb8R(Dud}=*)5P`+}x;(H{VuGs=E)|gT?KX*CjI1gWTs=s{{<}PBvnW3O=<(+%h80&in2t53P8*} zp}=0XQQG7iBOtW#Luqh=yTU9y7%T-W`ienjpWhA}%GFdh)p#)R&5_^FBnG5lK0n{j zst8>wtawzIK4#76BxXzSZ{RD`Utkx*|sG>I*b-%SigBaXG*Z|n>a&(L+g9lEhy zt#51P^855nfOGGD$*-P|a_{;1B{SZnAaZ904M{9zhym)pGcw|p(R9+de_1WEab6SS zanM5)Usl-cNb+GwfZ0jsF5xBx<$Ii+eLqps8I!87{ciM^a|-^NyvMN@J=e`|#puLC z<(9mM*MD4jU1}TL5Zc3ZQ3VW6-IuFbU%U#G&Btqhx-897(x6!%9Ih?xEL3~+?TjqF z7rN^n-J(S$}j4961iqqTh-zqZMhU824{tbhIX4_a1ns z49%Rxw|edmON`$X-?;tMX(JEtuJ!b~`!i*Yxj~*Xwz&B3eo8#$?H87M1WeES=Gz9X zWJC!yjMgUSm9#!$NGJJ;9|n*lM{sW2@#yfHO}7pY@agMUA(v0u@6v4CoPG{%FHUXf zSKT`S+&7NK*u|ZQ0f7{7pc9Qx;~WFj!ph3UV08(wWEfISs%bHz5f9XKb##;yywdvB^Cu!q)-#P;y^&0z6+n_Qmi`L?>cik1Q-fF8S>o$8vz zi-fi|`uEz(*4L4Bj8m@N^{%!&rcf~xxMQ#l3Qf_FPwVB_*4PIks z$Gt@g4gtgbCq8=VKV0+4cbfou_nz5F0Oc#cMvks&XyyGwo)B{0t~&)#V4;X0KRLQ(Na$!e&7KwFy%>z}t2sH*p;6VyDyT_#+a*neL>uV%D#-Q0 z@7cJABaHI$Qj+kb%p!OP#EVS}k&ugW*?;_u{$ZY^Chp5xRYLjDm}Ye0?oFAsGWPt% zX>-~Wxqqw%_Y$|)c5l<>i8uo#u4bFayMAp5tb4Pt-|M?^0T6AMn#j`I0?|XCoEJ?Qn1$b zOT(10_;%9fqOS1uKg-4Dn!;R~ldZ&Eu3lz_td*9E5w^P!6v>|%fJ~2_foF+!+nT#& zX|{J>P@#vQVAK{{fPinu*X=|kHX9ooO39zXgs1rw7--FsKXw0G66{OY25JkIH*ex&DGaT-vg0|svPeI9ur#82GO**>0PwlZ+(vqHD?dLlVAVEB>TtH) z(xQapEe8r>7UjywgN~`Txv_QoE)H^FuzwG1fB#^NdI zyIk3UVAP@3en@tJd)Lw)2>9jJ7bD^Fok__U&~ZrRIHZDuh92NQMu`!khVurRxI$@T ztrbR2R=h<*jCFZ+vNAWhGJ~6xBGq9;gWRu{+(Okbx4D5Fxpd^vvbrVEPT&IHt(dTi)|yXsN)pe6ie`3%L7!GrI(^YPs72*nsfq@AWU>Im znf@DeMr@+|Bree(Z;5+lYh%b6AJvF%tn0Lqo{c(nkiNVAE%OU^#ZlF#4>xf$Htwh; zjjlAFt7j7yjQP;>c27Qqlc(Re$WhLQuS^^?p2jqtb3!8_AjN`@1H?^YN&{06X% zUI*BY2L=~NAkz~9iSo{gTCm{fjs_@UN^miBVM78_0wM zx3Rx;s(&m9jcP~gP%xJ)?5CGvra?(U5CD({B*3MLGxFY?^Hbmi@ofe=G{`GrFj?F7 z{={9&6|P&(r~?I^jU~asJsxVosr}O~&g_a(QQ@r`GBJv+mb~3G!Jd4j%T+DrC%iUW zGFd#`8%2AmD#8>HAO$C&bZeg$$OXapeF}i9pvK4{&Jx_6TYM6y62ybz!68=9>95Wr zHy`;G+$&qCaZfFj$3<6TJ@jp6<^F!70b^cnIk6Ek zbGQ}UThEE!-L$)cf{>Vd5)NkT?4@=41|SXo>}(e`P5&#kTLOxIyk;91X}O8bAIviz z*z0_oJK8Mutwdc$?k}bpEdy-;VaMt|WepuW_3z38o@zLFd`vweVk%fYK<*O+=fgW4 zYgUn8L-ZU)lsvhR!hoH3ia&lz3kxnq>IDft+f$k*L#%xm$^;=FMJ3p;4Ow zBycU9uMa1Be;H}eq@;xoj$3pl3+X`Qz8wkPo69p?Cuy=zf}#1tysFq?s>n0D1P+&A(E{sG~y__v_V)!>Gihu>84>ay-c1 zDE!vWcYCtrZ{lK!vJB(cDYR`&E%o@46?y!=e79^dWbjHjPgb z9@SAl^uv{nm)~3&37Uou^?XqU!8j!q`ZQ^*{zh674C`}+q^e6sSr(-we**=XXe{Ef zcT3P8>MQL<$^Rw8>oSFe(rdAl;*JJ)dY=#6UmZ43oul&kJ(tTy?qpEf+a_iVf=|**4bT@Aj zi|8NDMX=b|9Q2dF;#@I+5M;9GE~PT)y{>Mm^7%;t1`HOGib5bA1gjR@CiwNgwbq7DE+LRrS z`)GVoZTw-fay#dEjeVe6pKv#YH>TvtJo}1ReuXHe{e9OLIEOY68n0!sMV02HSQI_~ zxG^5LCd|@6a}S^?*~m)U+O^!Yt!eTxn30adiucvxoA zx?vFI7EgCRQg#o+|~*yoI6Ort_hi6Ljy^|9n2I|M;Up$HLX+#rDYh z!BYq?ZXjxRFR6vj$8h4+I#a11)uIyt>fH1S8uP(u2Qkk<00~e3D{|DCOt-c9Sf@lm5lPN4UO*~**{6-j!vXN){VdjOXpxhMyGGxgs^I3DEg^9m*mkF2H6L|)t$F* zo8d|V*d&VOVO&n-Le84iQ^bUo0_VY7?C0F!m1mfK*VEGzQV^1lj}PS$<2M zeFs>g;!vf?V3uWuK3DouWbDnSp9(hJj=$0t<~4dw+-^)v1aUE`l=|G(D)ZT`UDq@i z;3%C%HDjH%6uAs7@*yOeDdL3D%an|8WN9tNZIe!ZJ+^IL$b}NTrkD_rAm&o2D=fWC z>^3qjJes63-5{Eh!KAda#Gz^5^QoM=S{_56k(7u?4C#RO>>?zz#dOldub*^1ELk9? z_Wk5Q)N?1BK#RO!T1@2x8K9a}C)e5CljE!39{_MXrm35MG@#}<4V?K)Mpi9IL5qzh zjnAG0*Q^AM`^^e&c>d|q+Vl7x(@@G!6#t$`)#1lv z@#ou|P3KdYhUAXc20oi=VM@E>wZ{$uVe_PqBOE^jzZ{g`xK-$`)o?SdK|G{f%i7hI zfP!BJy|W#)vmxp_yt6ViELVi7l5RTiiMD(!T9`uqt1`!G&Hed@fMP+PySM&mzCPFX zlVuod!;OH)vAgb3zV-*fm`42|6&!WRTFu?i@4qO{X*mba;<4=!01^rC0-jh91^`FB z+-2vy8C!rVm0}1{2H>wjLmwr;v#f7un0UASbU&xc%ipl#G-eYW?SfI@aoWMeZ?~$g zt^K@LApZOD+{pywbidDp*q+Y&ntkdUSbhU3bzvc{8EyJh!HBJ`9-(*gZ&-^|{ADi^iS-TYBZ^?N;V3c+Z9a%S!M z`sH|e!TDd+)XV*xVWVEQ@QJt4NV*n6Zdut)rjzY*^|rWJj^F*IllaSHMPOjF^pdGh z-nfsQSk4lyp}JAZUan!n^}m(7xr!x&&sTXdr~yKK*EJ-gSJMR+jLlomJg~y1rT$H z8TZ8$)r{)=y}CzOzZi2{b{x8yt9;Vp1Z()7|BbXWbl)Hy)RkP175BZ)79C;AdF;u9 zq-fkajkO$K-5Yov#p*=V?&O6XBlsUyK8$wZ`kmxQj_NgCU$i}LZ=1rkTfIlhwLj!| z?4)!U?R8?>S=t%a*(_xy-MP#zae-vxMD>M$Df&aH*)s9H0JuS#xdT z=g_?t0W?1xV_c!|@KSEyv_NyvQ+)LjS`u1e4p?5rJWrTb>MfWT_2VDD$8`S z0C#tP0KcqePyxR;LWek7Z-?iXLNIrc+R>=X5&fG^T4(lasr??m0)FYRp?7axPN`}b zh(G-6dIh$N`%88ktmliT=Xg5zm`K{LAmDS0Q1u(w>-N;rbI5j-FkCZIR}bhizVYvWv3<%Yd5RkF*m9l0pocX|-!iG265^b%Ag=yPk zX$W%1WJub*4TsPJzU=;y}HCLISB28-wqKZ)a77ys)F0U=g-LbZQYt$V#V%N$}>~hbnDH}{t_h3 z8QymOZShK3^?gXNuKYuHXEh`5dpS{zv4xF;(|0?E$hq7PGg&;WWeyEf2g?_9vDaX^=mu>_Ft zc$#Z_KEIk1?;p##38EG`KOc%!%@GUP6;vlYZn-HNyn^T7W}Pg13-H4-XttM9tEq&# zJCOo9ki>3!pX<-QX{taNr5$q{3+G+T<8bxbbjE>Ja@5c$;HStq*%rL&riP=zoaImY zdS_XOwuU@5mGU?ZwZ{+cW4%XSu5R_mlyRNatop9!g5rOUb!Fib}jd_x<5y^6s``_xXEW<%@A!rs#~{#n{&C)W7r^V1~b&_V*HozmJsLi#QsHH zQeleXiuCZ;=%!~g0LSNr-nhBoM`8lQ;%k*ou%D!DotfkrB6Yt9|0N}}) zB5=-jEz`FKb7|5yFV6ZL3V4Ftl*Z_j3*R$HWIKdCF(f7}ZvmmtG$Oaqs=U0s`{q)G z=FCy;&rM(K7m8HZp1V{e;uxNNQl}|ki^6W6hB!0hDVce!=4nSm4VVPG2LCo`a;EI9ZEK%3Y*Vtx-8Yt);|$Pa+>TwDYIHeIF8)-1kCVPm&x26dUUn29I1-mXk(yZ zVq%W?3agi|ojlE={cQf_LMcg40m763#}06i=bTNxMh>B=jQ?=D2 z#kn_6(MvMTeG%O{&2qL(%Vt_S(OxsguuO0HPB7e9lLA#*cd$KA``M{)Df% z@M9Z=J7T#)S|Yd9IH64#k*_%Ld}hMcU(X0=%|$t&CM=4VRgum0Ypqz54K z)2A|YC_xtxa>FL_(i*bcC-$e*b(CY(%f@kH&m_K22zzFt_8$5kCx0()pV#d7Co*-v ze9!KN803T+j1Y#q?eBKmWBtnQDf0u}w0RZ=iWAHDtB}u*<(c2e$?Ty?2>y0(cM+jVJ%2kY~h5$P$mtp(#76nTZU3YL2ra<>Gb4||+I-|IE!A*!b5+}L zwDiZJhmAzJDZ?YIpm98nyi2Wj?=y;CDUwxeX%f3UsZ`TE(jEq01eA%7C$+0( zREmyV^kW^RWwQ3o%N_=5W76YdUO!BcbhPW(WnF*!v8|QlI%MNiTi7Mlagez@uM zs(keL!zS-i62&qn&8FXYKX1Z8*t3sGtXFR~#J=72>U1{VtQux{pMU)Jt@v?Qdqw=(e!O1B?_(pWmiLpg@#u_V zafu9j^+sCp*LgqP8a36b^VJN=viC)cI*)dZ$HnNE?7QtHyO-_yC122k znzqev?>n-PQF`jx<>l+|96pDywuh8#(S3xM#OJC^oJaU3cvHY!%-#e(pa~!NTyAW_ z($Q^3f+}>D4zD>V8ez7$Y(NvKIF5T;5U0mjl~d$5j`D@Sub6pD`c2I%z z!h1}!aP`mvNfD>sTg4KU=*TwBP?4N=0+vvl9)bdBzpUcgJ-Ys4h%&~yyyMnxg(GRO zZ`?PJMhjQu*x<`p%>W02gFESsC_Ga#jZm;Os=AvCUxlu8t$KX9^SKet-y(MtFkkxm zspf%d_I(0Nx2Z`pPR}4S_3!(lzfxGrDkFmC)-x!hU#estsJ2)2?p7&PU&tOxBGs#*N!c4A&L153cMUo=`l06?96nU%DRg+?#!1#{26_5h%O$;qqb& z`7Pkr*99_$It+mKt4B2$_8MLb?qbpdR}*=P&J)TUx>bY zWvDLirx4TIy0o+iS0^K=E6P33EBkh}_)A=9r9hluoUmx$?Egcg#84&#oYiGMmVJFb zbaML?pk?53vuNFBbG?qv-0jcOUFe@$B`GFj^tD;S+1?&>zZ@c!nVlryL|$6-TWC3C zH;Ik%^Pjec=v|a2o5zG;u-(+SR%M^KI5=CU&2QoUo8o{_c+aQI&NZd?zw$F87_N=a zF%<^q&-V)a28J>oHmP4eDVAHNTgpeB?VoZ~xXI_s&{aqaJHn3+4{yTaG{ii~?kdF} zEfT-zjxfvw(@C|QF8Mu%b3}!$RRPFvYx~wHr0^o%zp0*EK#%t94AO{U8dn>k;A`Gi z+MiPu_1f-qy6{l<8PE_gsshT9BxV}P@)IdXkf8tE9Zst*$n!U=93$j9m5+D@^KILzs46>7PFh zwlXF4jlhneles{X)@5z$G#Ocpij=Z(e^t=X815g-lqJYw$ksbfL=x?I}3mmNpQ(#QM_-3*ZUHH30S)ZC8qNDT;;e=idSQ&K7=ylbD~Pe=;I;H>`S z4-Npvpmh4vL?9)cOwAtQjF!@njbXm`iYc2T`b@kY4x#{}h6T>TmfEi+w~bL-^0LP~ zgDE1{32#O4K%E9Z-1KweI3jxfKAcqC-rJqD7>#x|FH=aI-g=8lKS?+LJHx$`E-!01 z>>T2NdPP{0O2Io03q)zfT)3Xee5Rbb* z#EQMiNTMPM)<1t6toN`alKU9sjF@i=SXC_q`TD6F`*wUs2@2}sD^n2kHM|JWD=ydy zg!O*5wto9vQ$UiHxxZoQYY@AerQ%ub{zb(&tPT=1Czl*7WZ}ZNpejeKqa9o?PY(+>UswY{$UTGEzVU z{EWC+5gw_(AAARWS7fr_9M7}C_)|Evwv=~w?JnBG3SXPQ#3w+cqfsdO%+5t-ED|1t z?kX&cC^aBE@CbOg6c+T_GAaZd3eK@trmYm(k;)AGa_!ljbNa7Lxhk8qb z&v3yv{N~)#FfM2sbn1p@q*k5hte}c}T&A241OqEKoTi#S=2;fKGn(go&ALfMDl&D` zBnX5|kib-$p+_Z%Im6t+T@$R`0Kf=6Eu%vPAm5>9KfiLHHO)0RjTA5OdqGksI4~`9 z;C1@s4BgfZ;G=m5}>PT~B!c<0poa#txQ z{RB$_YHkfXR%;Asfqjx(6K}%4ei~l@ThnhBZfbWc_{5y2Suef=Vq%A|#}E1m-t}oQV@Aiz2#0@f2bH%%UX^C2=Aeh9c1 z7QmSroN5`8N=RdKz*$6@rRJiETg8(W$AHqAYMyRMD)7+=11i+Zq$gsM%3J`pEePJX z<%^#KCHANCK{g@f_X$LZa?GbXXtgFkn*aS$I!$s0N4gAX!!B-{pQ< z9PTn88|F-A%}>dM8TuVOQ;fj{gd{Li#={*Xet#>TSqm6-4EC~E{Yy~&In^hs`eaPO zL`MVa#fyW7AwBlkyGIprH081@Mkg$%E0Z_y@YGB~pi?TVueZ<3t`ytvS1LUBi{Y;p zj(?S9Z>-5`9bYI+( zCX9)?0sb;gB6$G+k?r%;{}`+D6hbd?M!(9keySNA4#26uk{q}w)Ko@A3i+EI7!L+_ zJ+^F4W}J~c>upE4Vxpq`c8vju%Q)m|3baH^nJC0=6kfatVA4QV8GP{hy`9roYMkA& zBt(eS`+P-xN^$t6e`pB$O8F6d7!*ve1;1+yE!QJWct;fb9`R+Qxy<0JcAIO-0`ET- zY;BT|p|U}xozW~~G4Uy!EQ&<>ZqNt#L>F>XF|m{b5E)b7t<;`{fjHw#@PolTAz(UUBo>cB zi0)HAAT&rat?`M+Ax{F>)#W(e;a>ALmG4<9YBWqvIWbCps^GP}`xn^e`NzMYV-Q3~ z_>CGhk_n(Iz&|Az4bHLgmQ)+q)iZ2$jXH%R?k>gcq(}jq{KL5)oO)K?o1VEm?pqc8 z2R^zm(V2EKF`PDh+qJmJZ7#Ap{)qFZHf{N*c>51gwC*dIkr}MC}W7 zx4Us=sZYfy>2Za9#_s-aPcNjV;fj!N*0eq=)Q9a&GN@dE`i&dDF7Zss{d=2+2c-)I zvvnvp-Q%g>;O$lV@{kt1lEN{Q3dxL;BDtYpqY8v`N0cd`C1=@cZC6Z99BKl;Ab~gw zKFOCIq_Nk4{#^Rq*sB7Y(B*nnwqRIwhdezvrC6cy4Wqe!hO6m1CjHy$iMdA05-eqb z#aaWn6?CB}Psvv~;W?0{JC!e<4MJC^eqcBJPeDMa&H#{`h6#nI^FZU_;Al{yrA!n{ zU#jc;#5Wm8FK4GLrNtKvD5-=>Xq>H(=qq>4asy@af~!9y&?6bW!)#`ZhaPbjaiX#< z62jz=p>k4D5ks=cp=2n{QTCPz;ao+OmA8Sthg1Zn!P8P$=5hTP8os<6mg=6wCXEV3 zls=CP9>_C$Q4`+kMWDo24}I3Nz>j;@^Bt{8x@FOKBd7zitPc)%a(`)V6gp24B_AQ9 zqNt+u#mG$Tk0{mnP^B6JnrwZ-q$5}Y^H~3rT%}R^c{AQk`q64_5E47U$e+VnX-OMgZ=ws#EfolB{) z1ZfQsUj;Bt8ChYITnyu$NUumJMXHa{Mt=h(65S}a^Q~hPk&9b$1E?^4;Cn--Fm`iOkr5U8#wptHA#;8%_^&;DXZr+$pHnTLk1zOI;C%wJ^ zLQYZ|x)F5|kRcV7T|n4JLLm(?Pol)&p3mYaE0&6qP<1hs`9NMk?trVL3tfdo6$anS zG?v<82FFc^_JY|)>^Ny@=;SE2!_;%rM2ddLkm5$X4z-S$+qk5GYOE8Fmu4D?g+lmu z_XJ6NM~kU_WqBD!BHs--NJ+hGWDos4MlNX$1X8sMJ7azA$IxvQMM;JM-9HZ?$AAjt zkA7>+mlyD-_f$MvdL;sUEF_W(cVjI3Onh#rO=@|XgcRFmN_!D4N|MIZ<0pQ#yW&+dr29Q^PKd@w7G_v(m9vUMPm`Ra* zrO0-uR|@Ok2U{u+?ClNFzDzu&UatpzNBOlD|F~y-ciq9B;c#5BX+ZrxBf0}JLvKK) zg&ykFYM)gflT#qUhd@PxmPSwR(mmw!_aIO_O~B_SGh{qG#d0VeVl}-irAx2XcjPFm z7NxVZzEJt(S@N?mcO$N%{b8ByFan|-8AvEp(?1j{6AG_tC!6M>3dC50$RKfAPL9Q? z*vaj7fSw*Zf(u1tJ889s*(G_3Ow7}L$mNEo^GD+8iDYRa4|%3Nd6~GzDb&IaV9Bw{ z50Kt|=gCg$bp9TN4n;W%x&X$Op^}Btu#$sBiyr1EtbAr9{3FCd=dRFnNI`rPPaZ_> zLeE1+v8`h72?!B8cpVYKU^~4LzCW@`%qf{ERPwEoCr~nielY?VRqOV>NmR1|En(0^ z+J_!GKb&gHIb!sSF{Tjkn+KdbL_>>Btw>v%n;lj#bz_2$S?Zo8Nv7EKtjKw{MQ?2* z=hY!2?GzPlo=a-&&)5dJ@{ikkEqajhm*Lfq`iqIkWyFP_twtILC;;Gtkfjps^i&T& z-e9!Ib5ESfa{t47Zg6AenU$GzL)A{ES4`;4Q)4E?K#>lRpxMK{e+uvy2cMz^J{!@1 zFi^WT;s|jYd`whjmK+GnJj%tR+9;ut1HUvy72g@=wxDF%PU!lVQ-M2VFg5)4ve z`JS}-`V9B%6y&rNQWNN1jE1KLBveI$M~T!qWuyGM+pGlJ{IHZ)%gTukY1+b?WyAUx! zq>ZGKHA{<>z=9%H)=Ije<3UqDnlN_4cZ$5E1m=)fRag`x zMKA%vXd@F9QzOG7|3gJEMk8j^BLKZWH9s#Nc(`S%Xs#mGNXa0w2XgBFm=J^jg|HCT z?|vlt_SN87OvyN7jDmsf<_&3P;i{#b6|2Mn)Rl345OIiB5KQY%LrmAD#CFJ;HfGtg(RQ^>8-*zZlbtX7*S` zWND zHUI#Q@PFS0XmLo*<0-v3kAj+Fp&$S(f>-UUSqHp>JG&v~^iomiP#w6Sx8PNW)A;H_ z^=4Gf=+SE9=q^?L!q=(+R693ahptDlpH1WDW60}`O2UIoO9JcvjNI(6M{Tv{iuL~| z?F|z0Ri)LU#lj0b&k2#4Bc6|lzLZkJ5voIDwryVj_`^T_F1`cq8ui>8yY5k z;S0)JTV*9FEwz`FFhp-pPpGrg>2^~>C?P(c&uMAtODe(Uu%X|3$tevyM|sLQ?ZT9b z{353X0lEf#z3vdDl;a3T>F#ci&0z!ZWW{1qu3A?-(Fn6d#Aps0LX{6CUSe{DzaWkh zVn(I)!XegrabkAi@w(a3uZQ*qLocq|J7xZ4mJfIgaN!1!XwO zQ9?<=giBhq1(yorSzd!vu##ju13~LIJ1%rX^ZYqj}r=MPY%rT)rpr@sU5>h;6 zig?U1ts6Iz4I3PkaSSmuv-M>s{*IB(i`}6Zy(1C90x!t zW0;}bizz04v{FpOQ9|T6E*hCfDItX8I9}#uCM)cQAz~_raCBO4Iu>FuopjK&-mw#6 z@X*3b>QxO zy$ut&pYsL>hp2Ksx`)|kv#sG|cVspPoh*1r5Q|G@_pR;zRNYpDDW8DFV z(}_Ujln|4h5EG$@sDKIw(VTK58fC}0h;yW9!0|;(2VaQMVKEa}h{3Tt*P(})EUz)I zcFqN7ossY49Tq?tyu&_sU)LFDd|4DlQ4~3jBZSPKKY#V=)i#^0ATMWEhs9#GrEVQ| zZ(cv&t!~(1>X$pDTwch@$rS~WM5DeG2__mE6AwHcb(QIH2TAJcXnpHnFI;=$S9O2Y z)7@EGIw@`8j4__$@)s@)dcEyWJvFtchc z=X}Ewvss0J%r-XmEfQc+1V_0GtI!YN(7!{EL z29$CU^_NivRv42pYJeDDHgxcX7!AZ6)nDA^fSKKNJe(*(NLHkx4W!rQuU;K zmroiBGC)QITV-*c((V*zh7dAo(j|C_ctzv%S-L-7wc>+?r>75A zmJw|nS8(jH9b2~KwYP`eZjzHjD5U_>&=8Sjlx6Sk-6ahT?qE>XbCkl8Y_$qDi&$Nn zlb4rQT$tZ5h2wbzatR^CX0x@1{oXJN0w0#-OduvBAx6bzD4~deL|N=kDOH#YatMHo zsWV<35+TL_VkV>zli5={I1Gi1R*1=R#egRybq@FK?ip4FElR0Fu-FNcqo#0*yu3WS z-R^KWC=dxaQM4GJEppk5Jqva>ALz372mL{27>zNF>buHZbyO4> zBci8sX;1v$YaMMZ&pq?Rvj4t)`Z*USeA}{bPxHP#cij84OjwK{ipteGc%FvCWOz98 z{Dy{zBvDE!fJ}%4V8mh^R?%h^PM=kA&fIF+1i~_dIsD4u=BZ$PLS~ zmyyDp!rtCqhr?mDT9v0P%d*4au-ol@zMK#v9A^kIz06g-nC6Q4J`w^5Y2XaB zd3RS|TTexG-Jx23(!6hXMOAI=?bc1}R(<^8t>3&S=KZCI7+K~yPWt%c_IKZ%ee=zG zd7l3L@9e<`t%%N?9Py@`>{ndT^xk{*TelL6Mb>38A=zr-Euz426aeNe=PR)m>fN1wl}vdjX)RsL1JbS}c~Wt%K!Gl43*(K$ro@ME*`%jYSPai`{)ZoK1!%nChVWHaxpwWc5#pRWmABiQ-g__jhdTa7?=1g6$!+`+D zxiP8J`dDCC3WOO0;Ku*)#vkzFvo84Pzi++q%0B`De??X87q7o%*4zckSO52?-y-7b z6(6d9`^RTrPpidn%37pgkUaFzp5@EAg$wg%&SU`1OP3CP@=48>Ej6O3L=oz0F~N`| zio8`6)*WzlcC;arxY*P^1xhIaXmf{Z%ZPHYF2sybh#4W*HXQv%v@shQCEkp;e?dmc zuQFSUq`QFxj`fX<(anxz!Fc5ClPjwK@T=bez@Xdp)89YVNppM8{o>`trNz|7h6X3n0c``bVK?cXDKY+hdQhC)T6s4TC_U$>6iuz^q-2B;K-8cInNUt0V7 zy}Xd@fJxy{XP(mG0qEe{{T#%w9r zDH)U9)D92&p}S`rj>9Q1#W+k3ZenKlg5%z4DlvtLkzZ8yf{d5Jk~q zv4nW>m5-XsbHfETTZ$4Hz;GboCE)?$OY|?0g)oe4!f*B{U4HE+uRbRP18I*8TdeHL z>yshoyy><#S8aRu~F^4oF26TdACQL+3_RFcqJEB)_ zr-FE{@YFCg`dZhyyYIjDVR+W5Pn?ijX(gg4Dk$^UZu*C(-n#YVN%JO^r6_I?eQ%Vl z@!JD>`z#X2MDun57gtp1dr>tsZgwyJF%gzI*;D z_r1L0!OANhoFUdYM4sng>Slj@cT;VyKPA2(04X508+*<$+7JK$pk%zO@ko~0l3C2S z2{DH>A_g=&<{spTm{A4Yje^1)goqgZPf6Mzk34gq;n5r0JD+-gvpBi2VOs6*kf(ij zOBpxxqYF>Vx@0sM0df3*=168SCd7<4#EdE;W<(jMj#7vLfI*+{)r~uLw)N*Yg!y$9 k7tNZ6BPiK~m@&2g4`iy77LW$#DgXcg07*qoM6N<$f`?V1!~g&Q diff --git a/doc/en/settings-dialog-account.png b/doc/en/settings-dialog-account.png index 6bf1be59ce2ac0836360177f965ab1901c06873e..852e84833287c5f0bf98e5ead1ee58bc27b52110 100644 GIT binary patch literal 72985 zcmV)+K#0GIP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m_e01m_fl`9S#00007bV*G`2iXG_ z77-T%mh8a*03ZNKL_t(|+U&h~oLyy+K3;Y1()*U~BrJglBmn|R$PR=}1Qo=M#g!Qa z1ym3i7i1Ji$KSY)8w#?oG7gS2I5+|#i-d+u4@Q%}`XRZrn>?^)4Z4yNzXc)*^Gxf~Yr`7ko@dTa;=M=3S=rs|WxQlka%f2t=c3kyGa5?cEMa zt!DY8(kJL9%&$EAP$uh+0f2aNwA-!@OkUmCWDszxw5|;m^1*$)^Kl9+li1>W9vn zU;;!$1iSE1uF81NfFzf5j5y@qxMU}G?`Zdh7PREzXCSlhK|->h==Q>|MtddYxg@V8 z-lhL^Ap#_)pRDcpeFTKb^+!Gk22uh-KzlbGK*cBNK^FoL5!&wn5HQ(){C5Jf7#+w} zY!9CFktaZy+%@|L6xJ`kTlT*5XSoj*M?58JZg_PW3X%R^64egRfq~yvX z5I~?&Twi?jF@P_ZT{a~B8@b4nwUZcp`xl1+hEK#D5`QqSn)uZC7sRJV0Eo#)054SX z@J8EP5+~#CIshdP9WM#Bh>0I_ckpiiB%eX?c_#kAWFhf~5&>H!NIukq!}ya3omEFb zA|k!i?Gq32#Z&i&pBj1b{VPM>lc=o?Qu0n=0Nu(5qZxerT@jMA3U zUM7;JCNY%)l&p}nkpz%tIm66KBb+wTB%ecnZ|*U7ze%AYRS1dVy9wE5pOT}E zO*cY-*ic_RskM6QZj*oaH_A`jwPs+j+}Yh98Iyp}un0|Vu@Cby2DS<>NGmclrvgG!N0`Y3>a6#ID=1sP>xBjBPCyE8Ud#NGg}9mY|66NG{1n-7Kn zflwWaGvFxjO&t1mARGc1yDFU9rQeu&D2SK~Fc$<-M4jFJ<_6|5fD?ZssB9lGmC`ifv3ho>DnOgnZ$1S^?W)6BJ8BBtK!9e@qUoc z14-_Uq@!uWT0nGwg^5jyPlqJLJ4wUsWlkZXZyy#*bRI$CoS7I1Tt#w2s z&mfS$P+|{HItCP*K)V?*06>P+2ND2LZ2XLPV`3Y~{m;Gyg<+%wZ{jO!*tEn84CE5S z_-7&`zLHDFuS45mL;M{R?7jA;YMnt8Xwgxm+#?5LL+MR-hL!As=;O zW=&^zU%708AQuEoh}c_Zf2@Eyh{!wXFPEcSz_xmXs6#^o$`GdBdm|#`0?g%t$WT{L ze>pTk5aa?Jk|8Gm2*YSF3=f#xgx!6EtJZFz6mcLpM$8OgnX%+BRtA`;9noAaD3_x( zueNX5*4@?9*FP{&U94`XuW21uzvskpbv4B>G?wm*7rP&g`uj&0IHwp(8BkXws)cjs zF_xOA*-pk1#3IgSEJ^SwnRKP}e@Q(w-d#eE3`xKQ7+7?Yj4dEaHcoO)9+@UdOUFMV zpD(I~B59&b(vkoJ&)Y^menm^7;*Z!N<&}n*<}J~p0}4V75L8GP#1W~z2dL7Cn3=#M z0Q8r3VsiznFHT(2og~t$SlL$={33zgm5ox#5klx_Aylz)YQ>WZ*puspF}%6RR|aqd zVhLz+(goJZDOZT$K+%|p+6%SMhw-krPgJ_l5d{T;?3`H$mqcZn5Kf12Hnt+4T@~am zi5r2K33ArKQ}j6bWRRvSNoNr>aOH!bR0>~wWy_YW-JLzXiG^&aX=|x}$F6O4wN+sl z4b4?z0Qn#oEQPCIY2Uo9yNh>HU(+_Oe)6uZwbjKaGE^~zibNCy7$BCzX!R>wwruP1 zcCyFBadkDtDB@_6ynI&tXfoB8$yKJ-zjMqeW#sd@T&Wbkw0>(EI3`VC;Gh&^lxzV8 zd+pwmkHSzQoDLq-tZN2iIYf9zgh2p>e7?Q2=ZWPnt$blccV|a`Z;v5^h*dRp4UJ9v zOqn`!-*@abp}8D}E<&-1H<5nJxN2DuTVio6G^)R%gFeqq(Hiv+(niVBQeQmA8fS9$F4NGy*WEci5X5Vi6T7FVhMW< ziBUik;{}tJ#Ka3{yWH+60Z(Pj$Rs%DPLhy)d3BkA9CK)4UyxG9Qh*BTVn<&>UGkxJ z7jf)@l(3h{9bh=OPZ=Q!564lF1b}21W{9aWVpjkaTp^*0Qz*@CWRe766Sm2F5`<^N zVqD-#ik8%d0&R|p5~sirU=qDCU&hZ-@(oIOBV>LoS?flml@a}Lgl`;3JQFOXTLyZo zjBqxKmW^;sh6sccM@zz&C8mf4AInE8vvFv5i9=-Lh@=VPD@ZaaOvu<4Kgqrwu*)DQ z|#-qAZWaO^U^DU3pE z`CY=#E-VungY6wXYd3W8NoGZ9Y(rBRW1ZP;gKIYqtlGc%s5l-Lr;OFrg*EH8EPj01 z$`#8dPH3Ayd&Z>QC$_b=baZyT^6JK?o?fwX)tV{$?l))Vf&1>YOF0aO2V~gC5iulL?t^oJ z#OXAdJ#opfR6K_xC_+(X8sN+)x-dFjhvJ2uqUIp=Hz4WmRgCJ0P)DyM&AVWU6R>5! zR7XpgS$e5LJz;_Y{Tx=~0LO>7(2($U$qZvCdGo_=oSi)*IryWiYd2kyW3 zuH`V2)dB3?R9EF!t=+74virog)|PFZU9Y^l>8WSzPG%ms-`=|pmc!IyL?EiJF05L+ zdGTY;R`20AQAg_HIbl~2 zT_k{<&~TOu*@PtN1eBc&Bu*c|#dERghOjr3Wa=UZ~sG&Jh}3P7012%$b;w2ieIp4>n4nAEXVZ|L*OEfF0ij1y+uRiaU$ zkniam;DcE>cP2kbZR1+nT3cowu;2456W|!vyr`|Yey|jQ2+3re8f4Vzq2!a%kU^2e zl9)$8x4&}fZ(h84YUAXoO$&T?6N4a!&#YLp;<@D~f9QSl=NxE^35|*WjqKNyefB*4 z)KgZkUiJK{mrZ1(t0O5|Oko~?hsS(+l=hY5R4NgtUOk6evFq`}?ZOnXa^1;UWJ-$Q zEo(r`dZJ2Nd5$ij^pT}+2d+4tQibx_u>pBip>g7$3_l0LfhKERNERZf90mbjC*Bzl zU}BUoDQb{cO{B0XmCTG09b8d`$R!ZLx^*vq@e8LPws6L~4xj(sZ-1k&w~wn-`SNmc zz{gK{fBfE0obrMAa?YJO)t&~SD4zBT1T08dhcQNXlaNeF#Dj62BpEUZB$_17IOxEA z7~2To=9_M~_{Tp0fKyI9{=aU%i4o<$ZocW16OSiV)SXn2WPW*dI9wydcY!lMC~guEt<5DLU*($+Z{NrxD6^}BW{^Yv2vu&W`mpi1s(b`OXlqRegz@`7+8m10Gx z7{d*Xa0ycxz~7%;v*Nksr+oN?`EzDO#ys@E{hv7H{U^Np@H0OB@fFW4kBr%8pUJ2F z!zrs*uUfI{Hm_N*p4BVj<}49C+%SF_xx??Eq}bLw!ZG-pZ*{ztmB5J*fbIV(dtz%#)q|f)r;}* zJofjM04Q*UR0Sm|i$f$T^w|w(^fIzU5(o$a;KI=aLI7_5_4Uh_KYi{$T>u0xta$Fm z>#ynS?+3u%zP{_OzWjw1&#{l->Hvu{zvOG&yO0A*q$Kcy1i$Rb#Rrq1Nnn#!N&b{k z&9)gb7^HxWYz#?a#fpoWjcr_BOCYL{iNnVvOT@W1n|8KcS{mMje`S)(pD^1=P{*k` zz*a~Wq<7CehUAqB_U|vO+Nv*%GG|7D81j1G9!gi%tn0ovH3i;f&j=ra! zd}7+vsne$H85_gRn>J3LKI139xU#Cc`sY9XUKp7uGHv6UV+*;Vy}OXl$!3vaKEIWB zvd`p7Ha3b(YfEBgH*M|7=X3Ims*1UeuD++9d}8X zBiXdIC!f!IO?U_ud*d>z!_)sFVzCf(b|t_ub)P-gz5Mbi??3j2Yp;kbf?R$1FF*2u zcW+$3K>$ZjKA)2zO+}FNQ$C19Fn`xYe_nmt()EujAOZ8}mjC+wix1TY`EkXXNi{Rl z-I0ZSzO%b$uS*R##77Pj`2rkdryd)Rh1)wi^QH zWKum{m2Pp4hQ&Eqn@EsVIi(7vP~ZW0I7cA*SQQm2j4|>fLBh?a6jhS$km0Hwl)sW8 zovaW5LL=iF5-}MHi^!HN#sjv0K=Utc$8#+3Lh@4e^F1#|Xa zFnhm`o^-OV@vuYZvn4$C_z!;R zpT9kK;i3~hc*OVagp80+O;o*+Pbb? z`%)N1!pwH%b2(|Nb3rb#)rT$!qbQ6h{`cY^fA@=LefqLXe#*ZIqsZ+fpCeK&o+^z( zzJD+rQJK7~kk5B^^=#a*anT_Q!pMx@Ww+0M{`@O1{n?GzT^Sm4&E=O|ch#j|IQN3) z*0wM-3+E=lk>6bim%`Gq9(LT5h5e=E8n}7FY`(NvG`3dz^ z`;S{#n{VQL1;a)@m+S87DHN-lni?WQ<&ctpBkJnujUp;X6xy#K2=Z0cVOTOoEGjTR=V0_003xj-}1X#|NQ+QUHs2qJulw>uYU2~CLmAql^MB=6-#H30u{)Ae`$`L-Ya^padIA5)zGFnjL2N0%%CfJc@r zK4{K-n}VcY{Pag(`qI}Pdico?pZJkWfAN!ew-+~4 zubg|q*DhMJblDkap8f4_Tqs)066P_%jD+yDmXyO+CSLf^UD(BI6&aUZA34vp&-K)%%sxInxNkSkwFYI(TcZqk7y7tgT%g@iX(*+k6cka6-g zBr^gw;I(Cs=xR;LgEyNzk%sATpHnq#OKRaOV|_jvF{;gRS-pr+7&l*drJHUW76e&!bP_5Yg<>7 zHfaZSwx~lv9akfY%67vn7&pMiPQ4+{;uyPkraH-G{MiI@i#QO_*T3~$W6bYv{`JRB zI{uUoy?e!qWw9On>tF7E$6ov7bA_Yc^`86gy;~rz%(W`k^^CL5sjaDg=h4T8VLATj zzukZD2T%M+byf9e&pL;1;JkSYmOS*gM;=+c=gB|)DS1`P=XoP4O(+! z`|?2~_aGb9Y?zqvqg;SbqBq*^QgXluq9;Caik-J09X5N@V`XRG=Th04}!SR zfv6l?NCcTk3yrz*(x2w@`P0riFBHE_ETk>4 zm{~T)grTXbs{YyK|B=rZ!pNA&gqAWcm&`Q`nP0cMAUi6(CZ~osu z-}mtQ-ha}!F8W$*YCAf%9Xxmc`3Frsc+P(9TQbfaY_UHA|v2ELe+566!vCq6&)3$8c91ETN z+Yf%y+1YvS*=HPm_`GGyo;E}P^xYr+q_ea0ytB_Z`tbS7mo1AEb}DUVKhDvo#E!F3 zaF>Z^$*oC28gPb{VF8mYn5Fk@Y-j{+Eu%-~%?RDAQIjNGyJf@^;qt&*F-DNGf;mLi zniNfJlC(%Z6%$7jMLO0#{|eq*Dq8cCvJ+0W**Wnx5{fG#duvr(Q~-zMwLPG$XbG%^ z>>ns`<}8fN)~#E%wr@V?OBWq5V~(-Ej6!Q6s|sQ#l+OirCxcOBqR^cD@zXwa=DF8h zaq)%cpK;T5mz{a`S3hvlC!&a=h}g_l74x##D4&-*p;y%r9Pl@3iYPgfVlLe<0K$8IO$bMMzAXKv$e1WJkukr%`m!eY4AhkQWwFUsgFl=pU&Y|h-8EkIM$sVU%zE}=P%AyRG!m2`0-%t-(+Rd^& z8;4;j$-T=hQz_r=E<-?~cFL)YUaKG=1_PKYjHTzlhgBePh!dcm1u9FN*Rb1Q`pHmbe1tW5;`M zYHsfC>27RnYHx419R=9ZGVaQ2|D#+k-}ZmMKkuB+-g)m5j;0^``^t0?UHt98eCKC5Mx{V)Iey|%XT+zUMGpxM`6b=iS4XUTQd(Af0ndmhXe3bJOarMdO0>wZ%z zm2UsP|2^;Q&;I$|C4kV<(t7pvzbTbUxBcJ$o_qFZ{(SFZ$r{MabbJNkI0h9TE)JMv zH3taoS}u1a;%0evT$Chu?4k(O?wCh6prtaoCN=5w5Q#6_q#`>iWQ~(5!zI-fPpaxE zsrr#U?7}DG4nM8~@q|)rj|u>w(anNs5fg?tM7A3wge0Y461TpfETMEVcq)r-%cL!D zAHO*a!`5+$g=}feu`#T#Z~5i5|I^ge97e8{ad0p!7J~YQda~^l@$1WB6r0(uo>FsT zV$V4Ils1=iYbXC#+Zs43^4?nFXa_C3Z5{+?Z>fu={oYb?3O&31Jl9 za&zKGPe1CI6B=8_hmm1hO-fWJyV7JhgiGa~2+QRJIJ$ZVn}Zx6+0XFmUx z_n-WU|M}1BZn)}~hTx=+ody7dWqUA4uO*VpMZJAEb6d+vrK(9C`yam;!$pMv03ZNK zL_t)3|1)6Hk-Ifb9bZ5BfVOGPRn4ZZxNwKg}_4-AI>bONvMDFfkLOB^#aqV10{IGeh321y6;Gz09m{u{5o zYRGxz4TafRxMSIy<(d6*OFekbuY>dDOAD z{{DBR!ND7@xtxj3Q$Bp$U4Om(1MQT+r0g z+}YU~@Bicvz4y<5x*aiSYHIH6=#+G>Vgg+Nhf0%D)C1b=DY-&@_c9dG3ZXdNBqm1D zUBgwHGOc7+0+G>4vKT*DcG+c{5|hva4<~kWJwt; zp$ck?zO4xqP1Uk22LWiHY#eYH^Xj^_H{W>0X=i=uxDS6U49y2m`P3&*Kj)@vF4?qc zV;Grr0ytg^$VIsZ^<$XZxY6XOzP_rtuGrjE)3ErJzj#v^gqQ#h4u&-~RYxvb@cgsO z+P8Lb(?;kb%_xdY7@EGmfoGRJGkeDLnwr{j6lsKWPbCV9o74ar6zft_m#Q)o#a@*3 zoD^O{&WMvxFLHxFz}3hbA)Jy301^t(6jv0GxZ;Tv$o4}Wh<%e1S|r8VkjPw+9+D#s zCXwVYt8+Z`~QA1xRj6^vk>pf z7?L!1j5B-gIr;eaf9OZw`wlxz2hEvZE)O0wXO2Ai^S^rG&wl*T!FfOU@x`J@UvyfD{sNR( z3Sf+F=yo;#AmwgQ?15|}1W8RW#z|F9VSSa@*&-0LX%bX}gdZdXk3Mw31`gOj7FG#C zY6+Y{ws-WryrBa|wh>VfK(X%C&ho35KY2@id6zS0oySj{>P=%3_ql+JbBKG4xQeHAZ6Tn zs8l%q6+&Vf>BvYcKrf`$c(m{oJEC+dkhC?>**;7zMYvqB0hS~)2~K^`GW zgFY=tGw~zohEcSVGoWuhGasU3HDd|!&>QrH ze*9%=6;s6ksg(LT>80mrZV|fatURI+W_5zRl1xF}-)+kTh{!DxCh|F{VC9smi}}X- z>cx*fb>G9!EIRa%#6oKIw*G;^rPe}r_YaoK5znfMkH5N@Z*Hhr{OD7EdH9*b4ml*l z%mVZc3_j*|GB8+*?1P*{1y#jdOJnVlN1d$}H$Az{eFM%`clF7gfTtU|T}e0ur42?z zwQ1l;@tb{vgO5M{RD3YodiqP{Y>?YyVsq|m7k<67XJCXN7gsixOZknZ<<~s@*9Oyk z_#Q{dizU@B0Wb`sLZPt7?h|SYc<0^sQ&6a>sf7TEATrcHPskx&yL&`xSQ`n&&2L}y)qnf;*RQ(#l5HK^zWJ};Z)|LG zo$@YhmnWu12soOMGHb!p+9pup^1kLx%{cNzF`ayj8k4Fed8`hAT8YR$fgHAgE+Ulq zI)Bmu$vf}OBCvDzgoGElX=toMiE`ALx8_sw2SS+5Z&Q^D=T03@dz#*~MwBiJN|#w^ z!-EnF13&TR?-%uyUUK7!#Rv!#%{ewEjUp=K^Ly+zv8I4`-u+j=VogmA#uhT7{(-@D zuWo$e@yB8d8Ai}Q7?L($2oQ!*A)lYL`^4IKCqbdQrZ&j2nN>R}MbtkiHNBD$B{HUv z%kPowCGS&Y^aqnCYCEF?Icf+`}G!>CvZIEeZO z247jf@kt9D17+$PC{=oXn(C{uy`$&l^&Q*w*xj-2zDu6JeB;KBPwaKVmk&Otf{wEb z=~|oX>T9buZ`peH{Y#!-wXPIGeSJg!KwnKUx8L5AjyQB~OG{H%_dsXQfEy=C8I#1l zEF~hlSboW+?px<0fpo2kXdD1lKh3Ld_6~^ZGMgc_OJQ77U0rQ)h@G^wH1+fjc69d(wAGi9sI8@b z*qwCs40Lu6WH$-8EDA~4WzV8i3gDPViZA;3miqeI;^r;ehB%nc?tzZ({vjT&J$7l{ zK9Gwj`pL2@{&UqIiUax5*1>PT^GhGx_c%R#E<2>FuPu%rS5H7u81?lJ^!E?c)z(y3 zSLJiLa%8r2^bQV|K@7#s7^aivEx}cCCNnamKCB0LI}CLh1g0EhF9u<&`34AT{2gLCL8fDbcr~(N400*=Q$ydyr$0g#fhrOvDWHJ0##G*8-)qM!e5}l{&SdK{q2@ za806AuQKd8G3FHV4Fi6lRHZ#iS)w4wDLt<4F-dJ5t zv8}n@fQhnp(%#uOSPC=YO&ZL)nqpf^T_sz+wX?5(pqxEbz-#&%hM!cxAzjc= zSFEqCD&%uJI`t!6--oH&wEd+9i;kw6_2B$c5K(<5HwU{A1f!cf$# z%gDwp;Yxv>cuAtWz-Mm1@dnbMS~4Sy?OeJJ6|a{C3Mp@Qgn%dSvRKfmAWu#k)tIM* z(@>3v&VoJPm?^H!1HX!=nub87?1q8>RPr}I-XIN;OCuWTOyr^8i{v9Krjn_I{_*>G zsrz-)7e|5_SKnvgnQMtrkR}sjpmUrO)iM@?3fIW_Ozhf=#WpmsWi4aOnocYG9Z)!Z z!^drurX~5Bkj}cXUXr&LIVFeNB#;oHuBN)KrjS@jfd0X9Z-1$`zl>s7I*VYZ6_nyr zsjsc7t0@)>x%e0c2FpEtgM9;KzHL@9AU#{gTDbt~YO3mM3dMXrcDwr%TV0ay=Fihn z@aFe1I~$wDPx{$Aa-**Rps~KXzP4D*=i@9&e}CAM0LSp#c7t5y%()sbH#B=mqL&Wj z94Y$@ijd&7L!Fn0PZ5|Rib|EGxTx6^Th)_}eGW4-utPCnQIMmrhX z`RNgI)s3=yPw`js$s<%wr|+W=19%`f2f3yzU>>NDz;c^Iz@CiuQY5F2`M@tNNaG)9 z2=q%$Jf&>PP)@5Dp`{@WaXTKNk-V2Gyb%$yG``cLn9(ts8p(79Oft}F*?4&7M`=E! zF$2kRxQ?c*h-xIC&D3?sj@YCraA@x8ZTz5(T)1c#AIa;YE}V+nhQKzUp=e1|>Mvq$ zp5#tt8Csf|bQ*tBl|rY)$WL~QXH&wP206*&f*gh7U*QVyrqx|Y_8Nk;GcXiCDSA5n z@u#nO+hdn_o*cQME`lVL-Nb?-l(o9f(IeuKO#Et|l^oA9jt4qpGA!CQAgjsI#wt1_ zV!00d<633Jq$8EN!Q@UE@_RdZ^0kyojZf5$6$Zlq>@<0j^q3OdBF#CV(B1+b`Y1|> zlZ3h<*KC)(ghaESQ+5QsLl6VK-I`IAOJZ827$7G$v>3gIXc=!blWEVdr9<3cK&eOV}zou)Nu(eV~?O12CFIS5)O#E zc1(%-C$=R3R8421^f*4MATfx6Qq>D=)tZ2{Kuih>kf%Tj$;4!jq7)}cT+BdB#R**9 zlWWZlkN^YQFA&657u_WY;wpV(lR5E@h$sLqYp`AQ2vQ|c`F@Vw;*oYr8iPIgJlMGy zVn&Nkhj;}Ex)9ODTy6o`8^zHzlTJ3Ai`6uEo-D|y&I$ME(-335#R)UFnLa#Jt3mbvLgRA83rme2*9jDqLNb;_LZxqoD8e3|&umu$rpB^*(+F&ei@-Ti zBD0`h?ILYW344DL6)Ty+jz@CZ9`01<44_;n0IA+A6uyE~>XPkb8U5Y*;@j?ZA?fL| zc$B^)4*yi00s5Dir-v&Uq^tr%1UFSjPK|&}eQkX|(>;;sXB<`Uj>qn*%czC$VcBMfFPb}gtN!AIpoH|6SN)-X%`BB#C+aS13km{{<%6l}h%CmT zOb=yGiSgiLN46jrD3IHk{DA0zU{68D@}BsefL+qEsjeW`Vuph zo=Z5X5#-hYqjP4_E6H=+UIgSMe?jP;63P)3N~2{)AA}ORl&|E4kRC#;n%kt7o*UfiC@$H^$R`>@m28?wP1_N18xbHH zV{umm5ZMj}7jL_oQgYa)2S@NbDqx$uQF81YX~7lrU20jdqMko-@F^ZP&EUD4f`tCG zz!bd6bW$aFlj}GG-u!FBEG3tyynaaZI)dC#P?rKGO5X}WC@2zE7EfXpYlGSs<<4#S z0HKn8lI|nO_GFM$o7=7AS;UT6Hq%>n#Px-hVmnmJE-BP>gTc`Cs-mmlv2-6wvItWt zxNN}FQ;M7$jp)YpiW(?6VHPE_Fy_TH2We-tQmB_5?I{*31NrQ7l5+$_03j_XDWNqH zv61MLb7tD0B0oXuVt`WhM!<}$4R{5;slSfoNui-|5@n5VCJ~|g=Zx#FR$~%L=?QX> zBz{ebE+jP<+ku&^$542tiO0++Ejv&{$uYY{g>Ke2`V@;>qRFBaLp~gCN@d+4fK5A# zj!bo8DL+3H0BT3zp%SS-+fKZfx3Xd2)_Z$Er73874 zMk;zUqObrfFI*`|DuyYcXRh7sOFtG+M)r+@w>JpnvY^h_he9RT0O*tPl4@njo3fo{ zp7xUlOGjp*4*vz_ky!BPrS6#AkRg#wRt<%AY5?- zM*?^WS80rEMQ0%PXSoiIdFdy?B?*`{bo8+rpXA+a@j{-hntJ3&Xq#8SKky(>FD-R2 zR*VfX24x1d64C^)QZk;EC^NY^B&wmV7}4!X05KKmG$Tg)jg`u&{ke!?)d;$kew!RM#Q|QEPtSBeup+`xl2nI@dT+)33B#_(lARVWQ_puK=sq1>Rhx@jZ1Z)A~_T# z#qyLc>!TYJ(Ia23L$M7JGp|LHKmP~1p2)-vC$*e=S>|lXqVwjoK?WAlej9=Cu+V)Ah0&g_N z*l+T0g?4d9ioZ)37G?Q!$=(3p`8E85>*!MY|G|Qu^q6V z=F}AYI73$bvStcb)^an1Na0&x%kIn006bP^p`=eQmBX_^9#Yy~SHL`JtstYml61d( zsscjZSy$5H%$#wADj_C6s)|-AKb9pfDvYlXEp`pOiO;O3YE8<5qoFh_ z=`|IdWbl<0KgEwIIdYZ8)D4Dmv4R@GDvXfIgA;k#$Bg7z3e1ulXY4PHy~Q4$Wt^+3 zmvNBhIAo9ilKS2iP%Y&dxQaeM$A)&yv8|1)3~XW&mT^HqPnGpd?ORC9yJL&Mr+m;gMC$5nc8!ewNS`N~R~p7&}gr>{!jDc1+3~hz>?q zsilp(u9f3Su{xgzZf2gpf=EpSCRxnvLLAYzBOKd=?TmR;W6QD)8T*afk2oC(foYtO ztR7XW?jVtB627()bj+?tfb4#b*W!F;?8j7ib_l$avhOwaEh+z*{Nr*rfPBhduT^P? zjZF+2610K6WqiOyB-I^VB#~0+urf(ND$kYSk_*{YF$NjMK!emgWCbM2@H;U-h>X>l z6GT0cWAAm>0ke@tbfa-X!DiZw{Rm^}QtvVMJOlgGTeS;UC+gS`EAi=AZBmLC;6{cS zAd&ay>NbBWANuZ-(1JvD!VxulF??@Kn+Q+i@XGQt<(&1l1Q9~r<%=7qc=;hh^p zEQ9ORToV8U%3z_dJDP@h zHm6@4KM;V1Qn3y|5Cr@v8e>3?GPmp3jq669SZz*^WvsHAEreOep4X zDz1pVbN<&AZE-t3iTY-53}WD7L1$%%#6g0cN2)vr=QX=h7GvE&!@&{SdlLg*oZGZR zL(!1vQxyZUg;zn2Ue;ec6_r%68IqbNS_z%V|9XuS%SiV_-i%Y8MJmR-W}PF+`%Ypc zI`4}pv9c61>KHqJ)+;xhhD!VZn_n<|<6J-^(r(6pnC!}!LEcg!01U)(vTN64^F$eQ zrRD0}DR;_*uJ8y&AmoNs8@u*U93X&X#iY0}Ow8VkgD>NzlE#lYsGjL0TC*SM za@`{Fz~V&cuBQRfo*^?^ahpqgSxjQaGzUgnRoRs%kmETM`{`PeD8)`7WvGdhXhH%a z=bOD*G7}O!@-T`va#lvW#Ii_F=$?pSJhFO|{8C+xjTF3bY)2VPCTE@up&0(d1F^XH zHiOLM@Xo1X>anhdGWg6O2-y0>u3t))8^sAS9w3NX6YfV*0@*H(B)9TWHix-G1u5#I zLcKJ-DWg3CU7qJS5TT2Zei_Q~o^e^A)1*gPcWce3vG>NEOb{Tm) zDV~xfTP^93fP#}#Nm!aByc0Yg;}Ac4)`}Y|)oer#071yu#E*jjy!Zt+YlWgZ0~N0# zTBy0{)g)S>vNVNMw<*h-AV<6?K9~4O(1kY2eFov78;YNElW;*vkf7AD-Bq%}nmm0X z$&?xk>ZtIKt9D3#!xj%j-@F}qin4!E7Mn0^%hDcjjp3MnA~=mgT;vIrI7_S$fzgoe zEmh(>6SInttulpT`Uh*0eiaIK*nYl{U?(?k z3vI?RDIZI2s{^*=_x1&@?T4fcmSQ8F9Ic#p9A7SDzcn1Rxmm+nB$ZWaTJ}beR(_F`e+@bG*EW1&b7FhqOl;e>Cbn(cb~3T8 zi8HZn+qUza`+5Jrs_WFLuHL=ZUK_o5E%dWL&|%Vli<|%dSO8K|NrfejjYi3otr|EQ z-cRsEbU%lkVtbm~2!-RpO>|(M{nFKt#wk(vOHF%%%48kEhiR8@zeuYfu3Pwt;9MeK zE@!=)Xu0P>5iT+wweBd%<^;58qPvtsE78KS6Dj8ukw zaY;EK@u=ELhRdgIPBSINAcuScTpFjA#~>VFV+++kpPK!FQSvt9 zxtdG!^Kj*y9JS{?cT?mLiXfhW@S{Soi64J|>QTLGYRV_Uljjhk^IC<{4Zy`YL*)4_rtFl&el51h?qO76V(gDjQ2|$wAdQ|- zId@Pb1?44VE%Yy!+YQ%F^1z9a@TN!#a1C8V!Yb|?Z=WLO)}cKo9+y>Bu1QC=8R>M#?wPUY33beE({%7TNJT($MYf*eEUTWk*_fzI zKUFc|PF*b@R&wzwY5vlPOj?6G%3w%UofD3MO8j^MRWj$N=IsC@3EY%dJY;*cdW2b` zt_zv;ha~OF1wvPnoH_3H%*;*6;Z;$- zQb_0*>8SLbi~)`g1Csw&^rq zS$+K|dOma*-F@3#AH&%q>e zR;uM6vyk%5LNdQ*TZx#-iZA9TGp(qPmkX?K6!_m-Hr%`$OELpg9_O0FmGJNu!AL}J z8?UUE=8rugR9cClQ;Y%R$yM}*o>leIA8nF*nxoY?e*A?BvD0Z8HzR#lwvq#Y!lxYm7myuGDfy$BIs&`& zKCm35f+$5J;D_Cxq^jJ9#^YBS(4t%VcRt?jPMK&(_*Ps|U=KX##5^MwY=jusJZ_l$g^9Y$7$4bW4y?`+MZ`u7 z=3j_z==Q(4*qCbWWJ(g?!R~5%#w#6?8R_)L#ICEr3`&nxuWy00^_fy)U!Vd7z(dCd3 ztXmeBe@DhR!%_}G+Waz}8B!&ulJGj8%HFVzudJ@Dt|`}S%m1D^{UH=oY!09ADrO(U zVe&i_mTHqZr!=pio~L4)AR!1tfhHl;=>R64a!}=%DTPL%m zL>MLq^NI$Q$V8-UcaJ|*09i=}6fuU&iq&@6fY_X4VN(U&n!Si67P)u2x112A5hNnC ziVGX^&_2B&#o%1Uc+#10l+C9_)SH6R}wCCD3#1wqEaQo3vD^dm0`{n zoBy+xS}8dpUO|~PIn#)QCoMq`XH_6ZP7&T^hUT&2nu!1C&G$>Yb zFaO^at{|4+p~AGNb^pKIbXn>FLz5ixEbu}jzO3yAA-Z%J--zZ0OGJYEh(N?dWJ)cP zoD^fUrVIfhq%$&%F>t4k=yPve&(7ph`d>0$cqRoSH?P-H87&Dto48Cc{rJppbWrJE ziU@JBc9|e?;IV@+BMAP=og~Up1C8(y(E%3%Hwp0Aq-fvc&iL4NL?pvzp}|RlWJ4E@k4uR)`J4>gn!1huRnm*N8f0T6AX)u%zrkr!l~2 zFC+=1`UuKqyK}EBT|JTJjFiDiu;q)DH<%cs!T2GN#dLwEsF3P{^c604SB2iJ)FjG`u8)GiH_8iVw)7GyCfu>Bw5)*@DuQPIsGvX@iMA3CJ_wo8?2CN zUO66F8FZZHcM}20QQ{)8vbv++%K_C)BQfBO*|1w>u?LXcZ17cn4Nb4b-Y&BFE_rLb zrci@xvq+9p#`X4{2BT=J*khC14Q5$|U9e<7N5P??yoFMgsJR#k!HA9zi+knecp;kH z%WvY+PwN}bS^#rcbUtL6TQd>GWU7fp;LnP?Ni;Chm{1jGW3ZFPJL9Cd-~VgNc|AR1WUZsvHM5{H<@Qf(cBehH`H!AvRQJLUFOBxY*|8wx-sPM~%86G&2_J;I0*%%VnP3@Hs1!i8cr5rNI^g`sr$l0DA0D+U$M zM0asTTQEByBZbL2w{mMf309=Ww4nH1{17)K_d)O~X!rR<;;*BAP%aVV1!oCJfyMWN4Ju39oVish}UoY1kOT1C(!od|4nP+crp+l+O`76t>hE$Xo6j%IG zyOVrP5>;U#-7#Z0)>>X;luM*W$RCN<>E%?V5Z_C+ZP>){#zWnG&&eA3v$ z5f#RDKS_bCdsw`IDCETgE6syc`x1>%^fYIlG!(<#D~|B3Wz1$^4akEc~x24$ME zqDnM^mkBdrmfeoT(?U98sW@4%sofaZ$d6?f(0j>?=cmB6c6FX+bol=%smZt42rhB3 z`P8M6dezi$$G2!%CZL-u+kj-}>9CpH?&xSYY{XOq7YT)jOowwkR3~8FC5l->a6fU# z?qfUnjl}VIQNWA9eY4Rx4fy9Y%|l1vh)M_Q@RyX!9KxdYAz|=P2?j7$JZBU~FGB6b9R_w){7n}t_h%^R3 zNi@;ndQI0JQ-mn75RRnU&urg3D{_}W=89pIT1Xkxo_!-ZpoDo2@%)|mz^3rSWwb!- zSplF=>Vb7aecLr0)6rxkAzf2K%pEGuXY~Z8NYRHvZebMuclF;LGYMLw>}_gW{VvWZ zjEG%+_5C0e00l0j`)g}%N1&Vq`8NPJ534$1qikaIvBt;HzK+M|C_r};EGI`di`@pE zlrm+U)}3>uyWR4myO8bYPfzcvru2mXSFTtIIZ$k1a6$R&>Y+RX*T>0mu1|Y?d0S

O@5NWIRB>)(Hx~FTtxutSYT2f*fNfr?k7ZEGx^bvs_=ol7e= z@)s?fNwpF&;ek4S|JR0>>T>u9ZAmIpiKRCsDeeB69(smkmzYD|0gH*mpxIPF!beBm zaD%1+SE5 z@9%GxR_AN%opalZU+t;V2OxT0hBjzN2c9jRO#6SZlb%*c%WNl97lDC7pb9p+V1TZ6 z%fWkj{?&!Lb`IaQG99q8Iz$L2#x;nw$OyaAOKzXRJ2SxV!AAM(j%|=QzK`D@&&>QT zb2R6A-FI)_TRw54wN*Z+6Y_bT??t?|?Yn*gP4~eDFDHpmupxbzQ=eyZ;soBtqhN=1 zIwQyX{JK7`gU?$o?>hqD4`8M_?}v65?dt@JSb9E#)4GJsK z5;G~-?JsEC+EsGJWFb%c96LqIuG5&AjK%6R01`ttAt05wggvVkgXtf@^>V*05fN z4^@T&Vw9Y(IFUQoQ8PTbQB=fnz6w@>joa@Omaba%X*qZO34PcxI#EK?&FV;uuac#KfcZvyPvstNQ?`U z+V<%rvhDY!8rnE%b_$xwS@up~xn(jPH4u222ybs^Oi>3;7%vqBv>XJ;q z8cW6c0Q0~M!u9I{R5zQda)X!|I;rpoZMU-7?f}jB2E6|>lT1XC4kr#q{yUs)HFXvV zWW!+U7F#*ChME)T_xg^1UnDAb!l){ufs=KJW6JSA@VR&0AgQXUu(00)``wF-0zQZ% z%-xm-aFZfqhozAZ40wu2dV>80aQ&f}QB#uYfS_uctd_H~8~=Oo9)f&-EiyQ;!qX6V z9^nJNZr-;+dz(Iyb~>DQsyJDjUB>fX-)YX5csedl&(1Qz%qEGERp~3fNxar>IRd03P4${RavDK!2gL(JDE^KM9pkG z{3t23q(p}g2{6P4TclngA#}pXFDX-UF1Xh__!kF(!ID_NFcGb|q<|G)v`itPM#;;+6X{{3iR;at&dXU>n!tcFk?HT-(xEuIwtzS$sY3Xx+wbO> zKq0e*a0*am&>w~>V#-3)ZVKn;Z*6uogGrS7`r6uHEC9f7cyMrVV-onp$F%9=x)vAb zR5AyCY@{bN@-M?GDkW1FA!VoW0bN%gmrdy(ZmZS#^%;#Guim~-*&#^0_SYso9}$eR zz%1B-(Uz5d;)3HmuM(eeQvk=~f!qDo+B$pJ&BmR@JO0ev#@beQd24GaFlU9orkMQI zMA!$6P}XYwB?fot`ROrz1R$^;40G#*56)>+FcSRv`57M@mE0TQyoyi+8T@L1@y>WK zfiJ~v*v#O~4QY7N`9g)BM+JA4xlxb$S??5siSTK)yqo*!NC$aZ?s~RNQ~>YUh%wsh-=Xy zXIvR<7=;HIwdCUt7lZE8-*UAP{PiX4@(Kz90txtA>~l_Zb>HrL65E6v-Odmcf{LEV z#vGjl1)1Pa!h!-Sns8d}J50&rSgWFnSe&fK03C;#&~%tz{!Rb@%s+AWo)={L-53CF z28^TuzqbNKxfl``RKNO9^h{`9 zzVFv@d1pea=mXo|JOL-ym(s0bGiE%Y4nM+@d(}=pasMnUI#J4 z6!j(ph}>_7KK|eN!Ud!rrKx;wKR*+~$tr(Gr9-eBi0Y1j8GeB4wdWD}NNN5&CG3s_ zXG9-vONSS|lL<4K?kDJ2LT5Wsur<_DNv<@6C5QYktiaG)2pNMwhkYm0_a^Qx2L`D+; zD&gFRBGBSp7Ruk}Ig7s22lUS?9Ma+Eg#O=f+=M+hI^P{WxZns@P5T=Z!05I7=fiQF z-}mUUp2zKS&t02l7Aoc*UHmBPt&de6F4}iG>ATW8YF#gT1W7;nd#XKm zeXDgp3ms_PrB4TSfBV#E1cjUt<+XNWXWHMq-th%#Fmqk|7|Gt;I9<+bK`wQF+--SX zf388x6VFN9oxb;(@ijahvcAjb-Cpe0q3#4vsT7FRM<`DXF z_k-c^k^0Xowzk^3bAcL*V{tn*bf-JpNxObUZrxX2El)MI<3K>K0!R=KARb2F$KU<@ZQedr)oFYZ{@2SOO-@blD!axMAURgHMuB%94RwFLe#S?6NBlO%y*7Arj)wh$&lrk^Vd)dyL)9h z{gT?@xn*RCPt^yW6IRf0vr*S|do?VQCxt4I zY9=Z+QmQ`&X}EfEP}`Xd#Nc8SArXEVQ>F&i8}Qj$dj+-X(3epixMFW>P=dD+iHo?f z(uqta;@MVJ+Lo2$(5C2XZ3EL{a|{*S#K@qG#c0gYA{QT%N_fBL;Ecx<%NLgQeTRLa z9uDqIS;QR+6D4E?iA>Y6QnvbNp-1D>WI{`nn4ASoW&IBm(I{bmflabR!n&HAJh)ql z`4gx7^m%=c40U{I7O6e&D!U<8p}I(>2E(p(mZT-D?6p##fet&d$Vl`9gLWp5+^)U` zNyp{WL+Q7NAKIeEB|!`Nopvh=gx}4Z=9K=qzJ-F)3pj*plk8xr@i1ARD&DwT|JIOd zzL`Da{$pWDpkGz9UgzrKram0JnPq8(`(B_(w|cqA+!KP~fDu|O!+n7p)mL5^sIFv^;iBRxJ`ky=5pCm@my$foGo^P&4j0bK99=JB9 zZPalwA$9qYGBs_{U7?+sbHnHTL&rjNiU7kqswd3g>023K9={&9Twi>E8^aw;~F z3VacwjD52s&I&egjR@Ki1X2}(Bx(H6vLe4eKl8^jnPvHTPNdRm(EtzMa0PC}ph_#N330NU;CgYKVUjpzWa$X}4AO~=& zuQ_!`7RMrvg*&G-2Y*1`T{C6?;ezorXpU@{1S1E+Tt0#VXo`GL@6imj`uYU$+up)V zrei}b^)}XC9ky*ce^$Z)j$#Y+z#0VqS0f-EcdT{2En&k7_JD~6c`Nu=&B7{MJtIMv z`Uq70FD{SEKbqRee~5pG#tW~M()C#TSR@0zkdW^GQQHz@!`-qw6>+e2(U+uySm`Jc zp1`Q83Q-En((o@RI3OQ7{4QV=N+EXZpo1wj5qJIn=c3}OR|1OJ>ML@%Y{eLZRWr?0mp$J8B1gfIq$lzs(M}8;QB1}bN zc$6c@6@?U1&qnRzA(FQLwHa!eMIY@d59=-=U0JL5ZH<_eMObt|v1~(AMK@ZSCA2t_ ztrQyg6&;-TZGL%6>-~E6miY%ZE_m}vAl7cv=4c!%rLj(hkI_K17o3Tw8 zcATLjL|rs-yn3A5+OZ+1?PG7_C0Mc6XlrWz^4RM=ogo(F^3ykYlo7^9-lg#?DToP-Yt2?e}PMa z0yI)r+fLV|OOY~VL*s|&hGpI-HpiFq@l02zXpP*#l;|0cZux@}LSX?3F~0PUtG9Dlac zXFPM6)Dj=l<-zHi-JNP~lx(eKvt0!N)Y+}a{Y3g;GhH*|19|Mp=6yT1JDPeuQxEIw z=Vm8ZZ!|ebmiHL>?shGgpgm{4(0y07|NBk$di8>oR+G+uJB={DZNBX@d6iWkqy-9C zy6Dz)Db*=SCJv?@u7_6!!Z}8gz^q^R0$EY#C8QQf4pr&C;I(&{1n_6)at;HuT+Dm| z$zf;6Ghb-n1?(t&2m;v|o-34aFuchQ03Zv5^*Q}~(g;EB+g_&Ub+cB#Hb}aV1L4|; zJ7EV>HJ#$~N-Lv4fwQ(`Vt78o03c$}|9r8amzzbCETD)H zAd2)MrayOD+PbT3M`VLG*ejmLie*PS2PHP2t)b~Qy{#TM+sb@^2{phm;RE<%gkQq# zD3nc2LjuAFn5;BaA=;kA^Eda7o*W}oZiPnfL;89GG2;_$tWx(U#B|@6Vjdx#&Kh-q zrBPPkpcY(CF#mE(Yd1r8JJZ2P7?TP9NsSgDvQ}9d+fjXyy&5g#J`2;!uazb{g(I%|Ma$&T)qaEkwsis|SruGK2l*dN} zvor*uxQr&!BvGjsgMt2F$OQ)sL}xEq-H22k+~l1jU1>O-&yD)el-Q8I<861m9);}d z`R3Cc#lTf!oObS(df)UptL7BwuN z{lk3bB2?crmaJ1Q!&xnMe!9fL+69>87@?biT5uXRNK_F);fTd?I^Fdcanv!*9a5!F zl@2ZwLT*lvoJ^{0pu4@J0tn2r-gz*)fq%RJ(VhNeAT%f&w=i? z*YZ`(HPXvAXHA+0jRuAqYT4)q%^EUl6HOPcQEE31GiH($3k4_{shrFFM-UdRe0j5r z_wB|wVNN*}l`ja$sAWQJODzH_OrV70T~5;mJsJ}^?Su7{37GPQ{6^gojiE!EaaXh)nV z<4zazgEcUxatIdK9Zw55O{Qe<4#%)C>Tvw4Div;o5grmuXTcZu-JPRy65)W{H|3+ElCR!X zWltUpjti$@JuNQ5Y%z6r$q!oF{V8|0uY7?%wWr z!rCFk5>jkZAoDF$4TDiO&57ezE6yN6hW08}n;MoXOZ!DPT@QOVC?F9ChYnxJJv!tPxH}bL3sIguWlmvb@3Y2Puf240Ly^( zmy&$gG2Kh_=H`a4>H0Z9cv#CPl{#CeTfb+1=?90ed-9@|lx%m;Cl1-^azMKWlV3mm9BA-c#de!P81|ZX;s)gfvncg!ey_W<$4XOg zmY!g|#s((e50Cd4tF#`iyVI+l=_`KEd}D;?ISrGsE*6FHdqjS}6`p-HVa zFZWl7U=1(O%g3c@eqUDimtc0S)}DC#z2`}OG1mxsv|eH>wV@a+_G+s*-{qR@cazCG z6Pi{u*!Zj*DpYA$m^@y|`pZ(Dzwe*zJyW@S4NmXVKrT_!&*N(^x17%$2DM4o>PBwY zyIcmZ#C=PCzs{lKUQ_7lHZs|MwvZN6p@Ie^>zsOWGFI7y126c+-;cXzhj2jTqet&g z008*I!`oG>*F94sOa|B)8@#_B^p!|7Ha@;e$m!7T=f=?E`@UL0l1Q}1+_Kn=+fL2i zUoWJ94k@?^r>7lH?an42pjN&rCjM3SPo1WrqduPHDa0G-F?Zc(B!@DDF;8e_tynKVkltR$#lHuehv~IUwAeU zF=6xhazjfmfTk`*UG0v>=29jsMda)4Jnch`BCj9e+xmWB#HER4&B zV6)Qn{YSBU^jW=DLq%oOg0(_f{F&b?Gx3S6?SZQ2`Riw;I_=w4r3abdl!N2dm5Wx^{ite)=^i1U{7-i(FhFpoA)wXQxi&9vcs1&So>7)XHssxfs%%oux3 z(L-{!7iT)3L;Rq1%jY9fl^qjK6y&?>Do^7e+AO)}(FHmAPjmiXA{1_!9XIQ&Sx<4^ zW@m2Wcn?)AmY4|{w*z{2Jo}oJE%@K6HCn8I-rp=E=;X4)sS+j>R?X?MsFIS4cXK4f z$S#VbDL(e(1#1ouGg}}*p~`3`NeV2Rb~`hqVNaldJ}!~1c8{3-zxObuMn5~TV0RT( zxT^YBm4`J`yS#6$vs@XXg%Zgavbl}evRpq}Zpoj2$dxTtIOc`)Z_o%;vh9i^er4pO z{A;L^tK@TVmk%4E)K+ZH#1!?(&BegjDi$on7)H8o;m6blB$CzY%hjb%zPs8qLZpAs z29IOP?Q;;PP~&A9`WS9;`F!j&Hld}OXry|iraGRj=)LDtLOt7>X&xE&MJyR4h%z_N zcABgl-j`~o%67Wui&nalXJ1PL*U19Jh1mqLbPZeY{l;rBv(Fm>HQDvL-%Z<#GS9TE zyW86rFL&sW^Ja_3XP6VFRvZ@^u%t!Ld}(YqYu$T!%Huive@G@p;z06>4+ zKT&$F#b@}I6e{^$1n)=>B{Vuc-T8Xy_}=hm+$r;SVT6>))w)rs22!*6=2!nptNsDE z%Ts%b^zj7N{^6xrlocV7>rf!@aO8{j8DBr%2K?B1H=oYS+Q#4XnjHJPf(;jWM2{g2 z)x~SDJym@zkN5C3Ao%X~#dUBQu~eU+rlZ5NmB(>%Rc#d%7RQiT99(%;;Qo< z%q%Vz9YeS4t^a@P?~tmw{Pg>!hBl;deIXg`+utA24m`iT5|*BV&sVMBdMx?i;N%LQ z$%%EutyqQj#yRCf(a1+#4vXMXnl=5ZdNwQ2M^|B9c!A=^FO?jo;#ldP070yfk&3E3 z64h>@EJ1=ys1+J0@Gl@*<|caG>TIfL3&?#t)jI{ zv8P0GKfv9khXD7lI&T0nP7FninD!~v_#snMjgYE>XnRZnbeqb>6$yhaNSI~KXncVv zksb)E;|@&!FT7z%GDAB%`3RAT6vX!%#OJ8kQgIbCcu2TVgP8O8TRbgVNFXI7(y_-L zsU|5>#Y&n0fST0#IA3SKPX@fEBP$GZ|53T~W6(JY_$>$Nw7J-MP+BFI z{^JkH1n>aW31P>W2lqY)yzvH{7_DkGDm1yfxwhM8q-%S9T8zSu3e#I!We6f@ggY37 zyIpsJen2qbGxZS@paOH!%Jp@0RH>YIv_mGV`Wt!3&nR^++GBGmb}{is6uDtNI6y&a zIO1s+|0>NCQgjiwqBtuf&h+}*Xo=saX5nPQ5T$rFbH)jTit|A`%Xd?^$VMwzr_+=0 z$GAjbnQ$uJ^t}$ccW60=6r!T53QiC#=d%EjCB9Y{=fE`G!1n&XB)p#?$~osXRguQC zxi(%6UtFhhksgJBgan6#R1qC(YvVkr5&BOz1r470ZG5p=m4=Szk8_dl zvA8>oNmyQ6bf%8)5qSmqpAw0tWXbBq+eXCBXs6`o*FdB_E*JOI3L8hr|1}rR>-iwi z3i96)@U(16%<6p2h{y2Yc&~JZkO=snzN<#X83du6Rc>uV5b}9`SjizhwY}XV2-c*) z^j|ARa&@PlI#kOoRMaA=c){_99I2vuW60rSx0wND2GhM-Mx(@$eRZ_cnZh5uy1F?4 z02U)Aq6r01l-g0=Ki{u51cqIXvn*T-L*a5%yEG=jr*$lQeopne3^ zF4XZ`)PQr!dM>2Z!jOq^+DYZ)ON=PHsDRBbSm&=Np-Qh6WC0fsmNb%@$mrq%qBKi; z12R`miz2X?(*V!3FuedWGyw1`J>Byv6866i1)5Jr5-T14%%(iq^VBX{@@{4lA%qF6 z6fWR&@#xfU$t8>)fX5cXmMg~(TJ(%D<5k|_S7XH1(DsCx<{s0UHvTgX;JMq57FcP< z7{QIkh+3Vv#|tP#p=4d4pfL+GnQS?jIg$F0`^kWY4HTeR0r*XC27j%oVx7ojJXG6r zS>M)uCuC5wj(31#{w061`>a*f(4*cK=yDJ-EBOj3BaH4LvdY?X;_Jk;=ZX<&h ziGh5r5mAAokjs6VKeJQ+dWm|xW;j>tVZRI-llth*&GC8b@vy(HLEKHK{aT=i!S6ob ziD(##e7C*|6dmUhaR$DKE5RONGXT2ipn}xg*`zw(Vg5*|{9`X97}zL{Ava0tFeZzo zGCA4F$tjVL!e+JJ?cyfDqpb}HuUh-EuyA%KqhYMc)*#(_rdF|r;E4W!!=kYGURdrS zHPy{U?c+>-_j!+l4HQ6Xdo&hme1>KDzaM5dAX?0B_ok0F+dZm9$JyZczJ=)30e}LM z^_6I(bzc?Ztd(c}H?Qw2ec#V{zSW-R>)5l^u#(d!O=($K#9P>+@}CT&?co=5U_((>3Q>9s^Ll&yacgjKjS|y2W!l>D{XB zd5000Dc$bXWG;;+;70ig4d`uWrRjJ+Y5cw0;AAH6_c(Zr%XUpEr%}RW%qPG7a;~q= zpdSsK)&%7=x$G{C#q!CB#$`PH1f>CLdbjr^S!vnV$2cE#di{+~1Dn>elgV{A{SL>` z{{~%24mT_xc{x)*A7K=>u61|cx@XLC?hX6VoX-&^4wwSBgZ$tjE7_MXfdQoxLsbo|6N=!e~_R?Tqdmnxv-Rz zJNwzK_v8UHNJ(FNm!pCpR65TF`^1)+KEcCk8Cr`PB&j>SN%g<8^@93NTsZaAr<6+r z1_76?)AP|1oqVfIvC#5%Oq1_8rLOayq7uQk8w3E**Z0$YWyNXMAOk^$HqTcpboCDW zzK|xH6Z+}<`+91<)mFsiZFw(EqIegd8w`*vMJ_x0pWvEW4$o9RAqaRug)0o!7(BG~ zYk&=5_V@3V1o*So`M_GHIBw_mC@B;2dcOQwQA$Zq+uvK9A&4b8Ja*Tsob_yH^~tRi zlS9)J4$B_eIox%8RBMnq8zDrfD%&Eq+R&vzjnHbg47rNt3Y4K>$9h1GSTJT9GrkiN zmnPs%NXkjc{@A&Rh(Z(9B*%y{nFt4I<6ONW$W_XSHo#gZra=rrrxI3O7O?On;>+MI zR6VcLoBiC*_+`?!Vt_tT`SkC;bI_VGoi<(^;mW1cOThdW6Gmgm@vD?myJ_iyy@I8< z67)c2sqTAhsXU&E=2KtWiz_~fUT0>4vCs!q<7ku3cqr-~0Z*OR%}l}*PE^S$I}{SX z`)_stQKwNU?sBa?p4ZdFsGAr<3#2_|l?2e=!Xa3uIyP1vz?ASr)-3%@Fsa?N)ph=y zD6M+ii5z}r+C&=nGu(1Axtv)ZkAH)o>+WP1tbU%q2^N!92cy;g>gHe9=Lcw%5AX5c z;1^{^urRblBrFcvuLqdi{jDr6r)T~3_owKUhjIBl+VDmK7fM<;>?-FIWKM61y#Kmo z^xEnxjyj6N=bTw)uRBmu zr2&G2YIagmQh8;F*sGRZvq~q({SET-b8jLp3KcOF%$esw0-XY6MQBXByGdyuV4#tR zs^9Yc^~sI9D}K-9l8*lhOn}PTDq;?YS9Mi+3TtG4-)}4m4C%Gt<~&ZTT%p~Exn#Jz zdmWuky~jnAWM>y+!+^Aoi&yew=yWMjKp`Q;U)F8_}o-FBt+`{)m`jc%8I*N2&HFC$O4Tuz@v zDNO~+ocHIe0XZD}&8|=Fpn^EOH9PcJY{p+S%wT}{gfHul6JiFs=s`nbssaTAXRS@M zys5MK#{IvFK?G!*&G-!vb(d(Uz;X+AON{MWIj&b#r(K0y6B(?srHiWTR=1wX*>a`0 zJnl2Ajki7D-TPZz@7LYj9-nV6_4UeQ2@4@`n4yUHchscafeS!;{UxdG?uNzp`^(Mk zec_O-R=0J6tnahh-c;9c`}4`?{hDe>f%oHJA4=iyHNUs(M~CwA$4!jt3Pn|yi)74r z+Eg=~-zbqrkYJDB^wgBDCq`nec1MHPG~YYYpuD@=n!3I>B7g(MZ}LeSlquuleGwM~ zaPIf^)m6@nL?C-I*F4N{u1-w;Ot@5~nUt8w7Rm z+YCHvPjj!0ySq6Oi5GLtVT(Sx7BLHQn?+1ifE^*BPCo%6!FZGe-RV5;pyUld4(}Ia z01;5TJ|Rvu+27mCWVKo=l1%#hmm_w+%F)Wsz}wqfLt|a7T1!j0?vYT-O-Wf9I6@p8 z98@&4l|pe9Z|}}W%Kl$@K2Ls=nXCwih@R)w2J*Q)RA}`qEA2FP8-Hhe{CfWU>3w?? z-uCr+X*8Q2OTYn+-)cg?ZpD~sDv#Uf#-9L*aI1B6bCVaS(${MgQe9{WR4dtTHu=te zPx=nmXg8Rgx47BD0BsuTQ zIn{S0BUh~UbhgA-;gt0c%o7+QNeY~$xw$z2z}6OVsG>%%%kpw9?`SHA+iWVk*~(9= z`3&m4Fd`xXm{vJ8IjQ^CK7X;jAwv`3Z!upIL%>Txb^7n?6Dlz=k?-SXaD04OpJBVs zp#S4F?`p02{p0n1zEqwDtzKqeNUqJ}{-|8J6sUn^#>fA%SzCxK3I%Ekguo3wLQ=Sk zE;qIPRpAC6GME8?)m2Tk*QuNipiz>Mkxsis zMt+*Ze&@F+EKsZl0VMtGd4IXxhe9H_T5ly}wEzb-sNGGa|8oAG(j zOHzq7Lc-s;|5~_}82yCe=l25$=;_(c3TI?w001FE`3jT(fTpJAlXy-}PPJYp-jud} ztF4WU%y$?Pq4(>d`jZq3J3ADBC_#d{_{PD(0k}Q4y1W|A{5EQIS8{p16e`7tke8-^ zE9R^Z&}DN2kI9zN9X8WRy}H-5=B~oNeT=DQ^?<7@y`VR@9@oRU7s>jN0*?Pty-uHP zvg*2vKd!44Hsy2ixzo8&I-Oij`0=ps=Hn%H@!|9?PUxp)Q#*d10lx*T#+T=-<#alC z7yt%^!F6zW_;|6(93y6=YQ)FKS1kXOWe1c>sxoGm_&BF_u$W}U<6?Vo3+|6&2uM>#n;FIO8| zZPx49xA9iW6#G+X)LX2UuR5-~ApqVt|H6QEShavfM%49vIBnLNR#sLLle8L)%O%J% zIe@;=oyKVlE>2F_^k00OoUi;{;Ej9)+^!pYgAV~Ve{Sc%6&lv21v%Z_;z%e93ScW-x;Dcm{aYMVO<&b_P{TuVJIdIaK%aqvTm65m zLAAetVoa5rsYA>-MKIu|tf69k5u|RWznW!bnnZZ};EaWryLI(-*zU(LV&nf~>nwxf zdZITyNN^8@!QI_0xVw9BcXxM!J7Mo{YyVYSTTAhQ8fs?l^mLy- z=RMEc_fjiJGwUHiWA0VVCDp3gUu*K$GKuGDGLwr`U0q(d?^=|*cc(J7NTpFrBJ?p>Ue zUZQjBz%|P05P_V=LA8NyCS%8gdFV~OKh2Xz8 zQnobtYkQ&B0gWCg%aAaN5TsnLj6i7y^0h+$djj%Rtz7%n>Ml5f=+7yo)ao;(S6Uhq z|CO&MMT><54g*AlB`u|4`k$774|)ByKyf8{LtLspFr+@BzK&>XVM3=+6^oZ9Swi@f zW4X;iC!vlGj@j-Za<{MIkPvOqTU>JcI54H;{Mu;IgK8^t9iFzcamcH3 zXPADUZN0iV;lI9CXAr;uq4!sAB%(i$cl>IpSB$CXB35YyGbtLJ@d)uL>tES-{gb0x zyN!;+qpzGF^@ZetnT#GU@uE4A-d@`UkDFT;@*|CiTMY)XX;{!{Y<4?!qPGjU_rpw| zY1I$2v(|EJDMM*QOO-dfyv2*>G``~z1-d+7gNTx(GB~Ub_s^9ptI(6xa=q_Zr(TMk zyJ(f(-`+_zLvml+X*k_@4+^_zUmxJ6h852u4~0T17@l4p;J(S@MJ@Dw(i0TiTt_Xg zTx)>R(df4lp)1HV{v%Aukh~2XjEF2=si@cPu+g_6%#e^L1p_i~SY7W}2htO6>P(um z(_u15JGbY&&)8!}?acFA$Qq8JW&Q@K-t8Yq;)wo4mVkCz>gVUj1)K%XtqqUn$iteN z3M)27ur50-fpNuoF9{^c+JLIVju8+HYX)&sIwm=B6%^4Md16KSTSqx3?b5 z>)a0tn=><^CI)9w91=%|@f@&hZ1m$s6=^2bW6=ODdKb+oxePn@GtNaM5RrtR09AsN zP64wA0lx2JTbDEerzZ+8EP5k2Oq~QX%(s?-hLcbe%ph&XQ^=OJlbhYYkx4Er;_Q@n z+$uvNDpeJ(OPf2BJ2mEQ$!>}e2&N~pz=ib%`GUYhPBfL=9N$8|z-?%6yone}jtI~G z7nXL8CCBPIM$IMX!7=G8${=@)N9P1t%sD%Kbr)r-Mv;-U2?~>6!Ge#e1+0*Hl2vF@ zWF+ZW24EDBFHa3)hv1YIE57gOxlEG!?#2EtIU1bRiB0HFGE%e;8}!goMl$yjj`|Tz zCI8-^K_T3PLcvFpnS)HkpoMws5@e~#+$GHYV%+;jYMQkP6>H`M(}YdKeT#TZI8jXU ze)#l1q6n0w3H2;PEGIwe8*oX7(lRr>`!TrM+<;5pHNlNGYO(Ho{=Mj&yps(HLZVAC zVLjDgka$t=EkG!dM^Y9y6K2yL!9iZ_$b5ylFi}g(!-`ha?+inV`qP;|u;VBkmMaDn$P;y;o{A&dgw%J|YEs`xIM7A+l| zJ;kDteSG)HbWle^DUeq7MfC@=+FnxTfZ^mwo1JpbwY}G<Hhhad9g6|^Na%0-4nZ@% za<*)y`WW|NEAT_DYK{r30_Ua#F`@#iQ-U+LJaX9)EEkabIBh)>2Xd|aa2~CnoIR@u zYQL4=KWA!i$q)piR2WJ9d{5_{YRR~{>YpnfA-kZ9dqD_vOyWNCc=@ci^>fP?#@5za z@Rz1;)$$r8I7%3}tWY6F>!MY63A3)A>rYtGK4lyQ=J)u4ghGDZ%I89JimT#u=EB>% zr-cNTA>?MPxVJ1*h}RL2f)9Jeic-t@Htm9o3q~Hz0)3VimC4_FZc$H8Jmr>qC=2O*6u%vU*#F`>jJjWyHZOjU`$1mTjdYHDWd=5ej75VL(`=XfEfggqF-Rrt6 zTFOSSls>7x%u0B}C3buN^9!tjukt=MX1GK=G}zAo48q(A+WTGRb=T{tLt0T2U+$-t zY5+EwbU}ZRkVv~hghSjbv%i4^2@HSb>Uii6Bkk(CG`N5Pf$TFuzSEXBmm9oRtS4>G z1W|i|A!_ETMctZ7WNswze=1Z9nPrT^e_K9Al`mQ3@OfY!AMKqN2uy$#GUUtVr)J~d zq0XcWzTk+%jM)av3%w6JS|&NfOeXeROTj(0(@YQ)4yp)*NRZ31O6qeC3C8!>BYjrP zb5uaZaHAfJcqzZA4rFU;SFBXMNe)S*!iJ^WXN(?jCxrTj?{{0p@Vlm|vy&&lT5r|S zan|+XpJq9G&?4&Xb?J}zhIQ)Ul3(VtN8!+l#Psu)^9)tCjjw>zpR&@R5a7wDivfR{ zAv#}$&DkkP0RY%zWvTJPpx`kz9M@BsBli-Pn)TMqH|u=hpw9=4FcIiphuDCQP!jX_ zMEEuCFe7MXD5UbmLkNw-u9?&8%ijuzAcg>F+~FPQK?sI#-@o^bl=8vUOzMcS+OE$m zHOI;9WF;iPgX~>h&A6lm|J|NjH|kc`{c6s)Xw446GV&9G2uuVjIiOopmH3{NTVRU~ z2jQIPFG6+oa3eoFqXbe|lOHzWnL674!r5_4OjqmBd*d3uz%3lTQDvV>My*3(eJmR+!P1Z9L6 znGQQShKVxB$a-J7nVMqt34Hhh5JFg-#93h>#b(FL+4~x-lVhE>_Rlu)sEb7#;660` z(Vsz}2vJmDLIDC8HqL3V^K;`r!R=kL=H{KB-e+GBY8>_kzt948gowEK-_6eQ=^34N zS21yMHQP9#Bn?LODgX684TF68Bkd+zvy#EEu6!s8Z!K5wokA8DcuZF=8p^Fj^hW_F zzSuVi;8fWz@AgrtO7n`@6hI9o!>G+*ISu*7kM*F@k?nG71jqbgty zZ&2qLiuRNzdFr@zQXA8{=j`r%tKFgsy`gx4wg6l0g zX*)gdS6iKyfV#WV$L(?*hhXD7khVD9@;Xs$HUWO$|88RV1tB&z_G$oIPo2^|l90Ek z1dHzTr%#^>QQsD|?7W{3Qifu_R{tjnA}ZkZ^c2p2k^7zN+WU7*^dGb?J)en2XBw5u z_sDVY&qG^^WeLifKjM0_u++yhXM5Tts8Czw1u(!M&R}$K50j7x+ZXvfw%?0ZW#l2B zS^M-OgP3qqhklHFr-txs>bu1^OJJYTaXgKJY1U#>c=p`IAimtQxN>g0x!Vc$YX10@ z>3DFGa3=W}T}<&_5lhBB;>>BPk5d`Mw4=VEqgh=N3+kMyo%Ed$Q z22gbR2Ly;k<6E#ip?u}T#KZ)H!PDhxQ)4OLQiz=4#_AA6cP@*DVt~Z*t>X3a^78TT zmK*qSv$K7p-OUTopq`(f2a={&In2+9I~?}Ja`-v{^>eMk;(h3=52mcsU?dLEMxd)| z2vVdq3Bn9F>8=Ns*u%vdFpPwJKZj|QX_A2Y(Ppz_Ws3hJlAB#`V6Q6@k80121pQ!k z+)cUa@-huJVm1kz?)*&8`iszFKac#W8#wh9H@GuVE4E&6)o*R`a3xt-jz{O{>Zwyc{rZ+p10?02Ua5yChl_|$Npail z55r+G#k2@P8`4`Z1P8A?AYS*veno)xk0v0s?uhGufu2{1Yx$`lYa)v~IX2S2xiq$Jzqgk5 z;|tnLTguyUPaadjLoJn6V@4X3ZhcOJNnnvQz$#hP6v0%O5|#Pf60{?Wg(5&z0GHlF ztxb}r6<%V>DYlfzU0v$!%uuBpiz06&ij`j{2;#NY&qWC=F5q!gAnH;5 zcyRlr%N4BMDms z9JctP3g6u>EjK$n9R3I~BGsGE{3(>~rsDppmnWY(Vd^KKkF46jKNntHObPP+O_fo4 zR1+8^XE2sL@%WcgWz;-Lpw|aVC%0+BJA`VF_8MQ28g4)gEu6!>k|$R)q8ODlVaA?P)p(pb+~03)O~rdY(36`uU9P=t z4OD7(yErG<;N|3O5j4*Y2`OK(mXq>aZgJSd| zCN-l>Q%ND+)ZI|t%^KY)*WfK`Zl+}s=Z^XF9_6q8JQ6g zV)+VGn60g?61<7EpOU66b#Fzu{L!FWTql<{e~j=BULPKfN>fM+dQX9UmL!NTB0J*? z#ffXoBPpHkL;jW`TvD-7Bx4J%8*c|fU+$14!b#+Z4G;l0RWc(cFOY!jb3oEZ6B_?> zZ3&l}vLHz=msno1Sz5Z01TFaVsd-S8o~5p!BMAO_RCT+!O0Ro{w#`mewMdy}a(ui& zeSC6~L9rA`sASG!jwSmGCg%Bf`{AJj2WK*8C4v0O*o1)k8b7s8RTRC4vmUR52&{w4 z%P!-Q*^{~Am6uU#-emD;{OB+oc`C!lONAIhUPBF6V2wh-qCAN&+W@f?S`g@*&?b#y z1hVh$P06I)Y*OZoBO<%-D3&V~%K@sXB_nv;^!DHTD=7&H0gP6sXXAh&m(yXS4Mk2L z1_rbNUfK;1H~zgFtpW%aupv2a1vbq~=@CEFN)@S9A8+|=*|KKo)xd{?U};~EmJeIublQ*gHag(i1h0p&))Ox9dKgh)6>%qc#&1)wcFv(ATg)0 z>`EGU5`(}g#>wSQ$f_>TS^;9&%Smz0zvdxFP_RJ|-!KFSi%uO4`w?jI<>9fv0h!y9 z>dwu9UbXtQti8Rwwe>mBl9EDOecBE{wcYC4sM1NTw&OiBOQABn{X}auSp$*87M?sZJRAYhYlghtaG)9J(L_W>BB7wr=tZp*12eWZ zMui#3sJL9u)kQ>xnr!;QU%_D|VcXyxI(Q3JyTJAeoIu~byxG`auPc*y7He!p<7I^5 zhKyUlR$rSLzT=UVcHqKe7K}iBK!>dk)-5+P_qR`gH--%F2aR3hlIFA3@}Np;6BT6) zi_T!~C?#ytI3hO0%-&S^xMzD=1P+y!{`&VX&ZcYtDQrBFl4H_l%InE0SF5fa*5?|f z={nae0E_8w2MYreQyd9AKfhkE!Ca2n!O=mg^N)>wRLwvhTTE*Tcs|Ol__!m=2k^{Q z6neHU#KOKOnYOf?&jTG}$?}jb(ChBbCYY;N<_>6`CJr{qDJr}_TVc{GGsM1A(!B1;}=8=v!LU@d)PoToGPBqs*k#f ziGuPK7Dkr?Ho3Y7$?RuUTl|x?R?#WL&@Dcyq!8}@Vyn)Tx>>E>mna=prc#g9MpO2* z5Jnxd^`uN<0|ySuyi|$_F|3f(44G}3FL2cUCLRfCeMGTv5~aS0@qi&;DS_sE_-n;>YH~oy{)4cTk92_NtV@yx=N7~6{+0%`7 z0`GiPwk{?x7-J5{3hDvos|_P%D&>8BeM=S3wcf7}B|=h8AxpWGxT2vyGgs^ItxTIt zOA|N=(>3lpkA@m3R8oR#FYC6YmYnEPs^>opOqC!&Xdo=1IA8lDcsL}bQhLL1`vk;5 zvMM&l=Zds`#<`?|1Am#YF_ucuL>d z*`$y0RbF6pV6=$3gm+C#JPYLaVPB5}yqRiKm1%2_T8;gfBu-bpwTz&B%LyjaP%H8i z&NSA*0;tO%U}sEaF>}?`)m2wtcH62H`EnCa$vJkTj{I6Dhi>STfBZ^N`EJ=62B(6M{fA!)H}Vr&c10|f#>(`|nuvt@FkA)qaQLm8@1qDb%G z7m_0Woh8zcN?{HOi)N2cMhypwHej=Z_>2JpS=CY6_{jsZjX#!@t&Xdg>xW&`j$d`g zEVlGR$}MynO_D&$OOIsmHJUk_x+hHD?038xFQ^&Kn*G`hgOaGw{%m zklx#+@JRSTce2N?gis1<=+-g{g;bQSY9Est#r4eEU;de9D zPj^zpI<53jscgvIAtGAW(>Me~LrsV7l;r|Xv;k{0BK5kc(3ohVZ$DFLEnT%CCnOX` zdi*qWP&-!`EQb4peY$~?C0fs_e*ZM<#ncFkB?&?98G(U#47Oh8O}u!ntPJbOK;_O zMAPc(_=cBNBpj^*3P%;-IlKvGmmt?pinR$#RC-`RR4 z$`s}Oa=xR#AgEQ4Q)(_1N0#6ysXK9wCt&W3Mds^%A!HIsry8mB1}iO~3WuXL-FeL! zGm(+mso>pm5jygG5S`6_RZEVv?hYlRDd>nw_M++24IXRw_6;@H@2EpZ+yG3GFowrr zGgl&M6>KnW%F?G^fdyFVN|bmLfPRRn;I?webX;2cJl+q~`ssebVZ&rAoFS30$#*T8 z0bojkVHlD67=4XEeN6bEioiz~IAT!d;!n}it=^g`gippEsb;KuSh4BlMqHap4A$H9 zz+qsleoA1mZ7?eFlrYi|wLeRJjOFD^O{3HJr(gqCS<=e?+WOFFLcttIY0QkR~v~K)DXu zB8q(RJpvvP0;1A-7Kk_(f}ahq{(LJGohmpwmcsvK&nMpdKo?P4=7T3#1vm>>jkA0W=Iz zKO-ENeQ2Byz*kW)i}x)rhZ9zv#?-EdKSTevWiKx?=S-TJzKc8+I@~2a}$gw!eNrf(=hkW{(7AiZ}$y?so|9`2=uHdDRP)c@i!BKd6u%^8+PsN1I>pCn0w*X zb`IX_Hz{~2l+`=@KzvjUBxatJLLYg3PqH3(2tP#o%mJd_Tj=20s{xc~168)-rWz#Q zdmVC;cwaPgz#0ic7z!d|$de535yfO6IS}HOATg&cNMAgbsuJ5sN-7Uz&~CY!;L!WH zUy_@T1@I}hz`Yg9^zZOfZil!zkRURA@7=4?V$?Z9${*IJJ9xxSl*E+867X_xjO+bQ z+}U&271>5EJmrRIJd5K(+1pHz0i39kNSaaXSOL(e@JJXu#!M0dghvp55dK4ON5F8cbw9nTLLK#41p*`b{CNb1q~x1bV}kOEx|_mEHm^!EI?J&ZKY*ye7QD& z7-@>0eg-BLO?0-x)+GO{h&L=~I}n{w@BU50RaI{C9TwHA?b9#a>M%?wMgPQ|0?<$t zPw{~|@{l=~Y9Gs|ii5C~tKo|F-`|G!=<)Y8LU*RiHr=uMDm+n|E!(kQVkn7%jle^< zG4tGJ5{l55WO=|&CV)m3eT{}oj~^ine3@i}hL#v^pFps=rdF+%yxtpa52I-;#cNGA zYZV%ENwnRsm+f{L05AoJsX%tG(N{xHPx(4*0O=FZ@6!+p2{T>2}5J zRO(HO|oW?a@@imR*J&=#J_wHa{nR=cWBQOLpgiTg5T1f1+2YuiAxQZZwo$ZXhNDk$rlPg+Cgatq_d}!>Q!@$G_LVT8}yWKDJ5c z%e7FT>24pSK>L4h9{(9~mVSt?v^oJjataDDnxs`nI<7cC{*W$I)GE@f!~!vT+_VFk z{=eRU5R9+_Zrx=P(zxi%j+nhczIs}T^4A(AAzmdV}o695pZNHW1N23O)>TJ2Mpcqx?%NvoN1`WMKA%hoO; z;S@mAUiom5mrADZ7mst;8v|!|7+hte}?07*Eo{RKfmp zstn>N7vQ@u*RaB-fNFZQGQOgsB3@~1Vgdq$IV(d>xqE(Yy|Lp#2tvcg=J5IV=Jj|v zk^O!hPacs%r}1)_VfVWzLSP=I%pJiGx`2aX5yt*?zessK7ZF3s7w*V~Ar>7nxl-Ke z-W-J`6@qe`3uVuP2veUG*?#D9UY0D2+G*@_7#tFngp?HghNxr2xZ>7`k`YsZh2z&U zX6H!1S2JkSqTUjAmPytqC>b-udofj!IE-|(xq?s<#_(KtUjt0p7bOwiil1j#y_Ot7 zrGxD|0M!l&GH1nY)I=r$tl4d-`xC_Ual`Fl#}pjBXH5Q(S4Fv$kq7yWyrCdF|QRO{{7dA4qVMU*te+no+#nQ-a2Cq9|#<^ug zwJjOfDDF+NYC2V+ta| z`S~Z$C$uzN!=2zQ7qwaug(cAKN8!6Q3sjERmn>if2Vtb&xnewXNAMg70b3rnB1U+w zWNSi8cc`T{qO$OXf+Ha0LW0h>y6v{Qyg|MS`C?iJj;-s9jZb=C*#2KgOo#;KI;O)07sLqovgK^5L zQxQdrVP;nzTCMt}vvukz`Y^(;8wlC1Wqr*l8UKEWdR&WrW%t zedQg3(mpv)xmcMdbLpcdmYgPIsIlaXM~j7)#lVdIEEIo(M$PTcVf}YOLMV(0l+HQA z9n{8gm-N~$&66cEX{bp@6og4k<^T~EaSY-(`7XE10l(h5e%7GerxuILcvWD`_p~h> z&|71@!VI_5U@>QCWK?-WE}c9HthN5I&;OqGe!O1Qn|fEwonU{9X33a9M@I)hKOJD? zHQHS_07;5~&5~@$0gzpF+MF$-%zMarF2$p~)aa6(BaiEhch(`cKIkyQzPp}|{+laV zwDVN(Q{a95)y`AJ>cJK1cre@QMj=Nod2=!I8Rc?K!ygTVhCZW0k^~82$d1Y3Gh!Ev z-9guBveD(Y8N>$(L?qiV=!8C29j#S)ixf{PEK;Ea!S$bs!a1(WBL=kc2c<*miu3*v zqa2|;gx9=H^@W{}a3JT@hqG|J%D~~v63#idx^m7L*6(o-6@~*rf4mtA5fe!glFnE8 zSuP2LDv{|sWcM)z57=i8G5Y%XaP-_DfjWG1algNgSj-$$yh5Ai!sEmC{1JwP<&53| zi|K=d5cmH)$i)k??mQaWo6!H(q-xz&PVek!@ecou#h~3_zw`SyR`voPEoOGnNuhKK z)~w6``7Wc9p59iamQSTDho8_6K=%A^tP7h^JYSU>^?VIDwO`>TAGT0t+5odrs!*O2 z0;HX#BaH6Rh9!LeFq`vU6-^V zPJNylM1$pzR-7s;*?-NwA*h){cn&{6z5z@LU>NvOqKB3RV?{@OnS}iGz{voe2+p z16eXZM9FbWp*S!_5sx-Gl*w;GaIRIF=d0RC9=eT7X8hmtPdVe(D>M~m&fT?p#WI8+ zsumc|;DP6lmG;Xkn(%6GQ#ZSBtsI>RLhyM@^3VklBr4Y1#lF5&p}*hcp+zB1Lj57x z&q;`Aq?8H*brUz|B!~;PHeKBgUyb_63(!f(;cxj~*UcQ6S-!hHPIfp=W^(OW(b3Rd z-J&vPREuZRtEppXR$hjSb(YKa9qlHLH>p(&m?`#ll#HePS?^NZ%bTQ((Q=EEZpy^?tp46XkY2Z8Djw{!Ik{!%Ins(!ae! zCQnk7L=={ro}1Muqmu)T#QCyY&b|ek+<68p7*>f$2s)(n`mPBuu=afwYxQa0_b|=a zZN42n@)$f)<;YCCpLsRZ<6b?u=$Is}sQlX0fMaaI5gB7XG1|ziO01LV%;ac+?Hd{A z6d7q^Oh-6=j5VroEB1~h%_bCg@%l_UM-05}U&YC9(vNPIuaitg|FYOTx0piy z%42yRI2uI$c`7D@)n_tNiSi$OOr)pL3%=yP(X%;zbxy0z^An`L4lW~G@;|?LS8ejT zC>yj?R$C=pNHp!hJIPciGN^=`h%QS2*;nO3?o$=BMs1p80mz7 zQw02(u+R;s?`yQ6;kFIOD2Smy!(jUuMux$Gn1ii$@sd(aFyIbF4IOaP1Cb2C2OIdk zW!J9Ti)VCPc>*3mi-;B;vtMWVYDVLd<1q+vRvK-*SDh}QF=8l8OpQfE#nlpt$;n%N z{>q)KP-OJ!oa%KD85ihXZnZ1v=56fkp7a&u#^x%Fyd#y#uAz#EEG9UtUz~D|NJ_>j zC{R98Sv)18m-}hYCrAfPcZ6CXHB0iwGZ{wqVputw@6(M9gZoJYpld=!(QhFi;C_qu z5N>9mZN$e8U0Pwpgz`eef#B5N$Sq=&oZ)ThT7*3ZzA4f|+V17s5=)P@{N$owe{k(2 z=oG`jD%fgx7myjJpC8d)6WprF=4Vq=l$V!(QzPnOu4(N}{llZ%&mOd92HI!JFkLK8 zcSgw;^;Pe8tk72NFc27IW>$SM=1krJ_tzl}kwlxQV>!sw2AWhgh8Qh_q6GT`4dN2M z$$XQkxUCMR{lV5DN|3e7uBG~~z4s>gvvnzIj2kx=fL|+WiA5D*lA9>l&?#! zehW*4mTjCYlLhpj0bCECFNVH?p%5?z{u(0`VZf>yuc6yvM91l84mFBRr0NnOk*Y+V zgC_f8QVR#aoUP(a#(rghQ{EOqs?N4K>9b1^{qOCJhbloqejQl{Vap$XacYU+0rX>gvM3hznP>wS@o-<|v+K;!kq z;SyAon_FUdRAxc|tHFC-C=?VG0@I}$6-g=551sP6ZTFZG4uXiP*JJ4?U6=%%7!gLy zLej+@ra7h`+v7!#&#JIMCoMG<6_q89Hc5u90%3RAR3l3VRp@NqmM>GUVnG6)1w_&| z4+wN}XYUUJ@%S$sc4>y>s8o`1DPXEqX|Di`1uFkr?7wy3RW5}?Q%9Vre(XP)ttk8V zJElsPL$!w|KyW{7yr}8=0nx)^q1`Jnhi`RCytkHv56zJ>$3us* z6>w911w3Nu9tS)LH=%jzqaK7zK&>t?HazqfiI6|?i!z78Com!99nCOT3^n#Ac39nO6dolcs zgLGqJA|gDu<1D?sy??tu{)vC}E>QgP*Gz`T^!v}%OZ4GesCP(jllZHv2U=<~M09_M zeB4sjy4R-aHJin|2IG{uUPd@#5xBgZyZR;{3`m4RnmXMIvEueeXQ@!%+Wi#>0W_jR zTYSBM4s<%4Ksz#5{|+Bg5GYO`M3>b1z#oVfQRaP=9DRY8Nh?`m1!WhPZ!E7KVtwku{FRI z2NDiZ9E1WfKI!pGLlUEjB7vY2&RHlvz**W(-RGf8C78s$eta*EGTgdN`MD)gS2Jgf zgRLGxkIzm$J!w37aQI>a9?<@w~tK40v1l)IbK>PVe4ud^6!Si#nKctKO6>W9L%|bIjN90|5>LsLa_Jwoh z-aKg9M!$2uUR2bB0d#z8Y%Rg7GbwtjhbX6htDWgD3s&fU_Vs)ehP`4tX2W%vu*M_a zf86rXt3Mn{p!@-xwE^U|(FEUt-zt-_`_1xGj>489 zC(fwVttIh_>kG2L?cMh^UwBhAL!4j}v;Z^^97&Uxdx*F`PC?ulYxpb*G@)RFmpk@1 zW;kVLIr@~^apX)=jGz&vsR6C^OXY}+`WDV+qJ(;XO@`y7KPrz&Ld{Tc226q^Sf9j* z2DLM$TFXtN1wj(rZYuOg&Qh&%#AY}mAcTu5l8`a_P+N%4Li=>Id*GzV1?qin69+^~ z){(f?lQ0gW!N^VF;D*SEH7~&2dy5;0Z~JIQn*vx4sp@;sj>m$Yus`_z7~NMhoW#0r zo?}-aginKdYIBq-fw4nd-<`=(Oy|Mu9X;uK@`8yOVzFIUSHR5ivNZ<8zkAPjz@YRC zSb95sIoUkVjev@?Wf=rudpsUD^F9_BPn2T*!{n>Sfpy<|dej)hdzL%+mv(aFh|g zO@xBYw05+cE*-me%Dy<-WJ>F^Ix-22i9fZtdjv&5p#p$oh9Q zzCbmC-UX=-DV@n^AP}BjtAX>^9aTWBo`8U%;ckZAo83a0%6e4DUyHjNii_$TWc66f z`=Sl@&G<9c&6ILyHfXy}Hk;|(UVw+VlOiD{)$=?l{Pq5VjKkcbQEv*k5xWZ!5D^hi zlnP7ys2p3|bjOzyoCiq5`J{q;YX=U(P#;vrTJg(`9t$h1>k0I?a30XthPE^R63 zPH8hJ7h#rgYDmjnES{o}6x6J6uVvc6Q$Yw!GXKJDjWppQalICD?Bb%HIxknvZr6NT zdUg&G2Z53WVUmQXjXt5bLo@XmOVc*caIw#-sU=)DsZ`_oi{r6Jg84TOoMFVp zKMSq9dI6*t5Rs3ja`ZfUTQ&_goh6KnCJZQrEI#O&j0bn};@F!iL_xppf6px6vm$PcXO&b**z1rpykusI-c{*}@TvD9v zSyxg52l~_3*O8;Rdsf{I5PcfAhZBG~uEXoGirq#trDA8f*696(7n6Wsp-A?u(Q3(4 zT4mM|$m8E`r(WIk%$(9+*&8=5?yLo z5aqYGgzVSHXC&-z{h#o@i-t6mV`Ey(qx;fQyy_jzPU+Fh(AHRUB_wB>q0E%8iNUx= zqS)e|7RQZgcci8!Hoh8SfkIP_F*P`{Wu7T{vC;Zr@nBh#_&3V*Mb0vdwGMbN)wc7U z;X881*2hlFZJRmjxYjUY>!~=Da~3=E4D@f81?df8*<)~~d5XOHLSg)ZNkXiKf{;SQ zuM|eUh9Y|xSlsnsF$HM$qgbPV&-IY0ZW*Q^?&2fv1Vl6vl3jqX-2%uxmMI=3gR0iBiJDC7yku-x~LY+n-% z(9^@3-OIffC*V&#p3eKh_dI{T;>1HZ)#2fU#}N(d`|F+Xzevz23K)sKp045m_%sTD z^4QprL8epL3*9~+c3sb|b49X%?^(0MUDDK4wKS+90{h$fmXH49`?Gn;k+3L@&hIIR)c3z$^5ki)HCj?=ex=a5ZOj z{(P`B$ew7u&~B3>X5m^#okz97-90K+a6~e?y(+H8eDfyWINe1pG;y;*D^jr!lhjB- ztiPMwBxs_ zX>N2y%`tL4Z%H+Hgu@SLV}tvPfmft5nu_uBa5qT1Ji#P3zI^6;o#mO({HLX$jiwFi z%S6tAoj$W1fTFxuDxR9o6NVrnCEXiMqUC?P>g)1;rJDp3tai18A9mXPVz~-aJZ7sV*4EGI`&w zND+bzftg@h-%4WxsQni}*pDAEet&&T0awK*EB|r}e}%wy4FB~#?I#^CHnBt~!sQk# z_u|%&G&V}icDcfXIp$22u6#lDWUeZVxr#$?*L%9ih`Lx0C;3)pyqzuj8*gD19k*Pfl+3s4FauAocaafSb9ulWL0pZqsU5jMM005; z+bF&_oW7w!AU{+nP@pwk+c48_|MuSW!niR*$e-4>*&qX)B2jf;U2-$q`Q=1rhFLXi z)9Fzw_K^iCS=)A(*SZc95Rq`*^}ju@Q_pCCQN7t8>FVkNEaL!AO_3l;kwC9rvkl~I z09I92Ky!|9%g1B0l>-GDg@~`Wa)1-+{GEelq4e5UOBYWh=L4Phy7+nIIl% z^%<@9Osa0g2;udr^=r(K(m?Vwa%f|4Y?+G+WZZT@soDo;QhL0dDH@VF*4+0hU1|XS z?vz3=TS|_?`$K|Rq9kd&SF93*H=36Qsth+l17WV};E1w=Vx5-5f4n(gzk93w8gVK* z;->E|%+~#BxHPklL>SRy3Kd@gM+ZW?a@ecFa_d;pkZZ`7|B4(C8+yHk&Frc@+@ko0 z`ml<(?=@~8Q=&KbY=Qv|A>2&Z@fj#m5~T`RHC)>_2xBPO*j)Yu!Y7GbqupdS*llS+ z!@>fCW4l49U1uByIP4}TfnbaSxarx!zzOoVE>cne3OS{w_|^;CZnyq~H+2hak7|#X zyy4=o$@ElIC5BK8I&JgaANla`7XT8eGeGj6b)wrRhX@X!|1K9Rt;p%~TI_bv`}?Ie zv?dEo(kc+5aTbdVnqhXhMY;T(ToBS!iD|#%2*I5sA%J3QD+CL-mmPzxqB`8O#`m4E zmvun;j@%Dq2Rc%A+jKvn>3;YhjQDpzP^Wbg1PS-tkS!BJotr43f+*uXkE&p*C3x=d zd+WUt>K*A^uQlgOU=9165x5{)ENkt!vtCZJm2xh48~237JoAFE2Uc%LEDJ5F^4sz` zc*hyXGaeovbC^w}w6(R3jSGx}6={+Hw+g@}mdZyRgZoeS2l%O@6$YQ@ci=5#p$5UA z|DqLu;R1;j5SXf5&K7_0T#LLuzyqSb*S6mz0II(Kd;Mx$HwtMvmCCfYq~~KZU$O&u z-#0yu2qc$*{mAuVRkapJI{7D~!5?W~v6eFNLF4g~$iF4Tb@%BQsQ^ ze?Of!1~I1)A%LNLiAJp#8PCn(C)p45a-l&)ay?-J2q4as9@BJdafYL}pL8by-7)kF z1*~KL!vd_i80w9Fq5KAYxI7`#t*I<(Pvusn zRkM}iQEHp^KIy*tMy=1-0QKZ6&2u%-h({vic`C2&I-M__1F+j_?N$sdtmM?x79cTo ztkl)^Wj5E8KHJhTj2n7Vj{NP1N;Ye>*o)nT(|0o2?;1kz#vpTi$A?MF&m$ zML_hbca|2Y195xwo;#{xaG|PL&pk+`W#DvroF~)8`r;F{Ya8%E2#_sFT*CG6;Vh|E zo}XjB@%U4@L&L&Rqjf050%rkztMN_WWZLB zG1*79(BP-&2`Sw{|6ys=lko55-j=(YJ^qb~ ziU#la6Z%4`hu6=V>Ks)MX4>wa%T;?i$(|PRKDbXqn|W-Sy3UX#5MX^ofo?3Y5?5L# zIJ1yc8%NoU5a_u}suxSQ7Llen#ox%Va{v;<`NE%^7;@gFyjoS_Gfcc$YW9Bm(9%!I zKC@1frr7COgy?(wKX1PlE9F?PF-jCyX;@7aBwIN`+q18p_*z5tKPNa=C{}m>djS&h zX4?&1eEf5J&T-TFxf6UI_bcGr4+sd5K4MRse!kUbPk{Xz$jso>xNNMX8mTUbwqJ+q zmiZr|44m(h54?!w^Nq>K2sKK`#?Vl)#hfXyy!!KF_@oFpsLEJFK12Jfi`X*nZ-@$i zI#uMS8_(TveQ@lWcwP&`6zuoLT~gZY3b0`8RqX-=z=3=j8AXX+AQXJTpo)`02tVH} z-^xsIv}G%w0Cttiu$CxvQ#c%5UHe0!@!zgQ3kQ#X6T{vO8qT3HVyA$bvBbID>`+s^ zZ~&yyZbJi+_z`>S3xDVmCiKd8EiL&EY@dtep_1L=r<+U7p+H0e$lEJa%q zV}#y!Gk15+z-?&Y{1r>-=;+SZn*ZhrhZNK!hVQtt{Oy3UumJh8+YPdq3c!Eu_F{)1 zRv8wc`Nj67gETVHG(t8{zD6cWD}oJ-lt9tRY%xpgTvJp6BN91bN-KsCyk4=i?m1NY zpdSiyiAENMd-r&7tXil&amIz5?^Fm>C2l9s(->|lww8MzoumYrLonK}{5KR(U*YR8 z1q_)w!$9ncsv!xvad?moJ4^JmxF%aq!}~mQt>r<`L`$bg*VLWu0>z2^Xn5&XF8dl; zsj))s(rEvSwzrOo<7=}n4!81~ znRn*CckWu>KOc+5T2xn8ovuFeoc-**pUN6f*UJw_s;jcsuCUW4GLf*U-L@bBAEO){ zV+mvskgf+Nyybcuy+EOLTMkP$tsF6=3hv#+T0OpNZw6g&bgjCth_ImOgrJxE;HzUT zHQ2Y2ae4!_+}h0w?k>Ti0qQPik!_L(ayBuyZ7P$WMyGf{+9W&L54z!VUrjt;9 z9xUN!3eOZd9~c^y=C6MZCr}$#ye1o7H;4&=IObaPZfn8;y zp4a`HVU(zt7$ydgO$R0;4jx|inB6{Ym$}I$4vE65RW~~5p@9-)1E;yY{;vvs?G>z! zEW&V3A;`wqCYQ-Imet_CK_d+#+T}Qx)IWM>0Y&1 zR$^j(z%L8f6s11T6eL_j1Jz$EJ9dyP+FT9p-uE!j@)2N15cTArU6VaOOmz79`E58~ z;?+bUm|$N$4oq2wfo&8MLL_Q3TNf}=mKw}u^;XAm?xNAdgxY_`+#{B}HV^IBA2!?e z7;UCUL}xoGtNSQG2S&zAsYMy3D5et-w11KZ3owD;<`STEM(Tr~Q)7y^)P>p)cHSS2 zPO2f;(;>qUOZVGQ#H9w@iQex|+sjgIVhOOJ=zVw58K!ECH#I=*hQ@wZV;)qvz5`MuZgluX9cB+`992%WT?#jAejvW}8OfjgB2(vIIIlsjH6ZL@4UZII z^`xSY$f%ls5LTjGOjMw5)wCvSEjTrVfRbmTH_U2`KK~`u5&`&HrVuZQ47iC@7kGVq zINl7r5yBJd_f>WzIcydq{+yJgLr^F|jXg`$9vyE=ZU6h0TyH+rQ@A3rqYeN9)Urn-AZpIT zoLJcXsq1%$GD6SvJLtw*M-8f`FH3!D32Zb5>}SEc$BYzGrfJ6#R$g=f2~BrfjuPhkYKZTr9eesMX-q}Qk!)O7@LL=D)Fiqwn3_-34NnPP-Qbkyn2J`lBjN$2wTF z+j(vYU^U8)|C?uVHlPQ ze7|WbjdEk6k;%R8T+x5Z&{M&Z#NVmZ5O{k@28|hFN4Kxa4w$N*Tdcv3pu|@E%$sG8N;kLdr8C2mwQ>PaXVzs8=Kh& zgVthn;SF_NjSmx6RlO>E4cJCfd3ibaJNGKlTC8%Mr9w5KfbD$Ogbq3@3ai=>Jtbul zmy`5byQU zLj-pw_I>AWCM_i3(nJpTabrubo|KQ%b1L|~sT!%}GTZvxgfPhVC=u-)d@Ttsm} zL4{k1QIl!_pLQL~=w`L>;_|pz0^)c6$D_&fO}zp!6`K)B1dO$b>Uxwp$BEQqgf)07&?cVg5ISn%FREcP67wiq*>+ScZ0NG4%ODl=~ zVIBPIivubsl8~Fn_6)5r3jd9dHwxi*K;aF-<83ZK^l#yel-irR1`JVG5*&}70Im?U zPfqad?cQ?K=5LCis9!oUz(~01+;$X*U{xzquO#8*bi2QZ!eupw0s;DI0-a^7!LA@) zRckJ0=EGL^RSdJQCJqyT4qQ=*flRM)4?{Nj=H!ui)zjs{C^By3@td(fjNLYZR*hx7 z<$!inANc%f9$>{q5b*VzR0CM%MMV87EGVoeTe0|!K$g5_sfo=tPDI_^40+tv`o30| zY7sEaAAq{jxgEaHlSelY$mEhk7tA+0y$3l0+}CWxwx_Brw@Z`bh1%sx!(dVg2?+wW zqsoVCL!dhVNJnx~5*$d^-$-KfS3D&dJPL}Gw6x`HnHA7qa+}@>2nu!>Mj=@(H%?Pz zdMc`oq@GHr9yvF-Uwawt9QEjCMMc@Yz|zdxEOFlSsI7u6>_vqjn)n1CYR?mEnJST- zGfM`M#pT}; z?{gJZghwEW40{qoj0w`LGk;wSVzpYpkds-cIgJLmLV~EsgmaU1 zV9rYja(biH;!`Rmg2k+-um_na5*F6J6G|EPy%>DFZd~z)1N;`1g`zP!T#walsjvW39t;c#6ZXDL4SxOq|t5?Q!=+GC{{a@53E|IZMQeR4m3iwvVWr|?9I2HP)Pl`AZ|qO z)01cM^oFy?cR7ILLHS-6wPGz28RhEo`VA-mj(D&20m|n|NXp!u;B(xN`BbZ`(9d3X zHQ6La{mDFjfPFX)~DCCiWeH z>|G|WhclVziks<9jhRg(4(kQr&_Yl3H#PD4Y%>VRmS@Uz)V}CIOq$PoQzaw@fN~Uo zLF0xT|Fg0MplzjRdQxDDn}EO}gucE_on9cK?*H2$tJ_Nl+eS;@*2W~bSEa4Z{83+m*nog&&rlk3ojnTlB&zpAuTu+qyiB^3NfOFRVX>`<_nYYsx6XjSqW80luffi4?^mQGf+_j^c@f#EbkjlUzYp=E++P=n2nL# zx_)u}0#zE$w@AB?YM{L3ORHM_jWEoW#^a`ouG?%RU9q}wL<=K1a$?`Hv!S&0Daf_> zO8MZ1MZm!rkTK^16NgsCH@=}Nz``e$c^CX34S<;>YUWF10m`CrLqj9UJo|x(K%D?) z8#8O!nq zHQgS(2kC!^DVIsF{J!ELOyK>1BQXVMGFRb+1VSWu2$+>gN4>aQAk>J&=ehck`bQfH ziuW+;?>38HNgJcAEBMCAts?PuEGS|_4Sb&y598DJy1-STce}Fu5pb5If*;G^WVN0; zTUlP+;rUh=yCgBT@o*o-YzFPYK#TiXeL`E!=X?o8~sLFJ3hg%p@T zI_csdOf{^OnyyBpbcj#A;>aJ`!uxK9=ILc|n$WvuFNf^%*x6&dhic$&Xf~x1+r(*a zZ|~EhPPLo5=zZ6l{=C2d~qi>h~h ztI_C~8r|XiV^*fud`e2nM(O1w24SSfIYh?$_;{ve_ERQ(vE=(&&E@JbK3EV9zeeNb zDL*{%V!hRi!L&UHi`6_{v$U|8gN!q@X?A~4l)-(u7Metn)fkzW6v050YaC6EpGJ+6 z+hrfXRY;#M7O!<0uj2={S{`@|YJr*{!Tj8+S@Mu!H`~_?SdS~9BE{zn{LN`vlp~q& zkZ=R6GNoPE+tXzo2xe$f^TWf`8-JL6Fe2~>T#r*uRXwYePYtnnjQWSlWji1bvs3Eh ztPPLv0|Q0-dyJ+lYkqz$|~TsO7RDQ|z>)et4d}rlLxWrPuNKm_el(QKvkb-AR(GC<=GZ`rsZ& z?x3)G(&I~nl~9_U2hsbUdA*Y6VmjLFN@b?EQC2Y?@>>jP)oV9>Nr<~4nM;f2YZ>*( zua^TCark1%(NNOuS$TCMu8T1yJ-xQ*XxoRMR0kg|*%sHmBkL_D|9odrUeNf;$~7tj z+eM9YxKLx(#%|ZA^jS>8n}D;%dpX6X>3UBowoEcFUnYI3NTq27Oz7r3^?r>1(Ur=8 zCi&+4ymFz0tF)}5qMc^S+{wagrBf%YT17PWGsum6SBu$%R=2t4=T9OcqP5zAIQuZX zJCmOBX}O|ntm2EO;sI{uxZ)-e4HyZDLVf)YUTpLmQzI7Yh{&8OU<$Y!(kr zR`Jma23IQH2xqvuJvnp`17!kSq@<)?jOMc^Hp$(Ans$Pc`T4oBp4TJM<7d;EbPUN^ zmZQk&O;*o_n?4;~UQaJHy>0dK!l@17LkQ)9iO>{&3RyO3QM(*0+LP!Y)(1NM?LLLn zr%`a=P~l_I2;od~AhY)Qy%iy7)#ZB@&20x8maou-8B+MHWOYW~(jBq7|1o z;qwzJ1=0{#obpo=ln}{UO>h)tSy69$-iVfW%|)srIy5Ntl~0-NSzwj`#qpRJ9u^6# z_%R_>sd#css|p~!V^%*bgr=|bF`9N%Dc(}oyB1!tW^6hj+-bSNO*H{qJHKrDjf~(a zcY|-`pMz0;FP}JBv|25cOt+ZBOm6`w0_6cZRsydZ8z&prpA&nvrr4Jju6T@>%I9y> z7FhiI-a`q^Hf$KI)(Zv~Q}w4mw&n8`GI+p03bA*Orto7Q9jA-JKG93=-=sJ7vV_D{ zN)OzIp@N8l1mUp0p>|@~(Y_5pWrPFy5`~z`X7c=IR~TGvlu6AG<_EtzD$rh7Ykd$3 z*S0W{ghDQ-vquQ^fJ+cGha4O=gaN+JFJh%5x-uDy8Ln6Sb-(0Ry}%DQO~Fw@#R^-P zNu%1*p`qbM*vdJ&Xt45OE>LMab{A9oNR-F3uZXuf%w{Cb%>hx$#)sV(ZkFr2f%gMc1A>Br?k#0v(!x?lk_F2tc)jX5 z6a5^>hQlCztoRHI>JeKI=$q`SZuxh#!(ED|H0M?qm*vCBxmVnGaGlRiaB#hITI{<*gUC8Q{N?OTFAy`C(u!^0H#5wC{J>igHP-@g5H4A2^x z+!_R^GFVk6(Pq2aE|^WJw@S2nHPU8! zs@~f>e@H2I(Hv?(#hAi)TT8R}CPic&<}kFs$s#e$FT3a+dP6$?E{riUlY6=@eIhQB zSh?U{E2&4WSg`_iJY1I6PDs(|R5_QVx^#mkep>)4N%{;O^qoF7>8_;3AhJWymwosa z)#v@wi`+i?D4~L|Y4gM(hSo2ImpM@eZ?S9}aODqpj3m?78dm6xsdbKl=R5^P6rd~# zQOqK}wWFkj>i1xgi%2;@EqLA;{3w@PfoO~8_pvCg&v-`;>4KT^g-4oCyDwEb&+Pu* z0!B=u-gxoISr-*rf%LAiL9u(|`Lb#1UOe>esa+C?7&5A72v?*7bT1rHCpc6vGArtm z48}9{!n+gB0ewFv^4&id<@IQn3-S3R5l<5iPg};o1}#}S?^ZX|Iw5-f;G?lw>w~Ae zU`4rDH`y>`gO^P$wkXi1_-kn!*$4qs2~!O*CUgKQb)~Ad))oLU;-yog6n&L6YQKVC zdDee2v4OSb#UU>W*)p#s4`wO2@Hciy&>AXLXiRAHb8Ip&$~fm&KOaLBal1v{RUr4N8Yf0nw9OdZMP-R zMHf-%z8%7R3z4Kk$iCe}LI7rV1ymJt_huN;Win1_IEE0lORMlrPs3|5lFQ7Rwa#3` z3G-TN^~XUfYW@~(d;+;zzMrB5>=)|1&LGAEjBMMsBpP8qzffAXWbIx?785Gb^tZip z$96$5Fn<6bEdOg{{2J*8L&0u)J~~V=^{hxs+r?b#CUWA?ww=bz@J#TdhIAD{GGnJ& z`Q-i;-=Bd{D5wvH;R8;6ag9ehg{oB8ps=ntAuZ)>Qu0$)L;-LiUVQGkigx)yI6_bg z=mDuB+q)dteN~P+KCw&3sjbTu%)nUWbVxVm3`pFLe}+9#bO4E^tQ}@Na@tRM4<$UrNW1<^;-Qj6(D8I9))7ndNTr# zvpvpV6Lz%ACqfb@ZHuU7b|2qfsHZB$Ac<>pcvv1=`}cKemCoqv;LF{#lYGwue^55! zr-&Q)TTw2H2%||UmP^pSmMatqx+i__!*tMyi4{8jk@I^u(YjO<=YO^lbN%h_6CIHF zU>>%p2A0`mP6}Z!7hSv?+K=4zcUl2v;n4QM`1n&VT!}oTo(_g{Z8T&64#Ws|?rE%g z{Ybq5577L#QJLyAO9WreIRopc%Z!t(M%xA2a`I!HxOlaCyDS7UBWGdtB2zDBjv~{W zmTycxVPIl`pZ5-n(MZMNKsCjg%vZ_mr8`IKo2tgf+#(9$7Yv$rA15p@CRKw;jcJU( z0A<~U3W?Yk;e(k}e1V};CYQr&UEj6cfu%N~_TF&A)}6>RO^;xoit+ld)^MP)T>o?d4ugEzgJxBtSv)w538ku2$#h z|GIuj4fE#R*HT5|w@{m@x>xMLnxJ4(@ zzv$bH!~9olR<}P}XrIzR?cXjx*~IqC&u0x;DcH{Di|;vd=>UmiPcT?Ywi{q{=C_=~ zbTML~ec1fz13K-Fcp(Qqk)(t6kHDwYoo2EOG^mat>G!Ldb~{^@=#BXPy&;xZ=(#TwrfAHr zTmB?G9C0@hC`d5-Q~cjpX)qRV$;-i*3cwTFq;7Tb`f5+-wgEhGd&kY-juL>j6km%a z3kN4^L=U@QZ!DY>5b15iPBNe~6JvofFy37{7$kpV`e zRbQHrLe%0ut6Y_JLoywZFbF6NYt@w{SyAQtA#BCDOI4Z?Wm9gN7zrd8-hH@}<#J$` zl@fN-5!Z-Kqf>^5UtazkAjVW_|3_Z=5_qPg^yN6m;Ff1|nt|lY$?L2ZPh2|z)pr7I zstpXtV)Q`G+*wtTGMKk;zM8rAjoMg-^@|ZqJ8rsMD#55Ep(Ln^(!SZ0B)=33Sv0K_ z^!0V>8^`xV(9zl75=U;j3Zlc)*HT9@CGeElILROz`Z3YFM6~@nTYC|S+$8;>nqR$W zWnSC6?Py-xn3_=9tSov09jkpI-Jt64b>kQ1wo-j~T3T(=-1-n40s1*@-uC2`!=Chr z@1%+gS|Ud9X{vIB&3ff=lrm=9=(8ym;`#z80ueMt%}N~b z$u)nHDkhmSG?tHouFcIg!%!o<(uXO8L~zZqA%Ls&&&1zmV~pc zJpUl1b-lf2H|rtx83-?E*Fk9T{-E`)zV>3=R9ON*=lIwZZ6W2l)lLRT6-LIFQvLXagJwbzneEz zYY#`$Z0}2y+LgA$m>-0FDUOUh%4FPJpQ7C_k9dfVjf>l~S>6WM!E;I+@O#->5Y;s! zaTxNk>w}PM6mB&wu?Q*?Nr0hx*nG+4;h{Nu-oy`pL-Mw(g2cDVV_ni#3&Pr9LHv$p zqet+W%Y$mSmfeKR@rc^k!}UZ7`NXprM-11LrG@A!^<(mMQk= zc^J-QH!#ObPKTK4oz0y6`Nf{dkltjpA|0f!3%piqPC>81csX2XsK0)#oBD8qAF(e5 z5)s1Mk&R%kjotEkwF0-G>W=I*TB#i&d$LWR=CBsD(*^|}XtLO3-A-^X69g~Q8vvD3 z@Q{PMtzt_RAFf<^co@Fwr!e&*3h3)+wY7NzLUx_wUKXwo(4wN|ctSqV;S!uu_FG(w z%YF^9$`z#b`j@St==?1m92PGZlIWdCskbp-_U)xw?r)myExzteIUV;dD>jaO_Wy;5 zgv(K1aL0%QrtV4`@&Y-Ynqz!u9G=6tGEaGMRmUy0g1o zs9ZEL7FBEjp{{jrU!xG?_WR7ETFRZ{A)BNs{tj+nF|GyX~Ca{xMm=<*A%$_D(god=&rUAMjq z6cp6W(eoJ{wDlT?Yzn;q^c!E8tNlA53+R3KzzlNThp?kdPK$?`Xwj0}IA$L}-ulFE zNrmmU8Zth}rt@jpQxq2z0eHuAgYjlx=Bs?w_PYniw7Z3xF*VwVA7*F0iw`g_Q%hb^V#t(PzzM^etW_2l>i7q9)e^%igXY_Y*yNBSDWRs>36q>WBkb+ zZkl8&W=@Uwgr1r=O=9v)U)I>xL)M6H%(sgILGs3V2LW+ zr>kHauRKj>VxK*nOI{rBhss-2imdd!UnCCM@K=&swyH6tPHwSZj*mY;BC8OEuoC%S zfyg0$a%jume`3#>lcp_7s8G>jN-{9^gsBBu1{tn5KoAbjm-}oE>mlTn`{A>EbY|Oj zlpeyxWlQ9!x7BjI<9@Sdsh4>-K%jt8N%lwHTeK5cjeJLVaP?Fz{O6CNZj$^kSujch z9Gv5syTH%<4D3?HVs6I+cTU!Z*Y-Y05pFh`N;x`+hjqg(S$n0~I2AydRdrQ@WtRsd zm>;)76zm(aEu#2<(xZu_nVv6(`Si=i_HMTs&z5Y(q?QZK*XzQ$IfM|5I_o$f@#_z= zeY%SghvoHpno|JX-S&6PSfPQ|_F|rO2%0ei_QzMMtR8pIUQSvFHaM*3ls@l|U7yIL z=dyBAu48I!2>B=@K*}fBIY?_RhGzGQ6$?;*+8<`A-G73SW|W%UqO?wI_=skIwAuv# zW~s5B=jZD=p5SLW{MX&PwqO<<8K8Bkb>BZb-K1ue)Y~n-2|v$z=h6CTK7IG&_3|Qk z-U#Q(_J@zaEYbW&vRML%rcO~EFuZ`mr2L?7oTDbSe|xf$7pW8fs{ly8aB9W^HeP)= zZ=}uUtCW(Y~XzKM&Nxe;om$K?yv*_Zs)UF%PiPY{`%S*3^;fqbkhzYm% z$<}M$7z`C$oFpA~M>7)rJX>|c*M~uXeSfv<4y?UCsQwj>bE;&Lgm0ChMg8TEA5~d7 z&6qj-QOD_^(AoD(R3c=j8m)xfHLJR;U%_1|0g*bl$MadL7C7BK6pjaCl1Jb`Y7q*_ zy}8^9BAfZxc_pAIrKMXj5t01BcDp_Btrnw$l4L~rU~>94Z1;5Y5b}XKe(>zf9oJh27k^QpbVj6)ZLZ>Gv0yI9 zzTvH*=OmFdOipD5(bz1*&w>Kfy?MEMcy=Vb9wHb+p@N8Wg5*R-a>Pa@lb$BiGTQ$G zp22O=%c6*bN~r9wNnBV&@B#x72!u>1tz4*lZE)anIDrDviJFq%zW?6#B7Efh*zw#G zBuGURO&Pja|IFuPucE_JtcC#c(tRv#zwCSEOdGG1x-MF%IN|o)MRR$c&r(v8h)vFz zDYS^XBd24x(%v0m13qYr$BPM8ozYc}{og^oT5;2~L$~(WINWhjs`iA46UAM>$`YgY)-|J9BP3ek0W?DSz0lcuBKOdVkZJhA|- z5MWEX4@i*!q2u#WwH%;m$-+^=2h1@m`-1*>X}uiMen>Cy6BY=KYW{PG1b#%C*}n!% zr~1C_tyB|sF|recIte>wSE)drE_)L5y>6$e6Ng0Mc-Y-H4#xPs4CJF$y>)K?4B5nw z=vgxL;0V@?UI9NPz-U3$T|at&9)n z>Lf{|QpCzh}kuW~{I=oTF-H0bCw>pnxJ)PCP|ZUXAzdY4+EIiEgV z4iL9ETdsaFA09GZWP6&o`^1n&z;3VJ6?87Yy{WV36nALin?u?cXWlxdTchD*;HsOv$kH_&j46=obWfs6m7=YXw%bS zvMZ-3I$3|(6%c*4bR<9%ht_&fjN~qnp(lS3pD(tDKx?O`dI~`R8^!B#r2hGlAFx*D z1}GFDpF~~v{lHJXKz=#}NPhBP$*&H?Q2=F>SpcqzDr;R7ziulaf&t2A{vh!>EHwkx z>p#ELK;LeTG=S2R+P`fl01ti1o${}`nE%PK0Qk$pX`Gi?!4J!d^W3>flY1i58WmY_ z`&@05F8>Ui^J`uxbeH>WqHqgubp{FVB2uXKAqKfvN=9B@omk8Hs%thhFtQ5Ptiy`wmvUx)T$(P=G+G=M)h^D= zOgG+s*9qbHAg*9LBrl)}W29~0#_vZJh}wyM_ULx81%JBS(%|86`Z$6=AW9MgxKjhg zACr<^pS*_#2PMhl2Da@BmCXl~ZjTpT06H&*3uw+HASr z5Wly=b^_&4)%FIz8U^)I96Z_9duSfP%1_2W;UM*6S)0NUUmFlwY|)jCAy@m7xVWkQ zfTgO(>&d@H*_rHG(n32R3Y?PI}!N^+hlq*9ppRelqr(jGE&>P^0 zfyiKIXh_j?yT!C)`iE^-=^q9>Xq5-LQSPSg!&w{kYLmZhp0m91IE5}%ul(cbrg2cx zTs`*M!1V!yda-lqLF*ZcKzu8^5AaQZUQ5ToAe9br!V_1pOrSpvvxnpKVJ8-6;%dn- zsD`sgCWf8Xd?`lDVg;?>4X7Li=75M{Ax^Zx#b|HPksA_xCxhvpC7T=Oo4R8AucEC*A^qK&bY>A2^^!8Yln{_#=c2 z0<|05AqXM?sH$v!j+qrxIdAZgN%eUQGf;s`uvT!AWx`?^XV$62SQu{Lk;zEumdZ@S zE=unsW^h-B_1|k1JizBqPNby$L_VReWuw!Pg(F5M4&V1ERNp#1b|yZc&+5iwD|3bV zd+I_wLZFAkCy3@Fmy*WOa0B&1hwPtbyL4{5fti_^@4TP_x3iA86yf|?8uSaU$eS;@ znq!O!OGXGPRumqALS>VO@6|XsSPEzlm3n*LE5|~T_1#8#Mz!e=RpBpe`WK6`9O*3A zhctC`;RO0S7W?+DaU#gYb0=`i^vvG0WDE>Uo3r5bD)&PsPJ}-VR>pEpifObeS28CK zHLCc1v~q%;mba{(&ShF(4w!_nemVI%(&Uq?ouDJgJeyQnHk?<$M2E-`>u;W9N2U-u zVb!ytq5tf!Mw^ivJ%kvD&|o?5cV^ec$6;q=v(BvGFYGUizsT>l)DE0fE-s2*!06dI zK5Ir55dCS400kMz{ceqbcx!s7`wU(<0OX> z$SR~_Kw@||Q-7jMYO zd6*lN0l}e~o()Q7i{oZvE;M;V{bj4eAs6wM>@X66p6%%gozPe5tLeIo)?PP6itdX{ zOplkVb9Vk`v#QRIBh7Zpe_}TCp6hObq@xX+FIBS#hq#Ue2cUy{aKp@h1eqCgi@Bx*I}U z-nTb0LjA|7vphWD;ga6q=irOGJQ~`GVLHwFCO0~ulGk@RhBl->?AWXshJ|ja(rT=_Gks6to}ZRwVq1~ z-j!1ZRJhA>|Lrm3Drj2mrJPcmtB9e1=pD5xO7+n=TF%$41_=u(@(Q; z;}CN@3aAB-g&aC5!ajpUG;biAtlx@ksc)8=z&8fjLW;_u-SZxG14aF4f8 zpHtgJLHsKsc=r6W$D%tXkA9CqrEwLll#4}}X$GsYk@6NNW*8kr9hW~WMo+Pmxy@(P znvO>nZ_$SK>gv4BWj8@KzX{XHZs(W234#pUr{Jyz0*ow$;+xlo7DrqI`%-Du)Hawn z8YSAeF=P84={lc*9vOR^!^hb|;bR`VvX7|t^16NYJ-JJ3<3FF+h5FAX;z$@?Sk2|5 z-tWprVlk81)ah^LlNoTJubmQtzyaG`dQe;;1`!Pnlh34`$Z8q@6c%#z+_WR(74A+bP%+IjS zkA}NrN+z@{e@7=G;b9U>W1EA{>>sO;f!Z$`RxdcxWzv<>e2D`X%=2%_Ke0dS_Du%o znRy;S4Ss^8&_{vO4DN)>XEB=EFZ1Qnbaa~T8nTY5JLik-B;et%aam~1gMj!f;0De$ zC5c$A2thjAjEi_(^m~-gl%r^*q~XBikHBWlx{a=UlEY~Sy2K$Cpp%`+1-;a4QtC=l z7M2W$L!?Yfmurw@-iXb7%(Bo)1x^L@;mUqF?5Zn0u39Yi-7(rDT#Tlb1}D59;oUGZ z%Fx50>Q8%t_+c5T7wH%u4Xl!*K)BLYElPvZj4H3lQpyY7@JX~0XMv7qc=E3&C&ME{ zhdW*J_-0{YX!==Ur(k4^;lt(RpK1exO`U_r3U%WLl?Em>)0YZk9cR@%ts%C!yfKD} zDw8tZkVDZH?p{Q2n?&4>17?|s60k^z@(3lWOZ3?9?=$bFHn3W#w-FHUc$x3c9RL1( z=js6~{sS`Q>Zr%{;@biI=4xR|zyw4ed#4F~{`+R)t@mko>2v59uY2pINm!T6VPpp4 z;`y4$kwUE?8Q8z;@&P5L6gA|+Roenrt5(z4%Y;vl2s7-?)Azny;tdFxBnP+fMB$-? z`1ItDX5Uc?5wC!NaAf++0i_@4osSECtI+=^tN>mIf#j+09Lbc~g7ks3=Q<&Q|Lc`B za^i@|CO5&~yUKn~A$Kp;+H8!hwFH6&Q7o8S=u>#&e+3x+dZ^Gq5OV#MBRz6v3(Cn> zt$4r25t?|1zVu#p6^#TV?73x`USydpKB>#ZaQ6*xu1dZ#!PM2EG_+<{vo>UA z;(taMs6gDKY{u21n-x84S0gtd&xq&`LzN(%Rdj6ReQ%N`LTy}qhRp;DSZcDe{VuQJ zRhJhY_9<-QkQGNJQnG9BlBBHqwT-`=8dFNM$wNAsZ#GvK+#C<%9`qlvg;+TS5M2e} z#f#=Xm*EOyZN@Ck_hSjcbumf?8mwk=C(x%|b}@LIX>PHiBfGpAM6^N4x`4ImWOVy{ zmkK~xB={_jj)Ox+J0r?Ve;;vA^iUNLUtrAey8^)mLc_3pLG(}p9ULM1kw2RF4Kgy) z7xW!(+k?56flV0XLqbnp>TKKes10BY;t>LG+Sv2j9m`-u|MytJ@CHOC_tFQ1EI{FM zVexR*Cv3d&8IFOwyFY<#O)eMvm|M^11->rU;ux zYEQ>>+*?-Evu6))Pv$GVPfwnz^#VF+D<{i6WSx-r?;q<*gF2VnUQtn} zoDS>2Kj6ot=^?SPPt&uDU8W4nzpc&I3$@tGkntIh5|=4pf+8ND`^u35acAl9Ijt9L zJjSl@IW`t$EQW*dm?GDReUB0A$1_f?UhlcJw3<5aO+BCPV;kb~M)+RTrp7;P&X#H# zP+nc#G}&_k)vGPk=dzSR!~^#4=z2tF`>0tmjX5 z3A?v1-f}xBQC_wpj%PbHrOuL^E=S&6T`Zm*BRde^o@z+iKM2*VJFngK6f*A|ubfNy zGAG{?demG-hBjk?FH_3(`mDH-u@PFp+#;f4jED`+WPkd~4Qn}2sA9eXdooeD`;%0p z-O&tvtc%%wG=6Y>AnF&BVXT<1ev=Sj2vvj#(WAkM2A~pTGN^5(mko~&qQeCQplWGx z$4NS?ka3Er%^&l^ z4V}RjBr(4|%Ey0oe=>>O+M!o3Q{1L~V0p?JU%UIQE}SK+5Ft_7-a!?b zGKYweu%b(rmOwZqg%=>%qtin>=2JyK>6druwT)?Os;V@q>?awT3; z2i%_;2BAWzX9pMZ+J7A#(QX>j;4U(-z5IT4?GB)-{^X5gO^F^#7LoG%`DMt3POG7s z6K|)@Np)UJGwBeq?~e1mR%*)sp5<^AC>aEi>|y$NM(aN_B9NHvR$ zxL%m$;kGH|)y;bj@0}#oV$R<#;#3FHlCC?S#^*}|`+gWcMg&&pg@=do^chskk}f8Mo~Nl3rmJvlygIxxA5>sl8POH(Pdcd>pQ;8^VY3=7b7QhKsWN=l8YEH|rk z`Mmm&PcLtd+m#93gCs@LNqF;3laGbXKeQfzY0>#60O@0&rm)wp7X@XTnI zIq+U5u%xq<=rkTbMwBis$|hG*{$0}BG;8LesnI{ET=r#5wl&ahg2y*e=ksloeoeX6>eoj4$ylEwn})rX!?E<-&B+sU7-pF%f7rKtpqN{fFb}W<6&e`dBV>hU-7|yi3myC>b%4WQx z06T*Z{Bhy)nwde6b|LlSB-MW{*Wbx3abzap;TeQHpne%s+ADA0b8{zS?*oC%{6$yU z!Cj~WC!Q9Keh^Ra4CWEofOu?0%<)dysKvePj_$21yM|OinUfWAW~k*{Ma;HTrMlZJ zi_Jv;hkTk<(aoTn$RDjm69p)ztMl0qaWejiJa-YUqdxG z3tP%Z#USH=`ry;-|7FRB9u2{X-;4dW{dj-Z0rpF6tkteL8cIoo>*x5p4g`6BtMLA2 zyPrTeL`JVct2*2wE`!rR?J&JvOXp3{a7O;oT$B83_tT=wrp9j;W?;Q8;=>I4h!Eg% z!dp>WTUigGbeQ^%b_t)Dkb#eed#X4a*pod@^mqB(Anr@}_o(0w|BS>N`{{oM26uXn zf4B0}0BrL=!vK~LY=a+j6BC6A{yEVM0v3N)d7Pi>w1vupn|7sEmeb}KINgZ<83()( zUDqc2+cv3Dg?Is?txIUc)&tAdEVw||cfhrsBDg}oLBaYU1j|vp`wvv%pXDEzRzbkM zft)qbe}NDG%OT*i{3jmque1L95O7oA#lNw{zs~yaL;rTMzi0j1p?~2W|L<1(+r|EM z)_xd{{M35zpwv)^&<(Ycy*|kBzZ&~m56>v02Q1cS&IA;v6Sf2=O zPS+?aV@bAFl0S2{whv7FkWn~~B3KFiA?ObhkReM5!N*TG=j1@R_ZxiAStjr^$Laes zLUxW5Pc;KYkHJ5lDH^QiOHd=wAo)>ZQ&Wq4#qEr?muS&-VVZ5}u|1U{Z7pss7HClW zB0Q(BfPg~0V%E26yQ1o5lugGPd7_PTH{jFx)T7x4pz>vo?Oske1EFQldOTqF`v3QQ ziQ4{n&qnBDrOS#>E~HFi;?bv$?*hjpnrKhaLQa1b_|o6m2PaJ z`F)Ef_12|p3C#q`-COwJF8Z=nGYrmygSk^uk~dLW(w~^E^CU}ERL4eW1^wafc?kMC zVG0#Ct)QcZX;oJ&>2Np`$gv>*fxe}9r592hM*51|0pA=HhFRY0T?hugy5? z@*fxRwH#Cs#JMFdd!0_Y$+WbzK3lF}<|?kw^h@MsPgcdB_LJ`x)kHeSie2MvX69nn zo?<_wYs%ysQx_kbV6OIDATbQOtU2Z5OO6wTx;O|>ZuV<$L{IKtBLp@_=71%GfY8if z*E=J6j*4T;J4`J(d3W~x4>iKPsLG#pq2x*h=G^mot=JSXlJm5l)Vp-!`&S4JO9QQe zf!yj5F{SdHoO5EUVA`0k^OmaEk2(?J`8)Gn0ikYSC4imZ81p~Pg?9X_qgIE z1kIocIo8ZXmeUp05xv%ZqVG#$sPr^v@(B7*5bzUy$5)%yr2-EzHO8({6AfthdbNt_s2WFZMCXsmD)uWMW~oH(yBeH zwP#zzrl?pU?W47c(nwRQS}P4=1+k*FYDKNY&KI%wra^vrp5OJG|G<6S*ZsNAb?(pW zob!Hn$tKDnExm>k9Zj#ix7Vj-g-Uo}`!ee%3WH;{q~w&wF-SW_Sm=o-hfpiFkxuof zT=dv(41$L9^V zv~DWRe=L3EqI;lj*EB@zu5=``#iiZQHjA&SA~P&m*4c;Lr=MaDXcnpMyZrYAWFl*Lm#8$H@fV2JoxT4?k2_3eeHJ%KFLi)(ze4o zZshveg$}}X=d=JOA;>Neh`X8Xa*8&b1Wo0hkNKVhc_)E9*j5KEW+=H3j2M}Ay`MM^ zC89zHVgq3pf;TMu$L*3&h>3Yt=o?(#>tiA=jK6XaHb;i@va#TcUoI3_jR(W5gqaij z#ba&l)1qM0xLW9#x1{9CPZk`*$koPjzo`61yn|AKeGC`yI?yq3bU4^uukR7%U}9(M z@_nb5;CaR*`F*g97R)5R7h;|3oIJ-O4637VRa{7lVO>bj>LX@b-4(t39*Vh} zv^Fu$#7lzbfC{-E=WTEunE<2}T)~H8X@x}l^03FAUEO`0efi=8u;Z)!qV5W^SY&t{d8vu!uBU{|7ec_m&|6b+@tY=LD{Akk1 zdO+XUk=E|T2X<7mJ_dPCR7oH^ZpLe^ot&TVu?zS^?f=>6O>dg4C@%is3<8h=mIb{~ z6heL){x%^dd7Zj5^(Fi5vtYO)FwoPstL2b3T{*9jm|$#dC_P+jcG)>u8@E(3uz|I< zEeytHTFGFKw-dx`busEOD_B}IUNDCp=7beXRi-NxWKV zpgP$mkSj|$vUX-a?4Jt+#QYRVzR%~qJmL)zbP{8Sw=Gm0sR7{K>LKct)ht*{j5@sA z)n7RsuG)SbWpqkFrPT**X8@g3?F+pZtK{Jp_CI{0hyPgI1gEZb|E zFJ3bVN`&KhdXq3nQ$f({6VE&yjD##~8Z8DFxcx3uEv&g`#?{s$T7psz>wBA)JIe{f z%_%wSd)n$8ewCgKgFwFfS<2q-q+f`Ps)coA&J^+~dmch^`EagDgFx{l^J}n8;KY#K z%uA$|k?E86fVA_motm>(Vpy(5pfX!!@7x!9K~0H7P;Q%&09>kLWuuuRv4%~Th(rA9 zZ_8A;yE!)-Ch(db``!O4(UAv(vYtktv4c(i{`#JSD+TR7S zZ1ZovIJnWl%FFA**lpCGy=5LMm;Y&I?i0W>sm~xxIP#iE^lm5{4KCUe)Rxp!d_^!y zZ>ssni}K{ju0JC8PS%+%q$P6t=KfVvF3J(Q^?5!}#aofwqdY9y45areUymRJ&A!tg zglFM7hE%A98%kWa3Ymls)>~Iqp#_0@aKWZY@1rs%i+QMPs6gjU@wo6!Q$~mBU-g6y z^YNqp6IvTXHyFbzlxK(40CUQ$gpX~n1jG2${FQ}EO(~^)Kn33F({|aOmEFY6HeTp) zV{wT#S^^#HM*)>>942lF-n3}xrfQYz*?-yWZ@F|7KFVn0r$2~*wl2aA{}8`5C0Vvj+uF>H6#j}SQ)!8prB_dkdIQ4Cby zB5MSn%I$y)4E0x`&gKF+q;UBswyyqii05+mbz^DI zXgRDmey`ry&9BV^u3xCqv5Qr0u7_F%LFfzXZ5r*bdYCCZ;mH3MbXV-;czmk)%X0vdYoMgY9-veT8~Fu4g1+czCdwQ0 zUcuTYyHkWxdgmL+64VZ-eQP;;tBGIs(T3sHBpH;FP1kgp_POkGHL2!(YARDVlF0yyEzv66^Esl>nnw{yroK3p6S3)L6Q^-n#e%m!(+zg`t z%Tn7eNPKA^H{5d-@rs9>s*d*wBxCx6GZY~=_4ADFs{SmHj-sV`M#hFnoHXjVc%y7I=h}`7P&4_m6|*3Yl+jKK`7B>PIk&Q_n!@aXrZl7;csqd zBg?h!q#rgOCFXaYZFR|=el!ko#2{t5h{X7W1fSVyn{4M~R~F41+cP9-$)8_=1A_~F zY+b2A?E1E6Zy<7aZR<#5pog^{cwt~vnW*;gym|e4H&VZJkC*3k$P@R0s}FKz-Gr%= z*rgWmY9mdIRZu;#8`NXantE<61%c|E<>kzQcbQtklZ_kiwrpkI+eu4G4w6VFx#lBdV|JvEdid`^7R=y4>-?W~C_!c59qriVJ{yjLD@4 zXBHc|>VTg@y?Yh{!8qTkA*lN4+eb3lAm9FFilKZ%$bMB6LrymTu1Q9l?A46k>>Br@ zucn1Ec1MV;h!TUT9#kV|WYfl=A^By*@v^;M?7sIBA2y`O(!(ynfy?iZmT-UE_Oo$q z)sPiju#I0e5Y;`$V<6AdTU4fjMq~N-GUIt38gcRnFlo=U8)uwWuhG&=#>#e*W)Y;@ z#}`@93kTL5sy@rN(uK7TZME|<^;EX(_Ysq{h=JgfdoDoXYxx*TSv$S?;P=R(j$L!UkHwEnEc7~<66t`-`BERINg$Nu4D)%C+DE>JwnX~31YJn# z$p<;0-K6TcEt6X2#zw~C-$PqUn!auNrkdPgi`9mfr-)tOR^jtCQ{adMILG7H@I(;;rwT zrrRAIX(puuumH=ydRJ>cBUT_M(7$35l%M)r0Q7tp{#`XkkU3mE|l<#hvQ?;6=vzU-eI?+28!XgJhPP?x&i<_h_!M}T2< zLltQlMtIx^nA^#ooj^CF#dB!mwl^z+i=B(A{VUVUgZ;p+c?qql>FbW|3vxhQdek%O zd*CCX#$G8$m6%#iV%_WYstesDbr>`^5Dvc?|IrI+D)m`oeDGVos6uS(%nN6Yqtg|v zuOmT|X=~pD3%4r_f{8MPe}4!2A=ugg2z(Ma{|H-FeQZDd zUAqQpdRU%cS%1W{`@n(P7PvwA&>eB2riNeW3Vp`Zyfe-yd#G=(Y#^q&qcz)XJjQfP5F;B9; zD424Qrw?YpRA^?p=~&ZUd*Z-KK_g10`;F}qf*{&?{%;Q>cCFA9XJhRn_6GlLn~ ziI`1Cz5gdVM4KK0{~JmcNCudHez`zD&DirdbySN;Uu77ckVH2;nVz2Q9KLSrb}Q`G z&nKOi5AI$#?{&IJJ_mf^d<9YOTw>rn5C2HreK%@fvWd%MQsa&t$d zuF8#QT@N6We#$EWchM$EF7i63?OK?nYfh<4x%K@60R@lM@8)Rfb$2O*Z9d8UvXHlC zsvJHJ6^5IqoY#$ia+g()!s_8! zg_4Fl-_R;}6^7mzw}(gX#Ak(Kr@l?g@{7mvl)*xonVH!&29wCj($-|(p7-hO?9?|f zFfugs8OlRr61wZlI{Ta&LjF)cL`9`lRwn4(`HnszrUER1Fd;K%sSJ1x-+0{vqumqDP-g>zrEZ?D~7eeQvlzz#Y|A~srCwd31TZTE3}d|5rK z;R;_UHUn**%bR~)ME88a7YnN8{%=@qk>p|UUq$OJ-lk1U>e_Sr(xj5C?-$pegP9J` zmFu-~eHuUTd`PIwOBf!SzQD3wtuy~LvM%+j_}hoS7MMK;xVrzYY=7_adSrGkH${f6 zL4^DzS3F_Aad~P(YW1Z;K**!0hLR7cXQXWXlq;L*F{i=hHdAjSV;GA)1#ISs{eRf~ zKN$EQX8nIL^TWBLKG()gW={so1QrDZ`rl#TYX#u+ddHL{I>1I#h>PJ3d`2Pep}2Q{ zR|}C8kH|(P%rgi#59E#*8`EHAfK5#fIJOO1#dPM(&>L?NKcYo^+wr(5&^ivaEQL3K zSD!ue#xwiXfwLcG_}<$mi_?=DcDV*d-7YomvuR(y+){MPx9tANBgxJxec{ZR;cGG7 rI9#Qv)nb787&%}P<9#7*XOk|01Ayurf81tJ_%r(2CR(MM&;R-l=GEGC literal 57539 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 _e$ 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 Unsp85@_{l8p00i_>zopr08qVHwg3PC diff --git a/doc/en/settings-dialog-chatlogs.png b/doc/en/settings-dialog-chatlogs.png index cc2cbd262379374e573b5a3db24a9e5ef545ed20..ed6a9d1543aae7966ee1b3478487d64b79bae3e3 100644 GIT binary patch literal 65433 zcmV)^K!CrAP)Mh6baG`nAZu-9 zb8}QH^;rM_02g#cSaeirbZ=~L08?djbZKs9b094sOHE~SbLjv-#U>v-#U>v$6#H=TCunRkD0k9Piu%6#Yk{=qFaULQ*hC8P`i zfBxx(>}oc%W{$qWInf#3&}3nDGK4Km?#@sTl2*ua@^w9{b9_ z@@0H;>~|!+dcoYQISHnYM#N--h=54M^B^rE0LX~Y{7q&D0En+g88Hx_BDKc&JW5usQS$QL$&C{q{*7$s!mFn8v!^s@@B zb{cPrLyot*?vfrAf(e|`MUBzkJU1%GiyfJtU^-uEN0huF(V@vtY0GS1imB|Fz$~Gn zq6;|Ej&$auVX+lFi$6eH7{f<>Yyku5sTqfsPm=r+cc@pP+)^?G<7$b&LSy! zaPSJ(p4d>@g4Q7Ia?s|ATBG=gkXl`8x^9j7~)Lh0r#4~2? zZn9`ZQeZ410s^eEdRj6M-lhppJvYABaephWz(Y zIwD48qc#ErL_qI6fB=Y|uTUH&HXx?0qh|MGvjd_yhKMf_S4a>Z9E@5~JV69>;T(g0 z419QoNetS#6}b^GdTLmp2IG-|)H*;YoW!a$auFj_#1H^bje_dN^^RGFm|-c)@@n4G zyK=aamrJEmDU0E$vsH&eazCRG0RUzhmNLxq(AzgKTnVKtVlSIROa{y&(nI+#i<0Ej z(>GA5Y9mD2Ou8*XsX@9yhtik#8S*-I`*& zQ0R4L#lfNTW~FuS3M3hqr&d%z@=~iy>aChk=tYDiXs=_0B*rv#N#IOqw#KkvNT6w7 zY#0PGe4<7a2|nVPv6kq{z)#~bp(6>d9aOOyIkR>m0~0YTmm9Q5Q2tYuAOupx3(WHt zJnL5+o%3i}SqPbcDN;sRRIrf*#!7=2hlpsiLBz8a!vdXlLgFzHW)cqx&Wd|*m4uRZ zWwO<;% zLY&7y<_w7lGMhEDr)=dk%(hL|p_o~;GYv~w?`SinHp%=VPNIGR>|d5X3M-LC@xoO4 zJtqw*hWI|!8DmJJ2_J`rR)AoWP~lMBT{NMW63YqY42Op+PcK-qcv)Xh{|bi9vCZSV z+BR8ld~0)4HP1<8Hyk0;XO>Z^gu}!6Q_n44ysW=h8)<7E-`%#+y4|hKO?g$cqZlHb zqhl;(S*22)_riz(9zwK%T9o$cLb0V)vLM4xVogE>rBYTIuFiXLX{|6DuHD_*+*qv! z0UXC@hzQU=h9+#h9sra-^Q~V|Rvyz3eA6Pm=eZ)=32v!m%67^45wW3MTGG@1;N#Ce zHD`8T&+>s4{ec1^HZ`}7ZSR<{`4$u3vB?JObPiXljC7LOXc&bq1*}cC(^t|es~V!C zJt?V)bvlKs;|dxg+5~wl6oo21qQ;S$cmbzTpsXk;&KM}*!5O24z|xJgXp$ThfUsyZ zVj*s%j6et&AV7qE)m3ap+*7#ApbLc)B<1j7s(5M; z&v69L`HPPq(&Af>(qYSa3TzYv~@BNQGGZJiWx870w!l$4LSsXD$?_GWv&p(^byV{zLyNTl0MJ|pz=kO&oKpsX zQU;mSaGBu*ToMzPVm+z{azI2&hvvULICsmAcPT$bGt7{h8XKN@e(~M+&w6V1taa8N z|GvF<+i-(*#*gb--qZX13kx59boPCB-??n*;vFV#^Nvl|9j;U@(p6!A2QX6FCkdZX zkBaIn0-PrRgQ$F@SbmS!M4z$}y7-1!r$k7iD-D5_gLLHtor7wFk^h)2#f^p6#76*P zy%5EvNjTe_zYCTIG10V+AN{s+hNtTN2Ai7 z1oAdj3GIm;fG_`xxZdHpSxFFy&0KTVw0w$yjg94}pItazVDtTZ@3!HF>x}R2THe#U z;Ki38e)P!*o0GTOW~vHZ0`I;Nh2GqGk#pxvYy`OeIpaM*>b{q z!^aZ; z_K$xF)ylZ8spC4^DwW(tSHdnX;nQB~y{dzv>04WK`I#(x8r+E9352phInUD-fpc{( zmLTd%yzm4g4)@_#vz3cw3k#txf(zJ+4U>|eCn$}UipGXX(E?91b0^6Zx$KP%-$Fk&24fe4EvuC%i=_C+L#;XNln$AV4w!%C zWDwXWRWf>gJK7T%mR46udkP}8vz??|E&urx3)9`X`}oebq2U}Pb5q+ZA%JYwOAeQ<0s`hiYNl!07j5*< z&!2bA)7Ng%zVQ|vJAp<`v6~FD5KRG-c8@A%toOxxB`In@`y2kk1}4 zZ{FO0&V4TAIg0hk)-y<76CzZ%lvf?0ixrLCB>1GFNxP_3WJ*5a ztVX@aTvFV^s6C#R4J~FZDxBkI=gdhA;>O^;QVJ>}x}($hF34%QED4ZFxWGnYNNz)k zjEK=NP>BP8BYX@=n=u{;k)@-4iGTti!h!|Q9{rU=r|!JXd-mAzzfL`6<;oR^5E)eG zlDkFt%mE*XLptbyk49pcJaG$|G^r>j+7Jba5ZrrY{SfCtHWMNj1EoQpX&~5sn+YJb zJp#D)>MPIw>FEe?zeEfhez@X;rqkw&)3 z1LYwvyly^WqeB(ILoP@Xr&|ofl;ookyOKjVqdn87mQPD1d~Ei!$|my{Je!A*Q^<3E zoxkAO37avS%$YYogdpi7)E-6VODl&20QbK%{kfib;$lXDfNSi;eR@HlE0wdCmjoJPAHblX0qp5*L9+rE*TVQp^S{1Q0{w9wlui zy?GScQ;%~#XoNeuBPXora6oTwD3_KlU-|Gu559eiE#AKQMiC(wy}WSit+)NzITtsL z8FThePm4f0zPmHR=1WWZ8cHSgQv_@%XUnXSjdKUK>A!qj7h~_jrTyh{35>L$pH>p*+vy>;3o5$n!k5kmq5XNb>U1zJ`Xf;&uwumQiWKXF%-~>#N(2O)_PZ zEhcQVVE%Ild}N<1FTW_ShCGD48ZN!?=LdfDeG6ZDXtFcN!l}FNSj|H<57nF^ z;Z@{S&WBy5Y}ebrvcIpdTrLBE71bmfsHt;8fe1$`evU|fAO#AW6`OapNFl!@@u{)x z*jONk_tedJO_laQUAC4l-hktNnBK6QB6xr<$6Y+Q)VtecVa6-13)*Z9P59kNWbV zyH0-R(O)^FudjyyCQsY~0H#dbV)C||1HhDtn*+k+iJQkBr%c@9ipwtg;68ioJbA0z zZvATfx-hb@7;F0Ng&|g+q3+uhks$G?YH{s zVW02o>x)6eZMXh)%A_r)Z2yh}Kl$MY9+(+n;I>klGP~}a^PsrmL!CAz<^JcOWE?izJ)I>+|Jka;+iD)>&wnOj@-Es)sid?=1P$eq18}P5 zd3>Gr)6pPSrfDwa)rq z`pR(^pL^C-mtS1X!(|tpd-)~jef5}=I>(K#R>RJdMVL~_*E#)Br`pLCG zRjN@3hXUL>ryJ6vT(h>b={{)pVLnE24SpRs7<^&kvM zA`RJq004rf503u`Q28(RSr{b67{sLr61nR>g}8JScH4c=bIv;BPuKr$-n_Y`Qt6hz z-4h>HJNN9L9{2T=@0ju6$3Jo41?QdxL^B_m0{}B0nKSc|rvPB)BToq~@_?5tS^S$n z-29_6rhW6oVa{Ir!`ih%xzTwAbo?9xFNw|B`XE94V>4c+CI{7;@W`oV9e(7g-~I+~ zEM%zX#*LqEXq~-c$>d|aae&*tIAVNbq>+kDtXdKhk*9eYZr3`t zE1tnpsiA31wK^=zrrcS%l=b!XH#Cmv>=;|kX~BZ|2krNPtFO33o4Wks^A7&x2Ny0} zRLv>NN)da5qdi0_X(OFu1-irK7oY#zUthiRZhKyH>v~PA4 z+A9_u5xG7G0HqSMNoPk}9KwO0{ovjY(V zR4c=6W5;5K)jR|W)jZ@O?_aUv=)(>g92lsE5ZszyM|%f^JcQgRYPHBuoxMIUjzoT% z|1#8Bu$J~LAA-0ECi_(Yjpl&kU2Bg`-qIrGI1Xe%zjlm75YS~tas$@uAr1{eX$N=* zfV!W{RCK#V?2RAY^7;k9di-Z2^%1aAFU9zSgMUKQ=cWxHSyqu8!H`8M@Y~-zErk4k ze*MeO?Ek_2KlZ-avmcKha>wnrY_iFOa;ahO_rCA;+in3==dc+iQ#Am!Sv5l6|q;*=>n&6xg=d+)t__dWLd!=GMPjW^r8)X=#1d*A=J z+x{BCddiMF-#z^w_uYH<)V=op?P{ zLykE1vJ20?=Bi8b5U#xRysLh3{^3WR(AnMXu{Y0irM;-bs!2k5$gjNg{HuO({t-u? z`28RM{E#D#x$MGe*Iae6F8E0!vPV=^O{+_Lx*xwld$AcmqPVbkz`=)ZKY8Z|XU^DZ z*F8Uaz`=eAQ-mq3q1&-)=4*my)>`nt2M_1VcKBHDl#d_0_IgkE%~?D+{6gQ#@hwf0 z#_iM5xQ;QCBfqSK9qp~d!@~mu!+8kRYKTjHjg3ubUvy2W+)!Bat5hnjEzM00W!Je2 zmtxRL1j()zkVG~j#E82+$xVaVZ(+^M9-rk4(Zz@|IRF|vb9E$PX!a4Zxz}wq76DN( zUvZ=*cq45vm?7{E0bcLWZ^=Nxva^V4Bk^DCu!jF)=lU>!tj(#=N>RLULI4mLbz@s` z4+2^W7!gMyAY!ZTmk?ojPbUEZbaZxodH1ZHNej37YHlQFivon&(j1ww$OOP7po8w&vA#*dfTgCCxLW^YgL zaYr8Z-o18ueAZ(iV<(^;ww*9};^vdL-CXiiA{ou&vmTpv?j;KsE`0dG2NdT4V3W-@ zfBEHw&pr3di!UtLeDkf;pq4LNw$r3{?6B>G9k+k`;>C;NPq+N=^q=+g^c-{KVej5! z%B)$BMpgdTkAK$F({t>RhrMUdDUZ*Z6&C?D4I$o31jZb?*@TTe7{l=;H6$15r-tXm z{+a3kFc2}-F@edtHwB5k*yN)rhajmP@19{kQV&)>1_IeuZ1zBoG>CWo#M6@G#bsfs zQxZ|&B1+suDs^8qSRyG&Dk=LAH{m?7raGLb8U&DMAY@;tl>|5*CJ85HnM?Xtl(42u z(qPFUQK^(MYz_|Vf?UYM(xr=+E?IQc*G_rowmZafWnK+=m0@#CQv>I?1OQaFMuze{ zX$HCn1oG|W5h3_akS85P0Q!JYw}4gb01mK|6G``^-k?;y?x-NM;ASD$8!%% zU2oUP<3Fl26GtQwJmq;9*VS3V(7R%&vsBVi0zg)3sOG{j00=NNTy1K|+QzoI{FEep z=h!Yr&|>`{E9W#qB53Jg&FUb@?V@|WKFRkmS!h@CAkADf5~RfCV-tZLM`1;{1_LiR z$am~|=%aaVjX6}3D-0Zlqr}QQ5_UU#1jX_{1p{L{4*27^Kb}c;~EDDQU%30XdsF|qNz}BT1KMx?zQ8eZv1<5Yirxs_Jcq7g-b6wCkoQm z-f`n!|50veu*WuJ?sO{(#t=@+c(F~fIRfbD?Ck6BYj5vZvSdlT0uj5qx-b64uPT+w z4S%}s*rUF5(`_?Utot8%3P76zUl;i94^9gdjy(4GuOEBlcfWty`0;CTJqKXB?I-=> zk_)$)xE;D7j&1L_`PRG24GlgX>gpVK$>rA!4-fzOPuCxN1Un_GIB@d9cs$Um{8+ym%+mRge_{qH10p*WFpd z(9<{6*-=t0wY7Df`-|VTcXU>ABkQ4|YGXszHnxpjPZl*R)ts@nf4H-qL4Lna9opN| zd)=?E{LJUS{Gt60QUo3vu0-sOu`+`>L2iu+2ZyU&9qpTMy5UoEZE;n1wN$G7 z8n?R4f8phg*B{r}-ZnT?1z|OPjg~DSPGY01S(gZc)WJ|a%PUdhOEA;r_xcbL_kik7 z5~OPK=WJfSbHOY`pOi2&P^`}AiMWptSxq2IVETKz+PGG5A_4`H(% zf9{}|$AJa}9ML2Hz6n?|N}w~J5oPg+*K9QSj*+q@BOKrh6ux_( z4_tlKWlNVX9vU3H>heo=n6h&m%haiR&YSymsOEpT?l)ij+^6DbOQllJ(j|aYDwTSc zFAGsAuC^hl82bu)y=$L8T=$#dp`j};yD)xD00(?x-@o2`BW789XIIbio_IBaPephh zqEh4F8XB4auv~6B;p9_JJ>{fIrJ|~sGg?(1i6{5}_y=zO%byXmj*iZrOiTd7m8v#U&2xp{&wlZkpPc`z{SQ7Y+3F(LJ1|sHv;=_RN-m8&8yjiw?Dkt- zsyVfHc31OI&2tan1@z{bN@>qWsG~tTKhOt*mEhUrg$47kz3QSvj`-TXpZIjO8a{Tw z=MO&gsH-nK_vM!tR`akRWs|zcXv~+F#(Go8tEGhtLy6kjnmSt>J3E@k-u?XFq-2OL z&EmLgXsFuU+_cy3JN@&CSxc7oY93n6x$>#6D_0IaG3&8O+iu<5(lT7ly^frHTL#U^ zpAnvBV6~M`Cl!CqftxpOxATW{6zQ036%CxZ6G3D(bdjBSk3J888V@p?I{s5O6=#lf zUWfk}nIKl%q)n7{N8u*MzQkWiN?%~2gYaLpC^-dE!_uV}8&(|(lnYRGNTNn%K@||S zoeM;=IK*+p7`I_T=mWG z{xA-5_dWL7_kDX3!R}M{+IOF+7P`wc8FCQ-;8%`1{vWsh?fviGb)9wBYiVgABBJo^ z@BP=s7fjo2%GTdH@z@{zWEzl=p4yo-6#^;b2_4Z!8*Tidk9_=$(|(}g)b=~5q2bdE0BQzT(^8J1q)!%BerP=z?jxPTu+(Cmj2uGp5Cp-}(NJ zF1ldau2Z)D#!1JX{?lnnV_FUX;Q;0lu?Lw_k(2Ay=*A**;8}!%vb#;N@0GyJnIkcv zxXVS~9=?de%WB~{uqQC(k)ZsiGTEck%%6SnD28OCFEn^~VE?(NBPlA;j zn@*c{WhrZ@<{_^0^{*U!{ISO-ZM$`AOKY{th2JRKP$h3}5$s*otB)V#dDwWs@&DpFi;NPv=!0$Vd18+y%e9p`&wLK^Pd}z~j%k<-NOXy?*l^-xF z$1zjtg1OQgr+czvg`87JGj8D><2PCmHLei4)y@o4Wcc7(0f6``$tJg!86_7K?$&h? z5aL%WbiQp0^#hNQsf@;;Q9hEJY6JxPX|hB;WK|4FFOnHW8zj0R>NvLFgcC6lA zWWs<=yRWX`3phA-b zRc!oX$Kp(58q4i%WA481;oI+dZ1-JvZEtTWS{cE>;LuEg&Ax%5N+l;rKjH<=P34ZU z&3E7T@ZauvZ0fGN*2UhHgF}kFy(T$1$d

u5WjQbeCJI1ya$ca(_?-2mE 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 _p^a(GwdDY zm_Szyi6G1f?m~zIJy-blb{YmO&6x^}|NlNzhd!I1Yr;h`3v7whjmpR@R=+%N_4uC8 zDgjc*78Iyng3fHcAIhohgnGxA*r5KeL(Z`524pveN~f3%z{< zAACPo^Z0zeQ4Of{IK&dIoI|G|nY!UDA26?UYN>z+!<0SbiS+Es${{oj60>gZZNdgY zVJOnl=bD{syY^kZeU@N9vLIemHv5Z>FVZYB(rjFVw=4?_Rt>H5;$m%_<)2_QPiRN| z-cQ$oFER9qQs=B+zNV`F=*+JEXh2m2RXPWa#cL>F(}ksG&RWdB1nv`wRYowSYbQoL$fU z#Pf`}w?4b8Vu?;za$XIH+cmoBpr?-bY&WiFKQthFkba(KszNRl!azC2i2p?WuD|wQjP9&ahhMnhz z(bX<)*d8s^ZXG30X+)@$PJq5zS&ekOd5}rx&d5w08Z_ihA8mikOF4LHD9JHgnk8jU z6H?VsD48{nmoQS)KCQdH9KdA7*Hlp|=F0zY1Ltu#c-uAJ>}+|lgK|ekKK)UgDm=}oY#Z0Y zi8s)?n%F_+Ta2#4jP&(I<4Rd*RZG?88xj7o!NHjnUcU|;!l9m?5IZ}{S#cDEZ>2bD z2{igvZu^CU=aBm5l^YT#yAHlP2(QQW_P=k!I81F+w6r_R$y2Y&-C=tzK4TfY$w_fl zwr7lH`>msCy!%5GMhgRqc^;&iBMIsbu#fnHn~#lbc}-2p)v!o>HYOU_ubUZz@2EG2 ziLF037@rVP_`MEXzuqxM$2$D%AJ+>@WPm5Gyxc~2={4D2U+yD5mw!FVlUIg_ELew{lB4ceShiiT7e$y#LbgJyy8lOIZ%B=YBw$yM!ZJ1y-`TNG`? z6^hu?R~|WM&pkL8fErl$UK7MjM_Kw*;es?)9XfKiDmoY&ro6(NZ8w9j0{3e^(Uym*PEyRci*Naz~{F@Y+ zQ+lOE+$Qzgc$e`Q$e#uuO5{2N};lHZ%@e=Zmr=HlNY$XbrF$B7*nu>~E zqF6kk2f1=Ze9f5JDMRpQ=asoD*-n{H%>pF<5qBsQ8~h}?O(Jwx0to|#0Cmj{5~rN} zg~4y_;;mD*V9A;)RcZn6pD?gTJr-*4K@*+8q>-K3zmj(9fIC;S;)B53=ch(>Il3E! z=*!FoQb%XmK_c=crKQ9??v`K46gVpk>xbZ8%_&xlkOK8+;yZp47tsZtATtvwM>1wP z6WQ5QN;WdL1~EdkujUpXip(9f%QXB}N6z9#df&e_tfFfzQ?d{T;BGf{9qiw?-QEoJ zheu_O+N`vECLJTIYS<)0RYZM1auqUQ>aZ49i;oPSLnVbqIGL zpc2^Mj&~ds(bb9(^E1zZVe45z4yb9oZVc4a&bNCkr3Dt<{qo;YiMRPP1l1SXfS9=Z zgv&;)VSD!1aCTofU!22NawA~n97z&!dTyU(1GF_S($@$QHYO?Ddo&`)+wtF-ZEMRu z>pzhW|7YOH9$qLbB~Uew9t) zZE{#Mu`ppTd*Sv9^jV0Ri;BZ)GkA5x#L6U*nWTE|aj9U$u3=e~9^sPYG{2@s3LwA8xP%MxfmS`}Zm0UOh4~<}1 zqD`8rx_ZNLYP;G<*{YWq74>zrxLQP6;*{rrQF%(wnuuX_DvD6S0a-YS_f|Hf3CB89C@e*P|P-btH2 zrWZ|)D<&;1B`wVz&g0!(uynEZxAscNGbi${Btc@m*lbW*L?s)8<}kaB$(V1DCDUyLc!eQ+aFJIw}~1u@X}#AXk285Fa|BC?$IVQC-UD zF(!asN1_)-kL|D{w-CRL3`QCIRNdHA@u>Ovdfs1;HCY2)i^(K<$vJp;OpPeSO%=${ zk<95ZTW&e4(MlE#1xE#O0iI__uE-|VTMevulEm8ThyP+p3K8>dOwr#ruEGC2w6ydp z4{qJEXUyx8gbvaxwX?&>pxUDd zv>Y3iI+0$F+0jLxrmxTd%@UI-P>_yP5Pi2J8QuAN5k_fZKNXJ9T77P7KRhr@Nlo@G zOKH$F@Lh^bxPxs*muMmp>fvzGyc8`x$4vaJif1OeherOcnZ%%7O_0NcQcfEXzxkI* z=2#zNOK3CZJ2nPujm{}2?!pG{ubO9+XkI+CxyuR+C)Jo3lU0g>l?MAM9mT2?vxgfM zY}rqIJ9hG1S0}l;NU{|N)l}Bs)rZ-VL@PViOR7@%qko`PpvV*>RQ-$x=j3J5_;MiH zT=?@LlK5hGR9yV=uEXzv%W93yxWHihC$E4gNp8aHcTn+ajG!(RukE)cPH5a-t0Y$I z510DEAQ{9Rds_XiP2Of%pufD395F#*M}EDjVU>VB^*OGHRxA0YkG(s)I+-gC!&lBmnra=4WrzCv_m=nsI5`*L&bke@ zw0wLIw`Z6oQq=JkCqB0moA?~&0T^!!XEtjVFx6K60TXOczfB~1^1!oCxh94t4@ z9!@^P#zl4};>%0n@K`-F2+D@W0rx_ZD9v)Nc}q@6@Q5)ZQ)AH-zC9|jEc^CY+YhU0 zjQkOK^?_5RwVLe>Ddb};KR}b_sKFOEldw1W8wA{b3@2l~uJ#z^L1 zejJS)5P&$PAdu~j>s52N6oIpprmjd&M~6znuO%;!kDa^8Eo)|03H}fgLd%qI@HNk= z7wqOtE$yl*+BjrMiV@4nLd}_5?SbjW9eLwQWH-TEx(EW)DCmz%JU$~h7NWHQ@w7RU zNY7#v(|Y8$9^{GitoIRY$~%cV1%}D=W|hln(E+4Zi#6I3YYt;orUp`;o-HcHJKTcB zFY74>606EYy+- z&DWdAT#t?v4~&w?DJaORxQl+6k%&npQA|qKnxPND<-Ruus{BbP;KA~*k_oM(4vxG< zNQy@YY^H$^HA*k7Uh@67zq^TY&|oSpTB=+=^`EBg-~gbDe&kNZ)mZ*+hsTM-aII_j z9Qx2~i{~X2&xEX~JWJ2R{hcwVj7saMDJC+arD)?Z9Eg=Qs0tm7M0!TXh-@t&3OLVV zZ92Z6)rJ#Zc`4AD!(F)^m^uv|dI=m8FC;n4KOWbJfm`k)1Yf-dVTr7g*e7eP7LTDP zlOGt$NS!rG8fddRQ7Kcf#oi^+;+x~L85|LF%Lz4YgN1B{qW~( zNP_dmd|AmxY?qSD#yr!SL5iLdfv~3psTjFc_9}aqbzx~K!;gIda6|ek*30gl;m6E0 zpJ!7?&rmVa!%X0}1%=?_c!Adtr^kbM#lU&P_}=kQXN>51?X;mC3{l_TXjwm3zrdcB zhy(e6(!zN+Q-qsLR|KBB;|XE8eOO9`VrKDEOwpJ{MOigzc6RnO`Df!H@|9hPD4B^9 zE=gk9*=9|5lk!tYAhN%+1n^w~GpVPX$`u8A#e$=RCa|>Ec6F)+ls)iEc9$_?CreAAE=lZ`qI~Ob znpAKB9c4UcQ&Wqah16x+LB(_rrIAX)Zge2LX-2^!Sei__ul@`3JHx-GVphSW;I_#l zI;&1IF1BzHYE`#l=V}cD~XJs+oj6%@j|-H6-3O+ z>kF?KkBZjh{L6Ito+Vv^STfN><;^4VUj9Wdyb-e{f;l(0=BNC~1-7-WkP*)BNazs5 zQ1B`o>up9Jeue`kB+gs_ebcTvr$h?tUDQ;WT;Y2%=)Xj49ot2zP_VYAMuN?kZTtDb zFsA=*Tkf1){z<);QRq;x9M+Ds-2!7gRU=7adbD^p<|M~GHwfLetmU+2Y3ECKo>Kho z6+Y`H5Jbg_Z7vQsgXXQ_2O}wkJP0Z;%(%|gEUQ6fZa!_uPsQPP^Xo?DwhCmf z#*cm|Iz;+E>EMYpZu)DWvX@I8CP*p8G__HpaCWJbIzli39Xg3OJd-xP@9OAPzMPq^=@O46(_zy-J#-mapM}iiQb+BxG za&Zi65CRb`rq*ZC3FznBd`t+!NBjfZrVnAE%xQdZTVCV~dn$!GRriB`9m4b$groW0 z<3Vy^9Fd-kcjxGjk+n3Fi!Kdpg1Bo*Xdt!ZBIq7esVoP)mU*IW$jH{;yeHp)ot(ZmhVGf{MJlr#gAOq?%i`fuKB= zX$q=%c}Z;qsgMj7+U)eKazZ>U)?kupS3{+NL~*J2H>~!A0zUIAYL*fvJ2f9b-2Kxm z>U^ngm?@&>Wm4{wnHpA#X>+4S7U!)(+<|FxuGoGeRF06J36bn)X)$<2K$HL#gF_h` zGn%`EI+r@-HhzByJ#9~$-#TByB93-C;eb__Gk5W4VKKUBWm(bue}l0()CbQq|7#i= z9n6ob)h0rB(~u_3LGd}aFkhl{La$KXEaKHZ*~5+Y}E+kCICO=zdtsau5zMDb_cLDxD0TW6Np|gNv_M$L1Xv8GMDCrpBhRny*Bava1 zAd9xu)w)hV*0$;*3j6aXlY3wWhk_#RV=QsRp-fvHS+uUHh3H|Pr%*6%ld zo5Ow;mr$`Pcz=JmX6NJo3)nBBB+(Xh(P&hXwBG+1z^10@3nR1t?5~k0Iqb~Y!zbBj z@NnJXhj0y_dKlqab=_k2*AH9&>;D`i0Zx{ zcdeV+I^(|>o&tzB83`$^Dpz?RBei0{t;%wv1ME+SA3)*)vEzGCB#8j8$Lugbx=qJz z=hibcYA8)to=D(A{(7tGCMtNI{pr%63H7aQ63J6q6PGU`4-JO)8QB!q1;FeULckI` z^3q1O4xXYBGhJt7y6__(M1OKI+)z(xIE)VfAz-?m@~WyggY?XrrL)ZK8j4z4kMjmm z?z&zucs;5 zOprz<&GqEzrnso+`SeHv)Nrz@OU&nNx%T|@a(9y0>~f;h_SkmqCS)!0UAl{_@}blL zSKCueTiyDsN7y=18#mF;FV`%hFfX(-(yXx%Du)@ncre3vn%(ykSSTPN7l};l7i1VBi^EE_Jc&n%Alex}+Z*yYbu_MY$GYFvL zY?`=oOG+3#&Hi&8pre;{;_82ywh5|CVDT|9l>Ri%aTL zThMRG>CvU2ufSHH91#)0NKem}I`aJLs_8=`97ulC=C*MSU*fW!uK);0pfIeOY?vo| zmnjE<-?v1Ey{`)9<=eZf4%4eL8O=%>T7Tk_a%N0TTfTpSjD+0w*E{Y{)<2)Tv^_bu z-c-aH4JEiuaS%lG=vQi#u7*ftYTC5I%YD2|wgNw@FDy8~hDliTyKjUZ=atCFMpAgT zZqK#|IjudnC%(^>+zpzt*J;9NHIy*I#>w_oJ7|9=^?tFafr^{`-Br(B%j z(7XZ|Pdou{MHd#vq|nRN#8#A$^Mh6WdtYwz%e^^WpQro#1;%mq(iu~AT0&xCxML%4 zGmk(zgh>^EkprMZtKP_2Oabn<>7`R*CWP||$3+8ULx6H1mAyz7pnduly>9K#W}ufk z_yE!tzI6xf?0m=8HipCTw}gAh3wIy zlKC$r6B$zQV3zN&X!kz~Lz8_-pEI=1*H6e_F2`aHj`u%iiz^1a|2!9fZn8SvRpZTn z&XZxAXRN;e?M>?a-mq@=G5xq#*5V%;z~+6twHaS@PYpEqj{y{r6cH2rhW`9~(|&Wj z@=)5#CHox!98$2|qQ|z*mfc|KV?r-2Qq&#?h55kcd47Qr0&K}Y0L9(Y-I$M{?fNg7 ze9X6cr|TU{byh<|Lx)FVz;lG+MZ0`Vj3DF+h4z1ul8_kGc3HtDC4JcpWB$*@)8=7+ z%xf&**n7M&;1w28iBQPJ0?UtSaj3<57v>$GEBAx198gpH^Qr@~Z$QQ=ohj(`czfmm z8zp8n?6&|8usc|$2Y&`&JwgGEZu71^wm`66fktQtRHW~QY928Z`pf5&tO@euXcGtwMn3L1kiNl$z%@$9C!laB#cIQjJ zG6!#gVV02-f{=d&{R%BWb}7@SHNW5N5w5Pf-rXK2%7=o3mY$vu+8=i!UYa#ZqrwuX z@eZR5e~eD^-_PDYUQiqOvNDOj1NF6yR;x4u8WiN9msCDmYq~D6gD4O%HAcw2ReeL& zM+Bs&Br`mY|0S~t2cdj=Whx&Y8M4soaRcnNoHADWzJEB{Ud)=fLA_1i6AF^HR+oxzkQ^I{BR}dwf-t`3V*E_m#o{Wo`!}dQ^@BT zkj1=j*S{_?T-)-uY!y_W8D+F8Oz?V}g?l0+{hupqeUcI9MC?qgE;OS4&z#7r`p4(V znS*vFoku3J`^U#(TG|Kald_T$DQRf|@5fu3Oi%lp6&J4B&2iEF5{SLscQc63)B3wY z;ss;i>C)*HDAq*hdRWUC;-yC>jUKOX+i%zX&=63G@JKPMo#Bg6D0FXc513;N6ck%| zsn#DFn?!n1+IXx^N6c39M`Jl^0*zvou#VxvNLj~BfY`px0PIUtFFMe(u7h_ zh3DP*)5Fcsj(zq763EHPNhbedMpc&)3`Ww8+rt>t6_7ta+9;;KjxXUCab@xJ209ka zbWWa`+OSsaKK77AvCKOKa8DS*L2%lU!{=X*E1$Q@Rp@E={?QC=VE4+r_a;0tMiev0uA_D z30wOc{f9;tQ&TkQg18zNM z>_UsZV+2sA3WZo;iNUI5uX}9lT^Fet5?NWdOppJXXNVYsSqwPhnyJ@aJK_rt_|*c~ z;|%Wc{=53OhJV2aD=us4LO$MldSpXY{9{8q=ZlMr$!sPhf}UzjiMm4v&RwL>pw(DX zPAgyK;(w+`6_Ng5H6Bng+YuSnv~$A;TOBKPReb(}L4T^x7aXjw%lhq>D=BzpX5uG$ zlRjnlN>C|)=1<{s!hw0$!FJ+~9Ddvw{w{@+uemWQ}b4Yd8Cbt1R`XhwbpkE-`0AjLg+W0|W zcElN}1Gagj$_2}(`>SXOeDUQuTfS{1wZmmp_uDHXo=I=U6NNxjQgtn@%PHB^u{1$> z9UXm^R4?XqAs1ecf9r0@I5d>hy4)VUi8`vP0v@Bj-P_a1utS>*kImcYRj>PzU4F$9V@IoR5zRySumDkP~w9t^v`5($fJa)Y;f2=1lG9k0i0#Z>uFssr*T-_n4dAEWU!Vs>HZ@`nr<2urMP>Q{iSlD zkuL)Sh4CL_dx61`5SKE>XA%8H*Nya5#y zfPp*_n%!eH#3Tsyn>SfW&vRIzJVZzsCa`V3fS@S%K8BqUkZlo%AGm%p1G|LpjtfW>EoUrv*K&cbxZ zv4kk;L$J%wNy2LHrHsy8d~JogzJNf0@bP-7!kN*O{fj&Mp2y&~j5V7(>)n#OE1TCq zYzVu(x9yZzP(Tm6= z?C{8t$Di{vTOskYChTy_(8V`BM#_9h#;YPv*4lM$-mz~i4iT2mDN(`_O|kYi&$-JO zG~BXDVL;Niv)kD4doUhVM^Ee9I_o!Nl}9(Mx<{4BQHW4+Ioss%6KtXy0aRonIo^r- zKb1ZVn{ghwF*d^l$-|l*<5l1$f=^Uu~w?)Dak+yN^X^RhQzPJX?jMf2a=TmKgN zM7T2{S@)J545s}{yJWOLLn2;JNQ z~a?Z^u#6gIsIUw(C%jAbm>Y@|Le4+#gN-jqV+z&`Wm+D6Kv zDzhNK2&hN#lG*xzYIDeq86f2Ff%ogLy`P_E<|&Ib5}K)&VyIm5SEmnesb!dDIJrWm zoYM`b+6-HrXMZ@yrdm43Mqu_)sZ>)*R+Z{2OF)6l_a2CRyfUeG&)gVqV?QIQ{ONx1 zINf`NFf~f{OO?%JlxHSC@?@>K&y+pilFA4nYN`3AHhq7Ipwxb+Xms>in@{J+)J9vr zmaY=}Ipg^0!Fl26y4#h>NPjSpj;=T`2tgP4XY&!+g}qSh;*?ZE=eBcwFL+PwA!pA1 zYJ+Bz@yPxCeHfpv+u3$Vefg5D@Sp^d%-pkAv!(_R;uK?qFy#j+99(OKc^(wWgZ}wb z2Jt-JPCXnqw2?=JWe>|3+E|+d%Bj_wO2^%Mu59m@RG%v@(%V(VX2FMK+2`B*F~ep) z3Sxfe!tB;k!?TzWoH)bA*3zrzQm!ks9;lt&A|Gd;>ZByJ!DlU_`NZw#a<>}|Q+E`x z+r{;WX7$P^ka7IC@=Dmg^O1mtQcEx_Z{uGY!S(AZ>lYyR%8lXJ9(Ch|yW?$tUwe|O zYknZ?<$T#;;aKv6Vtc^Z@CuPzpn1li!B|&uD&x@QINb}DVke!7b`hYL&+3wt^-Q`YfUpp*TWN& zHo-&CCjo)BeeZDZFsA>;!*xI)P?E`Kd*E9?O!&h@9T?d+vCn)sD0*KwKY7&#^*tE!xoQh+i^Y}^EneD02pbv7MZWLwVF#97;Fin3Cby{tzWoXH^XQB5Yfo} zF)oq^98wQrKheqrJ*{{66$2-}O5Dk^+YVjVn>SBrf~WsN2SZIV+}u0HA~7J8KO%ed zCrlY|!hXc0ZQ))afEXxw)3fw@%p+8Sc8@Gg930pn{Tp}}Drq#4nYWoQcMhtmb6lCO z5b3*ZgUs8tDE`Ui$tKv$oH?`3V<$`~C*>wFnBuJ4?r^g1)BT*6m)F|!EZ0n& z&*QO66cNv3H|Cn9wRuJ!V`^A1R0R4dCzz?Z%reBoD7oA+WGTKpI}|TOEEsCo><0pU zA>NDsw903~$3}EL^0+5QY$eBQEUEiEs5;#+KRcV3cjV#qQmB~UcC#Ieh)VJm>FV-Q zs%9d}`!d_O8lP->VZkkT)awBqaf(3<@r@n?-1W0GP*-U$=51wRwruvy#UoKVU_@jvoZ_N#Gpeg*Wm)36!NSHS^9S~w z-obU}=9!0(p{kO+$MXe~`jyt&XN9LR?`wxRPV-1AA)!o|n=At`7}Wk;i>yLnHU-x_Hu{#0^EsrOxf>;OfsE#k5aj;Bow<1S;_oI zGt2L~e4b70n|k!WAq7CPK8>;2-PBnjWu@~ud!Bg6${4fla(+YS4y+>LBMP0U{P-@r zM664n90@Y$UQ*{7IdysOfe!I%6=(^pUsPDz1Qt(~XgVA#fLlUDFch3F8OCSDxpchZ z!D-#{yy{WM%%pyKk@<2INNDZ3i@R@~_55`50z}tdmlULpj&}<7_p;viimf^?6H%V7 z-4{}x4@+ySu3aC6?kCXZO4Ql*t&&s0xs__uTQvxsXY6{i*hpg9sG1Bo#1^QHCHkUX zEAJ%CyjB9L>I>{)mZe_cFbS#Eoo!N}!Z9-#i^(&*IWuYuyU)DuTe<_FHR;6gmUWz9_83=IuM#{kwswS|HbIQ)w z?~L5is&QQ-&v=LXWM=L^e3Dp6N ziv%eQ3CoVL>R^v!>Kv|Xs(d;}qCtk2=Go0AY!@fH7yAV~RU(BgYo zDDK%Zdr5`jcb9LX?Jus3Y?~1%q>3lqEftOffNyy-*_PXLyZ@8__(!f~?kUEi2hIy2 zk)n3wk?n6tpG1Dk<@7r)yBh^4gaXN){KJ*?%-oDjOf=QijmUe}R?JulS$avL=GLZi zsaL)GaH7h8>DlSYS5p26G1Am2kAgLz@S&l({-Z!7F{Kj<-0#9+P?m+^zFZ#(y{tdH zJo=GVFf_Ye?2^80(<~fMIFkGOcglx;B4hWG!C~nT=YI-;Q^(?y8L}s1(E5Up-FJHE znaftMRI&VL6Y_q7(NR!naAE5u??L}8e`lsT)&YhVuZL^P8-1~#;XILtdk57E7gK4K ze>dIoTC0P$8s4we>2z5fH$AL=5|tt1vvlDN`+$o-NVmpa;lip76wWA2&bHv|kTUo( zxnIKwhcg)WYH#>{GPgLH-me*c`{ zWDuzLok1H>PesXuDW$-3-gSn4CL2a#@1WWAMTFH#C<9@Hm~r?HBdxNMigKo);P{#e zD^R^e`?|^W(ZdSk=?56BV;3LiCr{=1577Yxm}3LcXr>C|yY-IDtDTVpISAeFfv~nIA=CCmZnieLFej zfjc*k7_$+eU~0?&!GOa8C55h(5<3HhIQn&7&}XubL%mc+*HJC{;nHH+GR4*ErDv{M z=$j&BC_|>T|C51gpU3)ju?EnS#-Z|KiHrb;A^_iQ> zdR{DMxq!50rU+bvK&bM?NtGg#fRXxgi4QT4Z>KEf;DW=tzHi5IQM(KZ71bE&Ut0d@ zxN|L;)&A^u%GEx}pn3dw3A?nI)epxD&-R_4JB;evGB;jy{}A8eQ^&O>u>@2F1j@q* zmp}0ZEQ}r@3W^}H5Jd3zeS+YL;3L#uwQZq-LgYwHm+DPTX)Nk5N*SFrIa6OY-d|^D ze#OJ)9mbpJ)dy2bAWV8ImD#gmexI>#e z?>O1@--eypjwO?yD{p;F8R|=5YMbwuiHej}zz`AM z1yzQDh&qBDk=ULFCGOU%!d*27&Cy_{i5psQF<2+x_3cWd5^tmoy6CXent@aNQ3Yi(FGj2%&1WNM~o<0T}$_nttB`4En=s?TwsUB$M%AL#`pRL&AQn$ zU5ue15OOcpZq@X~UDf^PABIqIp#C?xgoMGBPwB7_Lw{40mk=wuVNg(zB>!blCi*#} zRQW!=p7k4J?rvLXPJbx$kIQuI2xE%Ve^J-Q;7$OG{Qfa=Ak>$V{sUP|iGTK4S=%ph z)1E4*8au;~!D{f?{6swhVwp568tNsfkh`fy6Acn%^R7%)Cn(QwFJ^-S@ zd0t#@?;JK6xT=cVlq*De9n@X+EN-GJt`JO4e^NkgvPnWlNrcMCeD;of)0SHXOz?#F zp+}g-&MkzC2$gD#k%pdLS6i3YBoAJr__XZG$#CXCdKmPTnB>6yA1z}f^#D8{)DBPxLKjikLCWz|maXr0R ztHfF~=z7dUz3#f>tX?s`QVZ-JWp z%<8QDQXXRn@614#c6p2K*wcxEViPYPQ<@Nk~<&NguiI1Pm6wv5h**)@5!RYyHn~Ls+q<6xuyHw4jfiYbJf9i)EATv`5AGFCrtS@ zy(WLMsx!Em1E|T}`5;~F!t}(fbK!MoXb}femV=2*e1d9|)+zwSEFzoC0Q&MxH+V$7 zr9|09#=}}XkrFy2YyFhi#p>kbDpSzO^1%x&YUV8jj1#h2cUShjx+*gIDV!P;;_B+! zZ(jQ@FbGUe9Y%F#z0yMvRsXZAH?_H$*MfPrq={hYyHe^8v{xX9@wi!MVbAUw%dRWj;+OM4WvpB|@a5_f^yLs0`gsep-3d+9+)XEYYTr@A>fF?++cv0( zUaLyqd5OyZgReMPVf*ZRY88Z5)b}$6q>r~FtEOZ#;*E#RS_?d@X@NFZ_&C zt4O(P(kit)`~Z-=S&U{#7+$-25^;^@+YMAHBp9ve=tBEwQ@PnXrx`jdiZd^W=Mkua97FB<6ykuKa3=!3={ z*~W;yNd}FPWjd)V8N1={u*cZo!~#S^x%~ZHI3LR!9S#L3Leu!YyN_*gaIgu1sF=S2 zh>A(eLs0Nh#Ht6B9Lg3=zZB>_Xw(u!Fboil4OF3Yp!^Cjp)=vgQAgv}M53*@_JkK_ zMpN!@MZFXiQiP(jUigg(GBuyypgT-*foVkITxOCCtj(`}XZ+bAgSC$JDzVUUPuhb|cO;8}E4sR94U=6-HvAJYBLG z*C+KUx#B%)g!_>KNmh4vh7w^g7|o5dt?g+@xet&)6jA^QUfNfhdQT>0T>>{$n>A#= zzPx0wy}^1&i@r^Y{U;`{Ha=V0A2VQ@Hf}ULNUxGnD9G}^}3l1pKcels%>3GgnRDL7Zu5pw7Wi+tQ>2#9yb+U0>=;HMqlP? zy_;}AK!lOn-~YL2-XaF=XsY7q?EP>Vw#>uN?Ilh0TB_Yel=VKm@L6OFMpxM0D<_T8 z(WTWr(z%~I;FF?`9Wd0WF$Gj@ui8G4iO?G1?ONzQ(G69_k$*!UR*jOWB+B=BA+4(7 zq33_pgz>exvCS<^v=tbhiG)d3Ew9erkJqJoAW}ppaeKe=r~GkzaA0b7sHV^a9k+_e z`{0dGn%C-5QFz?B8AF~~j$WpR07@bj^P4rBX@5M3hHi>Jx(=WRTHS? z@E_miWN!=0dY!xpVoLbTE*^4TiiWDK+u;mUp1Rv=favb zTbo-!eq%vDtb*_J(JK&6AZ;mpcyn{qzAU4@{ifaL;o@aJIv)&x8sF>h*PH+>YV6_a zcdBoeAJLHfM|rF(_i3dBBS^6QOnjGlToGY3(Os2`iZIUNG$G16L1sTYRn?)@I_m0~ zePhfIfee=b{Ac`6=@~b3WXqG#vem7v`Fx05#3u-S zv90cg4Q;C-=k83>qOkWDxDyZm@?MQ!2I(#>Fwm@vBIz1TPF+& z2#AJP#f-AF1NDZD^K^pr{!d;2i{8T$~nuj|Vj~KJ# zQP+E802t|CH=d=CPwEHj(5{a?*83Jw%1>T%Sto);6+|zUCuXGq)cMihk?=1OBnl}d zE7hbTY(t?16hi6=M(Q|JAqMJ@U@0U8tWbFdl0`0~psFy%Yh*(|v+OhXV-kS(7`J?6Jat$og2YTC3P zR#QV0nY5dHPIM$fC_~~DzM&hcCs6)KhbwiF#T}XP$x@Lh}84@{cAygV6k$j zq%3xaJAo}3<^O**V;(c_Kb&9D%R{JBMRE~^ZtGV+?F()F{-v21}Tj&~$xSSOo4KoF2kY+obnmRGF=#h1%r8}jrUn9O{02=(L z$SX`wpPh|op?NufA>aFTn>!?+X4FV;3;}}}f|t5n#x=@rp*HNm(5IiFhZo3-r_B>Y z%=VVWpS23&JJC>TZt)pUzPyv+XE=H%g9($403tOp06h%m$<@2Jv3x*XIeRW>Z@ zZ&^JmS%if6;wNm}>O`QjG4$fGF&L})e=)`zu0Uc#=_;@x^MBvzMpb3hP5pD&HiZaC z5dk3hC2p=NZ@NsaNZ?q9cn_s+J}PgB_TGRPKx}t>oXn~X4B{2cuRuSYhleiiaH!{# zfg3OV?uI4ob^KNO4~D-?|#pjl=%W1*pd7 ze=b1jk$UTw&H%E(l3SaeObVO27?vfuwncgF9TE`uW~P~Y7hAuGT>9wZd`U?+R8ge- zt_e-s=3y~x#lVTK%bnT;;c#s7HvlbCk*R2G8oBd}ut1=)Wmdryu*MX8MKrgh8hm#A z@PfUWzabebzOaa(ghtFv(zs(9WEBX>eE$`a)!oc)ojE(#k?XoR*ERF3N=}o8mo$Fe zPo?ZXI;+ra&AFehPPGApzB48!da_&~1OSe(jf4U;pXMrJ^d&O+>%d>@eZL4-2_)#b zRquCqTE`JAS`ER(J2Q|d9k%ZN!yF)zQ;eCy0{8bL5Blj(AJvH(PE>a}n!EQF+-pkh z72G2Z4}Y2wk&Kfg;C|e%Oa>@evcb4C4jvY_%?cQxN18uFbUq%bkt`g4WT<1&@i~ZU zH|ILMz;dapC(~_ctiNrWqu>`+}ZlwH=8?&u+Oc*k?a&RIBzPh>3q`wLL1P_X23;Imh z?yxl`Lm-|`0?v7_3)^k1RAJk{6So-<2YdUf$vb9qsAg5~OZp&*7zKV8>`q~!6)I++ zE!*o%$t~R3o8PQ4EHFLyDz8c9F}dR)BvwHa5sD?5vVWkUNl+pKlMowTJGi@xs+oG4 zoBtIPri__V8BLZ6s@8ms>5ePX8=Bf*Aq`_==_zw1Bk1LC*3#(JW_#U;(Q zRo8Nty^9BL2uWo1@W$TN4cTNe9Rm>Zxht@C#T66)d7Xpb`GAK%lD|@&zs!$PR5rc_ zl!re$u;=8(CS5n^T-`M?uzyAp10V5VD_pd#;IB52 zoNN~qCh~bZEL2Z2yYtB{T$*?XAr|~2NSy3pejkydPbO!+{~{ak=92~@Q7Ds$qV@1{ z>$TkP4;`(DDw9BLKkH&k>+dX?v;Nj>CXfJAN{iBUGQa;jXqR~5OLbSt@ zaVZizclNo|g%gnh0 zgB#+9D5eGm)j4%cFu(Q*q}O?aMqIxC2tNJTn&~v+IJ4r7-Gw@>!j)_`MD9FW-mwDD z7k@mJ&OMo7PSg6%?#o9|q0RNN5(`d}PYq@7#1q}KQu6s-Cs5Stp2l+47jm=6Gx@aG z@w6y#?-4f$RP6lmyb$n&zUNo`cHfvu3{*p(~GNnP8<}MWd}~~LODMctd0-O4$Lgu*SD9@h1M0!L}xSuCfum^ ziq*Hv(-;n zDl;`@%X^Tqe9-Lj=HJn36N{=`UY4!dfhyUc5sTa|lgU;h&A3W7&fy7j>WJm6P8CI^ zX8ZBs9!4A)y^d;HjmkYnUpvIVWf8Zk%FalOrWB~=r0codo|3asNiRu#C#!*ON0rN`SJy0GUfD48Rp2o7bcapdESbH zf5L2{|0$(fw=VFbh4u8DArg^EI;g3MOKbH{*1Qk0v1Ivj%527Z)E*$~j4g%r{?03? z)(*KgVrN{XQk!|IVuahDD8uccLdyn9v-I(Wei9C{X0q(_d6{@PAd!A3hZ|5(m>}d( zE87M!I&f39u5vL`n;#E7kp|4a|{jtTN82hGxwhzC* zPt@Vu>q6hv(Y|`zz;$G-fP3Lg)oq(dNJ2|GZJ3)IVBe%{c zJZB`-L(i+kHlC$>WOn0LQV=a#e5BV>S$PP3h!j2-GIzljYXS04b?j6ttwZ6zj6x#g zyBH%EtPIr0%vey6kl+LSqJwQj71fhicah0;Lso1W7p=qs48n)8J5{V!p7a}90ien> zIB>HkOAz^M%u(2%Cx((|2ZgSGxpnA%Pc|!{--Pv?IFPZAB2TesW}$pmorfO$lK5@+ zPavD3YRcUCzS?F2kghJK$$-8&zsFbBVap%wejE7x{#Wc)5U3RRxhuubo&cmT=)V-@ zZ^;M*Twqkt&yLP3K(YjFVugAE9}b8je85NZE0TZsdtSx@LA8L5-v9y-|27J2!U6UP zt>0dJcCY>^oxl^nCjKj(_&xjpq$2`g2=v^ZKlTB^j@+YId43z}8mj*5X3qjt?~<>$ zRswB?fpHx1MIhRgk~L&KQqpZmMetI238s-#4^be~?mZVy9d2u1+72c?!P79a4r#;I)%EpugfU{M( zk7lB2V7!0&w@&s-`J6|#uJ1itracPP0q%I8=zNR*zXP|`C=cX5Ljb5TEt4308 zM$n%xz^!u>U=oYG;k>;s`}on?B6z!SIQ_Uu3pR)XpJ!84(e9~GHWl?idVGC5{T2vd zsWJc_jOCYYE%$6?d)Azpn9(X=umHLfrQ3|agbZ(q4b71mi98z`QsXG#KP5KAms(rlO7 zUJ;W?PA*LKBfP#pKZ<5OU_Zy_|9bF_HS*YNsAm6=N(d-tqE@aQpKU7-1qAhY5FpHp zg2O~eRLjUeg$61JnYpT&5}`4sUrdYZn>Dr8DtpuX3z?w_QA|tyZ%~T*LL_fOi+!cu z1=iOiVedrEYLcJfhF|t3dT!P3f+A4C8}>?1aQ&m}D#n|TcPFzMy!B2R3rVenRCHR3 zu4h(hV`Ns)6P^9;z4L@Gc(aAAIr3xO_thG z0pif->98c>)eDd^d@KWy7x+q$43nCv08=siYjyEc=GTeh`=oLOsaT@Wz+Z3bCwFch zyhL#fll!L*P9#%J7tS4$w&KLYQxk9--^9!nMd#i>^782scQZ*RCsVGrJ5OOXHhwcm z_3!#B88_)<5*U5WmbCFs{4?;nQN+LbOSRv_RyIyz$*6}HkK~}xGHBKK-uZHa`@vs; zXaqLlcEtWCpqX|vVc9WX<-{|uQ3n@*iT_$RGA6^2Z_$MOsT_Dh(7tNO#q}h(yJZo^ z#z~ggGdnIPjyDj2Y5Pe7ow#)V=qO??YNiF`2v9L*K$r*roT+bY0T_3|slr)sx%Q%< ztct>gk->Oj=73Elo6BXt2R$-1ihU(1*)&rj6ZB0+U~^az$1r+}tHs0GrInTjOsoaz zJ~~4|Mk)Sab%$aJ5&n38$}_b((Os=gLBsmUs}p908zq)x6uo1lv3(bdaM#C_qqJc% zYvv{y=av=IUsVyy>HZkHvQA4&%a))Dx$0X*;&y=)dbn#8s5%~PzKs%d>`(HfX#7TQ ztPv&Fde*lTDg+pEM zWY65Bz-&X7PaOP-{quzH#R_WJT-5ohp805D3y$vb|dC?;JF?N*iV=SgS3rS{#ey zCE}WlG|YqBE!wmJa}0p%r<0eCJ+Xy~%N@2B_Avrr-W2ifS1kw3<@-|O%83=4^~aA3 zQ>OCS0$^a}vln^~I9CG+eLdE;k>6vnB^mf7Z5MXs{^7QzO`ovYDxZs)b#aEwn{St(eJ@LbN>5>8JkzeeFJ}$e&ApZ~CfLNQ^9P!srv+lr2pH;@^ z40%PIzr_)WE}GCO(Onz(Cw?d0ay-kvITNMTFe|uyPS3jlIwv1GIqf!R5;C;`a9>NQ zOP8+$#t(YIuCDcm*0xMq|Jgu;yAK#>{``4aHJ8VZQ?s%lSz4~?2`SXX{L|p&Ig=)1 zsts_KI3kdYzW==A2m1e~9Y3NCrFF%oej)O8_hb80(m%{XCau_jSOQO?SJ{n|9x0Zo z3KaD>JZqu?zg1KZo-wQU$doIaigAv34KR*HMCUI6uiJm!$y1?#Lk1)PM?%>2+A#8S z#S=5uIj|c`exYnI7)Lj9GdTMD|n<8>4S^I2xv$7W{bHEl~e8F1e%+*cTxK{7{0LQ-U)Jhfx2-+sC z%8tG3?0P^C!3IyltV#>!DhrD6|2Rt5SN<%wmj_rQ-J?v-CMTn>XRTZ^MFBPR?K}8EYuknpm60{aUE=$Bad~nV^saBN~;S zDt>f$TzOcJX z$rxQIjw*}GzOJ$%*m%A%rY&b%CNrg!SP@e$+pYEZYm`_X5U>|>#!J>XHQXDGE=*-+ zTB}+@ZOXY!Q+9oA<>vsmrfr+{$;lodf_tM46}S{@!e(1l>$?I=Zf z#7-s0Ugo_+bW6vso^R=kGASymcu&r-Y!=rCu@aat?S>GfleVNVR&Xhn63T9uawmxb(D3d27v^1RI z?Cu#cxZ2xzPoui#Jq{nMyS48QK_af!t?|a+Eb6}m`SgGUMu3BboYtHAeE1+hY zem@Jm$y?W0jI_!M>a>#Yga-DUP%p1Y0$<;Iev|`N?zuJVe=<3?RZwnOVOTq_t}Suj z{MOm!)pc=Ld%I6n)pvu`g5hBdPG!nMi{h%Pel>*=#*sKFl*!gB zfLIIh{~Gw6>g`d*Xr}_BlQU1Ott)WDMZq5k2(;U;xdOivg#r{Mr=oJ2D!k$!;A!{N zWRQhfZ$SMzcNRsn09?Xy1`A_l6F%>Np8*P=_!KgQwIM|rhy#WZ} zYZtm0X@w;6CafTq+~G|O zd(9NRGm_L6JnXEhYqW|3WOQi;F1( zCr&L(nrZLEoigZMIWY4Roa!3eyf;T#kU29dkB?EL%(J25nbe}-=H=DsYpmSw+riRv zEeW4K8w=YsHs-abDoswSXV)ke4KvTLiBq55IJG-7itD32 z)ip%yGZ>i(GS=@0?eRXkqLSqUxB4*K^6!d(*LmzzU(Z(3@BJc0Pk*HG*RPQ=2|eA0 z-0j1`q{87Ek_+6ZIW-kk#R9ByfGp9zl9YUh%|IurX6e|(yW6GFI#mIotx$Kbyzluf z039^at#=U~!kX!+8Tw)>PgvD%$F_D{u34La zouNb%0{EM36KUnyY})3A52C;}KsHYq9CrfQPU0r=lw7({oRn%3ycA`pR$^xi8U}oN?;t#oTy%=;$H%DRUzPFGMhGM^*SMO1UL!Zr>ELZ#K{UCK+)m1+ub4nGnS(!^ckpz5t|S!C zNV3u!1U3JSjEE3*eXYfPv$N3(O77(migLhzDAAIB zIs-kZi52j(Upbq<>s+pTuK(!n-cUccl5!LcV*G%1CxGSV9i*#gKoO>I(_*;bRvUs3{*PvH8tIAHBmFJ-P`osRi&%id;Z|u<2MPa*%KW zN#y4O%%>pV^)=30hQ0wSrYfEKA&Xk$^O+yTi%46ej%+ZzwWniXtN2S?ZX>6vm7d%2!%t;W<&f-yN3VnvBI z2{_!B3eaP56w~&gVB%UqJw*#1$DBd4kqr(PtOk1CP%r&O78VvPOqz%cI}nH?6 zn6-a-MEh+3p%A%{YR!fnH*(<^4AS=!3y57bC&QP@mQ_qpVBFQNp6ACYWQl*!En>ru zZa$oiNM0N4$CyFtKm9eT1W;+fNK)BYV2OlsA`bilPwJ z@BzOpvCp{ExU^U|O7$wa6@Ighv;Is;Q=e)Wmo;ql>ZHO$fPYRLj$JG|(!Zb(A=DJ}>>k(AaOYDamfsh>HEWGgvn@ zKcIrLZ*Cg*MqK9N4lc1w-G1=KD!<#f7A+eci#rtvArlcxv|#5BUm0dIlfAR}CSw!9 zz8N+F5|RjocM~QMqWZODRp+iFJ)3@x*zIji%9UEf7KmoTsU_IU?O1qB2WtKrZV0h* z<^LeU$EX~*`;%?2BmMJQ$Ol!^8uF(lDiJs?WxhUj%evlf;joNCFT(DhT*?sIzDswT z$W-(Kjwk}+eCCCofnT8wPJKMYxB}p?iEp!JqF~POvbsXA$Pbwdf}uR6@zfT=;JwHO z^t_g84@7}zg_sLj!3K7sHzV`kQb|N!n)K)PNRLEn_sd{v$o3!!m&8e!sy{7WOcWSV zo41n_Okh3Iy9GhKC|<>%yfB?Vp0j}s9KlbC7tPTy(R#q^uPPYz>f=0*eL@=6 zF1G#rfkm0Ks55^qtIE=3o)g^(_mV5hmhJ*vnm$rUOM-!t_YY3rUi12+WJDifLm{M=Z z7miUt`Y$>MjM(hGa%M~-`VHfY1&XEsrXf=&W(=VKoB6l9sIONonRcphICy<2237bw0S1I1eMlZAhSUcv6K+9G977?r<~9smvMe;EA#A5@3`iXi^)VucLHxp|$YsG>ESw+x-HCxTRg7pakIZO6 zj&~@vhk?WXmzbin2S~UT6o7mM`W9rxG$CC!W#P<73P>6Hy8a)ef%*Qoa>>6gJf5F2 zM(GnxIIZ;5eEQ)Zjx0lsNP7T;^@&g?ZoRrHkq+2!iyq#ElSr~qjiBN+@BbPie2@K8>&OTX6^hYgEdRU8A%292GO_9ME=6R z{WWq5g$es5MZXv^bK_ezI#H)(%h!um^)V~A((`re?LX1r z4I7imQ`dIbN*_vg8`s$%8m={IWY!OqAXCx&6W+fCSwG`TPiIr_cIF+<8*He#J}YZav<4PnpS=omWVK>=W2u0_-=y?usV##~&>$EHJm^`TXeq z0WoX`XTy2U+R4*|L(4?yZa* zuaEH-JwL6c^I1)%PVMkG?EY4RUY2C@U6rNVEU<(Hn;eIjIdGGm-t449pI08Q4&F8{ zn>)0A?pudIp5iIX8dn=GwVo4hIy`|CG7GEQUg+b``^z`dSyussK9?{;52HWni6uy` zD=I#fMKui=#^=zJ@S#N3E7>DBe^JY+9nQuitvR~tfw%QI>haMJqmbx`Ou#G$nM^Be zn6NFd^_cAT&%l)*5yzY`zr(YJJ{w$xL0b=i+>)|6-DJMo0`toXxQFAmhpZA;YUkF} zSNBNJNOLEb8=v#^=a#MGR)V`fs6NkCYb>~z)U~hR{PdoeppPfw{8yQjzMqCC0UG1^ z>`*!TVRG)Ge720Yc{U0P+luj9Ul%8QIBfDB{&}IiHWKaEApUgu8{uT}X;shq;h^Xm zr@oLSRquYu@rL*II9bo_xG&u{TicNtCY*4G@}}*)vCr4z>z+7YE-Q}aHDRQa%l?(- za81EoS?Og2_6+|SY5{m_<@vZe`~k+RcYoN=2Rta>+gejk*vi^nU-D;@)d#;AqZVF_ z@upT|i>S-X zEAJ<6=xqlAA!K9hfZb~G67~5qqT1o<4C-_7yLGLxye?zz)FWUWnCJ6iBlLOy7#j1m z&-6?sX_1Lxn0{hdine74qGB21SK-$=f=~l z^|pajw8MN(?Mpul>Uhd#PI0q*_j=d4gY;bHtY{-7^d%9#}4#v zWcDb1g`gE$G*@nDoE!P&@iZMFTsn!Oh!N>ww$qyw;xW#DQ`B+#i!}SzY8&b@)tdSY z+kS4{*kk4Q+T#vO$XY+{f7k9vnZo>DC%A!K&IW zy-0Yss-%W`dRE<@g_l~mxTr*dTzf*FllEGuFs{#I{)Dly#_=Dm5F59VtMeFd;vuDsq1`ev9?RY|n7b`Fkj=isoTcXtX)Tcazt3x$Zva zsPV*OtDpzP{i&J1edmdreXZ#}3QmoWAV>c+T@Ti!(^wAs-Fi~eZkJ_pipNLiNnJpV zKQwgPTDHA~V`6%BsuztiUDx~3q#|kOxV(lqa`Ara8QRVqWBF$Y?lwJDhABSqfo=H{ z3DLZgi0IE;w=Y^&u5;G)Ge=6}`yO?PUwMlW8Y*WhDx8-rv>Khu=rpS}brd;!a^JsC z)Y{~GNv!Rc!T8W`7M>zQfgrW+&40JC)y@vRYu8&nxk=pRg{Rs-qr%!VIO*bjPVY0Ei09xuZpyXHARZz*jZdxrpidKO7F zNF%qES8)_FRB+jjyYaW%`Cfg*Q?9&_wQQmQ(cu>jCGGjCtGF1SWRLC5t|sHd1g5@| zc}eaJcgBMI-<3g#D%Y<35(^@VDu(H93+rmDkx_f_{@Y2f-KSQ1p1m%PFOTlY%vjQt zsRx;}eZz8#Kh)~+B*p>h_I0IvxL+>6Oa}ctwNI{{qz)e%8v+v&Ufm*3YAW^E|EwAs zJ#)84w>kM?6Bn9HUx!REX0BFD=Io9=brA7ZL2GF?j>P*NZjW=Njj)Hg1a{o2dSm1FP!MXdK1b(pq*ahm?}tda0h%fKKObVO2-Dkk|FTE3t{3#??wgUX7{WZdhFs z+ob$XT`cusUlAwRqNN(nTz1q!;Kg)jc%y#q#VYexdoA|PUPY8Xw4%wH3lB)0>G)9F z?%q*EZpItMiDV{*%W!4Tx4EZ=gyAjO)O&3gRWUt15di`?%q2v6IF!7qLPhOe?kWCdSf7bTovJP#p{EE%Hl&AV!(Nro6Ho zww8L)%0`R3eNZvSjRp_OHdH(-?OytcyqH{gr@hTcW5kK~QOi{EyPe4R71APu3N!x?yH_xv^zos;#H~ii_6jH<#JYUk((lED-rX%(q zKS@?H8J^I{Qz=y%&+t+RQRu5$Y{>QZ(r{0jxym`S=>t`|v#Tpa zB!W>T-=vlKOC-neM{1gf1=E*~y>XvkG#!1TyI5H>uSn64c>enRkJzv;2kHzj>NGNApxI&65@v zxCe}mu2E19N8p+Dpnajv--$UF9rBt`1kqZ8BQ`K{i_C3b&s&OpZe()$8JZ=tGJmDr z?B+8(<}FHo2kG{=qi5wIdiNqDX&c4dQP%!x)cRocE$&`Ft*O^^{&~%0haz;%DYxcv z_4ZACop^imy-s*8V`MGgSwLW8lI_Y}SU>=2EBep<9+MPHQ){>9e&^)M?VzC60yQ09 zE&&x<8pTi3f-lFTJjb4yj}JhKi~;!e-YY9{{5f19ZlhXlZM4_JO#a~13(%Qm67PFlKI^^<#Em2< zAA_pt{$#LaqEt!!r>IUGn*k8T*RdO~L#%utDCFRZJs~$fhJ} z_KNH8v!}&Oe;v{Gcjb zI>ZJEXxS83jkY@TQjsP2Se|SG=91Z&6&+9U!7jo8uLL%$G?Ib zlkS?DlQ8v;3K=sj`!|+KTDZ<_^;X(kobA3tJG*xvkN4x0K22ImKrd#MPctiVxe12i z&yPc01Q17GhUwWcgWj|&Ep|wSQVHF*>tV>$td@jS8~UIkq^1yB~1#lDba%pGo=bO-0S`^YnY+FR%EBI{DbUmj~{LWEY;}YKwW)ew7QVl#YM55f)-x^g^{`iPyR*7eP&efrD;L4 zV)yc8Q6^qY`5?C%qvNVsR))+XP%mjy|C=YcHW2VGNt>4tK0hq!u9)ju8o8~4Jd)A!_+PP6lzpyY87O9b1J#yzzc9?gnwf%eBGXD?WbA*%yp9|K z5s3B;n45daZR4G6*Ovz0-kK@A%x(iSdtS}tZXlaq;)XnGYO7qTv|Mn%(Q2^Oom-sc zI+@}4VLBm}j7_H%U$?b#Gh1PIa~i((y@x578D&i$yB){7-=bbj`HKcRH*c=u;zS9f zSJ5;q+ebxRQ&CkHkIi^BbeG(z;QfnDiywP0K_K`XP|)<3HI2_fqm`lPJtDyw!y~Nw zXncc?b>#9H?T71oud?TV`6`sLCMIruRy6pNB*z({!LEh;@TqUj9TpdtSes z*&>H(|0rr{sbs8WztnkHRW#ClF;^20xppm;M+Vdpe4Hxkxrkj(0II?5d;1A zbzGYtp9fs>7jz%+cxPf!F)*T^y=>;StA77L_r;9I<(D~qqVe>h8w`y&yRH{HBajAAf!JR3zaC8PJ=*5-_lIlTAH;=_V*{yk7lo&w=SvL zlg&+;Y;bv6+9>AP^CIx;l1k}aqILCzoMRf zshd~V{d|-uj9bli=KR5F>1K`Lq~QD;z7Wkpq+khv?%8;F6%5CpKs6;x(;N&_GQ(qDXFR| zYO5Un-Xw9rK9lT>S4B8S%gp@9Ix~YD^))-En`dPuyN)X+Abe=(9B64vsTSMHon7TA zgaR@(+Hi%_PdW5^Z4fZHp7xYAo-i`EvO*VM&(6jsLG~_H#-wcwhMA)PRCM3n+@!_S z%sE9Dg&}#&va*DxlfBdE??`n<0>2VM5EnN!#SVVM3Cf6#T0{P3P=kOQh)fY;Ipw?V zpIe-m$U3$K6x*hL{}zMnQr-=|6B`UB$bnHZxFZQgt043|*k#&+5zi^tufG1+yxiUqACzgyO3KevS=Y%(4C4Sx=8<;$K+U+(% zWdY-jAkCS;jFAP=;5$@axR?JNK?sNv{1X{q^mo3Wk#DWB;9vR)yvAm{5F|na8`-^J zCj6g%q44ATnlBsNh!+|d{^f^TphvR*qjsXwi`@}+iQ{KPKLMief{21~q;SG^^r)b3 zg@>tmN=`iHiNN{cU+xKGI&cbpACl9UjeSK0`jId765IP91G)WLJDSkSd>ho(B=vH4 zWehHCDxy?N|2#l|2yH;XU(QXcz@KO^_C@CnE+)0!*eehbpnvWX_^#bXRHa8%e3Q1T zrY!yRcXC8Yf;r#e5|&7mlcpOpAHUM;+<9*2x%bx% literal 40520 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

VU0UvE0f*(ElYZ^6E0tuG0A0@RF7NQzkKA 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 RK!*QZI46HL;k1^^{{h+%P0RoQ diff --git a/doc/en/settings-dialog-emoticons-custom-add.png b/doc/en/settings-dialog-emoticons-custom-add.png new file mode 100644 index 0000000000000000000000000000000000000000..16de678fba3f2bc984235478600e18afa689014e GIT binary patch literal 29266 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

RhRD!LvWjdKJL+Nu=uCnuUS zrRBqI@TAlbT`H*4hB`uo(i6zh)$vn51vKBJhz^&G+J%&3rj^9OdlLvaQ6s|_u3YfeBp6Xm!E6lR-kNl zU^?Bk=iH`&*h@Bgods7z^0v!OaD zl9H-B$14|#EUr5GuC5i!1QSk)_W#ZGG}y9!$sl4#9N&M@EQEt+Yt^qJ(J4uvCn%n= z=HXbXk&0nl_o)~)h4WaLnizJd!M9z(hO%f?GHWR#JYyATWfJFImgXAr0qI^MaJe&W-38#Rd?*7x_O( z`2RnNxk&EN-7Y*JfbJO$vT*-t6OTkcKak&M@Hr1rsW5(CjtO65{lwg IqCW!v7ZMR!?EnA( literal 0 HcmV?d00001 diff --git a/doc/en/settings-dialog-emoticons-custom.png b/doc/en/settings-dialog-emoticons-custom.png index 909ed2405b39bb6f40fbf0eb03427249ffa0bd7f..1d15c5e853b958cff64444261db8e8223cef1c9e 100644 GIT binary patch literal 62381 zcmV*5Ky<%}P)Mh6baG`nAZu-9 zb8}QH^;rM_02g#cSaeirbZ=~L08?djbZKs9b094sOHE~SbLjIHRCoL%@o4WM=Fmj3`JG5k=)EGxi1o zDk{B0kWdl`A-%nlymIf^>-WcAZJ%@QOTZwC>`(IEx##Y)%i3#wziX|%?|u0Hu30c# zuk5o!?{jwStyZzMR%>Jdo{EA1)cj|x@V6?tKDTuL+WaIHq+3K+R|evTLN+qr?%z;a zn=Xhzc{2^~?hs(;l$FrCqpDw{L5O|?yb)d)(PnSA+R zvWXKA03!00HjO}k^$@pU@uruUY|dJ90zr^zY|h$jiDhx!Y)bS`Wy#rYGuYqKrBT3r#3~d-EBA^Jogos3dh(wh83Guqgz}@oN zd>IE3xc&5JT0H`PiD0;Q$d5;UT5FgZoj@=FA|iq)9(t{eEd!EQ=g2tD_V_ls+k)n7 zt0YrS=fhJZ06;>L9<3FvjUq`u7p_a%WZt?E0eJeX+wnO9LY6=3Ae2Z62mxg^K?y2O zGDlqqKtw2400_wK$M*?HIJ)AsSO!n&$e9Rv)#MHBF)ATNGw?d0;t&F0rSF_&YkuO(uwYQ|Hdmh>kb3Hyki^?bRsq+?O3%Y zPEBu+PK^K%xeHK5bztLPSZj$~?1Di+R6?q0LvdMc@YX(g8+84J*dZ&Dc1k3uA-I(E z6jzDg(@`KG5mBn@V(}1#m#mFijTe4iGPc0+nG|i1_(`3Sh@RN&qv+-qzIDWfVvD|6A&&!G zPdwTP-3S%Lp6>P?rnJA~WwS0OsO_;$$Jls%aCkHefk|jng{P8Jg3@YAY)vWv^ZV_^xk&M0FEf&Q-UzUCY!=Pzt`O2^a??@|SLj z^^dF(CmL;97zHXI0!H)(>F1tWGLy8M52)NwkOvhW&;U)__mi@rB4EOBtoaHlL^5Jo zp$O=a$fKJRE1@F;ZH)44>qBi|7N_Xv2@5LAL=aHgmZ_k^70J9nbw_zr7Qq2L%ZLa9 z0Rmw%6a#Q!5mjat`{ptn0tC?tY2Ry|0Xyq3l{gfvP_~pm|-5g8+a^VJzI(<^*Cs)i< zd+*RUQLi_$EH>qSZe|};_*p&_M66b@TB&3i4Gxdi8=+dQR4UHPYa-SrUFZ9qL<%IH zpgNw8UeLk5sTQILUA0EZ$!@F7B02BQSrCGs6}ODqGP!28zD|d%a*^RYO-t+-+mSw* zXS6l)jwWlq^efNusF5u8L^VZ2Oc`8kmw`#S7Q_(+j&I`gCQ=@iYKstrWD$Hp)LCFo z>RuKah?+vUq02CX5t(Kly04VW{iceibDXLmS5%p<1n0D(GTO9+!;|GXGFq=^)rw-ZpZ+AQQ^E_IEUq=9A6uQ9tzs>rI2MHf79?Y-VXRX;%{M}XscN-SuV;@eU9)=K z@X*M{(Xp}i*7lz6j;T|+cbqY$tE08i2!Pfj6r$05`|LB9W-NU`T_ypEA;h_J%;b8q z%1a+S46^WQ=G|ZP49iyToD@9Nh z8Me$96Gd^;Do2@tTWCJ5) zPsg-@?wz-p*45e8Xk<<CdEJQYkSrnOY0T z*Q(WtiN>SL))t9l`{_y?sp-KJ?&%;lcHz8%6>JL~QHm>gnyHYOa13=uKnDUUHl6B2XE#E6K z^Ksvpe;1AVa&D^HBKv3lma_zM(TE_W*e(l5CIAKjiSk>z6D)y)h-j%OtrvO3A%u>K zWUa`^GNNJZSY2tf)(j_!VVFgdBs@{LM7;(E1q_id2!#1G@uIt3);uwJCSXQ^dCn$D z?0DzJ3_5-Qp?xC-3M_w2s4hDCp6a+$X(GlhNSwXo6;L`CD)xC>yr?3^Tj}OR&Jz*|wmz0tGX0v>>GT97k`OFH<|>3){*e z(RR`-BgtwC{raW!3+Ffwgr8iY{K>ZF4985~gyBGvA&%kPXw^#qko>8*CM;(et*{TW z@Cj_;Jj1E1h&%+T1a0sLK&adnEjf<^q6U?gT4m+hq1)y^(hMQ@+iREYXH02ib&{!h zdx&9RtyW#NcKG)DCTnE78U2k$BZzS)i$a8mEw$>Zbt88)Z)EnKJ8w5*V4_|ZoiU)6 z=unm}{pmV#ewri1cNytd=AKU0o>UaMr|w} zKXEMyO-S-w>_E6tVNRcB7z24jtVke3*vR@p9)l$}U2##J#dA8i*syxtqRX5ybSiOTaQij!kMHpA8MxLT7h^?))M;~8fgV~?O zvTkr_>9S-nd+ah}e4?)Qn-Cem4m0{|Hp_@MMiR*cgfQ%9T-gxlp7p=^<&q!0Zl`xD zDyrtRwN-~Vj@@v}oew>@;H5_$amYcl_4#R22Bu9J*l*vx7CiXK|NiVZp;4bYFmGyq zcfHZz#Cu6FR}ASq{}Tvq7K1qwGXS<*XAOu_k<=3bbT;GJjJ)G!Dl?z&W1O4z11E}j$HVFz9!0n`l*LoQSZ;q3&aYZik}9~3GiZ5>Tl z8PF*YL^oK`)7FO2!JNXU@@oVt#e^U+x5$w6z52vNOG_&tPE3rqwzMJwQ9zAB9Ndah z2;1?xiD^Z_BgDNQ@llWhQH9-baiyHB<)&X&)(pi$b)<5NQvk@Mg1oE#h&`9q6ck~( zgPDX3J7_wQ)d`SK$}kVI4-gw*{UQkzWjJvOD2i9u#FRvT3n3xdxjV?wTe|ruo&^LY zS(zG-2#`$6B#O65o2|$^Gi!A1Z3)8B+feQJN#^eMgd zcz%M6;aXd3LmS3oBQHJ58UcW5Q>RRuGG)Jg_ge4}H!@|QYpa2tiFyOfY=MZ{T5Cfa zMsKi2W?LhS)q5{^aFNIAMk6RhyD%<#v+UDuDvWb5jvzy#mX_Mc#xWhtA#-Ff2-Btv zOq)6|`#F0(@DLNnl>Wn}^>>d?WZ*(FAE#E*5%8K>mwIa?}A4b+<)KeU-R<02ksj}XoL`dX7X?M-F7_Tt;a4}wD5t2i$fN? ztK(C&J}wsM&+)NNFChaK4zim;7C!h&7BDD1SeW88*CrPql>kLRQ~b@ifIeRdiK9yv zExFM$sEG)ua8N!~8dFj5%>YH>2x$5J#C(kqDM7S^WO@o-pr_SuZ|(?&r?<?`B5Z#ni= zQJiyT&y;CU+||t`21#cMiu4duOB8?+HFkm&X)jPlz?Pr=(&dm6w|f>sahw4j!2`n}G!9?5HJhg&bdjsJAG88N;PQEn&DQ)Jg^J{>vi^ z?!WKY*S=!zfwQs@uK&|@Z#njruXxGfC%*m73+}%!3t_k2b~^rFk6pBA;ev&Wvn(@V z5&!~Luv*2t?|)>${rA28wJ(p2*uP9*cGsOw_*aJ6EXyjA$^ynJtW@xx`yUmoj*U?I zGuwT)ofNAn1UY!&-7c`xq#`%gYWHLabD)aPI;h%s~h2``D64vk)>0S;jvf zTk_~`yX|=VTaR6|XyJp49t%N9$}PQ=gyb+mO|E+Dvg;QQE;7h7wWCWPIP)hD|9POb zb@r4OQ~*5>5kYH9WpHrpt~>9XIdk_tcHgnl2w7JCZ|ao3L!W!_U+%qk)w?e2#FjDF;Y zKpZ8Aqj;y_hbTuPLH3H|H330|)c`;!1mN=Te*3=r?m6WH9|eL37u^4yZ(qD|bQAzL zY}|OsH_v}?!TstZ=)V}t6#w};_7n#k2#Cai7chUx@joZ9=q=t z!En{e75nTn>&&lR*w)_u)vtWMk%cS^)28%Cgj~L6xTRKg^MTe{ZLK!4+fL0eHp{}) z0fyO?Ye#Ces-IC?Yjyq5#=GvkW9H1=_t<@>EX%Tt;?LV|xk0b9ESoALS-EzkR;z(P zw4x3Ot2Ikhx_+tn6A@cmDuY8z95Z*@amnJv$G-BYOTTqNCJge;^S}OvSG{D#vgM9A zMryUH4{3Z~6(}n*G9-ez+Z=Y)qF>&+?3RQ`Al$P0hd+M!`tC|?N^8gV9kWzkB*xKF zs|^m1tXRHc-l22rjgW;Vt+%)T{il8OnyY^kB|kVgc=EfCKXlG>PJZ{>hlhs%an9_S0C3RknR90C4gd$u z-kpHv%-%f?;Go$vzkTrqFFWe+L+0##?KQuR=(T?Rx|5E7^NS9j`~B};a^S4p<1DYe z=E{Q)-231I_Il$nueklTn{@)FGm%{c&m|RxNbvpde*1sL<@$``>!& zjYM?&tvAow?*Lg?7#dvv-jm*b@cw(h_r$ji4-ZF3zV@2m9(2H72kpP-8;*I!?YG|= zJGl1hE9dUN=iL4GeB&{%xc&BDHsF%I^gC9R*&LM}r;?>9AcFRp`)~wF5(8$7}b0b0yRjXA8T3D-A28V}NEMIY$ zH1gPEk2X?teeAJE8(HRHcBodZg2U=+rOH_Syn`EA*2pOSJo_u3d;h!Me%?7}>77QF zStGS7qeWpW4phIKf3T@UC0A>y)dq(~RxDp}*r5kEvar?G+rINXr(JmN|9t0?3mYL^ zeEvC?Ty*YxPx)y7)M<@IIAjhJN3B{-sm)3`$!V9-Q95p)6VAE$;vYTy>ow!+5HV1= zb=4JjuK7cEwKl!GZSN_Ebk_QGzd~uFR;>BYIaNLlQB<8h&xtC#oFS!JYgI{DM}GMQjP{*mJ>0r- zvmpkKIZhLVWe*n7T;kvw(RN7~i+em zJ@&kF&H|!a?|KLTZoT`#Tknn+4@t)?tu<>_U-8qczVPLx*IQMI3#%4eI;rD;^ z^iSV->wPDl^uEu0@}p5qr+@gAkDmUi8*iO|;z{p2Q-UQ|Nku|d#Y z&E>OZ5ddnn%E<6YOKW?7e{aKqVI!j(um95zF8kI#v-a!m84!f5wnT&!{fP6bR&h8s z($~|-Xvt%bz2$W;z3kf;X;YV6c9KB-2%Ge0QtYbJLXsK0PBhbh~BZEsWJokV9 z-(`n9@A==q^rFkYeWBcUjf99t2G_!EjI2r`lQ3L@qksUU#L?f^-3Zjk=nZdu#|iH~ z^_%B?^+PAW^U{mI@t#vY`sz2lwb4k3qZlk|X-aZh2;jz~t=bZhQb6@=HH@*MH z)6QS;m77*yyJB>FMn~(k&W>3FM@0`_wsZAoXw)aVdwQ^fSqOnbBMX7T@W{w1C%$Fl z=xAySA zvtTIEaCGVe=`K!?)6n)t` z_0GHOR;#wW;Kl#)`)jXujOzr)ropc9iSIhOv!nfmFFLBxsK>7Vc-^(He%%||+uGmx zu9I~E4?5`J8?XQ4%{Sk0*x^U~^jFt_qzNex^jtrJ=l8z*t($JV{v}5p-PYPFk_7-b z;J~>z-*`O{-Ez|n2hKSVIB>z=|NiQocHO<&()yyK{^fVq{x;6|pt*Mn1y7}fC=N<8apZ)q8Ni;YPQ-~(g@Pi0+J6H#-Q{WaPT_N$F z=x>45BuwP|CPYRA9p)P}ps2q_0FRV^515wj4s+GgA1-+k)E=YRG4-?=CY z;nHuO`<-un6(m!Qt0<+o(gCw~|vMf-1@Lli!$bWq4oa5hh%EjlO{r&G;m<5WP zbAr_&7sL4=r*tc>Im0y}4%vh|_P7)FpL56^x88X0q0fKSvB&9Nqs^%KS1xawzi55jg} z#;5ivG^Z#9f=CI~$q)o4;zOJ^%o_?7G{^l`9r6eq`y=CA;swx9ZFKb?Xj3 zV9x_*?RL<9d#ql)Dt^()XTNyn;NajX?>q5DhaWV5{yl*RfIj!7GY1C;PkrBsFFJhg zee>tX4Leg>85_weOPVeYF(h-UXBNp2UVBuCOhjaGN?yXtm`; zf~=TC9g^EtZj*_*Z;TPWm(eoeMH?6GQ-9Drx!5bRqbZ!@J=lca#2}Jh)O?&ZY3hgo zz4NHzlHsz*k^l~Ec-$H&au8GmAxFn1bmy#*g|%x}uU)h13ajJMF~FE;;X{_kHA5$Gj!WD9cD;wyjmq)e{la zYQ7O#x@7TXmz;Of`#$`tV~)$R?DcOx;cX|q|JxUSebtKPSr)R4cqFZUYsvGR>BbXh zII5{wMklfmvPQ^4`0h8)yYsf2=05lEn{T-8^6z}p?=>oMK$Ft+ji?r#bZ^`G2VXGf zqn!)yUNf>d?6%Lry<6=uy8ND1f4Oe)?en%dbk4L_DYfvNSb4G0XiOdGuVNS+8Sn3{ z>ghYkJ>~ zwL8+&ugKNKu{ude7o9oT6c=J*Vu+ONeNBOHl30=;=ot`p9W^azW(7KG&0&HwRD*vq z^&<&cfK5|e1OW5mSugd|W)3bv8{zp1`MHTOQ^uO{m59bm9tZ%Adj8y>|N0LdU0ppr zeaHRV+rN3i*P;$|_xAnzw|{J@wVH@sZjIaG`{Y(!dO#q6zW)BTFnzBOys#2Sb= zFfir9Z+)*`umAGrKR)&3cV2nzjiO(8+uaX=UvY<$|Nft!4-`&5?SmgW^?m>TAD^E# zZ7b0t+;9H_zID-g`_A6a>s3#0-&NQAxz^I+m>357r(Sf)_a`PMe)aR8ocg|ZUUlt_ zfG{vH^_$=R{=~$@FMs}%Q{MNEtFFDlBqSk$U)mVQV3H4a1EweuX(FmO8w(37QV4Ls zk!Z70g7<3plLGq5e(`UFHu#esZsQ9jSkxrG%}G9gBhYWhiB(?#M8V_4lh3d_p9~~h zLox-?eNne)@&o`VyMkza`EfaVLsZ^-gx}b;NXw{-=%MU+q+->y0^%erNH<^onhAD9uc`l#`}A#Q>Slt$q%ob zGIe?*i%T9}_r?=maO5j`2exWtL9v=dj93J1bt5*xaFAm-AgtG!IEFTi_gAWbaQUSd zT>hO4-tnFfzw-5O`M)1ra_L214+O`&>39GbughTEq552zERw5c8#dzXbpyvtv~9nB z@0Tsx`$X9Oh;933Zq>chbEfUl-`2n1)YpPz5z(!~F(MhRi;jyJFciMJpe{c8Lcq7MfqKa&7RKjo|1`OiVf}BsaYM#Q#%UBsM z{wLnT7n^6pFt#D#2CmQM?y~cgJRI9cq|_XBZ!5tm;`bt($1noT<&@ka_rqNXd2^aK z1aKb_)VA5}<=hKMIy8PEh{avt1G@;Aj1ww7fas@!upLOtO3E=njcsv=r;%lJGbE~b z(UC8`?7J7QUAua0Z1g+dy6C`z4vB1f*u3X2TKI65HGcZzE8g*MZ;aBYR;z<+*8ozr zS{+=!j>qE?73vAZ_~VEd9QD&5UokO0e(A;M19uC@zV_(fUiE9NRC@ad2GDH*e{sM8b2WG(f_d|fSh(<^dZY2v zA763&zaAUonPXr3(%)YBt4g)fH_$&gI2hZ1{cB!&)o*@WGP2k9Err4S9EhhrpqyLBtGYi_zgC2nm`o5^)CD&%u4bB6U}0STXYhm zK|s(Gw@Au;DAs4X6^+Y(Hb}G|jr@t*QT7VRx)Hg@?WnOfd*%fq48g(?1{QOwgl;%u z6-*Fm0J`u0aSanolf}T3LIlKmBTVV*-F=tsAAI5A9&}6(b0Mq8VyFy z$Cfcdj@KKat_T1V^#(Vx@R3Fq;sKLJ7T)@fQ~vuK-+TRW?@UghD9ldOeQYpM&!iDP zw9?x@Rhr`SCcXXB;~pqff%9)ag5c25l0A1mppd)cP=>o zT^~I9wQp)P!mE#c+i@qHeA&h4tX#RGk%c9WIG{jQQsi0YNHQ6OyO9F>goi#f^5W)Ze{sKTz zJyvzmcXq`icRmTK1J^bW(#J(gU&3=3!A`v?MJ|CoStQo1Ac`qIx6-#-xXg%z)pc#S z1CW+2F!0k;q(F~-1VC`whd#b?<%&1H_UNOIn0w#+dp`Z2UyN^@_Q8*xebyJ}9Wwg| z-~Y}h{{3?iNDe#vh@)Tfd?Gk(-VsM1HBUyMfQ7oOaoF!U`2&Ca{qO$eMTgGVdYjJ9 z&X|7u+y`LL!0?)L4~yXvZCQdf6*q^X1R~r#emh zA2_#OAK(AL1O4Pr`^d-s=PO@0Z0@Y@U-s=!e&+LWV4phU3m2Ss_Mvn3`Phd~{lb^e zjyFI3A78lOyt5BIXrGUL^wckYl8ZII8+__;_ZMOK2cxH?P5 zlS-l}Qbl5COFb$;Wi{aZplFVz4~^LLK@w^;|I8djr;e&dYValq?L{cZHLjWFzSG!5qqDO;BIN3|gIN}0a}u5Q^L_+4Ue7u@1!mU`#++n?)}40QLtcg~3mZlm zW;;7O;|`X>3~8d*Ce9~cP!@%VDX=%`|~|62bX!}$QtS*QX}g4iP2s2n&pKH-RC zaO(7J&cEzeFMZ9M^dkhXdi}qh_uXIi^-t9qb#!$4?}Et{T(f>;@$&V}-p&;ws#Ku0 zYw2Kp>G^m5sJp)PiTjkVu1N20bBfqn$QjN;C~N_{^hpVTH7En14qojZ>=(T@cIFl$Ww z;-^2p^4C8*@1o00lIDu*B3S=UIzYPC)@bt57q@^a`Aw9~dxVw5zjQ}>ay5BbZKWvD zB10lxSsgctisrPp*7|!oZn)*H-`#ZYyh9Hyfmwi!W8=43 zBV*$enHVxh1#PX>f!@v=Z!xTPi_Xiuam=uKXrpf=p*LPBw_cNP!lA?P80&QwiNmRQ zd~D92R4~Qm$#6TH2Y#f4O@0JX0N$spjVmrVEENxvFIQ zcyKalkM`g=MqabVxg9nDbVEeHwWcVPXS-ah`rFPG#L1B0syt-8m6w@pQzE665r98j z!eoq+IAS?_uMfoUFewN!i~lFqlM=JIJ*1ByXI#(t)JHyh#wRX1|D1K}*M0gwzR=s- zCv!#pWz<2^lXJqOU_5N5kp&fXsZ6|2x@Z?}p*#jFlq&5y0}&F#ye6Xh1djMnKjQ%` z9La%tc2oxn>>j#nBDIgin7KXFT`P_Mayl<>fLfVk89W}uADnkIBjEis&k}xlP`Yqa zRF~P@R3{|YU5v!Efn+ouJ(RgwbwrDV;Y7m-D9fm&R@-6Q867Qn<<)-xZ0+diz=)6; zjgE~kS-Rqm+i!~q*~nmYykX*%ku@4wORcv3b~8F-BbAo+j?PL|VK!-GBBRl9|D9eK zS2zoyrCQs88@Y}uE$tnh=&*Xp(v{XogGR^e;7iVwbsYf27NH2m00IxJrwrirM%LPl zIEY5a#vfm{;!Yusu{v!Wn}8;zue%-BtRGptY;z;ISbn|a_vbut{)!dr-?GaqKJ?s^ z#hVs~y%5q(?eFUDY+JQ@?bX-a_`t#?6AkF@?in51*wI?uYuD|c|GYT^1ARloV}m1O zg3?I<2l?zJDs+pBg}Jvp-7=)QUH3G_Dx!~9Wlqn$ z2;`77D6K;>Dg-c#F*sw8kPlQu=NO&Qv#+OasEh3&>Bqaqo;yJX;l)UD*hEl<1bq_+ znj)23J6cw)YKo9k2Kt6KObl)qL!BGS4ymZZl)kR6&elm9 z85rmr*)YC-c+|0NDn_Dd1Kpc!WN2h;aCponn&#VheLWg zJ6l(+UN^~L28YMi50B>8-<2JAE{xx0=#TKv^T(I65{uI@ZHJmAr0VsOc-4#AG9pIT?rfsR>^&{_ymDM>!{`jL$6h*o4yDQpQ9oFQsEO zdq_NZg5a9*T?>W6<`J7rBF}25yWnUI%A7U3o#!^6N8L2Hxz30L2#n;|;?m^+0Lu$^ zcC<|E?XDLl5J+V1@OPqlmAZt@yovqWS^b`kEtyUXZSiNpTKAFH|i?rdwRRS^*pHjdRd zjE;|N95?i0P0drC^AU1PoW3}> z$>KKOus&NcsZ~wAO`5$l z1CeEqH`NARNbuyT&W|q7XS%0V*uZnHADCM!jhSLG2&6g8(!fsWUW6m;R^ zXFDI;xrvGkjI3ZTD#6DiKxTpom|FtNwG2;iN@H+MGPH=r-T86%0zK&Y2J7p*P(*!;JQ0Vw`e z<-m#pF;(G26o{A+_!T)+AjV@n0}ah;AePJk5##7e|$j4)E+W<9M{%v+@j=VKUP&|DSZ zmfSN$@+<-nR@8AfqJ|0*V1)xls6^C76G4TDDizLBqclWB6`mZAM;0)K3L+nOrJYNN z#T3R@;>p)o;{4wP3+{#Y6HUb6E2au03#HMuCY>al19X%w&6ACnvu?>W*keee4UOMR zhKGrk=&Gu^@l&GofM7Sh+BtUvZNg>}IeFPWk&E5D$nx?lY0yHZqO1$+jqZQGkK)X8 z!YK~v+45|81{8J6!N-~A2bXNBCh6t$eaclPC~KMAwQncaCpYLL+qAw9F$zt&(9Mro z99PMwIU#5w&3s?Xxw_J_dhn4THOdeIRKHnnav-aX^CbaE^p^P88W@1YD4-(||C>01 zk{H3QiC`aQrS1wtR zYf~64ear7~a+D=Q)a)gQ3)d`r>8H(=rOuYfUQW7K=QB0n@&cMVa$cTaMR6N!yN>%- zr&ira(f88j6Ux>U=lH@R$`$AwXLq3P8VK2HIW?UYbu~e63^x0jNu-=i}R8e9& z2VK*s2V#7xb*We3C0RD@eA#@@VR8eTq&xAW-8C<;SO~ajax3|SB(RRE7?YeNFzz)^ zOM)y1IomW%WQF!d4X$T&xKYSYIhFA1W_GIiGBqJKFQF7c1EmkmH@ZF;?7jJbb2pOeiU4omlkBc@FY;dc5d7I8ys} z=I!DdME6t4TF~4A0@7W#AlZ29-4k12&62~M;EclYoGB9NULs=|>xQyX%tt|xO<{#E zF+)dx@4+Ims_SND^!k$(E=t{K5j=hZ>)&>VoX@ly1A?lY}A0j ze%J;J;=r(*T!Q9>vQ?*f}3 zyN`MZP{F61@VIK~g~S|Vuner`oQ8XDwoJBA#buNX@ zG5!S`v@{Y~!*TKAN~@5S%ycY_OQMCQq24DokB7~T;|UVy&6|@mId5N%bL)B1A9Exw<@%;Kp9gZI<$pB_M%)rT#c5 zR98%JQ@)$qEuYpF)G^mCHkG3dk{)wnS2M}c8=?S5b9!@ADWx~7k)XZoNMM`2j0As|c)+AXwSCjFA!#ltvB^cyDKWWY`2;o7I@JPGoo+T^Ki~;I!>A_gl z@+d{oViuIRxp}n8g?f;qJs0i8lSL9|G-W=OK7nO~4Xeqy;GO~jj0I!EsOlj|=k-Bn zCWx;dhF0>ye|{g}Nt8k$n6z(Wvv`A#JK1viW@Ow-U?Kzej(B69Y(Qx+E`TfPY7xJ~!S%=j6OWTQv84N0&uuO8;3n-#N7mvIKEBb}I10&{#P zM~U)F`YI-s)fq|MeN5li*8XPn7Ryska-XYO3ls`IaNR9C4;x|tD24Ocs|9D~0D z-u>Z+%=BEU8h}^P+^%5fhH{_zAgR1*wxa-?rZYT7A{Sn&Zi65NfcwKfAc3G=#HM1p z1Vw2GPzaAR-{@c?q{d(nzz@ep^bZO-IFyBRuwu3)IaVfF5T1r+#!y&oMi{;_SJB6O zDqFBEr&9idG71!_6R(=us-s?)9@6c&_*>sl$DP1WuPodBM6GwS76=@&XfWsaHjWb9 zZw5(68;Bwo$KamEM9gjk>SRdxtd&aQGb1)AHlABW6_+`YAnFRizjZ@ONp$*XPJUhk+-94nKyJmx=OYK?X`?evS2MPx{ew^= zkHFbVIhsGg;I6EZBm)}KzbFLCg38Q3t{dubj-lmM@K= z#nRkOI}>4)CaNM@hRNu3!nV4^CPpf^)DM$*Dw-c~Y%g19JOHuSK;rRf#73ImM>mKZ zv9XSU25saVMwgZ2wq*?>h{(~59Jldbyh~%|Nw_USfijZ-iyND0gKX_2+kC3|3GVA0 zbLgBF%MHjw+Kyu{CfA~8^VApPkiStR7fX)1gHebdQ{uhyQz@e9`>5xL*d^uLAO@Zf z?4l!Pu?>M_0@za6bkMV%DB0w(odpN7OYIMly1Bw+W>yU^#VnaxoPqWY(7Rx9! zmQ)wNl>bDk)}OAohK;rg3Lx(9aQZb$h92ePjaIG_uqdeJldx(`v8LEddGCdO)T;+& zBRgHdTBGxol`)BFqyAJ-fyt7KSSxY+0Gxm2_>2{R07141-N2<&Q6~+2OrRvHm?~$U z)sh%Uv`Ua75(QHNBE(cAlRRm}24%!X1TkDQr4@Hc1}a*{X-wY43LFsgd=1tR1BtvX zEo81~k=tC{hT|rZd~uH<0;`Ch*#%!)B=D-R^%|6u_AI5fktE)r|Bwk$`D8|cu!8g;sl6-4vB!G z)SMq7rw<$(c>lPFx@ao^4r=)PWDGCKcCKSplHEZ>*`Q!4N5O_5PBw^mL6^h%6Xwd8 zn4ESQ;pUW0XP^&|q~p|ok@YG%VmTHop{LT|Zj+^8{K8MJEB@sPkNl&00wo_2c*opJ zBjqqCrLok>5cez&gilO{z>6-elYu=1Brkkc1_UI|pa(>ZM>!}mm{FRh^lao3`moF5 z6c7}HIY$seLN=^sL_8qzh{c(S-N!bfKZfQR3UMjOYuqNB9VNgP#z7m?8&j&KWSI|% z>?{egI6Wx`;WoA=H56F|5^jrAGABWY>3}rPZ7gIGmqu{aX`&=h!7{EQc0Eq0ZOd(I zIBurE(^%wlasZHL~&hi$cpGdK}esJ z{Mc&{63`He>#L4iZc|Oi#KXOs@r(1Vv>_p#`sTs-p0P>XQ6*{)t>g<5OwIuDECT^R z5ZnoYPYozJ`3s3#!R@>xI*=-%8DhfhWxQA{M4PU&Ib}22DblTuQ(t;~N**p10y_RN z(a8nVm=IeC&OD+XtA~V25E3}X(;O1Y#GBCp5@m?htPSK}m5AMvByqpgf0RU;EVih=ggJS(v!H#GY=^3Lc3;!^jF%dAu#$P&%Ox{4yaUH` z;uWU%;|NL#4}|by$Lw(#P4UqAyojU#flxi-2w+w<;XD(N9(#=gU?;;c_ zucve$a%m1BN%cIBS2dTO^onbHn+ALzzY-ADyyP!=> zfSI!-A*lm*!7+fi6Y3C1hiOi7Q`{!P$a5RnW*z}zFadfrQ(6<30aeCN54{yjLUK>s z^tNb8ck0PO8t{7RCV|@+nw0GX&ctRlYD}^avUvdF{i*w-EJ$D{6HOmLxlw3|DK`Q{RCN8v^v~3B?egJ}SUJy8UK+bG^V{~Lq zw06hFOl;e>CbpeSY}=e*Vq;<(6B{$JZQEvtx97dl6G z3*uywdMKRCz&EP%)zPM>E;UoR4%;g4@56r?sv)WZjU|OyNU)I@Rzi~$v4T}X+r;c^ zMHasOM4~W`vgs9J9(Wa@4cvsmYNS!6O$x3e`6VBzF0INb;zje9ZEqnhc}m(Iv*pW{ zTFZ|Cxz0Zc&m%m{0p4R<>f~wYX@k*~la3TlepU4+%L-}CW_*Sm+lul>h3)eRP@$AW zn=}D=vL+Q=kiA`4a8ozG3?YB}|L|y*$0S999JBt)BQV&%;+ihvt1^C*56JwTxkDEE6E_ z94HhkW)YL#m42i0hlHSZfjawDGBdvBvSO7G9CpP|{oN8k#*eJ$`qy$sUX6Upg7`S= zr(Emzb&*2$2!6B&%A};$z^Yh&W}Liel>RDm@ln#GrX;Z*qAxar7%BG7l zY8pxTk<>(u`OP?`4#?5U^`z;{*`r{-(cCyK#g>#3R2sk12Di+-Sjk)LH`;x!vV~Y# z!GnhbGIQ%Z@-tdb)Sb@Akqa)Av}O91q<`?6N;Xx+*5Y*aL>7%nUo1{)_t!!7%j7B5 zW$#NF<|lTbglOfX?rx<^2Ik~kYQIjNo?Us65b)W#4{5h+w~{dodG!_=3x6#EY;Ooo zbIDjTb*mQ%OxGIB2=FkJS*dPTL&`UU59gXG-6p{W=Re?{&W2oXAr5Y@()%B~j4C!Nn|7n~V`JUooOD6&^ zBVqGbH){+UGv8V`-Vx`SOa}mve(Zl63^@Z^7TG;V|({!Qg9kRE!^!w z!xO5ZQjJWe6jYY6suOjxVt<|vqfq?`a>i+>UTT0h{sFXwH=%TkvQ~oY7x!b*^^XFq zh_geLOffr+ri1gM4aMXS5ss$s?iJw2$OQ4pj@Vs1Cc)glV{?R=) z{g1NeS~3>r=I)YXZ4-@Sf7e6#FqD1Q?o=Y2O$)ZpIg*P~4mk5G6~)|Ez3lG&dD;$M z4BTkfE=x7^Fpd%x6|K~$6}%37e|>o|jo+3)s3<@dO;o?L4^k@J&fIhJoAM->^AI_f zf#48&?}tjRc__mWrA{B8FfjWIxfUQ>y5D8OC7n}HpSPb90+nRk3TAkBs7!fNw$dR7 zhEH${Ua3*!oZ3BVTXOzg+qQCBuVkn>4ucagvVr9y0U^AD z7l-Kf5RHsnA!WHB>&@^p@nLGBEdE1AZL%ZIdWmpfq)D-MMJb7oItV#}%HmK}D}hzx zZU-00i)@r9?CCxkmIA+Sp2u@BBh2ns4QAA%JYs==ybu|KSQjg0*a4vcNb z6p4d7Y5jpq1W;mE82agSyUPXvxO&lIFVG~e`=ucFlYm@mnr65qn8!<6Sh$$dKtgSx zqPS@^%3ag1uG9}s& z^m!kBJj$ePa*4v%=elNWN4AX28oRI%Gi_;Os^9(tju`{ixIr`~v^1x>xVYhl?5VO+ zw*=~1BZ=r_oT$P1$;-^SG4mtP2Q!x6+i$U3q`&~a-)4*RgolVpdYm_e@cW7>DB32N zJFJUY?M~-QE!n41tyD{pk&tf=CFh;r86`X7(F250JvAjl_B)8~2Cx--gZ_xQZe(ds zGsg>)ZWH4L?LIaXT4cd|Yro|}WIt?1EJS1&zL8ORYsk~P8V-HA*nKFNBzis*#->7N z3qdyx#(YRfG^VFzEaoca^H2rF*Fno-IHp)i%;u0|xQfv7#daffG!g$qz$ zBMp?lK?;`?gl-^}NW(v`ckfFW9;z*rnQjRFHQu7PrnJ&lz%b$Wv1#n?lvVJ6gPpL zeE0TPv|M)h3;ej8mqO@cS7^+uJw)^Vv6y1W_wrjk1%O!60XAz5&UtKBI0t-#1Kyv_JmE>ZU+`~X%*KY0vXiIUW;_a31C&l`p*-2xO^wlXx z7;eynOFFp>l-Q8?g&Bzx69gTb*YUlCm%JUFOjP-Is{xh(eosQ`7L-R2tYQX``(vA5 zP@r_)`MFZ+<1xX;jCnl@t^~1s6MfzB#qW(gKivB+N$7M0q0ff3#4mg@S z3=tpWxdtEq0P@@4PsHk_A5K4-XK$Z;+HZ3kP#roUu=&RV!YJW1-$?$3>=YHt&*kKy z7MwI5d;j$XV3tY8Cg3?y`6bs&1#<&g^$;)j8exTRWI2J3@X1Ps$)PWm@MTVxlX#R! zFn?N65uav^qKl$hu|8FHq&U@*GH-K)tq1{M#i)^{GuG)tzsj9G`?TYCGZ9j*nkA=- zq)>kS^Bo>eMz4P-O>AC|;~L8jJ4htV2#n!ZHXcAnGW*7c0lacmlej8pUI!`7wGZj{KDJZ>eSPr zzwyC9+_3X??p|=nk!|gJGj1XWpdy19gemLP@yj{~7=*$aUy~&y_A6%mf&^gg zi2M!6)5Qi_PUV0b@dfBl`W{DfrCpfzIo8ErHp(`lC0{EcX@(szpe0rzf#SP|f?0ay zBT(_NM*Rv!u|ihJLxyfkDMsoF(<}BwyCrWtv1T(EM3rXdeM1oJu^RO z&f`o2G0VpE?;yOuA;3evA~)a{%%oE+qC#x}TdUj)+p$QCgW7O_mVF(Ttw3Msf>c~U z2eo`NM#`+1-!zo9p_nCOQZc94gsd^gFaaJ|%a#P{g5b!VOe-aC1z)VMXUMriRxRt6 z5MLeeHkzXCkNQ}uknd3Y5RuizG5)f9%f(~H-0CLK6~%fkv|1+`^F8!+Zc4@{BUoj1 z&W_*ff`E6hf_>XX;HY+EM*Ik?bU!WbZTz@6wE*EH7YAM<=p%R{yGURoc<#dU(U+nz zNhGmQ6wbzzFcy7Jb~}|GmUO9EstWbD6P`HqU+M2B6I6jTKvU`igIhV4&l;hoW6NS;;?)k^sB){RB0J3MhWJ^Twq=HgU zKFq?!CgjC{PBYGdRk>Af8fz{df@P-O?SAQk9&viTDDI~^Z3-z=u#khD8<07B>oF~s z{prNK^pz7z0^LhTj0^(9@o9hCit|?s>`-{y<%XK2v{h>5z664zVg8IBpISZp?x`qi zN+U)#7$#;~7vT;=Bc}6aG@)gPGx!|@(i;-D7cOWYt2?QYC#baY_z$+8NlnejxT;&w z)aW;Mxu*0K$Pu@tWx|PV>F{fdU~wtDdqJl944zQRWnCNh%Q-bsE5@4b zW9xv)W8e%n?6D1|Y?}0>mG|ujCtkP9z$v?XyOl&OuZM=JDQ0r+CW0i9btJPDFAK(N5n#8)uBH8d*Jx~ zjt=QtPs`VD%fF30P2cM!{ICH!IzAn*Ehp#aHEOhq`lVCsiMkKNeo%GNDpoHSqtjOXN13n z`=0nZ;`FrcOA{E0xZ>%o+VhsXk}?C$=HL!xXfTUoMS`wfF`;BsIbGflUlnmEKWDua z%f}Ep`O~Pc4)Em2=I~?Sz{rCi*bB3%;Y4K2g_S~{T`jGA%{u}k1gV^Q*jOyTS)Fo8 zl}XvNOXr!dV11|G;3GET7_Q5>&Z@(OuMGN7uMH@3tp1+6%-qNwEz~*T%5OMz!N=Q7 zW=VjTsa5|RWJX6>ak1v%>aa0;n@oJi7PC*-@!5QH^CH;rM1V_(hmWt*5cX4 z;CXf!ksd_T0U(H~3d({@fG$x_NLqaZ@xGyi0ptr~5FGI?Tqi*ZzEv8gO#!WUWO!Uv zL_}>i9VcTY@)y_yq4{noArY64k2SHWH3E<6f-Z5*;!zqP_OhSskV3Y;pKj+<>1SMt z{Yt&}N}~4b)T)0t0qsTCLUT<_;T~XqWdTB17K_nyJBM$HQUCc#&KbS1b-$i%RE3Z{)>EA z23PuTER|j}@z)fk@ zHwE-h>Z-%B<>le$7om%$v%gJeLzkap_c`6a(CaDU7&eVwL8Q03{CtXq)WwUIwdPVR zEdEx*s&+*mpC^N@a?R9IX0(^aY%02$OMuzaPjpjMr24LkyM=^1b0QvxMdk1*LFY}|Pq1>}(>l<=;N@j{dYb|( zyTPe1Y%165V-#bo`(^7BL-+lUM~~aUL0ZoBrD|-z(raz&+bofuJB!sJ+BR<6PcqR! zStj16Ax+<_{wM$KfXVmA?3S(DHZ}#SJR;wxT{^~|dx9&$gOH@n08lIbpB-2Yq6h#0 z%DT`eS}t(6-OZ-^rilrnH{ks>{Ho__)4}hmH1~6q%f9EKWa{JfBsi7D3hgt&K4kxc zf@TJL4g4sf5%UWeWMJM%fgYQRi2DW076KS#q_#<7oFm2Oy3%LKr;G%+m@w;VLF>Lj z7TQ52H!wsG$_wGP20XPIVJsvuza+(3QZDPVt@al9gdC!8lICuwS2 z$w^b}22-uy3WCsB4jTBiq~AU%p*@MRPIqi@d_#hBbXa`P*PyMmtwf0TA+q|C(4UJ; zpM8vMHQL?he*&4fpS_4SJsw$JFF(UJ9{uCz<0J|=4Y!2#ht+Z1B= z4{So8mARkC3=TrlFiBGIL4ca>Q!K#s8`it5rsmQ@KsO)f?U}&`Bmg;JN0vIIHX8^u zcz^rcylqB%XiMulO`oi>zeG3O3;P0i9;Xt#&M?`0i?Xq|cDO>t3`)Gf7Y4wJloLLb zWHXO!z;s=0-mazhroD(`Y!eNK4ng;vl#Lo%j^SFAPbomX(p|9eV378VCB{oby%!VV zjtS6F=_S3UH}*NSCPfvYP`;On@YGUM*pXiq4j8=vdE|xK6VfKAviZKWqBZA*+j0m- z)z{fj!_7zy?b(yY$xPl?R)W&XlBD@0Q~bnA?(i&0Zn8;xT=b9qZQQp!6Ha&wPwKrL zlv&Y~y5TNldHB8d@*Ma0BpV*^<1AIc^Ap8m#mx8hB*yG4^+9pP9U*oH2V*1#rFO;W zNS{s%43#OFfNL?UJBX%w;oJ&u%N+d?4%k6W^XF$U5i%?seL8~u;l|vYZngTJn}?!7 zlLlBHnoff?6yW~;-qqs?y!TX{&ICa^^V0cZl>;!nIa3Y+09X~Zl(xj-ITg3G^k`Ir z3B!T`Hhor4vh_C*h;$qm(=XR&C9gThfBwS(kby=B$n@uJCp1 zh_7cE!9;K)L@rb1&i(@=5mUDdNs^)ET5j)SriuKtRa%{)7+n5XsT2iF1c4!zH`0Pt zG9(gKya6$@!xKkDEC0HGH+-yM2uuJ{NTzJeEffWIfj5xT<=%j0aL_r>GNcPL40m&rJ&vNvx?u5vft3 z02K=r+3&gn8+}<-KjBz{lXS|oBMZJ+(?an*7S^Zd)Ikh*1&6E%HLxUtJ{0Or_4J`RC6`7~u-zW~RSM5;iqDjms=i^Q zT4Jjl1zX`#y|O|>{g;}f{`ElTdG*Qf13_&U6lkvX&*E;Dq@>z!l%y^rebU3@w=qii z5+8SYqZSG{DN}*N2ejgKA70eeS`u7{P2riVl_uH(^Hf^IYxZn=P)we(sb(amc$`(Q zt1DFcZU-KCF*lpt1g9|?WlU@4rxh`H;Vs+DIm+ak}L!QG0Zi`EHBLZqV9!G`rUhx2)z)Az6t@G1M z=s+Yq&Q^|YwuJ5v3W zXSM-qIG2rscB+}d^+LEL;KMkL99zWE#8C4z{Ear7plo9?5d6I%c_xA5B84JZ{@x9V zN!Rz_l%vvP^`I9e*MFd(J>+J+HZFR zH?7H)%b_0=yIip~1N?pFQGYWBkv8Yr$sl;`nx!xw-^2gbqY=dC#IOvTklvdwd@UKJr^Y zSZ8Ji3Cn+PJR&0E{Rsc<&)gJoU`x(*PTkFnEaNlofW+qQW8>VmU@&CvM=jfw;9UdJ zXRpsU*w^vZ&tw$8Z>O9b`5(qFPIwF#1&&nmZzWgd~@tj?@5RLftX6>>+BOb}9M zlj4gZ5?Gdr%e=ZJMQLiZlf5h4c%;!W#>kjZ{Pvq$Zctt6Oq1A z>5u*FmzS+DF4-%Szb2ygGtO^XKjii=$Kbyr-z`nuYI~J0aW$HW#&b{(8r}41I^ZMC zH47qs`Suq`9iYXVbL!=TC7m19^pNS?J&(12>{xgZ+L&@!9@D z36bY>ez^O(*O93CMJE(Yo!Qv(DAYq!RAn{6^6dBWg?@Gx_Q5stb5*M|Z;)-L-FA{A zN$7JwqwnFvxs`S13Q1Z$A*by;4h?6Wa(#H1Uk|E z*|Rg3EWepzWHE7r6|~GBKj$La;z9Y;3CW()f_L9cMHv|#FoCq^*PlGfqogG%WA5r` zgY_h%^*WuF-j;FXGMQV218*I?<}&NqVogbn zyjR>Wp?J+}&0VFXtDDODO^oY)pCoL#F0=PIYbZ4a&2KXprp-1sSZu1?>BQT zYfrVOy7ShhcCWcs3HX3U`4unI6NA;t6nNo0%&K`n;5QTCtXao7_tOdChN_kdOsDA( zBc@DuYskCC6RE`}BeztC%Osl&5f7}aA#&1H9r?=L?f#G?VVz@ArqpZPX45&3NX>A^ zZfcsS2BgXCVJ4~W&d1^OY*Jy3c`<+HPk4fdj%oON$?l2|p` z9X1|QvORYJO9cEjBY$8T<+duCdI~u$rp_*Z1-!dyy4hk+z3OE z#f@4?OWV8H*2}GZ*1#{WE=HTKH7WqWRKm2N@?QG6n~?Z7MAxFfDYk`tNj(2r?4H{R zF2B|fqk3(ODrUg7l;Wt)^JUahruzmmzxU_Yqv8}A0^x+816(L-(0cyhu!#q2_&@0^ z)VJ=@idtC>i>1G(q#AEFt(Y*jgVU08C5>A!4wcy^4;pg8{|G z;}s*UOQjjv6-|Cd$Vz@(%PIhK85FHf&NJFQeTQZeULQA`yr&991AjmHJ9JyjyoHXX z)qHo?wZSti=B=+&u{o=4zFeJgf8AumLo;b~w=?*RRc+p86;GsdiTg+x>vi{G^g2$x zXvvPv4^s+)U-!E5oASCG%ei!V7f8i#K8#PjrC0IXlyt~@eW|}tU00(6GH3N@UpFE= zQADLEZGT!^b?y~#Z$f{ZU%IvOT^EI*NaM7^&Lyf-$U;*$0PA$Yi3`LeE#1c#XU?#3G$d|uDz!~J(eN;=KV zo#*36`t9Pq?o{(vz$w+0`CQDp^HqH;%f=e5k_b8bKB1KtX!Yz1XtBQ~K}vjaJ%Bto z+ovU9EoYxIN7vZIWh?wG9c}gXB@}sKm09(`z*6T=wEF2^VLR5fKLjH?XQ?vSjchSePd&TaYwF?=QqPS@H#^b!*kRljGLV=E&HPm z?Uc*2*#w(H!wnY&nj1${{ZQu62DgetI8s*l@xYG30XCbag+32vnn0u1G#PQG9jt zCY+JiN@wy*TwZUG4{^)>s>bRpU(oXvV5vgwY~hsU%%);GtAb)c5=T|GN@bG9?i*07 zUd}$yYl~qalITV z!QoM0S;+LjLeoIM&&|rlnyK4km*Zt3FZc7@Zla2Z2UixcippHSuUFi3qhPjnvG{DM z^tZoe!M)}nKaYr&}Qwk^qea_WjEj~ zXF;N251w{W<)BcfW8f#2RH%Ih7FP`X+}K#CmS+qb(CZ+U8aul4%%XalglQKfSS=^+ zm8?}!Liwuqz?hT)C9b6(L}|8vPtK4+!=WQE=saTtAE^<~O8@{!DDf+%CS}T0Ljfq0 z{t#!((>|9-x+(T%oHT4HCE28k?4lNIX4>UI2hF>Jvd=_ z%pP};33sOS9J&aq9y07Rz6lJb9qYVsBD%D4BPO@4#1HT9lI&hpme}zzBJApp!Pm%^ z2ZsxC<=EBnnAQu<07Iv&?9fZSocNJ?XNbvryO}y&XLRvWQ}nhDUWl+A?mwnq&3+uW zo;bQM>>%J;W)y+Jr07iTvCi~C1ql=5;!;L2n0mpB=fr52nY8ndyfI{YM`3kChjt6sDUI=ziE^dM?tqcjlwB_(8 z>u6Vo2$08;RbUlakZc{}wt+>03JdvH!EyUiM!H;u-WfcP2HrBG#B%i9dc``QI+FdF z5-K~^w1HrGlkDG}^vG|fQ%uQ**vMg&**OJPRf{#!0KhQToswk+bg0alk`C#=+uXT- zC(Io`$Whuan<`e4X(N8Co|!r96wP>#Czn?VGvaBqpaTyQW|zlb9`aqqrR3#}< zSy;JIFW;OMTcs_sAdu85vP9}ORHP5AFo+TxF$)?OCX)QYJA?dzTLco=0es~RMj(U) z^{s^r(OakagYRbfLgz(2l3ZG*e0DSiw^-%J-gdtc=&}MoXDr_~&VT=hRPIs7V>?w3 z2^DhEyet;F5ASMe3efdclr5`s! zgC3d6@Qni(DRUw=AZL4j-_#}swHBXU{!Ch>R+P~L4+A=Bgc!Ebg}2~ixhbK;@uO3s z5DX9_;d1jg^b48fs!URPdb*p<5}|HVrIGFkt((u@2%sv zSYlRA9NV&7n7&XU>SLV#mN1oK4rJg?UwAIR*X{mD5+}QJVS$|n`(KS?X_ZP1*Q!y4NEo&T1_l;SiSeGui+7MK+B-HZqcynx2&-gfm~Ph9;%r7h=|sSzb`2 zL|_qho7mpbMQT!5&)m;|yBO-a=6a}W1}@+2xSVp`hKXTRHixW0S{ zm=Ey4W97nj*Ao>bE!V^Iwo}rli!B%cnWRJE)g#qXdjtNQekPE8onH_bW3A0>H?~7?$=YD=Vu4N}WNU z9ux0H9B=Da#R@M|YK6Ak-)`L1TEr%xa-JfDpVE7w;)Y~wY}^=SRdncGzu<)~Nvf$=%q^Zmae!OVNO$>d>*SDdS3na24k2OEH+*qT#m+nJ#Th|$Kl(>qt(DH za-bOazFjT~P~m;6FBg_AiJ`~z0d;k@Sj#1^Bu{R$P_a;{ zQC&mM!1}MuqH<=lY3qBAr`LgGUcEQMjqYq!Uajs3K>oPtNpO%m7IMS}JU>JE-mawK zEmi-XAC{Jt#g*VYGdwyaLFG^pWDb|`&Y(w=eBcc@-5!tVvrxeIr+Xaj>);a1;otpH z_ik^{V=P6SmRh6xI0CcxQmgwIAx9fje<@~CTELR0Hq2QIG#<@_z#R9b5ERZBjL@5SlBmmlrjg1^tkQ8vBrw_|VOS%MlH zO=miB$Y8>mGPp!(X*kS<{P(9?3Sc@h1c(o}5S+MbyY2?JLG`|Oc+Zg98PJwmpQOyQ zLGL@SEXfMS5YGCYcFauW3e;!=O~OCY@6C&>MAXl~f-Eg*aoThyb@L~rzG=ajAZb>+ z+@+c9mVHkV928wSq1n3NW(Iy95`CC>$n4I!t$k$ie4bU~rQ&{l`#3|{>4G_bd-vV? zqa5&d1q1M&O27szyO5Wtv;}-P*i8A0x}OX2J!YSD1Zb)2yNjjyhl zZAB-CTzL?1PCP8-RHJQvS}x@tbv)ocKW!2;@zXT4HQQ^wOwKF%^E%SJOh|XMRMq>Y zY8*TVcj_rJ5zS#ELL||rDBfirAej5Ut<>EuZRK!3ymE{Ij#V`;!F$W;Jdohr?LNC5 z`r}1QYmo>DyL?`s2G6Z%MtVN{eIM7weF9c;P(MANx(f~H4W1@$q0H4|&bP{EOH-XI zQol_xnF`t1e&Nq|v&=dv1=+^W^rXt-_T`Nj8$&(2V0Eiiv+^+WL3F&XS}f}zcy~qu~pyae(vlctng{i*ykQ++>p85^~~o=L!Qj^ z$$rQc{%Qhr<$CE=H zb=ma-s?`k|Jh4J0mo>QKD39Q6B|wa-0RzKq^M)!9*4+y=x+v?|+9@M>z*z`;-)FC&vKr@_#`$FpPxUcqLdL?c0&B1bsquv@lCB=6hRSmf*5c$mbRdDf?x zW~EkfrOEVcxqCfd^vqkP38(0gyPjpc*Tb9rI65%LQDks^K-(nqzJQe*O~k{z1DvaX zD^j6J8-f6EW|AePphUrkh9#K+0!c(R%Cr^SiZzQHi$X>!e5usZvJDP0x*G{mVb2VW z=g(c;DgM&VcM3!%H3(O$ID0AJ#;lIC-QEqO=OhW&F0o=`Has!C?-^f@9%{QrCsj8@fL%rt=lu9hxuw3t*7NmEC}#Y?2niZ9G~kafiN#>2{|fz z*wEdFOpmk1RRjw~dR=ax&z-vz$XnpI6qOMdXO&9zN$`A@O&z@TdHR2{-aV(EK50zZ z^t8@>FMbFV*2<3DNO3#47SqCLKkwL~>l971U;5;$T{^qke5o}_y9|@Ur!t)#ojc_X zee!y|%4~!>gbmh4ymq!Q>6^ z2R~GgsQELK8ojK?OKRB^E?pERugPU=IT%0u7ZY&n5gvY!GOj^4;icDvK%<=caC)EJ za<{kL=)Mbg>0uXhKV7{`LfL!9(_Aak{e-byKk;8J1GUEso6kujaB`>b3j_pA*_G-XpgIF23&&Lb{z5 zVdv&7x+t(>KY}q*hgDb^mMsK$XhwvXe_NDphs~X+Q$Buomhkp=bPPR}AE(FQ)g*)! zVW;-)5~O2$um1AxjDP`;v0AbM&3&_+V_e#h<`5PVvaEv@QaC%V8EyX027xRX`3p!w zmh)M;f>h?Ka96`EH;bbvKvuiJU{@Kt6oCYv$(yDGW2ZdoC6--uoEG+Jg@>B#G>(wT zuW*Fbt{)7VAP@1)(X#x(F!Mz|0$w7vhEaWhy-7N(46kv-W5H9bP$bc`BUOYuc0`?5 z4ag}{Gi!{ExjtShrmzYc3B;Z!15b*~!@ZR#1DV}MJ4f1>9r4aXNQqS<$k@rQ#;|(1 zUiR!TjN1lWy&1P@Sp4Z`fTb&#IYp2?5b@t!@j$b!M)>>4oGu3~GH-NHwujSZF_qI~ zvs816yYo`GbVelPzuxB3M8?P|R=b3Ty;59UTiO8&U0aRV1#-R*I^p*b_h{uL zMESBVC*EhNTEy;7je^%7gyR;+AIDMZ~)>Ez!H%e*RpCigaolKx&?YVaA%M?EM=m&*s8Y<%gZXy z39--$w~sla#0kIh`h1AFkfk?ooE6)By3CN`yHsyr80!eO1mCeKWj83}`V59_a01*+Hu8*fem1Rz^MGO|6LCP)@;zHCPzAFAV@C<*Wa)V`?xgEqLhR_*mNu*(POQS4; zAVwH)fGNEE&mLWufVk&*Uo5P&RSQ>sGRZl1ab@qW?xKGM8&GL>HU{c}IoF|-fhTLx zvpp(_72d8I7GyduN52_s$Jef1giFh>4}$@u6TQ2>)22v~7k|r-${Q3gib*fw!aH0r zNqd48FPx!H#?5dat`P#6vcKWck>HDU3hS!OuHq#orxW*XvOM{z0AwT%&mmf02!yo`IhSo+*!HI=Zd+bnFX$5%ucsD5 z>G98!odbhmzOtModERjyeSjRPHXT5*n6;}$_*df`0LLims4UEx?|2zaF=P8&#zrYVx5M<~Q~uR* zGmVZ56MY{uAde{WqR|Svg{F=X(x3dE$7pPU?ybNjK=05}z~dW5CYP^(^EhPGJ!t7a zKl+wwj5cuZ?N{6V1z@N=qpsF8^iqZ7?!!j>U7Ef@Bv#<2$W$`j*8%}JiCHp752N{m zOpE&r)q|`=v*&+7@k*yl4+%a;UKGnFcDMV3%6+^&8H`6Jhuhm;xJPt&G+a?)BE_8$ zK1btgB9KUiqImFpDDH#9Xg&|F5PIOv=Vr2c`DqXtgnlnp7i87d6UT~Vv3%LBE#rz2 z%tsIEb!5tP>?sDK!P@kiPsh9p4bFJpyOjS!$rl00pFCb~j&s2ki-9yHp&C?o!$E#T z3WU1)j1ZcPIXTSMc~)&4dciXNLVoun(H;^=7ayC;`A3SMs(sqJY8WYv9J)da3q0UE zsNBs7qUpuNLQ`{NL+sFf*0^^19mYHNE4c(bcziougz}#ksb2OIc zt0WfDFv-tGlR_2~37Ole*Uw)ZPf>oKYYC{Irb`ZznEq|<7m=arQO{;aspX$sN89C} zFZV>ZYnMbeH2KzTDd==*Jti*wdBYG?H40g`GbL^Y3svs+3Wv=GC>fY)P0(^I42`_M zCVl_BF!ZRUjS0&b|E&$kVb>MspaTFvQ1@|>j|iXJ-)$F$=wkK74#~n!Sv|d2VtG{B#0hph5mskxFFt&}AYl)J(CyP{ zz}c$0$=ll1)b_2Xz>8QB1y!`K33&L}*@8!)Hp~~U8vREETM5)?LO;?PgANs0xP=tm zl+3zM_p_C_KZf@a*tdJ2bm>`se|_e-@oTI^n5u))G{mR6A+oZ89Hx+gEPGV-EBFoS z_bO1$pWeSgGe{28rgxgUO-|>($6;QsBLo|=w+nhBrq5*>JiTA{4@_TSIN9DR=d4UV zJ4~?)*v2emHL5>u8!)1TNMHw7$=X6U;tM!b}a z0wGU)R#to#ssW+ZWfemOe1lpw5#(PdCtI>`bIpumRS=x~WWinnDvHK1TxS?EEgeiQS96 z9!ubhzHZMuNO>eIKTLR(+!HX*I}S5v2KF7uXYh`tf9wGb>~%gD+Ebz&@eQ62bVN-( z;{=li#R++Q2mmGi&nH|449neKey<8fxeVX6VNy!QvpPP`#8Iw>fY9u^t*&nWZ^Uee zwpyU`gm!tl{e$i>tE)&lw8s~PFVriL8!8s%gW3?%Y7N??Xj8f$CSeAp8Z7i*E0}%Q zI`72_pj|~=6j6~OHMB@&N2x3P!uE^EKYM#OvopD}6gXU-E;m4KF1~{6Ra6%)8a9D0 zZO7kMrl8E``@MubP^@h-CUgV;+}zFFd`_MH3Z+aNuyAnYW~qiknnN}tP1Xyili6Y3 z3AP*Ut2i*QprzN58ykS!>_(9`b};GS|GB&Tu@7npJg6+>q{blHI&MB5 z&(3(sk=TF_bk!)87r0s;CB!54LuCU)%mE7)a#y{?-r+U2Md81N@25_1H2%NEHG`g$ z%~@PL^iJ@-QT|LraPzx9uZK>%YlI$SOA2dAYe!pq$1kT~J^g`mCqHld%16qz{Sv)oHMo>4E~$(7+T(d`|r-@;1jm;Q30=C!Jn{g`ksJ2TNmz(i>VNq#I9P|Z+*u2BpX8K? zEuaSES+$?$`@KGa^$sV@u*);){WiSX+>(n~?~gzO`U(O}&CJv%d_MjTw6?a^YF4$n z0>1+G4-av7QShG;00ojU&hG9tJp_p(rhw~@q9>5QI3pwVa(`bVN*v!{%@9->pa=K?%b}&dFuT-39dX1 z*(gJcI-nP$U)J)dZ$wSa-PA!JG>^iNq96m$mP{%MZ|`rx0TE&i^@h`%cYTfczb z+f74eY=G7eOd~w9r;#k44=}Jw&1wZHDJ9yJwPt%a4;KQ|FJJ(W&l4=LP%;jm#~J&d zn^~=aI!G8`rvDR^sv2;8Jkuxe2_my()R_!{_1*-0wE4X@cVwRZUJBC~wfrI)j`;X= zhY=+n=C9T_Y@A*EZ=)nUKosycQU%(*z-+RA_hwAvyXo=(GdvhoCrz;2^|=yI^t8`7ykio~wEu@0fl-qxie5w|>08gnFDk&P@sRsQoV>2mh!2 zbyhJ#!#qZs<=V zBtF2;e=uE4)TCVysp&uMH)C3U%)YRGdQLmtBpX(S;EIDm8pKIhQH?LW1Pd}-_y)su zFI48j=rLD_=M(=K0b)r|I6VI}6T9|lD^plbL5u#R(0dsu=&rhQx)LrbNYV{80DH&C zM*N@DrIjVgS}vSFF6iqmhLkYTnxLu!6(k4D_U(GIwxlg>)c@TC2fE4QMOk_(mPFfG zu22#UzY35U6#Cqe+nF|BjZqUj1luvU0z*V&~?!?p;;g++ra z3TE@1_;;{`&b;jA4xEXo^QF#Qe@AgLZKYCT1@^WwL;e zYo&vf_3zhxx*~J9o3B4om#+^$d6xbOJH6Uez9$g8IS8t_0g1Z#VX>N_3i;NP%rp@! zh1jbO11QbZ1T>?FC+7dnE^X+HPwy}4L@6@rkX4w~D_oYT+z{YyehM?k)IAR9OCx^mg#nhukCV}9i z$s;2B>Uc-)X`(`!EVK&?Gun_=6nP~CpXrb5QB0I2KmYA?UN(4u_2spAqY1$V74o5d z6@h4B0or#lje~w`D zx0~&9I8Zv)GT6-S#BlHItXg_DQ57u02}xBa2j}3pXR8*LOb~?31!rU-(NVxq{xhZ6 z1(Mu1V_$g|r(LG1Y~)|u+3!P3^k~fa+P_L1G1Nvk>&qYkB^K3%9ewU@Zi2AOby@9N zyT16#iI=Cws*;W_Om@GQSEf3oZV|6h2LnGWaeEFL8jv&fJY0L$&eU4y%d19Va>3B0 z0ekc98vhZ`a0nH!Kh2`wsdUW$J32|t*DsF@1bP)2xebB&qQTGw1Ip;K#|6P?d_xt$ zkczk*!1q06UF47NN4E%Gz+&gPPjxd8=Vn#%V9gzQFfMF>O@98$3YLY-j)5Q3+iwpJ z%Ks@{k{c;`T<66lOzfUUKAh|shbx!SU0uJkza(e8@LQ~$qs3QvaVpORuNjxGS8p2x zDqAWZbTM!`85yTd#9QywAIXquz{;lnLVzn)xThD`o0E0U&~t$=;nD6hTO@--z-I+8 zV?c3J4qQZ#)nk@E zXVsOvN@BL^9}i9knrP-FsIQGi^#=O}lbtwbZO}u!My4!km1UyOieK(IXO8{DCFbq8KBtZvUnIpviN;{ZV$#eqD_sB zS!?*XcYRJilqL`RCnM@bY4jk&z&H4A8YD~7=6Z|JC;B?YX(hsAEO8`vXvi>E>_XHy z#*n)}AUk*lTtfzXGKN1>BaxCaVYPLr;_mg%W+&{|eTWsvjY=`cQYLk7DF;GrA7ng!J~bx7Fswo+&LuaPo$Xl?0%* zsoB}t$w_(=l6_QQ@MfZ zNH#_?RQkuaRLsx%%5vDfVG-J>Xg$Enz=4Pf`tr8+w~R8zOm5U?F#4v<)$Gg}UFYw?u`VP&}1^(l7$l*2Z z>)_%}y9SN3HV4yGJgA0M*4|Wzy}R5g(2Yg*;N&pU#l)#vJ##&&4i|sbE6KR)^gmqg z9ClC4IDZ(2YRA?45AJSr$SRIa-1yh4PriUC&W@qBP#^Q-Venn?iCIU)9`YSRf3f`+7 zd+^6<4w_mZ2!y%;h_Vxx3U?fSK zmw%Of_=tA+(?ZqfC$9WX59Zl|UiQL|;AM%l6!x)6V|WwgxS@sp!?Hd`?9hGdIEyV< z?Xmp_9T9YMbMyWC_e4ojkXDmjZc`HnBV!z4*xG-WmfYk(7G%vT8rr2LC0)1cr3 zZ*(Mkbys2`%+kQI{a6OnpQv48b=!OOHOlWbg!EPqnMxEq;;J)wZJS|ll$bJ7*SfV^ zquBn6Orwe!`srusl;3$MD$YKEZmGHW`qEGWdouc_cBcH7D!lS(_Smn;f zg8>R{S(iv7ri?ED+j=XH@7|tAY{-7n7Kn>>)KMY)?10C5R?lH?`g+}gP9J2!!Gb;B zABh1(u08t>kl?w%cQA&TiHS`5&(*SNwy1~*L+Y5=thH9F zee=oMI0hRt!);7T=ZA;q#oAlvXGpUn7$_RozuNGY-Nvg`JmxNBc4X#4(tk);gUWgT z*q^xjYUlSf{TZ${S^Uhb2VUV9NoWVi0ayDJ4PZpJHbZvhx9R@LM5Q#oS+&bX(|K=< z?CLwl{8J29t$>3we@!Fe9?@jz-d-*r9cwsT_ zHU?>fRB2W{betVK>;?62R?td_4!iX?{ul?@0Iw3fLxazbLk-)WAk^ShI|v*Zh8MK*3- zW%nFemY;)E52>84^S~(5xV$|EgTI=-y{+}OMiqcDWOVt(N_@@c=_pkkeHCwu+zo0~ z`zb5yS8#`=I|PGT(yngaY$T;5y!6B|GQQCuCGs+>DaiLn_4#HSIy24dNq!x;*L!-; zq>Pb%tjmMQ!Ae3<5n1r&IAg43MBLc+sISGU@>Ds>IZA?Fe2jW}OZh@ZduLx-c;q|7$s1Y) zJd8`&$-AR8f9iRp_5I`(Q@{l2VT#Qrmi@umaQ>5G%KXo&fEJiiQ`-nk;aoph)&|KF zyY*nT(n@|zvW|e;<|>8ZFqg?kaJR0UdEtgu=_sUsEF&+Z8QnM?#)QkP+7-bgV&JXx zD~;Y&yE@l)L|Az7QtwihzQBp|{tQs$+^94}cn+I>2lZO<8Cm+}{jD{fJh^}2bUd(Y zrU!B&Kuniwva_={0xw}`NJvX_b3039eb{0@wHf4Aj^fWh(&(V_MM*3gqDWX#(Ld=p znQ;nPOPd5gz8C$x%iByZ0_2%6JyoITGVwnG6)q_qSgfZF?ARv-Vz$COW9Xc0ehDmR@~-+n0tc0dL2>lXS}n@oe~QcMntWm1YeG1*G z^n{bqgxNOTTbT{shmD@2rYoe{m-kx@@xfZ!Ec(@zHjHA`;PNp>!dBkTR5uwI;?n^wuMQUnMaV?S%=4aOtC14~&qO5j<(@e4{dAr>@dC$wGXY{?jS1maOm0^Uu7*);gz_1W1O6q7?g#e32Gxf%-;!fuGP4CypQ1(gOCWpEt_WfPSX0BNl zSW!iqGR&CC!9Z^D&W-c>_DSuNhljx5S|nRlI4nx2C9}YBw``%%m}}kpge*bAXhv5k zfF4e3jZ(5(f8W!6NR*g|TrMTmmyA&m7j9Qu>gfUoA8u`iw_KU4tI7G)z!_klYVpDKI!=2 z-QLaw6YIkJ^`hN88L&c0qvL;H``zEgyS8qoC{+aLNRtAee#r)tu`i`RXVGb)*l$*uyYIrP$2DE0B*G#k zeB>2lAwk5hx}95y!cd{j9#Cg(fnal@HG*YaCL(ib9xhX>HZG(Cb7q3Y^CgLH4qUqm ziaF^&3r0HkPks28Qm!6$ZZejDQ#$VBgR(_^<4iVn(hSiB{&*^liMhFp{f4=1OsG%? ze(xU*+KL$%ij@Ig1;o&$anrFr(QWViU4v-d4rjVc#qS`u7q&}GKBJ4i#V={~^}|JD z`{)&_CD$##I6!7bU)6j?h~ret0GWrCY4uPeYxtlutXQkEzybylJbzdU&9D2Knbx`Ry&*ryd8Z3#q>-x+bg z-ef#mWd-99sO9oG!npK-34rXrsLT@w7$rALKuk`qn{5(k*S?Qir)yuo@ zJj^2x;9N2A)BB0<3p7MW6AKV`Q5v)#4*kfI`wv3uPJolysiso$ss=`%lpa$mS7wEO z5DG*$2IRGppK6qRUBK*bV5;xn3;=Ap+g|xTUtHL zJYB5JY_hBOBsX4+c8ld7Or3;)r}%Elm?-JKeeTJXT6ErP3a3`hSBE8-K$s-#A0)%H zZU-FjomxpO`qtOAsgn47Kh~C)pDQ~*Ztm{JhKH}Ou0SAN-OYpXbZ7_&c~sIQ$!uQF zgVWPdJq8AN<})iw^vK=a-B2Wg4YL&o4%{s}5QIq#S72r8&uZV^W8v9{CzM+Ls5HWR z?1WnV)h~x0dl)Z==#By2KWM>$d?0~)Q_Pf<-J(Y|=Ch5hE+3L#9(F$xM1xaV%IRon zogKa(IR^>s;j!{a3e=*;k9t^t6FrfjP15a~ps+1{T`oa{E3&X7FE`Jr3dKFTTw{Xc}YrQ>&?_=8x*wtjp{PNO=o7+9^BcCs4wuPZX z5pXbZao31hhI)Hd@~3$`AKIKx7hEsb46B!=p)3b4bj1+pb{yRWn2f)xXmn^6m68%| z<&r|caGM@Y<)+YSE0)dYi$yU3q~f-S_2YFxQ3oe0 zC4Kj7Y;<^d+MLxO?$6~IbXxMLaq2QwKWYCUK<$4khCdZ<{c4`1l^PEVE80!v;tAht z?Z(xh?HFc<+GlVL2&Vvi$P++J(o8jK)M?^=0?bQ@{*s!mH>*Kk*x$btxQ)7i3gh{C z;3^!2+^em9Bb#M9;s#+o$pt)-+rEB>l6XvsesZe;((!?M=fOvDiHS5AxvGAf==ixr zJSLlCwZpr(t*vc$P!5pY)02{ta&uF2b2GED&JPX}3|2La8xzRw)Y(KUc{s}^zv&n0 zrZsS1d0BZe)n!_Bt`Ro1CS9f^$Hg(a-@J|ofTu%3%BJ23_BK~U1H7Njnszu27<{ir zqYW=$84(UeJO>UxoSdl@*NpDRGlhjxDIuYuF<8t4RZ_|8GmW;**_q}_#b+z;vlZ+7 zzZ5!_3ADLwAJ|EFu^&TaXVHFZCA`nCA~~}=G+5tH2^dN@sG=sz!Z#)0$7Y5@dmM#0 z%Sd^9?Cca$^N{D3rF#xW;{^%j%2Qa(7k!bK_HZsrQ94`l|HaF-13$HAGjwc!Q>)xpI}4Lfgq!ZZqw+J2VSJ{-6**b!++WL&ejY;W9dBZ1x7vvGE}6D%RzKKB>lnz3f`YC zRPcJ7slSW9R~e7KUUqI)XnO+kjAh{vcsvffDY;fxxopP#kDgp<6_9$Bo&M!Ud(<^` z$BPBv8)$X;bUN7^mgCEMznuRpO{lVZu8EtT?) zf+V|#hll(7XvoOOI5?{S`KIgh+`q++1`;7w04{0iu>i=gMRM62f3o(d^gTF1gl(3K z!l6j7udn>>Z%w|RKIC$lh)76s5)$qJ=`}Zp3bJ!`qy-E-ZFZPFs>&fnIy6w1Tch5M z=`f&&4GQ`F=BXfuoNU3gzbG>VXn zr$!+K$4(#K1>|2^$}9&_)3idu59jNasBQ;i$5ZHNF3-d;JA1<@ z3yN;acS9TA9t41`Y_12aYq{1mq~ifQVHg(+PdhO9i{CBaoWg$x%xSo6G&g6dwF6Jv z3JOp$Z1bdMMyPP2T3T9>=(IgOJw?)~HNXbZZfvz&V|+4Ka=ua@855&cHqWLoc{jnR z6AktSN~^;Q7DT7pJht!f+3JA?qRZgtH=7a&Q=i{{XP6{LOY?bdE(K(!^0V)=xJz-YM1NdJN_K4`V$g=)t=(7f|B=3-p`Oq3d60pb)z9&e z;i*nQn$Sbe)6>36KklfdOA`6Kt-2i#@-t{omz`9j$eeY|u;o9{jdtYrCBK?Wm^i%6 z%f2=p_8!phG2sZ*cigA;ISW2X6JcC5&?R6D7&nRWyd9sJ!JuOVhRGWkR^QKe*Q;0} zcH4C}fQ4|q7-!!!s8)C6f1mq<*URuP&yX$tNBPpq(R%CSwBaB+jaHM*xrUMwIckep z{rrR|3m$@l{kP$Lpd=Jk5*;zKrbIi7;4VPj=bMbDt#|tJ^YFBtDA1+gU}JNcP354F z|67o3fT^{`0W4cl?JhFqs++Bzt_x?&KqM6V^S^}VXRD36hDXXKV;80rho70xtM_@2 zEs={c*XQykC(`kWp~e>Ry?thBCd>@xXeeedN-7SiA)WZg<0g8h*^-?+$=1JVke23K ztx*aC;%c2Dg3gOA61_oo8M{4K=VjKP<|acajZFlZRJf0>Z(IBXcf40sm)k)^#a{>e zw+Ki*=vC@6B0V3;IOsr4smYnM5W>mcpN{ zFWEYkfI`D<5`P^bPMYi%kd#m*y-QRX{J$39r1i3s`2df_Yzr`!I&rP1G8aQ5VJoXV zNujVHUSD6sL*)ZAKSZ(uE<~Rf2<|)|=~Rlf!%xGP8xc$ak@yrkpxm%ptjLUvlzM$Q z_g$(1v=a|J_?6$3^UTwVD0dHaLJT(i?|7?&FP$-P3_x9ObC?}TrD0~<(t1vhCT*G} z5!i~V7>KB~6+9_?W6C0~sMsVjiXA6n(LUGK%f01n!@uWDGc(G^12{DWsxp7!pJV0P z&SV~x^{Ni{EJ*e)P__R1!98YL=az81oTbOTT5|K?)T*}lBaOkQO|lRh=zhohYgD+l z_ImXDt(=48NvTTNX4X~S;}{U|R^5~g6=b4vdOh79PRe|hl>UjyMpLsb+l{Q#@m2=t z{2-oQ%e8OE7pzwi;(#5H#rh->@q9HnDDl$nb3URH36BR874vD3z}M^jex%euH!bHI zFhLt_HxXfA{$9KTVeQlNv$2Uu0}x;UhQg>aZBCUZboVEc{yryqr7NO}V+bpxD^h zt5N#Se;VyAxpE>j=%3Grx=FcvqKTAQ13~erdk8>iI!RiiK^_-Q8`1f()^J zcBZAFvC`k2+9s+CY&E@x(5hA>D-?B1SF)|Y&SOD9UyoYGpw`AyQ&CBPm?>`tRq zmcIo5x*js%&*+}P^}y9k7EGdiFm!YTgiaw>pWaWoM9BE~_>Qy0M^}djd}|&g!8DO2f9zv zp#ZIAnjVwr^|CzDW3Ljr(!fZ-JhG$A;!y8Ck-W^-dQssda8zT#dix;H#u0gfqc2dR z9RFi@+pbiqYxf%9*!CQnJAJ>rRNABR{l4k}$?{N4ADthO_nB-d;AsK3YU+ty{6tgw zd&u>@c~CU0EBeAy1(OW&8j3VTYf8LMN31|+M~9(RrY>hoV4yFSS~?4VDt6BZprXgI zk9aL}0y!PU)q`K0)HK|I=S!gUkD@$~{xH)fFF4fkH{%0efZ2auQ<$JHirLFasx}_# zYAb098)B((s;t=v5KQ*}=_s8~IIsIkO#@%;$}g7TL+C&gci zpVT*ybC^q~Lp%8CWD<;trtZaJdO_$4KIqe=!uJh}jNDeI1^0y$oExrG(S+C7*Yjjz!xs7ho-l zaun5Gr7Y#?8bl5{p?6>%2+iJA(Mp80^)~##+Q*#fT$DjwS7_ocGW+QM7wxkaEX-Sq zVlale)2-vlrrSqia_3xV?lH|UnVfZI{>qe$KYF}3`0n+0{!L;2S%Wa`yI3bb>nkFw zGnz7xTuEfM$OlF4-^vSS1L?HY+qNfZM9n;{?;0Ij(E4+THTiZun-{1ljbadFBHAR{ zfcEAy>a?oWqUa_sWeR#?S16iM9QbaD?r;*;(rLzekc+CL{d!1kF(6WQtj7mwWrme9 z$@CJFLxKK|uzjtJLJpU#B%uU#G31zgoF;h{Cd0WHPGTKhukPi9$(vHogEKjV!KshB zn)N;riW1@mzMN^B@6+N~Mpx2l6-<2r#RPNL!hk4ZPc3D2wURgL2qS|se5pJw)oyNf zIWe+^GnSvu!0;DJAdGf(^h;YdnO_jgi57E(p*0&|?yn!1Ja7QVBS04ZJ&L2%47ymW z-Ysm;1V%1LM{ENB-&(&Z6X=NGWUVup8I<8h$k<2Cf(p9&qn>o92s*;qSzC$pen^-a zw|!nD?6b<%9C-b_RR~iq+;q){0ZFQOP|pjm(?j-5mz?-ivULa(@OyYðYbovn|n z^_VYZG#un}d!pdu>)4)v^sk~mGYdSZbsX^)Lt0kCSG9 z{QOPLRIublc{$siH7fq(<-*X*@?KdTtcA|kUdf%%1?(A}yeU#&v@?-wgMGY-Uw8ep zHh(|#GoIN;Ta5Pel+AqsbY@J4lbM=rZsFbU8vwwiII2}^GI`+844laTl#b0|B8#{7 zt*mm%>Y?rV_VMgFn^g|vU!`_ZkJ;Adt;8SV^?6o!Js*7U;c>d(R-QtADdc%wvbUoo zF@ML!+x{$caqzXdC>*GR(=f#o?sC2TJ0&w=U%iCsTXfj3M^AcD<$g=caR)d!I3QgC z4K1XFR8x}&MMs9eiZquy3$pwY5>5jYo%ycWeEe3+Gx_33nq`3kEKtrY4iCpc zQ}&E4a&Pn#ZyP3IYUs6P4VE^0DuXTer-$RObvZdzo{u*CZ%y?Zr9{Yx0(eol4nko9 zEQrpvrY2atFHzI^n^nmy5IsbCpgCs*u>WM?$Sz?LNF-^;e!#C`WK#VXBP+ivbAO#6 zL@aYwIVA~L?*R)}P^NIY*CJmv=_LFAOELS2qHrbRR~xLq!on^$RqL$&r_hARGv9R+ zlP#O?c)e%^a)g-HE(6r?^Zn_fb@{jdiO^92TOa_s#zaLq+uIXK)Bs2ma9RPV>V|s7 z|0JVT;wRe{gJJ-zl95LdK=}6lz6pq4>FFzzsMS86c4M^Y7Gt+Y@RrBL;mWhJ*ha>M z$5=!*I8u_{3NU*KJtV0sP-b0D{>xgEcWuW*;tDJ_f`L%?C-c-yOf|cojjo&53aIB_ zy0X{X+mod#V`Bx(Ur`l5;o`l~6F1`}VE!h|j9;86VhCXbAIoU2Aj z}SIdwU8_=2y|Q6Fb#FI6eV(q*c`gNX8^U#;A<2knc}*&gGUMg< z7DaHD#t=XgHXRCSmf)Zbnv9j$H6pe|g%*o8aTp@yZzWgKs2Cfyvn=mJZ_k5t+9zuz z2`~bYd6k`?xx%3)?a$e=n&H9lamvOmk%d0UjZC3+w+1`6Ouc|recob`=cp~`QiHY_Ed-!vk*)! z)NZLD-E`ugVdD@gVUo5Uwf3tX3|+5jpnrtEpR}3{1w}4rF&eqk@(b3n>70P|u3Pe(^)LCzHcjQ(HCnGZL7xnf+2mK{!3rM*uK*c=7?Ma>4rzwBrP@OOIUnThl!FTI2vtP@tRCzHf+X;h;g1J`hzLyitEB*`}GA)fp?L`|w z7^D?^YTadGpp)LJnsxxwSZ{WU976=E0zf2K6fy{C=#<1nb(-Y7JmR#XO`q5E%8r+j z@$myW8)MVk0vKpeQJJXds;zsB`825A&Ro%rdi-;?VA4=!e-jon84Bc&0+z$#o1n2c zzy2sHHm}zG!lK?gR#ej|ci!$}QXcxUw?z@0P0)Mo^>U6PArbo7W?$evR)DDeQY-0< z7YQ^k40wgm3iBveUPcZ0vgu_gl15_qUd&$Zj)7edaLEE#pN<%SamKM4CckeH?S-zX;V+R2E_8h@0v{EDcl<5VD)WOg8KBWT~@udz#NIgT3rl zvyynjCQm0%iy?cgyT{8M)ENd2@MYf{rf1A=HzL+fTv z%eHZ2;h4NFyGr);`FT8zm718Cm<0$lZfeZ&9(Uc(W+x9BAD^`PpC%se-^z=3 zMhT?r0*cUBdKD#U4a;DJhU%M)V$<))Ksknil;<{tHc; zv5hjZPN-k`T46>qN~qA7(^1D~r4B00QBC&zMxQ>2%@iw{Ej4`lC#b8(e;WQ@gn~I* z?l@+==a1{2Zr_NEWm+__G&}X9BU*yC*qU$&<_lAOk zf`Dxc5P|`~NpWEzz}viE^&*vPHUi0pZr7h#&)Zqg85>mcDRv=+r=2Z>5)5!a3|7yt zxTsdo7-U%}g--q`Ac5QhS}{KI*K_GeZ!MPq+Y=k^mGhb|Z^^ULv4nmc;*7N%6R;LIRk;nIb zHyeuYakNmbDOnhQ=w7d(Eicaig#AjzvL*9qbji%=`Wrk=?kFI=Ls|7I(AyjKKN1zf z2Jxmiu`K571fNht^)vjXzv?@!~mHg&*oo&cn+f|A=kuiA8PTfX6ufz>YlqV1- z00XI$wI8|AJk7;U7z7hAq$zT0`DY|DY+qD88O~-zxwL$Q7>4N3(QZ=gBF)b46mQr* zCxsZ0JP~45b&gnRls|+L_y8yjRZ;|U-r^|`&WsCnCnM;-Qv-a*{x?LB%|_5{@oD8g zon#AEw8}J#@az~rwRAs>nijFi8W4g*h7=Zh!WQInp@>hWrL!Nt_jrBjEyWZbo_OK@ zbBpkMXkv?_)@`e*(17b(xZXD;+yfdhqGCS?mZ+vym}ZpW2LdL|$Sbnz3!s^cJ0613 zknB*23!e`12GpiMe-1Tn`lP3)pPrsdDJY*Jn_SN!3qJ@(?|uv`AEURtc^x(`B>}I7 z`A4?hqJ9QzPioYg+-CAvW_q)c`$NxTto;BFZlCQDak4E8+66w4(g+04o3o_!as z@2}%~k?X6Ja$3kbnF{bTfx4oYtg$xhB2D(fIpD8iF8F4&GZmg^YJ)zTY@cl!Uszn{z zVFCAA1ct85X5;Ksb=gqWouOPwPp``F0Ccx%P1h)2LUCrHch-7yJCRYugo!@-1Lj z`w}3cSzEBVLDqipi?P~V$>pr?2IquirL{W~+8a#34tYEs*0!V)rwj{nwN^Jn^4w*A zsd&*A|0_b?TN_0d`Lg>?xs%{F>%YmP6mBOx`Rip;IMrXX{|zQ_J62o9=^B}uAz;h2 zoX*>q+w`6xVak9>W`^$cz6-}NU%B^*x6*4XY?>h@SJ6>0SBagxTq%Y26VINL40T12 zD4B6Oeb-Acp{37Uale?+T^^*HLB+#d0n)D!W#$2~1#9u~hl(&k#$k;5ZzQ;!U zgRTy3n?Xg9uwH)jv-v4`)<3AxI6dmB>>lH*QOFi&ztEbCeVb|X{(1Xw^^|_E25iez zR6zG$kXSyf9h{kbdMvYu0+VQ7ZwI2H)|0802wb4~5y+k`mWM97wY|VUS4_eEdOb%5 z5aAHvR8N$ZO9W|H!(#4k((crMTGUis_zvV59L%T?afkjssI%VyVO{wDNThkd?g z(SqdEPSWi3@i&zmycpRnxT`iJc$~Wu*y%^)M2OFY))mBIgS4b{Ua^DF~u5Nn`ROEDrtsE)#4Edm|wimIm! zrt(L|cekV=$Wm{bLpn4B+yRE)JBZ1~*6oRh9|bcnI1v$8s;H2XTo?4dEQJ9LItoIT zXvR<{zS&6=_!#geap;sFKgH^TE;miWb57<=sHuVT=4~*4FpdTwY~J?}w6Qz94&;u3 z23;cxA{Y2xlJO>n=TRKnMKynwnN{SHnZ?|=D7rt>r)aTptiS;SF+}=&FqRMH=4yiyBtHvtlrM`@H{uG2U12nXIi-j0u#c@_I6g~JeW+P4#$lJ*x5*aVN6 zw+~V>xx#8uj!(4}zTJZ_G-rLV*g>dUI4Prm{$g&AI3}*UAJj`AtDq)^v&ieAuLc{l z7|~mG!-U43>BkB@RF%?kWjAE}O4NBq0D+TVWl&rZgMwJ}Ya$>)plFad2*d$5=HCNpU=DIV`UeMN@L5a2fD=oLseY{RyxpVsHxPvE-Wa&;H}_f) zNHOE9Wg%Bw#@A9fONDAI8e)(@D%OY_#jZ08BuMXDt}^N|RLg@Bob6~bowwt{Kgn8E zuea;G;Ci5F&X=3fvy3xN$3qn= zR{Ne$T8%aiT3$nd0h}$8txpI8Hke17*wM+!bWTID)}gQ>nSd6TV;?W zBF5!4IxkHlad@eUCh0(hsvM>iD>itW5HyGi-laD5&%km|TgctteFSedvD$^JBhV zNJuu7#ZgKKe!$}$^^Ia)=WJ_5+4kUtB<(P;CxQmb(fa`)vtMec;a2EBq|VxLy9bgRn0adYOv&B6p3eKF zD%6#_ogdE_xgvz9rc>38=gH3{XudgFtGwv6{ns z)!iR6`nZV^dI#OaLRnxSI+H(X2+CB6M)Lgn^IWrYY$rDf$uq;!k&rnZ_?B2GD7C;- z0~%&5l>*+CUTg9T=@`h`d6uH<^9vZav`M})<&nij+ri4twDAKO{?E6uSvl>Fcs=TG zM0?+*2Wo;weZ_;Ir=o6o{+_&bSYm+s`tGWe^luMjtXCV3=dS(RJwFo_;}a5g#bPYb zzpnukt<%RF36}$eRzdUE%|S8kZ{p77q32eYzbqbs83tChx-m;ncHlzuIFA$}$UvW!Nw_Vn@SlVfc`~&)jW`8>zj5QyxH~45W z_-u#I;E_i%)tFN-e>y^%yvGWy1D%t|mF=lHGmPPN0e~aGA*MRANnZ5$V7-bNa{X{k znW#f&MgsH;9Om!*%FsjRoW(e=M+*}vDI^ffzF8S_IN!|4@mmA<%^zmZhD0X!nZCop z7`bM5%f~GK?-g39Z1*aE?V6I)Q*`ZHMz|)k`8ywOCmkIf563e}3fpS+x~KE60dIjs zbKFirRx_LG{JzUV>oTX2l@)Wn;&mmAnhBI&Bvz42;BO7N!Y*cu_56-pe#|i#XX#3pod__8g z_WSqmUmD$A^I?{wt1GnM-Q5j2^~HKC1_&RY(_!gqoB!>~JE~RTs|vn~nipNk?)_X0 zAS!W+(g6FV3kFOawG2@RzsSY=LBES>sbjRcRF(QUj~GK0Z7Ou-D!%iTSAkc=cBn(;-TwMPN9UqOx9e6L|HXk4KWh9*^PxfO;H6$j-i~ z8q(Dza6G@kqwBMCTFYuF22YUuC-G@Jl)!%-WDclQkVb3l$os(koZ?4%dwUljJNOiS z#Rc3e9E;uRZ(;=w1TH`;!+|(_hGjOdcO_<(T10ejzph?j-6<5p07wdgMESIs%Ta-< z<;C<@IkDeiz@cY;FowW$FHRhfrpD08ORE&xL`hgmS2M3xW-1p*g& zVR0$@*gii83;?b9c^-UsdRCDK`hbXC-^r;`rR=m7~=}7=URoEkj;{R&_EY~prqzfS&q+rhS4UemI9-E52^KK-{ z${Y%EKKrOO)q$ko*HPCI+x^;*XCy_0KiJ2`#Ra>f&BAHG1A&}mYvxLus9S#@4tu;f z!lgHLe$$+uLqU8A|KabjIj<|B;umugAsEg<%}uSP1T(E?bw83+UZ)ciLHy1Sdm5g$ z!uN~?!-knludv^oPmbx8 zk9CB}Cq!Y^Loc-GkGCeqr^nDR>|;L2Tw~PVkJF-X*y_yJPmYVTaDk~dV?2u8DjGHR zVQ6r|gh3Q^(#z}Nyw6L__TSY|tvNkZAa116Qie?wqy>&YOq71%L#^4*9HrT4W4>DC zJWD3HP@FSwOeX|056u%Vtn&8;Y%ocy!|C}gxbyLRl^xjajEz)%I;6D^h=XElx8iV1 z12P+HezkKsmx|@PALWK}L_1z+1tB}2!#n(ibJ-X%**`zGE)HoK6NMo%?Ve5g-^~yJ zCxD3Ai z2cOSgY+|S8pK&3uqNhjQ3{3kHPMP*6~iPp_{~5GrWmfYmpZjX8nXU4uQ>ZE?4SNSh>C*d^Rh-@@s8F0hZ>{&TVHf%0 zQADT5$D>pzL=+1Ar&yBGl$03*SuHS%FA%8LhM!()8f|p&xTfCuYf}%&z#)lzE>Mvb zP|MNStdNj_5zqI9<`mx$5<58uoXg}9c`3yy01y#?(kovc*uE|MWt0S06wNr(maJnN zy}ZpO&p49WoTe9*E@QJo3OYNKfGv$io~VJN z!J@7qh2#&yfS*)mXMDgDC{2j4AFr>hK&8&{V_=~`O%xKO#FXrohl3=&Azka|AfTVu zHATy|+KGsWFaa!fF>s@KgzI`+ZvGe$#NRDR11MNrvVq=mj(5tcwX7_U_-1OOhEqiR z*fz;x4Gzn=7?{o7SUZNW8K9D^T*N>_Yk!oCgwC@`e_^9Pej1;jdm|)Z7yM_}qG+}^ zn*^-UyUUV6vA^dJmn9cFuL^ot>;jf(rUF|W>m@wi`t%4!%bjd)97g0#=%}bXuH$mV z^Z&2CuMCRg@46g95(p6Fj|2!Bf(Hri?(QxL?(Q;^1cF z$mpvNGU~}5d1|um`^|bVPwTjvmORjzD9L5GwJ$kI9Z<;LwKTU0a16sW4VR%$wH$5J zR-ScY=Blj}@!bMh0fX1OAMb$5WHWmFpoktQnSy`+tq$LaDdeEsPT9X!* zgruZW;;vaX)+;{oWncATweT?L05#Ahzs|oI_0&evuReqw51e2i!K>XR(xz_>-x;Z^j{?~r zsv5pNe}4#HFb-Qyk;(J)zECS2ALA|#{v=b@=6T1IRVjrIBsbZovKEHPq4<{1^^EYC z<5y+eT>Sv_8Hq_rB8ydfCE~dtr&=iXJFd4s%QY%=%CwoxZrl{Uhy$Hr0dz*j*>A)S zimx!5${#kKwo{b=Kdb5iiwGyp+etn30u9v%A-=LtAN8MrxTIaltcxT9R$oY<4}?de z@k@Yy$d>KBUt45l84B<^-r7mE{6fWb!EAJoaWqn51%a>o6{cANiR!iO2uluB_|&_X z)`4Y8#7M9oPaW%MAoZ-5nXFGarTttc4G%Ow^MxCJ1)@Cff`RF)?DU9ie$QWF zHzc#VqW~;y_*2+!CTX`9ebySgo17-;uGFId2GF}bn|oWw=)bDt%~ZU^X%6VQ7J#*S ze{D_kh#27XKb#vnk8-g@Na6N~K_HCeY(nCX*lvYNHzT>uA+5!Gs{#qjY`&0U1fd7a zr0p0X)Q%La{wyT7YM969b$n0|p448VI+xt55q#ECKimPK4Md!s(gu zB;-_#xckGOIP+b2h|Lx0v_71EV}_w%gfaXLEc|KxHeQFA%eO?H%3tr9B7A&My9@|8 zXNbUk6Y+*R|2F(DfwVdo?zcil6eJ4Z`r>z+ph`~ntCl<4rZk0|Za8OsiNgS~VgCWw zi5goR-v&UC-^WlfWW*D4spMi!>4b(Oa~bBv(LW37=HNader(|+;MWjtEFRkkbQe`T z>E{LE&e2*A(jmb9`pm_33{0Bp{ z%vvFwkcfcGYxr>)idGbvjKszJlt5^V^K#uv+3$y>&CZus&ty8<4?mawRO+jF2eRQd zkU;Nqm&qG_bfFMsZSlvf@eNsUkVMO1_PzM>8)&MCRw`VKC_4PuP!C`N(Xf)NAH%Eu zQE+Bx|H#mex0iX*Nh3ZZT^g=f(mhu?GBScqF0egc7aT@rO&y#9vx*vB$=_DHz+n(>9f?R-{Xf z&P4vmxaspC8<9j>v-j@wKo`8rrXhg@>kEUQuWw>vqP(obSd+qzX=G2QYb#aQ*aQQY zn7H_7z;C9aqGIk1%$7Jf;PsemK2dWrSa6c&-+^L&Wk))u( z`8s4A3Eg@}2GZk;G^x^MAkZL=k6FxLTFGx|Ex73@kn2^P(tDC%8u|nT!s_BO=zHv# zbikXX>I{_(U7H}~jUUi5G9n`(nJI!i+_nZp6h3+KWDGvWk&nvpSVl$c6YdX&v|O8z zkHFv~k&vqG;b3y|NX=1t`vxS(8_tO#4cJzsEs)1WzW3~l(Vqq!K%H!5wc$e6chZ`i zJOzkspNW4U4zbjamZ9n42>D1HlEa{o_QTddA;Af&h#_L@DgrqVfbd)`CT$uoz-Eba zZ!(E9C#HM*How~NGteu~mOY7p`&(cJkx8Ia&vgFVY9VFq-`LuMWxUTbwvYnME8`ZA zEMDhIlPWY2MAQ@_y3{;{EcYWV0|R!c%9NNmP{ln_{}=EP4GkBO6r660moa zQw|~Z#Y`e1U;sC&I8y_UxU&6G#;jXm;0yTJhoP5mI5>d%5-Mq2u4DPL+JwB#u5XN- zOu%{X05ednf_voKJhH_LMNCPF(vXD5d2zhKF&#jp(=8XOjI@AP*Xgv_in>EN{VCu* zx&ROh=!5Xb?aNfjtgTmnvzH1z%XC<}fN#!$zvRK-MW8OoY-8l3!m&s5Tf-PKOT=Ya ztSAPjE;4Gm$-U^V251RVY1C&;2?>Cj=;Wj}abDmi`R`kM{*XPJpi$viuL4 zfZ!;Qn4h1Y@}D=sxOSkI1nX(s_Rm3pHnD-@>GS6bII^3*CJI*$ur$1`P+B@#@a2l^ z2VSw+2{P=SZDvoi=tJUB4? zFqNumxD!*XsQ({B=%9Ye)R~C1*=KYWNRbUp{=f#SXlOR_Hwx+=!8en!z@0H5z2Qxz zS#xM88VIl}1b%J5H}3`gKHmrYNH@9ERhpVoaCUH8*<^?Z0F(R<@r|_v<<3!`-=I>*WX{1*U4zCK0jjTPZHad z4Hp2^3@sUV(t0CwdD@S9)8pw>P3l}$zV}2HDf{nF=oTsL03m3R5i$46L9~G6qf#%Z z!b5hv0B9NNqCB@_#j3Z~f+ovWgVAwTIYIvQ6;K{-c69<&)LURjbk3jmc-zM6se`C8 z58ttE>`H4aPVrfjahnfIN#BvCeI8Gf*xJD8?UQe{gPCbpX9INPhuZe0L)l!{9%6_r zhkvuZM37JelAn}fajfH-rVI68$y&Do%emU`jH%58a=NV!3X3_g6a^mgI0^_Z05a-- z2EO)+rV3Pmeu(ZoGfCThSN*R~%zqwSy%+v232YDkj~f~K0MR3Kkf{0kXspCJ0MsXN z%JBc6`v0x*|6**!=WH&n+wn|ISBRnK*crh#4SXWbn$e}(CSyo@@-i26D3~G*{RBAV zCZ-+5(Q`^^EmGl;S5r4FQwR^a2U&i<=E=WmHgTUY>9Q@sxOGz#UQLuA*_ z7~?s=uia*uuji-2f9;OZSdjSto#DL#TSn)nqz-=dGz+SlO;xJ)69d?o2g5xFo#pHW z6x>KZU+YOau$G}DeI5z?y5^havfr70dE<)$dM0*I3#mQ9tfI5Vi?Addn(69ymP4VU zhq8C9sDFo}iwT!gdjU>>{!|}v+@_j#b(|D_)<&_VX_zh9fm5@{!t8;l*SA~`jF1v@ zM>lef%&t5Oa+G*!IvSuZ*k(6(w+NOSI)A*l=`8=7?(QSsXBS9#bu=C8Z`oIPi|fdI zELGJifl0cTC8=v}8{GLZvEMzP9%EQ?JdwfQLbm?LzeiI=_yyXk{c!dIm&nPP^A^1) ze66JXq+uB#^mOimH25^>zid ztwp+~lhW@_YUABIPbeSgN0|RF|j7Ys4&ivk9ARo9&Pc+C(Ks8(7y(n9i zy3B9=yth+$E|a7hECAQje}#@BL3TIR=J=;KR5o^|-P61(<-UQrJhy=fA9A~bxJL~s z<|e(F*-eMP+P#dU;7_DdPDmsH-yhu&QnLDakID`?M%9knBv|k~dD&pF`i)FtXzP-9 zb}yscK3umD%Fnj5o0ySN&UB)spHtC28Y^|=7 zvplce<`(^brz?>SA{XP2fuF)|)6bq7KnJ6h6b?Z52W$&l{aRs4i5?~`&wbbB< z@-tcQ2o*%Lmc{3}Y9nKi#x0%3z{r})?>P2jG1FQlQ_ny{0$qrN_YEga5bm$6gy}}v zmPkl8{nIh0A`ueaPR5&`G9+UPU7hUZ3=s`7pK!P5@)kCuMMZer4u6|uVjnCq)0(tj zUIe?wzT914WNmn;G;P#(cUm}wcS)L4P>{NRSjwi4p$L!MH?7u6JQH+H*mZuocTraS z)8(4^fw$PZXs7DdR9zj9`f!|vW(=(7Kqp(+6A(TK-K%L;5%;AztD3(o;m%`-xbkg! zJsAjZL5dmDP;Cs$sosItsxXNHFNgM0HCDf0Sj7f{$0`Hq>6Nk?{CdzPGkD{xoG&eh z|LUJWua4nmFOsL67q$QOw(beLj=WJ(Q$8W(g7K%}Cmp6M6YbQ$8+!gOC>HOBz|4!81G5S-&L(?l0of4q% z8P2A!io&f^S5+Vywx#~Y$n>|#H6YOixRW5dm!)v&$LpzhiojLpZ=2kyWQWl|RmtX??8Fbw816up3N|=h-*l#;jP6%3 zItg5uyhjBAdZ>{ucqH!X+8U-exS)#T=s+6v_aDuNlf_nE9Y}Sh*-Xd#%zPoPE?fzq zHq_M;E#_Z3&DBIj_a*)F)0CA0TH0jREW@AMUCoeDuWMb;KIlDC)JvYA=d$bO;o@p= z$N4Y3sb!87#dbEWV|H&f_shN^4;?+dv0|%1HQU%SoC_618r`75Xm~b z`?*y09VkVjUZRzlM1UtD;JJU)(aBE~d3D@_>AtA1fL?-ZpLzyZFd4CYKY>6wOA~0) z&#h&WBy9yCQ-tN-TJ?;6D#~Z^MG=u_SHA7w`>)c^T#A6DgqbZ37liKc&wRcAc-0)Q zzNW_kMY{K%=DcsjKh#orqah(*ooDJQEfEa@-WQVqiL8>BCpVe)r zZ@3cbTG`;B;}f?ewycYx)!2g57TF(T!JgL@B$~}0k)#xYcDKR0CILJL2UyxkHQEr* z1vjm`XwdY2a!X55#}99JI7zgn0FJ5z`k$JLIjPDk3w@um$#M<(f4>(%J{42&xl~$h zRT)wQnw3lB)D`|L=WzN97lbTGpm(2=pUySFgoYn3@1|U~w6qh$6Neu3in75@tLGK3 zD;P)HuIH8HH+{iVF%_Eh(TV@~OPwtqc0DwE#L_(lN_Exyt~DQw29gO)jgQdhk(m^G z`i;}5?wl2b;@nzVKV{l%R9RAzKj5{|3yoO-&z$CQR}W?o7L}DRrRI%)qET~gw)Xhj z-Uf9igPit%E*3149X7dZaGV*TDOE*1`;X~0algxYc>4|2pOWIvr{MIPt189pMbYmQ zHkCB5jlr+gv7*GIl|l8LK%bPR6zkYiK>S*{ErB&R2ZR#7zLusd4IOKsuu7j@FlL0PvbC-n3Hk1ALR;@&Z3TF#Xk)gbf342(EU zuU#^|9V&NK6($&a_cu+?awr0>J&EjAx9i6%9@wEe?MrZWVnT`*C!K=cJw_S2beez+b}vX^dUe z_Egj0=|bqxRGV9-j_>^#cZgS~q1LXmTp1Zkk;jracFb5?gN8O~<7{+Fdatd0SRi21 zyOD+za*>{WRSXB5R$!BZi+fxi{{Y$Rq_Q@$ z<8l94{Qe%rF0t@>e&QPY4klINM7s)!i z|K;>3FuC%xvpdR~AQf#Ho9mmh;5ZQVjV?T77#Waylcpr&Ou3}6GpS3*gL%yKj?q4$ z0iaH3j*rGSU+orLlus6ahz`n-sVMx+v3-UWgyZeSA->FQ2h=t%Phf@W(gDt@=nQCr zP2jLyG{z*ITFE$5V)HR0w-#jmVo(ZjoqRKZS`)_h8iADI6cky&A0UHw+H0T+j$`gv zn)qKpLY@7p%D2IX0Na>>ZwUWIfT7dDP9V+gC5ii~?#oe)LC2mNgWlK99M9o`M!`Pb z_sIu^Yc67B>V3lQEI|Ox#kDf~l^5{KJ^^8T`gI8f#l@SZ#AQe`Bxx^a5=KX@`MgOp z41Rj)*MvHcijWn4NY~X1;AF|pO?+qXyx@Me&ngH#EJaOEDf7lh>kfbT0@%Zt|DL5S zGM0c1{VwGG(S}wrwJPb+Kq?DVDD-gL#2Q;n2t3oQ?aQO4U-j*9V2$3LpR^!S`12Pe zrY;ti@!&aCoS<;s-SoD;*EpxxZy~ zX!n(FW4L}xs_u5_f``$|=iQxKi)g4C1p)`D_GIf%)yENvK~Dl}PZXskN?{O$*X*Yb z$;Aw4w@MZgyO6vk>me7lexlJVs6;+)X|y(6z#Au|w+uilRAJX+W1yvmnP+}(IOYGm zEYx$xIK2>o@Jkn+d`KBYm?$^4`0Io(C@b**&lP?drk9d^)ZtJ2;ziVqR0~4NV1+tG5dFPk6M{vN7{s31+A|KXFP5e|X+)v`8Q z-LXHQ-?G0fiyB(2XG}dRVnGLGlA-=&D60vgvU~lq`QdwiqfV?7ayDJwJc?3$TPDf52vJI>U)h4m1`|GD&Ntf=tN=>2#G z&0XoALA9G8!Z$Dd&nQ8lZ(Ag3=Wd$q4<2RRSZk#VJCO~Ah3hFgt++Yb)l51$YU~Ym zzx?&jlTG3qw2jFYFzp`bZ!ZR|GqKU_W=j+=+^tmvQXURsd(6BP%Jv+YCa@J3h`uML z3wqw~7G?Wdj4WpfKgYTpZYguzFnZ|H&Fd2yEmeM6X2EUX2w>9MO_uqSo0yiy8klGm z8!J=5$1wtWCo|7ID=YQu?&w$;Wb-SE@U<|>+*TrG-`qe(X1piM(cmfX7Oim`Al1^2 z?3t+UP$9$3VHf?l@`VmZST8Bj_jb;CA*9=D`qc0wcJh00{+Ilx>cOAzy8a=U?Ja+-F8}`0iRijF!`u7*T#@{NOoc=slqa@yoVK5ToU6n!mw_D%e~MGB zEMNOwo<@yA(t=khd%q%oU3}GdOOmghRxiC-`qMNtj5yq9^Tpc)hcg7K>+n06aCr2mwlM7zZ(zt!L%+(csOWk zfdHJX*TZ>a=BlS%sX23Y&>T7S&yNTsjcLZs$}X~kai-}?bE}+`NRXYqpI4B%&lq-? z`=JcLEq6IELmj0Y+s(tzZHWyvu-A}xtW0F0M}&Re4nzB!&5{qV>uOHEJDyZ9>Px4_ zgZ<2U^I~xmANHfZh((8f<(w^9`5#evqF@{oensAq#e7&)9hU^vzSr(_AEn(TN>lr( za3hE~INKR*WB9+(6fq^^z4R(C4r*hEGUF8ps zuSf3@l!JZi$30N`D1Qevq>5|xo%dZcOn@q#_x^IazXR3ZQ{Wdg;EaKVG4-UkjykYe zh;y?e_)l^eYKwhQlt$w2VQqZZTxEi;I9za;@GjupgIVdouyKJIVG!lva}13WAHuQ^ zHj`G*KzDu(WtY{gK$&G6Q?Tb|R#4G34(a(unrit~1wP~<&};6XD=1X>*Eu|v%q zJdLC?QHrR^i7@qBHt2`h`B?wcgUy{1*uYSe5A{kiON*6?U#HGXlAXqdd5^?@s%VWX zekD3y`Q9xqKx4Amd#Yt7Eb!gS8z^xeoMmSpM93amd$z8}$bn$YCfXTIaKProuN=!| z9lZqeztH;woTWBlv+4>`pRA=O^FKj(y|@x)vLemyeSjmgLb=T!&5T(+Z5wX_VRI`k z(SLL)39Q)Mx1R`16}2v}=i6Nhd)(voC{0;K*={zDOvnwH6_k@&|Ngnbv7)6LF)`_x z`p0o1EDu5006Wn7|NW6Rp?Hsl5?yp8Gx0ff_s>4N7>v>?(cWPUDcnFF}`2-Q=^TX zy1TvNd`%NX`BS?KAU=TXHj-&y@t#n_I)SgTl)@I)|Lz@%iLLE#sKLLF%tQUpcjpdK zHNJoEtd0VBJeyNuR#8#+RlTL3pkHo5+nB7GB2)GUZy4V7w+7a}rR^D7GA8I|vJPxq znQBK3ttof2+3Sx8H5+a_tWhY~nS-zoyKAgg)1c*dZ{<4$qG!5Q>2Tf#k30u-q;pNXZtobYndQcm?Bg z85pGpY673XY!tz*8XGi+RAyqS*cP=p#B5~n_&SUpbB9k=1~=~hW|BvE1v07;5RzhG zz~d`3Ot}!E>$iH{t9NEKhel)#T{`b>ws-M-UB^>H$BX$c04dIsu2=0AB4=n}) zmH90`KC049mSV$Xn}`9hrBKE2S4Q{>MJIy`D>0WI{locG~*_#m3^5>bzc6pN$^twbCe!N#WWavxb<`{MiLh zPgFHU&nxAj>MkW9&f;fza${q<3~gZN6RubAXB7tfh1yNF2?o&$9Y4KdG#m@0E_U5H zX;ZhZj0GE1GPxSYj6j#R3sV3)hRiZq|7C5*T`JN|qPm^oS<$crHZ|Fw+G|b{7rMdV5CUf+zQ!1=8_9?B(gDJAW!TCr-}2 zA+9tMx*GbsLoO(#Wq3PKWP0m(Q;3-QhlMDz$E*p=;@UTvO$o6I_zKIvwJ1z(M2?fV z6AeMS%vLfQ!uc0r?-fZjyGu|T1;764L8vB_ayDP0fvyp3;8 zh*7}()iTl5JZtd^L1ZY1YZyLB>UX+*hhP&G1XqqVq2}7cbzXd6tamZ0WEz(8{Rwd$ zxw?xDqy&$D&+dCTEl|^v!3QGq?aM-BDg3?QA;^ontCksycE63W(pXWS-I-Sf`oQSA zc}Y5%W8P@WbB9joRZA%NM)@>i$NS(^K5GkyeEQ~AlO`P4-?ySPw0G}33J5mzWOCHY z>b;%vEeSmgsMVPhv81IW@Tg>3mi!#Z2b95x!quahN*YuBo6y*v;)QWL+{?w#s16l(UTp^D5#w`0bgr)txwA!g`kG5=@OE?W;uVy$>{tHfj4S@{ z-kcOJVcWqdS|n81dvZL^>Z3EvaCP}$*6E@QW~LcUIr8_vl5&N+*+k8N=~PL#q|lT) zYTjS#h}QO&wz;gMAB7E=QUoXxmW9S?0^Q%-$+_96_rz_YhY`#y?6e z!uErR_rfg#^%LAy5d1PvUX%}u*HetwgGKqK4wPy$Qd$s>uYNJW)q4^yKpNqMI?bq}#XCI}Sf4u987tS2^y!jvv$8*KzK~ktA z0H%d<BCIjiv*=&ZkG6 zPq|IXN-U8>_Zy9(hQcJ1)slv~Bx7mb_>2BlJ=ON1bXYGPH|OT{7s_iW1QXpeEN>=X zj=sOk6d8)ak&9n(&3uueckHBiF;=L+L>%^g6$9jiAkgJE9{>JKIi#;?&~BNa{)HPB zECU+Q=IN8NXj92^l39CEH{ifw$On{{9K)QclNfctW3tHaDFqvljSg?})&TUTZp$eX zqE50%I}7R&opU5C7!5F?k-D0l>7m4AdL4Uww^J&Hwb$6-Vpi@cv`iV__bVZpo>ek) z3s5y&UN?qu3-_P33!lx?vsfma%<7SJVp@py<$NcF!15XL z;Cv9Vv>4($mnyKes7b)-u_Y^WkQK4Cn3`CN7mjK+%+GJm){y+7@vN@`+kcZ3jsL%= zQzv5lZSB19P2?l8va-M?0)hJbYx5)1qbfkT)?*jV4Wa}S<>tw9eTFWr z>H~o4D9dYh@b&^q06LgG92BaU4kP1hmtag=vurh6BdMg^Vnym3n}Q-#+?Oq7s86oh z^wslv#oF!`5OTnY$&bTE>B)sjBrkVtcdmT-fgmEMMWOP-$X4ru{CNchrQhDOk-r zd}O$?`M(f6Vq)s@1BJb4Q7Ceb0SXS{Rg_cNt zrg{U!W}!|=h4*D{uLS!0R3%Hx=kZZG?1Dh%a~(vXj&AKi)3w*uGTr9xf(IFP7|m{t zb>-beB7wB+IBC6tvc+i_E(QaZ^96cDE*ELEK}EYNMV*W~c7=as`vU*3@FqWA@=(;( zFo1JIcrX)7s}p?C5j(vpo||)aoPAX zV3E(A#X%(qT Ii4R}?8>8v{%m4rY literal 45385 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 Cz#jYn diff --git a/doc/en/settings-dialog-emoticons.png b/doc/en/settings-dialog-emoticons.png index 6254be6b202bea8d2fce7f897b5c7436c788c0bf..77c8cef496596e8f0efec903afafe0fd7a47a493 100644 GIT binary patch literal 75684 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 z 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 A=l}o! literal 38449 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 S&RlxV00f?{elF{r5}E+R2*tzz diff --git a/doc/en/sidebarbutton.png b/doc/en/sidebarbutton.png deleted file mode 100644 index 5ef0b4a155b04f6b1100a1b750457c94a696ee81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727 zcmV;|0x127P)P000>X0ssI2ON$aT00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-al911fXGz!x`0007ZNklC99Xcz-yU@WW!5r{ys!|{lK0OYze=t(sWbj$euDB4W^=L_|PZ=3it}tUbM$IMgwzcgkO{o;z^na6bSMhzK(?3$uub4&?1} zHm#$ijQ?isK%o-~j(dV-%Rtfs#2hh+d2I*+BR0F0r4{_-daaEi2izLfTAJFlcn;j8+URo5GFiW6}2z$h@}xDVle z25QQyj8|tCCp+|4Ybyc(^wbySRaAW%7y?cKL#jTlyvo|;51Y=fW?Jp7*iwY{zT0$u z33Df)B-D9!!YNJwd0-v*2&_BqO}Mp#-dSKK#bOd;tcWlPGZTw&`rjqFSM>_26%^pO zw^jWvst9wxf|8F~gtfZ%d+NbAGDMch5E&aeme>$kS~8E8yc+<{JHj1 diff --git a/doc/en/startupscreen.png b/doc/en/startupscreen.png index 68690dec68fc82b9e5c8524adddc150b8fad39a1..fc38cd8395037fe6eafdd9bd576ea74f4bc2a9ba 100644 GIT binary patch literal 53443 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 })T*MpKx2o!WG0ky42+ZMxu?AlP8xB4tcWO!mJf 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 literal 35852 zcmaI7WmFwav@Hq*hv4oSoZ#;6?oM!bx8UyX79hB6++BhNcL)x_f;-&iJLCR%_T{X!1F?8v|iqUfsueoiwUcFuAX*zcoGhEy}z$Id(SA> zrkSlY>>2b9|M~Mfx=#B07G(lhx{!z^+*sEbC245LURc7Np0%^pJ+_DlL}73sSRmK( zGTS|^rnZKIBoB|9$KmtH47XGoy=+5WEPw6c%3%%&#LLUdYq5F#IB{C#{N~mJMY^mH zQYT52qCgu%iK)#fE}%V1GgIm4l29{zlh>w2ixeZnO)61*iKnj4C^@3pUS7gVEg=Ku zCy~ID$ zLsUTUM5qMW?R4w;YZ2Xsjv$+h5-oBs87tl~;dl49K}%I zEY9sHT5APeS`x_hk2%Ubk=>17XV@M?opMo+#WV+4sB>ch^{+U>zNRae-IVocUAX&>hYA{r5F>N`K&yFT`NX<|760-)fYbl#Txrc z@(30;@iDDy@q-J%^G&Y*Ih+YCHgq%}QYeb+YW@BDjHgc@J*?XM>-%2*Y%Jm)lAG<6TBUA2Q7xR;S*_4^v(dHS`ssEHAKF10NgFkziCs5|t`{&`kuwQO=$ym?DKQ%2gxK6BN+dlAXVG&*ts{mM$nrNF?e^LY;j~ptwRt0<7(Q09A_+{@8Ty)}=4W5{=RezL!Z7`GJk4(|tP%XN zUswrEh1DHyuHCuei5_M`2eolBR+%-GQbDdrsQfu)>!xH5 z-1G1?*2radJokIW@z1A`*e85Cj_ae`rGLLcmE3OTL`(0kP)m&GUx^MU=pg=-^wjnq zkMC;ysd_|z*y`~UavAYu;p1q&usXQi&$hHaDe~20yf#-L8PH`i3h)?LXxMO3R+E40 zphz;o!!(mKfB5137bfn)Xz7@^CeE4upm*v0X@l7Df`JMNB`y*)ML;Gfs!bHEM?J7P z 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

VFEn?Ee*t|74Xv2?7b%f6FtFi2m`D|IR$Y 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 E0n{zhLI3~& diff --git a/doc/en/styles-fresh.png b/doc/en/styles-fresh.png index 16df4f07bada09b4b95afaa689d7b45d1ba8a808..170b7a73b19f6359318402bb0bfbe10abefe7e12 100644 GIT binary patch literal 18193 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 z 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 diff --git a/kmess.lsm b/kmess.lsm index 5c53275..17254e1 100644 --- a/kmess.lsm +++ b/kmess.lsm @@ -1,6 +1,6 @@ Begin4 Title: KMess -Version: 2.0alpha2 +Version: 2.0beta1 Entered-date: 2005-05-05 Description: A MSN Messenger / Windows Live Messenger client for KDE Keywords: KDE X11 desktop MSN Messenger diff --git a/kmess.spec b/kmess.spec index f870c02..0e1e7b0 100644 --- a/kmess.spec +++ b/kmess.spec @@ -13,8 +13,8 @@ # PACKAGE SETTINGS # -%define kmess_version 2.0alpha2 -%define kmess_tar_version 2.0alpha2 +%define kmess_version 2.0beta1 +%define kmess_tar_version 2.0beta1 %define rpm_release 1 %define with_debug 0 %define doc_files AUTHORS COPYING FEATURES INSTALL NEWS README TODO @@ -294,9 +294,9 @@ mkdir "${RPM_BUILD_ROOT}" # required by some distro's, slackware for always bui %{name}: MSN Messenger in Windows or Mac OS. The strength of KMess is it's %{name}: integration with the KDE desktop environment, focus on MSN Messenger %{name}: specific features and an easy-to-use interface. -%{name}: +%{name}: %{name}: Package Created By: KMess development team -%{name}: +%{name}: END %endif ##' fix syntax for vim diff --git a/po/ar.po b/po/ar.po index 39375cf..003dac5 100644 --- a/po/ar.po +++ b/po/ar.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: KMess\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2007-07-06 22:23+0300\n" "Last-Translator: عبدالعزيز الشريف \n" "Language-Team: Arabeyes \n" @@ -19,82 +19,186 @@ msgstr "" "X-Poedit-Language: Arabic\n" "X-Poedit-SourceCharset: utf-8\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 #, fuzzy +msgid "Standard text mode" +msgstr "صور تعابير الوجه الكرتونية" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "اظهر الوقت في رسائل الدردشة" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "صور تعابير الوجه الكرتونية" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "صور تعابير الوجه الكرتونية" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "غمزة" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +#, fuzzy msgid "Ne&w Line" msgstr "سطر جديد" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 #, fuzzy msgid "S&end" msgstr "ارس&ل" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "جهات الاتصال" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&دردشة" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "اظهر/اخفي شريط &جهات الاتصال الجانبي" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "امحو لسان" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "غيير &لون الخط" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "اعد تس&مية مجموعة" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 #, fuzzy msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "ادخل البريد الالكتروني للشخص الذي تود اضافته:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Email address" -msgstr "عنوان البريد الإلكتروني:" +msgid "Email address:" +msgstr "عنوان البريد الإلكتروني: " -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 #, fuzzy -msgid "Initial group" -msgstr "اعد تس&مية مجموعة" +msgid "Enter a shortcut for the emoticon:" +msgstr "ادخل اسم جديد لهذه المجموعة:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -102,355 +206,579 @@ msgstr "" "ادخل الرسالة التي سترسل تلقائياً\n" "الى الأشخاص الذين يحاولون مراسلتك:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 #, fuzzy -msgid "&Automatic away message" +msgid "&Specify an automatic away message:" msgstr "حدّد رسالة الخروج" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "ا&بحث عن جهة اتصال" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "حفظ الدردشة" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "to" +msgstr "تلقائي" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "ابدأ أو أوقف &المحادثة" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" msgstr "اضفه الى قائمة \"الأصدقاء\"" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "&لا تضف جهة الاتصال, ولكن دعه يراني في حالة الاتصال" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "امنعه من الاتصال بي او معرفة حالتي." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "خصائص جهة الاتصال لـ %1" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +#, fuzzy msgid "&Information" +msgstr "اظهر معلومات البريد الإلكتروني" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 #, fuzzy -msgid "Restore" +msgid "&Restore" msgstr "محذوف" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Use alternative name for this person" +msgid "&Groups:" +msgstr "المجموعة" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" msgstr "استخدم اسم بديل لهذا الشخص" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 #, fuzzy -msgid "Show a popup when the contact goes online/offline" +msgid "Show a &popup when the contact goes online/offline" msgstr "اظهر فقاعة منبثقة عندما يكون هذا الشخص متصل أو غير متصل" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "الصوت:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "صورة العرض" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 #, fuzzy msgid "&Clear Cache" msgstr "امحو لسان" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 #, fuzzy -msgid "Notes" +msgid "&Notes" msgstr "ملاحظة" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "تعابير الوجه" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +#, fuzzy +msgid "Remo&ve" +msgstr "محذوف" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "ا&سمح جهة اتصال" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "جهة الاتصال هذه ليست في قائمتك" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "جهات الاتصال" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "جاري الاتصال بـ %1, منفذ %2" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +#, fuzzy +msgid "Format" +msgstr "عنزة" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "جهات الاتصال" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +#, fuzzy +msgid "Select All" +msgstr "حدد &الكلّ" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +#, fuzzy +msgid "Deselect All" +msgstr "حدد &الكلّ" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "حيران" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "نافذة الشبكة" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +#, fuzzy msgid "Command to Current Tab" -msgstr "" +msgstr "إغلق لسان" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "النوع:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 #, fuzzy msgid "Standard" msgstr "نجمة" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "ارس&ل" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "عنوان البريد الإلكتروني: " +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "&تنظيف" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "حيران" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "ادخل البريد الالكتروني للشخص الذي تود اضافته:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "كلمة السر:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -#, fuzzy -msgid " Account options " -msgstr "تعيي&نات الحساب" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 #, fuzzy -msgid "Remem&ber this profile" +msgid "Remem&ber account" msgstr "تذكر هذا الحساب" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "كلمة السر:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "ا&تصل" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "إدخل رسالتك الشخصية هنا" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +#, fuzzy +msgid "New Account" +msgstr "ح&ساب جديد" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +#, fuzzy +msgid "https://accountservices.passport.net/reg.srf" +msgstr "اذهب إلى accountservices.passport.net" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "ا&تصل" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "إ&جراءات" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "عنزة" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "حساب" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr "تعيي&نات الحساب" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +msgid "Enter the name other contacts should see when you are online." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "اسمك المفضل:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +#, fuzzy msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" "ادخل عنوان البريد الإلكتروني لحسابك في MSN Passport. يمكنك تسجيل حساب جديد " "في http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "عنوان البريد الإلكتروني: " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 #, fuzzy msgid "" "Enter the password of your MSN Passport account. You can register a new " @@ -459,370 +787,660 @@ msgstr "" "ادخل عنوان البريد الإلكتروني لحسابك في MSN Passport. يمكنك تسجيل حساب جديد " "في http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "كلمة السر:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "كلمة السر:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "صورة العرض" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 #, fuzzy msgid "C&hange..." msgstr "&غيير..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 #, fuzzy msgid "Re&member the settings of this account" msgstr "تذكر التعيينات لهذا الحساب" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "تسجيل دخول بهذا الحساب تلقائياًً عند بدء التشغيل" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "سجل كلّ &الدردشات" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "طلب تحقق البريد الإلكتروني" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 #, fuzzy msgid "https://accountservices.passport.net/" msgstr "اذهب إلى accountservices.passport.net" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "اذهب إلى accountservices.passport.net" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "تسجيل حساب جديد" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "اذهب إلى register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "تغيير الحالة الى \"بالخارج-آلي\" عندما تصبح غير نشط" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "كن بالخارج بعد" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "دقائق" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 #, fuzzy msgid "Saved accounts:" msgstr "حسابات" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -#, fuzzy -msgid "Click" -msgstr "الساعة" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." +msgid "&Add Account..." msgstr "حساب" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "محذوف" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "خطأ مع إعلامات" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "حفظ الدردشة" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "احفظ &إلى ملف" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "احفظ الدردشة" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "سنة" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "احفظ جميع ملفات المحادثة في هذا الدليل الأب" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "احفظ جميع ملفات المحادثة في هذا الدليل الأب" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "اختر الدليل الذي تود حفظ سجلات الدردشة فيه" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "احفظ ملفات المحادثة في هذا الدليل الأب:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "تصميم الدردشة:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "تعيينات" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "انتظار قائمة الاتصال..." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "اظهر &تعبير وجوه" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "اظهر &تعبير وجوه" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "اظهر رسائل الخادم الواردة" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "جهات الاتصال" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Show notifications when your contacts:" -msgstr "اظهر تنبيه عندما تصبح جهة الاتصال غير متصلة" +msgid "Show s&econds" +msgstr "اظهر &تعبير وجوه" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +#, fuzzy +msgid "&Text" +msgstr "&انسخ نص" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "خط رسالتك:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 #, fuzzy -msgid "&Go online" -msgstr "غير متصل" +msgid "&Force messages from your contacts to use this font:" +msgstr "اجبر رسائل جهة الاتصال أن تستخدم هذا الخط:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "امحو لسان" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 #, fuzzy -msgid "S&end you a message" -msgstr "حدّد رسالة الخروج" +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "استخدم تأثيرات الخط في المحادثة, *عريض* و /مائل/ و _تحته خط_" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -#, fuzzy -msgid "Go o&ffline" -msgstr "غير متصل" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "عنوان البريد الإلكتروني:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "اظهر إعلام عندما يصل بريد في \"مجلدات أخرى\"" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -#, fuzzy -msgid "In other folders" -msgstr "في مجلد آخر" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "اخفاء المنبثقات بعد" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "ثواني" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "إشعارات" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "اظهر الجهات ال&غير متصلة" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -832,1129 +1450,1420 @@ msgid "" "window with the first nudge.

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" -msgstr "جهة الاتصال هذه ليست في قائمتك" +msgid "Display your own &display picture in the chat window" +msgstr "لا تظهر صورة ع&رض" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 #, fuzzy -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "تغيير الحالة الى \"بالخارج-آلي\" عندما تصبح غير نشط" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "كن بالخارج بعد" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "دقائق" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "سجل كلّ &الدردشات" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "اختر الدليل الذي تود حفظ سجلات الدردشة فيه" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "احفظ ملفات المحادثة في هذا الدليل الأب:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "سنة" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "شهر" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "يوم" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "احفظ جميع ملفات المحادثة في هذا الدليل الأب" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "تصميم الدردشة:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "تعيينات" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "اظهر &تعبير وجوه" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "اظهر الوقت في رسائل الدردشة" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 msgid "G&roup chats in the same window:" -msgstr "" +msgstr "قائمة جهات الاتصال لديك لديها مجموعات كثيرة جداً" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 #, fuzzy msgid "Always" msgstr "بالخارج" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 #, fuzzy msgid "For contacts in the same group" msgstr "قائمة جهات الاتصال لديك لديها مجموعات كثيرة جداً" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 #, fuzzy msgid "Never" msgstr "الخادم:" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 #, fuzzy -msgid "Your &message font:" -msgstr "خط رسالتك:" +msgid "Display Options" +msgstr "صورة العرض:" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "اجبر رسائل جهة الاتصال أن تستخدم هذا الخط:" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 #, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "استخدم تأثيرات الخط في المحادثة, *عريض* و /مائل/ و _تحته خط_" +msgid "Show contacts w&hich song I am listening to" +msgstr "جهة الاتصال هذه ليست في قائمتك" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "انتظار قائمة الاتصال..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 #, fuzzy msgid "&Emoticon Themes" msgstr "تعابير الوجه" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 #, fuzzy msgid "Available emoticon styles:" msgstr "تصميم تعبير الوجه:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 #, fuzzy msgid "&Custom Emoticons" msgstr "صور تعابير الوجه الكرتونية" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 #, fuzzy msgid "Custom emoticons for this account:" msgstr "تذكر التعيينات لهذا الحساب" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "حساب" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 #, fuzzy msgid "Re&name" msgstr "الاسم" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -#, fuzzy -msgid "Remo&ve" -msgstr "محذوف" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 #, fuzzy msgid "Web Browser" msgstr "&استعراض..." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 #, fuzzy msgid "&Use the KDE default browser" msgstr "&استخدم الصورة الافتراضية" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 +#, fuzzy msgid "&Use an installed browser:" -msgstr "" +msgstr "&استخدم الصورة الافتراضية" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "حدّد رسالة الخروج" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "زبون البريد" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 #, fuzzy -msgid "&Use the KDE default email client" +msgid "Use the &KDE default email client" msgstr "&استخدم الصورة الافتراضية" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +#, fuzzy +msgid "Use an &installed email client:" +msgstr "&استخدم الصورة الافتراضية" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "تم نقل الملف." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "احفظ ملفات المحادثة في هذا الدليل الأب:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 msgid "and" msgstr "و" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "تم نقل الملف." -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "اسمك" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "اسمك" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "أنا بعيد عن حاسوبي" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "اسمك" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "you@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "احذ&ف جهة اتصال" + +#: accountsmanager.cpp:404 +#, fuzzy +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "نعسان" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "لا يمكنك بدء هذه الدعوة بسبب وجود جهات اتصال متعددة في الدردشة." -#: chat/chat.cpp:158 +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "%1 انضم للدردشة." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "%1 غادر الدردشة." -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "%1 غادر الدردشة." -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr "%1 و %2 - دردشة" -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr " et al." -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr " (هذه الرسالة أرسلت تلقائياً)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" + +#: chat/chat.cpp:941 #, fuzzy -msgid "You received a wink from %1." +msgid "You have sent a wink" msgstr "لديك غمزة من %1" -#: chat/chat.cpp:971 +#: chat/chat.cpp:966 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "الغمزة لا يمكن عرضها. تأكد من تركيب'cabextract'" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 متصل الآن" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "ارسل لك وكزة!" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "ارسل لك وكزة!" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "ارسل لك وكزة!" + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the
account configuration." msgstr "الغمزة لا يمكن عرضها. البيانات لا يمكن قرائتها" -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1220 #, fuzzy -msgid "You have received a wink from %1" -msgstr "لديك غمزة من %1" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "الغمزة لا يمكن عرضها. تأكد من تركيب'cabextract'" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1230 #, fuzzy -msgid "You received a nudge from %1!" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "الغمزة لا يمكن عرضها. تأكد من تركيب'cabextract'" + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "الغمزة لا يمكن عرضها. البيانات لا يمكن قرائتها" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "ارسل لك غمزة!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 انضم للدردشة." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 انضم للدردشة." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "ارسل لك وكزة!" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "ا&سمح جهة اتصال" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." msgstr "لديك وكزة من %1!" -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1381 #, fuzzy -msgid "The message '%1' could not be sent." +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "لديك غمزة من %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 انضم للدردشة." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "ارسل لك وكزة!" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "الرسالة \"%1\" لم يتم استلامها" -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "ارسلت وكزة إلى %1!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "ارسلت وكزة!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 قد أرسل غمزة: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 يقول:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "يتم تشغيل المحادثة الصوتية. يستمع على %1." + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&دعوة" +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "اتصل" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 +#, fuzzy msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "لا يمكن حفظ سجل الدردشة. تأكد أن لديك الأذون للكتابة في مجلد السجلات." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 +#, fuzzy msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" "المف '%1' موجود مسبقاً.\n" "هل تريد الكتابة فوقه?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "كتابة فوق الملف" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "كت&ابة فوق الملف" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 #, fuzzy msgid "Add this &Emoticon..." msgstr "اظهر &تعبير وجوه" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "اظهر &تعبير وجوه" + +#: chat/chatview.cpp:833 #, fuzzy msgid "Send &Email" msgstr "ا&رسل بريد إلكتروني" -#: chat/chatview.cpp:1286 +#: chat/chatview.cpp:837 #, fuzzy -msgid "Copy E&mail" -msgstr "البريد الإلكتروني" +msgid "Add &Contact" +msgstr "ا&ضف جهة اتصال" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "عنوان البريد الإلكتروني:" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +#, fuzzy +msgid "&Copy Text" msgstr "&انسخ نص" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "حدد &الكلّ" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "Save chat to &File" +msgid "C&lear Chat" +msgstr "امحو لسان" + +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "احفظ &إلى ملف" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&دردشة" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "جهات الاتصال" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "تعابير الوجه" + +#: chat/chatwindow.cpp:121 +#, fuzzy +msgid "My Emoticons" +msgstr "تعابير الوجه" + +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." +msgstr "" + +#: chat/chatwindow.cpp:331 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "إغلق لسان" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "إغلق لسان" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "إغلق لسان" + +#: chat/chatwindow.cpp:409 +#, fuzzy +msgid "&Invite..." +msgstr "&دعوة" + +#: chat/chatwindow.cpp:410 +#, fuzzy +msgid "Send a &File..." msgstr "ارسل &ملف" -#: chat/chatwindow.cpp:493 +#: chat/chatwindow.cpp:411 +#, fuzzy +msgid "Webcam Chat" +msgstr "احفظ الدردشة" + +#: chat/chatwindow.cpp:412 msgid "Start a &Meeting" msgstr "ابدأ &اللقاء" -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:413 msgid "Send a &Nudge!" msgstr "ارسل &وكزة" -#: chat/chatwindow.cpp:495 -msgid "Save chat" +#: chat/chatwindow.cpp:414 +#, fuzzy +msgid "Save Chat..." msgstr "احفظ الدردشة" -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "تعابير الوجه" - -#: chat/chatwindow.cpp:498 +#: chat/chatwindow.cpp:415 #, fuzzy msgid "Close &All Tabs" msgstr "إغلق لسان" -#: chat/chatwindow.cpp:504 +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "غيير &الخط" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "غيير &لون الخط" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "اظهر &تعبير وجوه" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "اظهر الوقت في رسائل الدردشة" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 #, fuzzy msgid "Meeting" msgstr "تعيينات" -#: chat/chatwindow.cpp:505 +#: chat/chatwindow.cpp:443 msgid "Nudge" msgstr "" -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "ابدأ أو أوقف &المحادثة" +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "ارسل &ملف" -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "غيير &الخط" +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "غيير &لون الخط" +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" -#: chat/chatwindow.cpp:576 +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "انتظار قائمة الاتصال..." + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "جهات الاتصال" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "انتظار قائمة الاتصال..." + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "تعابير الوجه" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "انتظار قائمة الاتصال..." + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "تعابير الوجه" + +#: chat/chatwindow.cpp:491 #, fuzzy msgid "&Font" msgstr "ا&تصل" -#: chat/chatwindow.cpp:577 +#: chat/chatwindow.cpp:492 #, fuzzy msgid "Font &Color" msgstr "غيير &لون الخط" -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 -msgid "Emoticons" -msgstr "تعابير الوجه" - -#: chat/chatwindow.cpp:658 +#: chat/chatwindow.cpp:493 #, fuzzy -msgid "My emoticons" -msgstr "تعابير الوجه" +msgid "C&lear Chat Window" +msgstr "امحو لسان" -#: chat/chatwindow.cpp:738 +#: chat/chatwindow.cpp:561 #, fuzzy -msgid "&Settings" -msgstr "تعيينات" +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "ابدأ أو أوقف &المحادثة" -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "اظهر &تعبير وجوه" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "اظهر/اخفي شريط &جهات الاتصال الجانبي" - -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "اظهر/اخفي شريط &جهات الاتصال الجانبي" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "اظهر او اخفي شريط جهات الاتصال الجانبي" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" msgstr "" -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "إغلق لسان" - -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "إغلق لسان" - -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "اظهر/اخفي شريط &جهات الاتصال الجانبي" - -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "اظهر او اخفي شريط جهات الاتصال الجانبي" - -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 يكتب." - -#: chat/chatwindow.cpp:1575 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1 و %2 - دردشة" - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." msgstr "" -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "دردشة" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - دردشة" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr "%1 يكتب." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr "%1 و %2 - دردشة" + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr "%1 و %2 - دردشة" + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "ابدأ &اللقاء" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" msgstr "ا&رسل بريد إلكتروني" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 #, fuzzy msgid "&View Profile" msgstr "اظهر المعلومات الخا&صة" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "ا&ضف جهة اتصال" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "ا&سمح جهة اتصال" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "احذ&ف جهة اتصال" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "اح&ظر جهة اتصال" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "ال&غي حظر جهة اتصال" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 #, fuzzy msgid "&Friendly Name" msgstr "اسمك المفضل:" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 #, fuzzy msgid "&Email Address" msgstr "عنوان البريد الإلكتروني:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "" +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" +msgstr "&انسخ نص" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "محظور" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "جهة الاتصال هذه متصلة" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "اضف جهة اتصال" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "ادرج تعبير وجه" +msgid "Add New" +msgstr "حساب" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 #, fuzzy msgid "Remove" msgstr "محذوف" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 #, fuzzy msgid "Web Messenger" msgstr "تصميم ويب" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "تصميم ويب" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 #, fuzzy msgid "Windows Live Messenger %1" msgstr "تصميم ويب" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "تصميم ويب" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "متصل" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "غير متصل" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "مسموح" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "محذوف" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 ميجا بايت" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 ميجا بايت" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "بالخارج" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "سأعود حالاً" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "مشغول" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "مخفي" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "بالخارج" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "بعيداً مع رد تلقائي" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "سأعود حالاً" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "على الهاتف" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "بالخارج للغداء" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "مخفي" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "غير متصل" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&حالتي" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "ا&قطع الاتصال" + +#: dialogs/addcontactdialog.cpp:49 #, fuzzy msgid "Add a Contact" msgstr "اضف جهة اتصال" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "احذف مجموعة" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 #, fuzzy msgid "Add New Emoticon" msgstr "اظهر &تعبير وجوه" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "تعابير الوجه" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 #, fuzzy -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "" "المف '%1' موجود مسبقاً.\n" "هل تريد الكتابة فوقه?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "حدّد رسالة الخروج" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "تصميم الدردشة:" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "نقل%1 فشل. لا يمكن فتح منفذ محلي." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "قد أضافك لقائمته , هل تريد:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "خصائص جهة الاتصال لـ %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "متصل" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 #, fuzzy msgid "Not seen yet" msgstr "قد أرسل لك" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "اظهر الوقت في رسائل الدردشة" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 #, fuzzy +msgctxt "Contact props dialog info" msgid "Last seen: %1" msgstr "قد أرسل لك" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 #, fuzzy +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "قد أرسل لك" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "البريد الإلكتروني" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "عنوان البريد الإلكتروني: " -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "زبون البريد" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "هل أنت من متأكد من حذف هذا الحساب؟" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "جهات الاتصال" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "جهات الاتصال" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "خصائص جهة الاتصال لـ %1" + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "جاري الاتصال بـ %1, منفذ %2" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "" + +#: dialogs/listexportdialog.cpp:159 +#, fuzzy +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" +"المف '%1' موجود مسبقاً.\n" +"هل تريد الكتابة فوقه?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "انتظار قائمة الاتصال..." + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "احفظ لسان" + #: dialogs/networkwindow.cpp:79 #, fuzzy -msgid "S&ave tab" -msgstr "احفظ لسان" +msgid "C&lear Tab" +msgstr "امحو لسان" #: dialogs/networkwindow.cpp:80 #, fuzzy -msgid "C&lear tab" -msgstr "امحو لسان" +msgid "C&lose All Tabs" +msgstr "إغلق لسان" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 #, fuzzy msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "لاتوجد اتصالات حالياً. لا يمكن فتح نافذة الشبكة." -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 #, fuzzy msgid "" "Could not save the Network Window log. Make sure you have permission to " @@ -1962,86 +2871,101 @@ msgid "" msgstr "" "لا يمكن حفظ سجل نافذة الشبكة. تأكد أن لديك الأذون للكتابة في مجلد السجل " -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "لا يمكن إغلاق لسان الاتصال الرئيسي" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 #, fuzzy msgid "Cannot send commands to this kind of connection!" msgstr "لا يمكن إغلاق لسان الاتصال الرئيسي" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "الحاسوب" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 ميجا بايت" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 كيلو بايت" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 بايت" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 #, fuzzy -msgid "Cl&ean Up" -msgstr "&تنظيف" +msgid "&Use" +msgstr "حيران" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "احذ&ف جهة اتصال" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "صورة العرض" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "صورة العرض" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "هل أنت من متأكد من حذف هذا الحساب؟" + +#: emoticontheme.cpp:612 #, fuzzy msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " @@ -2049,975 +2973,1491 @@ msgid "" msgstr "" "لا يمكن حفظ سجل نافذة الشبكة. تأكد أن لديك الأذون للكتابة في مجلد السجل " -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "ابتسامة" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "غمزة" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "أخرس" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "ابتسامة كبيرة" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "حزين" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "يصرخ" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "غاضب" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "حيران" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "محرج" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "خائب الأمل" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "هائج" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "مريض" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "مفاجأة" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "حفلة" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "نعسان" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "مفكر" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "لا تخبر أحداً" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "بلاغ سري" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "متهكم" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "لا أعرف" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "سأعود حالاً" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "ملاك" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "ولد" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "قلب أحمر" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "" -#: emoticontheme.cpp:838 -msgid "Thumby up" -msgstr "" - -#: emoticontheme.cpp:839 -msgid "Dog face" -msgstr "وجه كلب" - -#: emoticontheme.cpp:840 -msgid "Sun" -msgstr "الشمس" - -#: emoticontheme.cpp:841 -msgid "Devil" -msgstr "الشيطان" - -#: emoticontheme.cpp:842 -msgid "Right hug" -msgstr "" - -#: emoticontheme.cpp:843 -msgid "Girl" -msgstr "فتاة" - -#: emoticontheme.cpp:844 -msgid "Broken heart" -msgstr "قلب محطم" - -#: emoticontheme.cpp:845 -msgid "Wilted rose" -msgstr "" - -#: emoticontheme.cpp:846 -msgid "Thumbs down" -msgstr "" - -#: emoticontheme.cpp:847 -msgid "Cat face" -msgstr "وجه قطة" - -#: emoticontheme.cpp:848 -msgid "Sleeping half-moon" -msgstr "" - -#: emoticontheme.cpp:849 -msgid "Red lips" -msgstr "" - -#: emoticontheme.cpp:850 -msgid "Clapping" -msgstr "تصفيق" - #: emoticontheme.cpp:851 -msgid "Crossed fingers" +msgid "Thumbs up" msgstr "" #: emoticontheme.cpp:852 -msgid "Auto" -msgstr "تلقائي" +msgid "Dog face" +msgstr "وجه كلب" #: emoticontheme.cpp:853 -msgid "Airplane" -msgstr "طائرة" +msgid "Sun" +msgstr "الشمس" #: emoticontheme.cpp:854 -msgid "Turtle" -msgstr "" +msgid "Devil" +msgstr "الشيطان" #: emoticontheme.cpp:855 -msgid "Snail" -msgstr "حلزون" - -#: emoticontheme.cpp:856 -msgid "Black sheep" +msgid "Right hug" msgstr "" +#: emoticontheme.cpp:856 +msgid "Girl" +msgstr "فتاة" + #: emoticontheme.cpp:857 -msgid "Goat" -msgstr "عنزة" +msgid "Broken heart" +msgstr "قلب محطم" #: emoticontheme.cpp:858 -msgid "Vampire bat" +msgid "Wilted rose" msgstr "" #: emoticontheme.cpp:859 -msgid "Pizza" -msgstr "بيتزا" - -#: emoticontheme.cpp:860 -msgid "Beer mug" +msgid "Thumbs down" msgstr "" +#: emoticontheme.cpp:860 +msgid "Cat face" +msgstr "وجه قطة" + #: emoticontheme.cpp:861 -msgid "Martini glass" +msgid "Sleeping half-moon" msgstr "" #: emoticontheme.cpp:862 -msgid "Coffee cup" -msgstr "كوب قهوة" +msgid "Red lips" +msgstr "" #: emoticontheme.cpp:863 -msgid "Birthday cake" -msgstr "كعكة الميلاد" +msgid "Clapping" +msgstr "تصفيق" #: emoticontheme.cpp:864 -msgid "Plate" -msgstr "طبق" +msgid "Crossed fingers" +msgstr "" #: emoticontheme.cpp:865 -msgid "Bowl" -msgstr "رمية" +msgid "Auto" +msgstr "تلقائي" #: emoticontheme.cpp:866 -msgid "Star" -msgstr "نجمة" +msgid "Airplane" +msgstr "طائرة" #: emoticontheme.cpp:867 -msgid "Rainbow" -msgstr "قوس قزح" +msgid "Turtle" +msgstr "" #: emoticontheme.cpp:868 -msgid "Stormy cloud" -msgstr "سحابة عاصفة" +msgid "Snail" +msgstr "حلزون" #: emoticontheme.cpp:869 -msgid "Lightning" -msgstr "البرق" +#, fuzzy +msgid "Sheep" +msgstr "نعسان" #: emoticontheme.cpp:870 -msgid "Umbrella" -msgstr "المظلّة" +msgid "Goat" +msgstr "عنزة" #: emoticontheme.cpp:871 -msgid "Island with a palm tree" +msgid "Vampire bat" msgstr "" #: emoticontheme.cpp:872 -msgid "Telephone receiver" -msgstr "مستلم الهاتف" +msgid "Pizza" +msgstr "بيتزا" #: emoticontheme.cpp:873 -msgid "Mobile Phone" -msgstr "هاتف نقال" - -#: emoticontheme.cpp:874 -msgid "Email" -msgstr "البريد الإلكتروني" - -#: emoticontheme.cpp:875 -msgid "Clock" -msgstr "الساعة" - -#: emoticontheme.cpp:876 -msgid "Camera" -msgstr "الكاميرا" - -#: emoticontheme.cpp:877 -msgid "Filmstrip" -msgstr "مقطع سينمائي" - -#: emoticontheme.cpp:878 -msgid "Note" -msgstr "ملاحظة" - -#: emoticontheme.cpp:879 -msgid "Handcuffs" -msgstr "الأصفاد" - -#: emoticontheme.cpp:880 -msgid "Money" -msgstr "المال" - -#: emoticontheme.cpp:881 -msgid "Light bulb" +msgid "Beer mug" msgstr "" +#: emoticontheme.cpp:874 +msgid "Martini glass" +msgstr "" + +#: emoticontheme.cpp:875 +msgid "Coffee cup" +msgstr "كوب قهوة" + +#: emoticontheme.cpp:876 +msgid "Birthday cake" +msgstr "كعكة الميلاد" + +#: emoticontheme.cpp:877 +msgid "Plate" +msgstr "طبق" + +#: emoticontheme.cpp:878 +msgid "Bowl" +msgstr "رمية" + +#: emoticontheme.cpp:879 +msgid "Star" +msgstr "نجمة" + +#: emoticontheme.cpp:880 +msgid "Rainbow" +msgstr "قوس قزح" + +#: emoticontheme.cpp:881 +msgid "Stormy cloud" +msgstr "سحابة عاصفة" + #: emoticontheme.cpp:882 -msgid "Cigarrette" -msgstr "سيجارة" +msgid "Lightning" +msgstr "البرق" #: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "كرة قدم" +msgid "Umbrella" +msgstr "المظلّة" #: emoticontheme.cpp:884 -msgid "Gift with a bow" +msgid "Island with a palm tree" msgstr "" #: emoticontheme.cpp:885 +msgid "Telephone receiver" +msgstr "مستلم الهاتف" + +#: emoticontheme.cpp:886 +msgid "Mobile Phone" +msgstr "هاتف نقال" + +#: emoticontheme.cpp:887 +msgid "Email" +msgstr "البريد الإلكتروني" + +#: emoticontheme.cpp:888 +msgid "Clock" +msgstr "الساعة" + +#: emoticontheme.cpp:889 +msgid "Camera" +msgstr "الكاميرا" + +#: emoticontheme.cpp:890 +msgid "Filmstrip" +msgstr "مقطع سينمائي" + +#: emoticontheme.cpp:891 +msgid "Note" +msgstr "ملاحظة" + +#: emoticontheme.cpp:892 +msgid "Handcuffs" +msgstr "الأصفاد" + +#: emoticontheme.cpp:893 +msgid "Money" +msgstr "المال" + +#: emoticontheme.cpp:894 +msgid "Light bulb" +msgstr "" + +#: emoticontheme.cpp:895 +#, fuzzy +msgid "Cigarette" +msgstr "سيجارة" + +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" + +#: emoticontheme.cpp:897 +msgid "Gift with a bow" +msgstr "" + +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "الحاسوب" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "KMess أيقونة" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "فشل الاتصال الى الخادم" + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "فشل الاتصال الى الخادم" -#: initialview.cpp:377 -msgid "Connect" -msgstr "اتصل" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "ا&قطع الاتصال" +msgctxt "Button label" +msgid "&Connect" +msgstr "ا&تصل" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: kmess.cpp:223 +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "عنوان البريد الإلكتروني:" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "اظهر معلومات البريد الإلكتروني" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "جهة الاتصال هذه موجودة في قائمتك" + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "مج&موعة جديدة" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "اضف مجموعة" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "ادخل اسم جديد لهذه المجموعة:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "هل تريد حذف %1 من قائمة الاتصال؟?" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" msgstr "احذف جهة اتصال" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" msgstr "محذوف ومحظور" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "هل تريد حذف مجموعة %1 من قائمة الاتصال؟?" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "محذوف" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "هذه مجموعة خاصة ولايمكن تغييرها" -#: kmess.cpp:671 -msgid "Rename group" -msgstr "أعد تسمية مجموعة" +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "اعد تس&مية مجموعة" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "ادخل اسم جديد لهذه المجموعة:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "فشل التوثيق" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "الاتصال جيد" + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "غير متصل" -#: kmess.cpp:1408 +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "" + +#: kmess.cpp:1475 #, fuzzy +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" "

KMess لن يتمكن من تشغيل الأصوات والاعلامات.

KMess ملف " "'eventsrc' لا يمكن إيجاده في أحد المجلدات التالية: %1

من فضلك تأكد من " "تركيبك, وانسخ الملف المفقود إلى إحدى المجلدات المدرجة .

" -#: kmess.cpp:1412 -msgid "Error with notifications" +#: kmess.cpp:1481 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "خطأ مع إعلامات" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "إ&جراءات" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "جهة ا&تصال جديدة" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "مج&موعة جديدة" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "ا&بحث عن جهة اتصال" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "ابح&ث بالاهتمامات" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "ا&بحث عن جهة اتصال" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "ح&ساب جديد" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "تعيي&نات الحساب" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "ات&صل" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "ا&قطع الاتصال" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "اظهر &معلوماتي" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&حالتي" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "بعيداً مع رد تلقائي" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "اظهر ج&هات الاتصال المسموحة" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "اظهر الجهات ال&غير متصلة" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "اظهر ج&هات الاتصال المحذوفة" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &History Box" +msgstr "تصميم الدردشة:" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "اظهر/اخفي شريط &جهات الاتصال الجانبي" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "اظهر &تعبير وجوه" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "صورة العرض" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "رت&ب جهات الاتصال حسب" + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "اظهر نا&فذة النقل" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "جهة ا&تصال جديدة" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "مج&موعة جديدة" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "ا&بحث عن جهة اتصال" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "ا&بحث عن جهة اتصال" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "ابح&ث بالاهتمامات" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "تصميم الدردشة:" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "ح&ساب جديد" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "ح&ساب جديد" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "ابتسامة" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "رت&ب جهات الاتصال حسب" - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "المجموعة" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "متصل/غير متصل" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "اظهر نا&فذة النقل" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "اظهر نا&فذة الشبكة" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "يستمع الآن إلى %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 #, fuzzy msgid "[%1] %2 goes online" msgstr " %1 غير متصل" -#: kmessview.cpp:363 +#: kmessview.cpp:357 #, fuzzy msgid "[%1] %2 goes offline" msgstr " %1 غير متصل" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "دردشة" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&خصائص" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" msgstr "اح&ذف من مجموعة" -#: kmessview.cpp:574 +#: kmessview.cpp:605 #, fuzzy -msgid "&Listening Music" -msgstr "ارسال ملف " +msgid "Song &Name" +msgstr "الا&سم" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "انسخ إلى مجمو&عة" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "انقل إلى مجمو&عة" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "حرّك المجموعة للأ&سفل" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "حرّك المجموعة للأ&على" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "اح&ذف مجموعة" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "اعد تس&مية مجموعة" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "البريد الإلكتروني" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "اضفه الى قائمة \"الأصدقاء\"" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "عنوان البريد الإلكتروني:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "زبون البريد" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 +#: kmessview.cpp:1156 #, fuzzy -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +msgid "No" +msgstr "ملاحظة" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "محظور" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "قد أرسل لك" -#: kmessview.cpp:1076 +#: kmessview.cpp:1194 #, fuzzy -msgctxt "Last time a message was received" -msgid "Last message: %1" +msgctxt "Contact last message label in list tooltip" +msgid "Last message" msgstr "قد أرسل لك" -#: kmessview.cpp:1085 +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "جهات الاتصال" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "جهة الاتصال هذه متصلة" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "جهة الاتصال هذه متصلة" +msgstr[1] "جهة الاتصال هذه متصلة" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "جهات الاتصال" +msgstr[1] "جهات الاتصال" + +#: kmessview.cpp:1631 #, fuzzy msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "إدخل رسالتك الشخصية هنا" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +#, fuzzy +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 ميجا بايت" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 ميجا بايت" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 msgid "Project support" msgstr "" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "مطور GnomeMeeting" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "ترجمة المانية , اختبار , توثيق وصفحة انترنت" -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "تصميم ويب" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "صور المشاعر العامة الصفراء/الزرقاء/البنفسجية و الترجمة الايطالية " -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "صور تعابير الوجه الكرتونية" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "الأصوات الافتراضية" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "الترجمة العربي و اصلاح حفظ ملف دولياً" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 #, fuzzy msgid "More Arabic translation" msgstr "ترجمة تركية اضافية" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "ترجمة برتغالية برازيلية" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "ترجمة برتغالية برازيلية" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 #, fuzzy msgid "Catalan translation" msgstr "ترجمة كاتالونية" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "ترجمة صينية مبسطة , اصلا خطأ ارسال ملف" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 #, fuzzy msgid "More Simplified Chinese translation" msgstr "ترجمة صينية مبسطة , اصلا خطأ ارسال ملف" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 #, fuzzy msgid "Traditional Chinese translation" msgstr "ترجمة صينية تقليدية" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "ترجمة صينية تقليدية" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 #, fuzzy msgid "Danish translation" msgstr "ترجمة دنماركية" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "More Danish translation" msgstr "ترجمة دانماركية اضافية" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "ترجمة ألمانية" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "ترجمة هولندية اضافية" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "ترجمة تركية اضافية" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "ترجمة فرنسية" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 #, fuzzy msgid "Estonian translation" msgstr "ترجمة إستونية" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 #, fuzzy msgid "Finnish translation" msgstr "ترجمة فلندية" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 #, fuzzy msgid "More Finnish translation" msgstr "ترجمة فلندية اضافية" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "ترجمة فرنسية" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 #, fuzzy msgid "More French translation, MSN6 emoticon definitions" msgstr "ترجمة فرنسية" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 #, fuzzy msgid "More French translation" msgstr "ترجمة فرنسية" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 #, fuzzy msgid "Hungarian translation" msgstr "ترجمة هنغارية" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "ترجمة هنغارية" + +#: main.cpp:115 main.cpp:116 #, fuzzy msgid "More Italian translation" msgstr "ترجمة كورية" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "ترجمة كورية" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 #, fuzzy msgid "Norsk Bokmål translation" msgstr "ترجمة Norsk Bokml" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "ترجمة سلوفينية" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "ترجمة سلوفينية" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "ترجمة سلوفينية" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "ترجمة اسبانية" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 #, fuzzy msgid "More Spanish translation" msgstr "المزيد من الترجمة الأسبانية" -#: main.cpp:123 -msgid "Swedish translation" -msgstr "ترجمة سويدية" - -#: main.cpp:125 -#, fuzzy -msgid "Thai translation" -msgstr "ترجمة تايلاندية" - #: main.cpp:126 -msgid "Turkish translation" -msgstr "ترجمة تركية" +msgid "Alejandro Araiza Alvarado" +msgstr "" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "ترجمة تركية اضافية" +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "ترجمة سويدية" + +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "تم نقل الملف." +msgid "More Swedish translation" +msgstr "ترجمة سويدية" -#: main.cpp:134 -msgid "P4-Context field support" +#: main.cpp:135 +msgid "Rachan Hongpairote" msgstr "" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "اصلاح Xinerama" +#, fuzzy +msgid "Thai translation" +msgstr "ترجمة تايلاندية" #: main.cpp:136 -msgid "Original file receive code" -msgstr "كود \"استقبال ملف\" الأصلي" +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "ترجمة تركية" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" msgstr "" +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "ترجمة تركية اضافية" + #: main.cpp:138 -msgid "KWallet support" +msgid "Uğur Çetin" msgstr "" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "متصل" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "تم نقل الملف." + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "اصلاح Xinerama" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "كود \"استقبال ملف\" الأصلي" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "تصميم الدردشة:" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "عدة اصلاحات دولية" -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "عدة اصلاحات دولية" -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "مطور GnomeMeeting" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "شخص بكيس فوق رأسه" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "شفرة متجانسة و محفزة" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 #, fuzzy msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "كود البالون المنبثق" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "شفرة مؤقت الخمود" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "Your name here?" msgstr "اسمك" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "اسمك" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "عنوان بريدك الالكتروني:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "دخول تلقائي باستخدام البريد الالكتروني المعطى" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "مسموح" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "محذوف" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "لقد قامت جهة الاتصال بإلغاء الجلسة." @@ -3035,62 +4475,113 @@ msgstr "لقد رفضت الدعوة." #: network/applications/application.cpp:540 #, fuzzy -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "هل تريد قبول أو إلغي?" #: network/applications/application.cpp:581 #, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "إنقر إلغي." -#: network/applications/filetransfer.cpp:134 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "هل تريد قبول الملف: %1 (%2 بايت)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"المف '%1' موجود مسبقاً.\n" +"هل تريد الكتابة فوقه?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "نقل %1 فشل. لا يمكن فتح الملف." -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "نقل %1 فشل. لا يمكن فتح الملف." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "النقل تم قبوله" -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "جاري الاتصال بـ %1, منفذ %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "النقل تم إلغائه" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "لقد قامت جهة الاتصال بإلغاء النقل." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "لقد ألغيت الجلسة." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "لقد ألغيت الجلسة." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "تأسيس الاتصال" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy +msgid "Successfully sent file "%1"." msgstr "ملف منقول بنجاح: %1" -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy +msgid "Successfully received file "%1"." +msgstr "ملف منقول بنجاح: %1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "نقل %1 فشل. الملف غير موجود مسبقاً." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "نقل %1 فشل. الملف لا يمكن قرائته." -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy +msgid "Sending file "%1" (%2)." msgstr "ارسال ملف %1" -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "لقد قامت جهة الاتصال بإلغاء النقل." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3102,72 +4593,14 @@ msgstr "" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "تم إلغاء دعوة نقل الملف. بيانات سيئة تم استقبالها." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"المف '%1' موجود مسبقاً.\n" -"هل تريد الكتابة فوقه?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "نقل %1 فشل. لا يمكن فتح الملف." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "لقد قامت جهة الاتصال بإلغاء النقل." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "لقد ألغيت الجلسة." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "ملف منقول بنجاح: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "ملف منقول بنجاح: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "نقل %1 فشل. الملف غير موجود مسبقاً." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "نقل %1 فشل. الملف لا يمكن قرائته." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "ارسال ملف %1" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "لقد قامت جهة الاتصال بإلغاء النقل." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "أنت مدعو لبدء لقاء (باستخدام GnomeMeeting)." @@ -3181,28 +4614,28 @@ msgstr "يتم تشغيل GnomeMeeting. الاتصال بـ %1." msgid "Inviting the contact to a meeting." msgstr "دعوة جهة الاتصال إلى لقاء" -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "الدعوة تم رفضها. ليست مدعومة من قبل الزبون الآخر." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "الدعوة تم إحباطها. حدوث خطأ داخلي." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "الدعوة تم إحباطها. مهلة الانتظار لقبول المستخدم." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "الدعوة تم إحباطها. مهلة الانتظار لبيانات الملف." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "الدعوة تم إحباطها." @@ -3215,103 +4648,103 @@ msgstr "أنت مدعو لمشاركة سطح المكتب لهذا الشخص." msgid "Starting KRDC. Connecting to %1." msgstr "يتم تشغيل KRDC. الاتصال بـ " -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "جهة الاتصال قامت برفض الدعوة. حدوث خطأ داخلي." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "النقل فشل" - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "الدعوة تم إلغائها. جهة الاتصال ارسلت بيانات سيئة, أو KMess لا يدعمها." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -#, fuzzy -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "النقل فشل. جهة الاتصال ارسلت بيانات سيئة, أو KMess لا يدعمها." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "النقل فشل. مهلة الانتظار لقبول المستخدم." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "النقل فشل. حدوث خطأ داخلي." - -#: network/applications/p2papplicationbase.cpp:1176 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "النقل فشل. لا يمكن فتح مصدر البيانات." - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "النقل فشل. تجهيز البيانات فشل." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "الدعوة تم إلغائها. الرسالة لم توجه إليهم." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 #, fuzzy msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "النقل فشل. جهة الاتصال ارسلت بيانات سيئة, أو KMess لا يدعمها." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "جهة الاتصال قامت برفض الدعوة. حدوث خطأ داخلي." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "انتظار الاتصال على %1, منفذ %2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 #, fuzzy msgid "Waiting for connection" msgstr "انتظار قائمة الاتصال..." -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "فشل لم أستطع انشاء مقبس" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "فشل لم أستطع انشاء مقبس" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "النقل فشل" + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +#, fuzzy +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "النقل فشل. جهة الاتصال ارسلت بيانات سيئة, أو KMess لا يدعمها." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "النقل فشل. مهلة الانتظار لقبول المستخدم." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "النقل فشل. حدوث خطأ داخلي." + +#: network/applications/p2papplicationbase.cpp:1350 +#, fuzzy +msgid "The transfer failed. Couldn't open data source." +msgstr "النقل فشل. لا يمكن فتح مصدر البيانات." + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "أنت مدعو للبدء بمحادثة صوتية." @@ -3346,648 +4779,849 @@ msgstr "يتم تشغيل المحادثة الصوتية. يستمع على %1 msgid "Inviting the contact to a voice conversation." msgstr "دعوة جهة الاتصال الى محادثة صوتية" -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 #, fuzzy msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "جهة الاتصال تدعوك لبدأ" -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "تم إلغاء دعوة نقل الملف. بيانات سيئة تم استقبالها." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:138 +#, fuzzy +msgid "You are invited to view this person's webcam." +msgstr "أنت مدعو لمشاركة سطح المكتب لهذا الشخص." + +#: network/applications/webcamtransferp2p.cpp:147 msgid "webcam" msgstr "كاميرا ويب" -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "نقل %1 تم إلغائه." - #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "ارسال ملف %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "نقل%1 فشل. لا يمكن فتح منفذ محلي." -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy msgid "Couldn't open a local port." msgstr "نقل%1 فشل. لا يمكن فتح منفذ محلي." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "ابدأ نقل الملفات" -#: network/extra/msnftpconnection.cpp:478 +#: network/extra/msnftpconnection.cpp:469 #, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +msgid "The transfer of %1 failed. A connection could not be made." msgstr "فشل الاتصال لم يتم" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 #, fuzzy msgid "Unable to make a connection." msgstr "عاجز عن تكوين اتصال: %1" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "استلام ملف %1" -#: network/msnconnection.cpp:589 -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"لقد أصبحت غير متصل لأنك \n" -"اتصل من برنامج msn messenger آخر \n" -"او من موقع آخر" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "حصلت المزامنة" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "التوثيق" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "انتظار قائمة الاتصال..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "التوثيق فشل, من فضلك تحقق من اسم الحساب وكلمة السر" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "جاري الاتصال..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess استقبل أمر مجهول من الخادم: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "البريد الإلكتروني الذي تحاول إضافته ليس حساب مراسل MSN" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" +#: network/msnconnection.cpp:404 +#, fuzzy +msgid "The given account name is invalid" msgstr "اسم الحساب المعطى غير سليم" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "قائمة جهات الاتصال لديك ممتلئة" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "جهة الاتصال هذه موجودة في قائمتك" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "جهة الاتصال هذه ليست في قائمتك" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "جهة الاتصال هذه متصلة" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "جهة الاتصال هذه ليست في قائمتك" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:444 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "قائمة جهات الاتصال لديك لديها مجموعات كثيرة جداً" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "هذه المجموعة لا يمكن تغييرها" -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "قائمة جهات الاتصال لديك لديها مجموعات كثيرة جداً" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "هذه المجموعة ليست فارغة" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "اسم المجموعة طويل جداً" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "هناك خطأ داخلي في KMess: %1" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "اعد تس&مية مجموعة" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 #, fuzzy msgid "Transfer to switchboard server failed" msgstr "تحويل لتنبيه الخادم" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "تذكر التعيينات لهذا الحساب" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "النقل فشل" -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 #, fuzzy msgid "You are opening chat sessions too fast" msgstr " قمت بفتح عدة جلسات بسرعة" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "لديك عدة جلسات مفتوحة" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 #, fuzzy msgid "Bad friend name" msgstr "اسم ودي سيئ:" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "فشل التوثيق" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "لا يمكنك بدأ محادثة مع شخص وأنت في حالة مخفي." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" msgstr "" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -#: network/msnnotificationconnection.cpp:2371 -msgid "Your passport account needs to be verified first." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." msgstr "" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "هناك خطأ داخلي في الخادم" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "خادم إعلام الند مغلق" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "الخادم سيتم إغلاقه" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "الخادم سيغلق قريباً" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "الكتابة محظورة" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "الجلسة ممتلئة" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "الخادم غير متوفر" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "فشل التوثيق" -#: network/msnnotificationconnection.cpp:2449 +#: network/msnconnection.cpp:642 #, fuzzy -msgid "Unknown error code received from the server: %1" +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "KMess استقبل أمر مجهول من الخادم: %1" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 #, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" msgstr "KMess - MSN خطأ" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "التوثيق" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "فشل التوثيق" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "جاري الاتصال..." + +#: network/msnnotificationconnection.cpp:1949 +#, fuzzy +msgid "Unknown command received from the server: %1" +msgstr "KMess استقبل أمر مجهول من الخادم: %1" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "دقائق" msgstr[1] "دقائق" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 #, fuzzy msgid "Server closes for maintenance in %1!" msgstr "تحذير: الخادم سيغلق للصيانة في غضون دقيقة!" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -msgid "KMess could not process Offline-IM messages.
Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "فشل التوثيق" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "انتظار قائمة الاتصال..." + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "هناك خطأ داخلي في KMess: %1" -#: network/msnnotificationconnection.cpp:3242 -msgctxt "Login error message, with more details for developer versions" -msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" -"

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2916 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: dialog box" +msgid "" +"

Authentication has failed, please verify your account email and password." +"

" +msgstr "التوثيق فشل, من فضلك تحقق من اسم الحساب وكلمة السر" + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2932 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"لقد أصبحت غير متصل لأنك \n" +"اتصل من برنامج msn messenger آخر \n" +"او من موقع آخر" + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2966 +#, fuzzy +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "إذا كان ممكن, خادم الوكيل سيستخدم في الاتصال بخدمة مراسل MSN." + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "الاتصال بالخادم قد فقد" -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "خطأ الخادم" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:681 +#, fuzzy +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "هناك خطأ داخلي في KMess: %1" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "انتهت مهلة الاتصال" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 #, fuzzy msgid "1 ping lost" msgstr "استلام القائمة" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 #, fuzzy msgid "%1 pings lost" msgstr "استلام القائمة" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." +#: network/msnsockettcp.cpp:395 +#, fuzzy +msgid "The connection to the server was lost" msgstr "الاتصال بالخادم قد فقد" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "هذا الشخص غير متصل او مخفي." - -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" - -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 +#: network/soap/addressbookservice.cpp:777 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "الرسالة \"%1\" لم يتم استلامها" +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "البريد الإلكتروني الذي تحاول إضافته ليس حساب مراسل MSN" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "عاجز عن تكوين اتصال: %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "" - -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "" - -#: notification/chatnotification.cpp:163 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/chatnotification.cpp:171 +#: network/soap/addressbookservice.cpp:787 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "البريد الإلكتروني الذي تحاول إضافته ليس حساب مراسل MSN" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "الخادم غير متوفر" + +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:521 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "الخادم غير متوفر" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" +msgstr "%1 متصل الآن" + +#: notification/chatnotification.cpp:158 +#, fuzzy +msgid "%1 says:
'%2'" +msgstr "%1 قام بالخروج" + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" msgstr "ارسل لك وكزة!" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" msgstr "" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" -msgstr "" +#: notification/chatnotification.cpp:174 +#, fuzzy +msgid "%1:
%2" +msgstr "%1 متصل الآن" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr "ارسل لك وكزة!" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr "ارسل لك وكزة!" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr "ارسل لك غمزة!" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 #, fuzzy msgid "%1 wants to use the webcam!" msgstr "%1 قام بالخروج" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr "%1 متصل الآن" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr "ارسل لك غمزة!" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "لقد ألغيت الجلسة." -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "لقد قامت جهة الاتصال بإلغاء النقل." -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 msgid "%1's activity has been canceled!" msgstr "" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "%1 قام بالخروج" -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "لقد قامت جهة الاتصال بإلغاء النقل." -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr "%1 قام بالخروج" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "لقد ألغيت الجلسة." -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "نقل %1 تم إلغائه." -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 msgid "%1's activity has ended!" msgstr "" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" msgstr "" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "نقل %1 تم إلغائه." -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 msgid "%1's activity has ended with an error!" msgstr "" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" +msgid "%1
is now online" msgstr "%1 متصل الآن" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" +msgid "%1
has gone away" +msgstr "%1 متصل الآن" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy +msgid "%1
will be right back" +msgstr "%1 متصل الآن" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy +msgid "%1
is now busy" +msgstr "%1 متصل الآن" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy +msgid "%1
has become invisible" +msgstr "%1 متصل الآن" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy +msgid "%1
has gone idle" +msgstr "%1 متصل الآن" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy +msgid "%1
has logged out" msgstr "%1 قام بالخروج" -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" -msgstr "" - -#: notification/contactstatusnotification.cpp:73 +#: notification/contactstatusnotification.cpp:98 #, fuzzy -msgid "%1 is now busy" +msgid "%1
is on the phone" msgstr "%1 متصل الآن" -#: notification/contactstatusnotification.cpp:74 +#: notification/contactstatusnotification.cpp:99 #, fuzzy -msgid "%1 has become invisible" +msgid "%1
is out for lunch" msgstr "%1 متصل الآن" -#: notification/contactstatusnotification.cpp:75 +#: notification/newemailnotification.cpp:90 #, fuzzy -msgid "%1 has gone idle" -msgstr "%1 قام بالخروج" - -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1 قام بالخروج" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 متصل الآن" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 متصل الآن" - -#: notification/newemailnotification.cpp:78 -#, fuzzy -msgid "New email:
'%1'
by '%2'" +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" msgstr "بريد جديد:
'%1'
بواسطة '%2'" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "ابدأ &اللقاء" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "رسالة النظام" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "حدّد رسالة الخروج" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "الشيطان" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "ا&رسل بريد إلكتروني" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "" + +#: notification/systemtraywidget.cpp:78 +#, fuzzy +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"إغلاق النافذة الرئيسية سيبقي KMess مشغلاً في صينية النظام. استخدم 'إنهِ' من " +"قائمة 'اتصل' لإنهاء التطبيق." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "إرساء أيقونة صينية النظام" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 ميجا بايت" + +#: settings/accountpage.cpp:80 #, fuzzy msgid "Browse..." msgstr "&استعراض..." -#: settings/accountpage.cpp:70 -msgid "Browse and crop picture..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." msgstr "" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "تنزيل صورة العرض فشل" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 #, fuzzy msgid "" "An error occurred when trying to change the display picture.\n" @@ -3996,160 +5630,648 @@ msgstr "" "حدوث خطأ أثناء محاولة تغيير صورة العرض.\n" "تأكد من اختيار ملف الصورة الصحيحة" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "احذ&ف جهة اتصال" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "تعيينات" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "حساب" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "حساب" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "إشعارات" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "KMess إعلام" +msgid "Contact List" +msgstr "جهات الاتصال" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "دردشة" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "حفظ الدردشة" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 #, fuzzy msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "البريد الإلكتروني الذي تحاول إضافته ليس حساب مراسل MSN" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "هل أنت من متأكد من حذف هذا الحساب؟" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "هل أنت من متأكد من حذف هذا الحساب؟" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 #, fuzzy msgid "Great!" msgstr "عنزة" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "تعابير الوجه" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "هل أنت من متأكد من حذف هذا الحساب؟" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "تعابير الوجه" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "تعيينات" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "حسابات" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "إعلام البريد" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "احفظ ملفات المحادثة في هذا الدليل الأب:" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." -msgstr "" -"إغلاق النافذة الرئيسية سيبقي KMess مشغلاً في صينية النظام. استخدم 'إنهِ' من " -"قائمة 'اتصل' لإنهاء التطبيق." - -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "إرساء أيقونة صينية النظام" - -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 ميجا بايت" +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "البريد الإلكتروني الذي تحاول إضافته ليس حساب مراسل MSN" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "جهات الاتصال" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "الرسالة \"%1\" لم يتم استلامها" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "الرسالة \"%1\" لم يتم استلامها" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "الرسالة \"%1\" لم يتم استلامها" + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "الرسالة \"%1\" لم يتم استلامها" + +#, fuzzy +#~ msgid "Use" +#~ msgstr "حيران" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "ادرج تعبير وجه" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "عنوان البريد الإلكتروني: " + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "محظور" + +#, fuzzy +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "قد أرسل لك" + +#, fuzzy +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "قد أرسل لك" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "جهات الاتصال" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "اظهر الجهات ال&غير متصلة" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "انتظار قائمة الاتصال..." + +#~ msgid "Alerts" +#~ msgstr "إشعارات" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "KMess إعلام" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "احذف مجموعة" + +#, fuzzy +#~ msgid "Now listening to: %1" +#~ msgstr "يستمع الآن إلى %1" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "ارسال ملف " + +#, fuzzy +#~ msgid "Close all tabs" +#~ msgstr "إغلق لسان" + +#~ msgid "&Send email" +#~ msgstr "ا&رسل بريد إلكتروني" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "احفظ الدردشة" + +#, fuzzy +#~ msgid "C&lose all tabs" +#~ msgstr "إغلق لسان" + +#~ msgid "Connect" +#~ msgstr "اتصل" + +#~ msgid "Rename group" +#~ msgstr "أعد تسمية مجموعة" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "تعيي&نات الحساب" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 متصل الآن" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 قام بالخروج" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 متصل الآن" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 قام بالخروج" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "خطأ مع إعلامات" + +#, fuzzy +#~ msgid "Show notifications when your contacts:" +#~ msgstr "اظهر تنبيه عندما تصبح جهة الاتصال غير متصلة" + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "غير متصل" + +#, fuzzy +#~ msgid "S&end you a message" +#~ msgstr "حدّد رسالة الخروج" + +#, fuzzy +#~ msgid "Go o&ffline" +#~ msgstr "غير متصل" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "عنوان البريد الإلكتروني:" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "اظهر إعلام عندما يصل بريد في \"مجلدات أخرى\"" + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "في مجلد آخر" + +#~ msgid "Hide popups after" +#~ msgstr "اخفاء المنبثقات بعد" + +#~ msgid "seconds" +#~ msgstr "ثواني" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "إشعارات" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "جهات الاتصال" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "كلمة السر:" + +#~ msgid "Log &all chats" +#~ msgstr "سجل كلّ &الدردشات" + +#~ msgid "Month" +#~ msgstr "شهر" + +#~ msgid "Day" +#~ msgstr "يوم" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "جهات الاتصال" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "ا&بحث عن جهة اتصال" + +#~ msgid "This person is offline or invisible." +#~ msgstr "هذا الشخص غير متصل او مخفي." + +#, fuzzy +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "الرسالة \"%1\" لم يتم استلامها" + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "اظهر/اخفي شريط &جهات الاتصال الجانبي" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "اظهر او اخفي شريط جهات الاتصال الجانبي" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "اظهر او اخفي شريط جهات الاتصال الجانبي" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "جهة الاتصال هذه متصلة" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "&دعوة" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "عاجز عن تكوين اتصال: %1" + +#, fuzzy +#~ msgid "Copy E&mail" +#~ msgstr "البريد الإلكتروني" + +#~ msgid "Specify an Away message" +#~ msgstr "حدّد رسالة الخروج" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "البريد الإلكتروني" + +#~ msgid "Soccer ball" +#~ msgstr "كرة قدم" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "جهة الاتصال هذه موجودة في قائمتك" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "البريد الإلكتروني" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "جهة الاتصال هذه ليست في قائمتك" + +#~ msgid "The group name is too long" +#~ msgstr "اسم المجموعة طويل جداً" + +#, fuzzy +#~ msgid "No permissions given for this account" +#~ msgstr "تذكر التعيينات لهذا الحساب" + +#~ msgid "Enter your personal message here" +#~ msgstr "إدخل رسالتك الشخصية هنا" + +#, fuzzy +#~ msgid "Click" +#~ msgstr "الساعة" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "نافذة الشبكة" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "تصميم ويب" + +#~ msgid "Co&nnect" +#~ msgstr "ات&صل" + +#, fuzzy +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "انتظار قائمة الاتصال..." + +#, fuzzy +#~ msgid "SSL Error" +#~ msgstr "خطأ الخادم" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "تعيي&نات الحساب" + +#, fuzzy +#~ msgid "You received a wink from %1." +#~ msgstr "لديك غمزة من %1" + +#~ msgid "Got synchronization" +#~ msgstr "حصلت المزامنة" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "تعيينات" + +#, fuzzy +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "هل تريد قبول الملف: %1 (%2 بايت)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "النقل تم إلغائه" + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "ملف منقول بنجاح: %1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "نقل %1 فشل. الملف غير موجود مسبقاً." + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "نقل %1 فشل. الملف لا يمكن قرائته." + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "نقل %1 تم إلغائه." #~ msgid "Picture:" #~ msgstr "الصورة:" @@ -4158,10 +6280,6 @@ msgstr "%1 ميجا بايت" #~ msgid "Speed:" #~ msgstr "الخادم:" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "اظهر معلومات البريد الإلكتروني" - #~ msgid "Logging in..." #~ msgstr "يتم تسجيل الدخول..." @@ -4185,10 +6303,6 @@ msgstr "%1 ميجا بايت" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "لديك %1 بريد إلكتروني جديد في الوارد." -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "متصل" - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "نقل %1 فشل. لا يمكن فتح الملف" @@ -4215,12 +6329,6 @@ msgstr "%1 ميجا بايت" #~ msgid "Your password:" #~ msgstr "كلمة السر:" -#~ msgid "Display picture:" -#~ msgstr "صورة العرض:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "لا تظهر صورة ع&رض" - #, fuzzy #~ msgid "Show notifications when you recei&ve an email" #~ msgstr "اظهر إعلام عندما يصل بريد في \"مجلدات أخرى\"" @@ -4430,11 +6538,6 @@ msgstr "%1 ميجا بايت" #~ msgid "I want to use a proxy" #~ msgstr "أرغب في استخدام وكيل" -#~ msgid "" -#~ "If enabled, a proxy server will be used to connect to the MSN Messenger " -#~ "service." -#~ msgstr "إذا كان ممكن, خادم الوكيل سيستخدم في الاتصال بخدمة مراسل MSN." - #~ msgid "Port:" #~ msgstr "المنفذ:" @@ -4456,9 +6559,6 @@ msgstr "%1 ميجا بايت" #~ msgid "Aren't you going to open your gift? :)" #~ msgstr "هل ستقوم بفتح هديتك? :" -#~ msgid "Connection good" -#~ msgstr "الاتصال جيد" - #~ msgid "Server too busy" #~ msgstr "الخادم مشغول" @@ -4487,12 +6587,6 @@ msgstr "%1 ميجا بايت" #~ msgid "There may be a problem with the servers" #~ msgstr "هناك عدة مشاكل مع الخادم" -#~ msgid "System Message" -#~ msgstr "رسالة النظام" - -#~ msgid "Show incoming server messages" -#~ msgstr "اظهر رسائل الخادم الواردة" - #~ msgid "Show outgoing server messages" #~ msgstr "اظهر رسائل الخادم الصادرة" @@ -4514,6 +6608,3 @@ msgstr "%1 ميجا بايت" #~ msgid "Chat message layout:" #~ msgstr "تخطيط رسالة الدردشة:" - -#~ msgid "n&ame" -#~ msgstr "الا&سم" diff --git a/po/ca.po b/po/ca.po index 6587930..e769fa8 100644 --- a/po/ca.po +++ b/po/ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ca\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2003-04-23 10:23+0200\n" "Last-Translator: Jaume Cornado \n" "Language-Team: Catalan \n" @@ -17,83 +17,185 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.0\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 #, fuzzy +msgid "Standard text mode" +msgstr "Emoticones Cartoon" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Mostrar hora en els missatges" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Emoticones Cartoon" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Emoticones Cartoon" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +#, fuzzy msgid "Ne&w Line" msgstr "Nova Linea" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 #, fuzzy msgid "S&end" msgstr "Envia" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 #, fuzzy -msgid "Contacts" -msgstr "&Afegir contacte" +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Xat" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Mostrar/Amagar la barra de &contactes" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "&Xat" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "Canviar el &color de font" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Re&nombrar grup" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 #, fuzzy msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "Afegeig l'adreça de correu de la persona que vols afegir:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Email address" -msgstr "Adreça de correu:" +msgid "Email address:" +msgstr "Adreça de correu: " -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 #, fuzzy -msgid "Initial group" -msgstr "Re&nombrar grup" +msgid "Enter a shortcut for the emoticon:" +msgstr "Introdueix un nom nom per aquest grup:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -101,718 +203,1225 @@ msgstr "" "Entra el missatge que s'enviará automaticament\n" "a la gent que t'intenti enviar un missatge:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 #, fuzzy -msgid "&Automatic away message" +msgid "&Specify an automatic away message:" msgstr "Especificar un missatge d'absencia" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "&Buscar un contacte" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Guardar Registre" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +msgid "Filter by &chat" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "&Add this person to these groups of my contact list:" msgstr "Afegir aquest contacte a la teva llista \"Friends\"" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "No afegir el contacte, pero permetre veure el teu estat" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "" "Bloquejar aquesta persona tant per contactar com per veure el teu estat." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, fuzzy, no-c-format -msgid "Contact Properties for %1" -msgstr "Propietats del contacte per " - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +#, fuzzy msgid "&Information" +msgstr "Mostra l'informació de l'email a la llista de contactes" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 #, fuzzy -msgid "Restore" +msgid "&Restore" msgstr "Eliminat" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Use alternative name for this person" +msgid "&Groups:" +msgstr "Grup" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" msgstr "Fer anar un nom alternatiu per aquesta persona" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 #, fuzzy -msgid "Show a popup when the contact goes online/offline" +msgid "Show a &popup when the contact goes online/offline" msgstr "Mostra un globus cuan aquesta persona canvia de Online a Ofline" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "So:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Foto:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +#, fuzzy msgid "&Clear Cache" +msgstr "&Xat" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -msgid "Notes" +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "Mostrar &Emoticones" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +#, fuzzy +msgid "Remo&ve" +msgstr "Eliminat" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "&Permetre contacte" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "Afegir aquest contacte a la teva llista \"Friends\"" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "&Afegir contacte" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "Conexió fallida" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "&Afegir contacte" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "Bloquejat" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "Envia" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "Adreça de correu: " +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "&Xat" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "Bloquejat" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Afegeig l'adreça de correu de la persona que vols afegir:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "Clau d'accés:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -#, fuzzy -msgid " Account options " -msgstr "&Opcions del compte" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 #, fuzzy -msgid "Remem&ber this profile" +msgid "Remem&ber account" msgstr "Recordar aquest perfil" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "Clau d'accés:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Conectar" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +#, fuzzy +msgid "New Account" +msgstr "Nou &Perfil" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Conectar" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Accions" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Comptes" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr "&Opcions del compte" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +msgid "Enter the name other contacts should see when you are online." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "El teu nom amigable:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "Adreça de correu: " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "Clau d'accés:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "Clau d'accés:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 #, fuzzy msgid "Display Picture" msgstr "Foto:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 +#, fuzzy msgid "C&hange..." -msgstr "" +msgstr "&Convidar" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, fuzzy msgid "Re&member the settings of this account" -msgstr "" +msgstr "Recordar aquest perfil" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "Entrar amb aquest compte automaticament al engegar" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "Registrar tots els xats" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "Recordar aquest perfil" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Canviar el estat a \"Fora de linea\" cuan estigui inactiu" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Posar-se fora de linea despres" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minuts" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 #, fuzzy msgid "Saved accounts:" msgstr "Comptes" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -#, fuzzy -msgid "Click" -msgstr "Bloquejat" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." +msgid "&Add Account..." msgstr "Comptes" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "Eliminat" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Notificació de correu" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "Guardar Registre" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "Enviar un &Fitxer" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Guardar els registres en aquest directori:" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Any" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Guardar-los tots en el directori arrel" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Guardar-los tots en el directori arrel" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "Guardar els registres en aquest directori:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "Preferéncies" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "&Buscar un contacte" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "Mostrar &Emoticones" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Mostrar &Emoticones" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Mostrar gráfics en els missatges del xat" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "&Afegir contacte" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Show notifications when your contacts:" -msgstr "Mostrar notificacions cuan els contactes estan fora de linea" +msgid "Show s&econds" +msgstr "Mostrar &Emoticones" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "La font dels teus missatges:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 #, fuzzy -msgid "&Go online" -msgstr "Fora de linea" +msgid "&Force messages from your contacts to use this font:" +msgstr "Fixar la font dels missatges dels contactes a:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "&Xat" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 #, fuzzy -msgid "S&end you a message" -msgstr "Especificar un missatge d'absencia" +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "Permetre efectes a les fonts, i.e. *negreta*,/italica/, i _subratllat_" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -#, fuzzy -msgid "Go o&ffline" -msgstr "Fora de linea" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "Adreça de correu:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "Mostra una notificació cuan el correu rebut está a \"altres carpetes\"" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -#, fuzzy -msgid "In other folders" -msgstr "en una altra carpeta" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Amagar els popups despres" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "segons" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "Alertes" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Veure els contactes f&ora de linea" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -822,2192 +1431,2985 @@ msgid "" "window with the first nudge.

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 -msgid "Inform contacts w&hich song I am listening to" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 #, fuzzy -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Canviar el estat a \"Fora de linea\" cuan estigui inactiu" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Posar-se fora de linea despres" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minuts" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -#, fuzzy -msgid "Log &all chats" -msgstr "Registrar tots els xats" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Guardar els registres en aquest directori:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Any" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -#, fuzzy -msgid "Month" -msgstr "Mes" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Dia" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Guardar-los tots en el directori arrel" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -msgid "&Chat style:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Preferéncies" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Mostrar &Emoticones" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Mostrar hora en els missatges" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 msgid "G&roup chats in the same window:" -msgstr "" +msgstr "La teva llista de contactes està plena" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 #, fuzzy msgid "Always" msgstr "Fora de linea" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 #, fuzzy msgid "For contacts in the same group" msgstr "La teva llista de contactes està plena" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 #, fuzzy msgid "Never" msgstr "Error en el server" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 #, fuzzy -msgid "Your &message font:" -msgstr "La font dels teus missatges:" +msgid "Display Options" +msgstr "Foto:" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Fixar la font dels missatges dels contactes a:" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "Permetre efectes a les fonts, i.e. *negreta*,/italica/, i _subratllat_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "&Buscar un contacte" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 #, fuzzy msgid "&Emoticon Themes" msgstr "Mostrar &Emoticones" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 #, fuzzy msgid "Available emoticon styles:" msgstr "Mostrar &Emoticones" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 #, fuzzy msgid "&Custom Emoticons" msgstr "Emoticones Cartoon" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 +#, fuzzy msgid "Custom emoticons for this account:" +msgstr "Recordar aquest perfil" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Comptes" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 #, fuzzy msgid "Re&name" msgstr "El teu nom" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -#, fuzzy -msgid "Remo&ve" -msgstr "Eliminat" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "Especificar un missatge d'absencia" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "Client de correu" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 #, fuzzy msgid "File Transfers" msgstr "Transferencia de l'arxiu completada." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "Guardar els registres en aquest directori:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 msgid "and" msgstr "i" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "Transferencia de l'arxiu completada." -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "El teu nom" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "El teu nom" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Estic fora de l'ordinador" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "El teu nom" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "tu@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "&Eliminar Contacte" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:119 +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" + +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "ha entrat en el xat" -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "ha deixat el xat" -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "ha deixat el xat" -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr " esta escrivint." -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr " et al." -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr " (Aquest missatge ha estat enviat automaticament)" -#: chat/chat.cpp:934 -msgid "You received a wink from %1." -msgstr "" - -#: chat/chat.cpp:971 +#: chat/chat.cpp:830 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" - -#: chat/chat.cpp:1080 -msgid "You have received a wink from %1" -msgstr "" - -#: chat/chat.cpp:1100 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chat.cpp:1119 +#: chat/chat.cpp:941 #, fuzzy -msgid "The message '%1' could not be sent." +msgid "You have sent a wink" +msgstr " esta en linea" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr " esta en linea" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr " esta en linea" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr " esta en linea" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr " esta en linea" + +#: chat/chat.cpp:1194 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" + +#: chat/chat.cpp:1220 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" + +#: chat/chat.cpp:1230 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" + +#: chat/chat.cpp:1241 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr " esta en linea" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "ha entrat en el xat" + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "ha entrat en el xat" + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr " esta en linea" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "&Permetre contacte" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "ha entrat en el xat" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr " esta en linea" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "ha entrat en el xat" + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr " esta en linea" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "no s'ha rebut." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 #, fuzzy msgid "%1 says:" msgstr "diu:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Engegant GnomeMeeting. Conectant a " + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Convidar" +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Conectar" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 #, fuzzy msgid "Add this &Emoticon..." msgstr "Mostrar &Emoticones" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Mostrar &Emoticones" + +#: chat/chatview.cpp:833 #, fuzzy msgid "Send &Email" msgstr "&Enviar un correu" -#: chat/chatview.cpp:1286 +#: chat/chatview.cpp:837 #, fuzzy -msgid "Copy E&mail" -msgstr "Correu" +msgid "Add &Contact" +msgstr "&Afegir contacte" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "Adreça de correu:" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "Save chat to &File" -msgstr "Enviar un &Fitxer" - -#: chat/chatwindow.cpp:489 -msgid "&Chat" +msgid "C&lear Chat" msgstr "&Xat" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Enviar un &Fitxer" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "Començar un &Meeting" - -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:108 #, fuzzy -msgid "Send a &Nudge!" -msgstr "Enviar un &Fitxer" +msgid "Contacts" +msgstr "&Afegir contacte" -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Mostrar &Emoticones" - -#: chat/chatwindow.cpp:498 -msgid "Close &All Tabs" -msgstr "" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "Preferéncies" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Canviar la &Font" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Canviar el &color de font" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&Conectar" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Canviar el &color de font" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "Mostrar &Emoticones" -#: chat/chatwindow.cpp:658 +#: chat/chatwindow.cpp:121 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "Mostrar &Emoticones" -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "Preferéncies" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "Mostrar &Emoticones" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "Mostrar/Amagar la barra de &contactes" - -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Mostrar/Amagar la barra de &contactes" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Mostrar o amagar la barra de contactes" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:328 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:855 -msgid "Close all tabs" +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:856 -msgid "Close current tab" +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" msgstr "" -#: chat/chatwindow.cpp:1467 +#: chat/chatwindow.cpp:409 #, fuzzy -msgid "Show Side&bar" -msgstr "Mostrar/Amagar la barra de &contactes" +msgid "&Invite..." +msgstr "&Convidar" -#: chat/chatwindow.cpp:1468 +#: chat/chatwindow.cpp:410 #, fuzzy -msgid "Show the contact sidebar" -msgstr "Mostrar o amagar la barra de contactes" +msgid "Send a &File..." +msgstr "Enviar un &Fitxer" -#: chat/chatwindow.cpp:1565 -#, fuzzy -msgid "%1 is typing." -msgstr " esta escrivint." - -#: chat/chatwindow.cpp:1575 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr " esta escrivint." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" msgstr "" -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Començar un &Meeting" + +#: chat/chatwindow.cpp:413 +#, fuzzy +msgid "Send a &Nudge!" +msgstr "Enviar un &Fitxer" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "" + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Canviar la &Font" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Canviar el &color de font" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Mostrar &Emoticones" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Mostrar hora en els missatges" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 +#, fuzzy +msgid "Meeting" +msgstr "Preferéncies" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Enviar un &Fitxer" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "&Buscar un contacte" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "&Afegir contacte" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "&Buscar un contacte" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Mostrar &Emoticones" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "&Buscar un contacte" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mostrar &Emoticones" + +#: chat/chatwindow.cpp:491 +#, fuzzy +msgid "&Font" +msgstr "&Conectar" + +#: chat/chatwindow.cpp:492 +#, fuzzy +msgid "Font &Color" +msgstr "Canviar el &color de font" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "&Xat" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Xat" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "Xat" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr " esta escrivint." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr " esta escrivint." + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr " esta escrivint." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Començar un &Meeting" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" msgstr "&Enviar un correu" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 #, fuzzy msgid "&View Profile" msgstr "&Mostrar perfil" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Afegir contacte" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 #, fuzzy msgid "A&llow Contact" msgstr "&Permetre contacte" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 #, fuzzy msgid "&Delete Contact" msgstr "&Eliminar Contacte" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Bloquejar contacte" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "&Desbloquejar contacte" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 #, fuzzy msgid "&Friendly Name" msgstr "El teu nom amigable:" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 #, fuzzy msgid "&Email Address" msgstr "Adreça de correu:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" msgstr "" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Bloquejat" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "Afegir aquest contacte a la teva llista \"Friends\"" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "Afegir un contacte" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Inserir una emoticona" +msgid "Add New" +msgstr "Comptes" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 #, fuzzy msgid "Remove" msgstr "Eliminat" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 #, fuzzy msgid "Web Messenger" msgstr "Diseny web" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "Diseny web" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 #, fuzzy msgid "Windows Live Messenger %1" msgstr "Diseny web" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Diseny web" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "En linea" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Fora de linea" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Permés" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Eliminat" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr " esta escrivint." - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Fora de linea" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Torno en un moment" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Ocupat" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Invisible" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Fora de linea" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Fora de linea, amb resposta automàtica" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Torno en un moment" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Al telèfon" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Estic menjant" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Invisible" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Fora de linea" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "El meu &Estat" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "&Desconectar" + +#: dialogs/addcontactdialog.cpp:49 #, fuzzy msgid "Add a Contact" msgstr "Afegir un contacte" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "&Eliminar Grup" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 #, fuzzy msgid "Add New Emoticon" msgstr "Mostrar &Emoticones" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "Mostrar &Emoticones" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "Especificar un missatge d'absencia" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "error. No s'ha pogut obrir l'arxiu" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "t'ha afegit a la seva llista de contactes. Que vols fer:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +#, fuzzy +msgid "Contact Properties for %1" +msgstr "Propietats del contacte per " + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Conectat" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "Mostrar hora en els missatges" -#: dialogs/contactpropertiesdialog.cpp:381 -msgid "Last seen: %1" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:419 #, fuzzy +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "La font dels teus missatges:" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "La font dels teus missatges:" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "Correu" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Adreça de correu: " -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "Client de correu" -#: dialogs/networkwindow.cpp:79 -msgid "S&ave tab" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Estás segur d'esborrar aquesta compta?" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "&Afegir contacte" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "&Afegir contacte" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "Propietats del contacte per " + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "Conexió fallida" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" msgstr "" +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "&Buscar un contacte" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "" + +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "&Xat" + #: dialogs/networkwindow.cpp:80 -msgid "C&lear tab" +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" msgstr "" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Conectat" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 -msgid "Cl&ean Up" -msgstr "" +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Bloquejat" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "&Eliminar Contacte" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Foto:" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Foto:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Estás segur d'esborrar aquesta compta?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 #, fuzzy msgid "Smile" msgstr "Correu" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 #, fuzzy msgid "Sad" msgstr "i" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 #, fuzzy msgid "Disappointed" msgstr "Desconectat" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 #, fuzzy msgid "Secret telling" msgstr "Preferéncies" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 #, fuzzy msgid "Be right back" msgstr "Torno en un moment" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 #, fuzzy msgid "Sun" msgstr "So:" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 #, fuzzy msgid "Clapping" msgstr "Parlant" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 #, fuzzy msgid "Snail" msgstr "&Enviar un correu" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "" - -#: emoticontheme.cpp:857 -msgid "Goat" -msgstr "" - -#: emoticontheme.cpp:858 -msgid "Vampire bat" -msgstr "" - -#: emoticontheme.cpp:859 -msgid "Pizza" -msgstr "" - -#: emoticontheme.cpp:860 -msgid "Beer mug" -msgstr "" - -#: emoticontheme.cpp:861 -msgid "Martini glass" -msgstr "" - -#: emoticontheme.cpp:862 -msgid "Coffee cup" -msgstr "" - -#: emoticontheme.cpp:863 -msgid "Birthday cake" -msgstr "" - -#: emoticontheme.cpp:864 -msgid "Plate" -msgstr "" - -#: emoticontheme.cpp:865 -msgid "Bowl" -msgstr "" - -#: emoticontheme.cpp:866 -msgid "Star" -msgstr "" - -#: emoticontheme.cpp:867 -msgid "Rainbow" -msgstr "" - -#: emoticontheme.cpp:868 -msgid "Stormy cloud" -msgstr "" - #: emoticontheme.cpp:869 -msgid "Lightning" +msgid "Sheep" msgstr "" #: emoticontheme.cpp:870 -msgid "Umbrella" +msgid "Goat" msgstr "" #: emoticontheme.cpp:871 -msgid "Island with a palm tree" +msgid "Vampire bat" msgstr "" #: emoticontheme.cpp:872 -msgid "Telephone receiver" +msgid "Pizza" msgstr "" #: emoticontheme.cpp:873 -msgid "Mobile Phone" +msgid "Beer mug" msgstr "" #: emoticontheme.cpp:874 +msgid "Martini glass" +msgstr "" + +#: emoticontheme.cpp:875 +msgid "Coffee cup" +msgstr "" + +#: emoticontheme.cpp:876 +msgid "Birthday cake" +msgstr "" + +#: emoticontheme.cpp:877 +msgid "Plate" +msgstr "" + +#: emoticontheme.cpp:878 +msgid "Bowl" +msgstr "" + +#: emoticontheme.cpp:879 +msgid "Star" +msgstr "" + +#: emoticontheme.cpp:880 +msgid "Rainbow" +msgstr "" + +#: emoticontheme.cpp:881 +msgid "Stormy cloud" +msgstr "" + +#: emoticontheme.cpp:882 +msgid "Lightning" +msgstr "" + +#: emoticontheme.cpp:883 +msgid "Umbrella" +msgstr "" + +#: emoticontheme.cpp:884 +msgid "Island with a palm tree" +msgstr "" + +#: emoticontheme.cpp:885 +msgid "Telephone receiver" +msgstr "" + +#: emoticontheme.cpp:886 +msgid "Mobile Phone" +msgstr "" + +#: emoticontheme.cpp:887 msgid "Email" msgstr "Correu" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 #, fuzzy msgid "Clock" msgstr "Bloquejat" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 #, fuzzy msgid "Camera" msgstr "El teu nom" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 #, fuzzy msgid "Money" msgstr "Mes" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" msgstr "" -#: emoticontheme.cpp:883 -msgid "Soccer ball" +#: emoticontheme.cpp:896 +msgid "Football ball" msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 #, fuzzy msgid "KMess Icon" msgstr "KMess" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "La conexió al servidor ha estat erronea" + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "La conexió al servidor ha estat erronea" -#: initialview.cpp:377 -msgid "Connect" -msgstr "Conectar" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "&Desconectar" +msgctxt "Button label" +msgid "&Connect" +msgstr "&Conectar" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: kmess.cpp:223 +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Adreça de correu:" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "Mostra l'informació de l'email a la llista de contactes" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Afegir aquest contacte a la teva llista \"Friends\"" + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "Nou &Grup" -#: kmess.cpp:226 +#: kmess.cpp:253 #, fuzzy -msgid "Add a group" +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "&Afegir grup" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Introdueix un nom nom per aquest grup:" -#: kmess.cpp:569 +#: kmess.cpp:577 #, fuzzy msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "Estás segur que vols eliminar aquest grup?" -#: kmess.cpp:571 +#: kmess.cpp:579 #, fuzzy -msgid "Remove contact" +msgid "Remove Contact" msgstr "&Eliminar Contacte" -#: kmess.cpp:573 +#: kmess.cpp:581 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "Eliminat" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "Estás segur que vols eliminar aquest grup?" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "Eliminat" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Aquest es un grup especial i no es pot canviar" -#: kmess.cpp:671 +#: kmess.cpp:677 #, fuzzy -msgid "Rename group" +msgid "Rename Group" msgstr "Re&nombrar grup" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Introdueix un nom nom per aquest grup:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "Autentificació fallida" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Conexió fallida" + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Desconectat" -#: kmess.cpp:1408 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" msgstr "" -#: kmess.cpp:1412 +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" + +#: kmess.cpp:1481 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Notificació de correu" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Accions" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Nou &Contacte" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Nou &Grup" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "&Buscar un contacte" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Buscar per &Interés" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "&Buscar un contacte" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Nou &Perfil" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "&Opcions del compte" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "Co&nectar" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&Desconectar" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "Veure el meu &perfil" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "El meu &Estat" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Fora de linea, amb resposta automàtica" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "&Veure els contactes admesos" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Veure els contactes f&ora de linea" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "Veure els contactes &eliminats" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +msgid "Show &History Box" +msgstr "" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Mostrar/Amagar la barra de &contactes" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "Mostrar &Emoticones" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "Foto:" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "&Ordenar els contactes per" + +#: kmessinterface.cpp:177 +msgid "Show &Transfer Window..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "Nou &Contacte" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "Nou &Grup" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "&Buscar un contacte" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "&Buscar un contacte" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Buscar per &Interés" + +#: kmessinterface.cpp:187 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "Nou &Perfil" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Nou &Perfil" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "Correu" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "&Ordenar els contactes per" - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "Grup" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "En Linea/Fora" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" +#: kmessinterface.cpp:299 +msgid "Show &Network Window..." msgstr "" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 #, fuzzy msgid "[%1] %2 goes online" msgstr "está fora de linea" -#: kmessview.cpp:363 +#: kmessview.cpp:357 #, fuzzy msgid "[%1] %2 goes offline" msgstr "está fora de linea" -#: kmessview.cpp:559 +#: kmessview.cpp:590 #, fuzzy msgid "Cha&t" msgstr "Xat" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Propietats" -#: kmessview.cpp:569 +#: kmessview.cpp:600 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "&Eliminar Grup" -#: kmessview.cpp:574 +#: kmessview.cpp:605 #, fuzzy -msgid "&Listening Music" -msgstr "Enviant l'arxiu " +msgid "Song &Name" +msgstr "El teu nom" -#: kmessview.cpp:601 +#: kmessview.cpp:632 #, fuzzy msgid "&Copy to Group" msgstr "&Moure al grup" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "&Moure al grup" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "&Moure grup a sota" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "&Moure grup a sobre" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "&Eliminar Grup" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Re&nombrar grup" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "Correu" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Afegir aquest contacte a la teva llista \"Friends\"" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Adreça de correu:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Client de correu" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +#: kmessview.cpp:1156 +msgid "No" msgstr "" -#: kmessview.cpp:1076 +#: kmessview.cpp:1159 #, fuzzy -msgctxt "Last time a message was received" -msgid "Last message: %1" +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Bloquejat" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "La font dels teus missatges:" -#: kmessview.cpp:1085 +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "La font dels teus missatges:" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "&Afegir contacte" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "&Afegir contacte" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "&Afegir contacte" +msgstr[1] "&Afegir contacte" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "&Afegir contacte" +msgstr[1] "&Afegir contacte" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr " esta escrivint." + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 msgid "Project support" msgstr "" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "Programador de GnomeMeeting" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "Traducció alemana, test, documentació i pàgina web" -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "Diseny web" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "" "Les emoticones principals groga/blava/violeta, varies emoticones i la " "traducció a l'italià." -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Emoticones Cartoon" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "El tema de so per defecte" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "Traducció a l'Arab, arranjaments en el sistema per guardar fitxers" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 #, fuzzy msgid "More Arabic translation" msgstr "Mes Traducció al Turc" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Traducció brasilera/portuguesa" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Traducció brasilera/portuguesa" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 #, fuzzy msgid "Catalan translation" msgstr "Traducció al català" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "Traducció simplificada al Xinés, enviament d'arxius bug fix" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 #, fuzzy msgid "More Simplified Chinese translation" msgstr "Traducció simplificada al Xinés, enviament d'arxius bug fix" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 #, fuzzy msgid "Traditional Chinese translation" msgstr "Traducció al català" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Traducció al català" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 #, fuzzy msgid "Danish translation" msgstr "Traducció danesa" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "More Danish translation" msgstr "Traducció danesa" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "Traduccó \"Dutch\"" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 #, fuzzy msgid "More Dutch translation" msgstr "Traduccó \"Dutch\"" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Mes Traducció al Turc" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Traducció al francés" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 #, fuzzy msgid "Estonian translation" msgstr "Traducció Estonia" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 #, fuzzy msgid "Finnish translation" msgstr "Traducció danesa" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 #, fuzzy msgid "More Finnish translation" msgstr "Traducció danesa" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "Traducció al francés" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 #, fuzzy msgid "More French translation, MSN6 emoticon definitions" msgstr "Traducció al francés" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 #, fuzzy msgid "More French translation" msgstr "Traducció al francés" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 #, fuzzy msgid "Hungarian translation" msgstr "Traducció Estonia" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Traducció Estonia" + +#: main.cpp:115 main.cpp:116 #, fuzzy msgid "More Italian translation" msgstr "Traducció al Koreá" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "Traducció al Koreá" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 #, fuzzy msgid "Norsk Bokmål translation" msgstr "Traducció al \"Norsk Bokml\"" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Traducció al Koreá" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "Traducció al Koreá" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 #, fuzzy msgid "Slovenian translation" msgstr "Traducció al Koreá" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Traducció española" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 #, fuzzy msgid "More Spanish translation" msgstr "mes traducció a l'espanyol." -#: main.cpp:123 +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 #, fuzzy msgid "Swedish translation" msgstr "Traducció española" -#: main.cpp:125 -#, fuzzy -msgid "Thai translation" -msgstr "Traducció al Thailandes" - -#: main.cpp:126 -msgid "Turkish translation" -msgstr "Traducció al Turc" - -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "Mes Traducció al Turc" - -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" - -#: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Transferencia de l'arxiu completada." +msgid "More Swedish translation" +msgstr "Traducció española" -#: main.cpp:134 -msgid "P4-Context field support" +#: main.cpp:135 +msgid "Rachan Hongpairote" msgstr "" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Arreglos en el sistema Xinerama" +#, fuzzy +msgid "Thai translation" +msgstr "Traducció al Thailandes" #: main.cpp:136 -msgid "Original file receive code" -msgstr "El codi original de la recepció d'arxius" +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Traducció al Turc" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" msgstr "" +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "Mes Traducció al Turc" + #: main.cpp:138 -msgid "KWallet support" +msgid "Uğur Çetin" msgstr "" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "En linea" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Transferencia de l'arxiu completada." + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Arreglos en el sistema Xinerama" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "El codi original de la recepció d'arxius" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "Alguns arranjaments en la internacionalització" -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Alguns arranjaments en la internacionalització" -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "Programador de GnomeMeeting" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Noi amb una bossa al cap" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspiració i una mica de codi" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 #, fuzzy msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "Codi dels globus" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Codi del temporitzador" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "Your name here?" msgstr "El teu nom" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "El teu nom" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "La teva adreça email:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Entrar automaticament amb el correu" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Permés" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Eliminat" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 #, fuzzy msgid "The contact cancelled the session." msgstr "Has cancel·lat la invitació." @@ -3027,69 +4429,111 @@ msgid "You have rejected the invitation." msgstr "Has rebutjat l'invitació." #: network/applications/application.cpp:540 -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "" #: network/applications/application.cpp:581 -msgid "Click to cancel." +msgid "Click to cancel." msgstr "" -#: network/applications/filetransfer.cpp:134 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Vols acceptar l'arxiu: " +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "error. No s'ha pogut obrir l'arxiu" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "error. No s'ha pogut obrir l'arxiu" + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Transferencia acceptada." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 #, fuzzy msgid "Connecting to %1, port %2" msgstr "Conexió fallida" -#: network/applications/filetransfer.cpp:339 +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 #, fuzzy -msgid "The transfer was cancelled" -msgstr "Transferencia acceptada." +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Has cancel·lat la invitació." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "Has cancel·lat la invitació." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "Has cancel·lat la invitació." + +#: network/applications/filetransfer.cpp:490 #, fuzzy msgid "Connection established" msgstr "Conexió fallida" -#: network/applications/filetransfer.cpp:456 +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 #, fuzzy -msgid "Successfully transferred file: %1" +msgid "Successfully sent file "%1"." msgstr "Arxiu transferit: " -#: network/applications/filetransfer.cpp:620 +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 #, fuzzy -msgid "The transfer of %1 failed. The file does not exist." +msgid "Successfully received file "%1"." +msgstr "Arxiu transferit: " + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "error. No s'ha pogut obrir l'arxiu" -#: network/applications/filetransfer.cpp:624 +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 #, fuzzy -msgid "The transfer of %1 failed. The file could not be read." +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "error. No es pot fer la conexió" -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 #, fuzzy -msgid "Sending file %1" +msgid "Sending file "%1" (%2)." msgstr "Enviant l'arxiu " -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Has cancel·lat la invitació." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3101,69 +4545,14 @@ msgstr "" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "Has cancel·lat la invitació." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "error. No s'ha pogut obrir l'arxiu" - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Has cancel·lat la invitació." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Has cancel·lat la invitació." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Arxiu transferit: " - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Arxiu transferit: " - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "error. No s'ha pogut obrir l'arxiu" - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "error. No es pot fer la conexió" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Enviant l'arxiu " - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Has cancel·lat la invitació." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Has estat convidat a començar un meeting (utilitzant GnomeMeeting)" @@ -3177,31 +4566,31 @@ msgstr "Engegant GnomeMeeting. Conectant a " msgid "Inviting the contact to a meeting." msgstr "Convidant el contacte a un meeting." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 #, fuzzy msgid "The invitation was aborted. An internal error occured." msgstr "El contacte ha rebutjat el meeting." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 #, fuzzy msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "error. No es pot obrir un socket" -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 #, fuzzy msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "Has cancel·lat la invitació." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 #, fuzzy msgid "The invitation was aborted." msgstr "Has cancel·lat la invitació." @@ -3215,106 +4604,106 @@ msgstr "Has estat convidat a compartir l'escriptori d'aquesta persona." msgid "Starting KRDC. Connecting to %1." msgstr "Engegant GnomeMeeting. Conectant a " -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -#, fuzzy -msgid "The contact rejected the invitation. An internal error occured." -msgstr "El contacte ha rebutjat el meeting." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" -#: network/applications/p2papplicationbase.cpp:609 -#, fuzzy -msgid "The transfer failed." -msgstr "La transferència de " - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "" -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" - -#: network/applications/p2papplicationbase.cpp:996 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "error. No es pot obrir un socket" - -#: network/applications/p2papplicationbase.cpp:1015 -#, fuzzy -msgid "The transfer failed. An internal error occured." -msgstr "El contacte ha rebutjat el meeting." - -#: network/applications/p2papplicationbase.cpp:1176 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "error. No es pot obrir un socket" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 #, fuzzy msgid "The transfer failed. Data preparation failed." msgstr "Has cancel·lat la invitació." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "Has cancel·lat la invitació." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 #, fuzzy msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "error. No es pot obrir un socket" -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "El contacte ha rebutjat el meeting." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "error. No es pot obrir un socket" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "error. No es pot obrir un socket" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" +#: network/applications/p2papplicationbase.cpp:769 +#, fuzzy +msgid "The transfer failed." +msgstr "La transferència de " + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1170 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "error. No es pot obrir un socket" + +#: network/applications/p2papplicationbase.cpp:1189 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "El contacte ha rebutjat el meeting." + +#: network/applications/p2papplicationbase.cpp:1350 +#, fuzzy +msgid "The transfer failed. Couldn't open data source." +msgstr "error. No es pot obrir un socket" + #: network/applications/voiceconversation.cpp:71 #, fuzzy msgid "You are invited to start a voice conversation." @@ -3352,806 +4741,1448 @@ msgstr "Engegant GnomeMeeting. Conectant a " msgid "Inviting the contact to a voice conversation." msgstr "Convidant el contacte a un meeting." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 #, fuzzy msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "En contacte et convida a començar " -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Has cancel·lat la invitació." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:119 +#: network/applications/webcamtransferp2p.cpp:138 #, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "La transferència de " +msgid "You are invited to view this person's webcam." +msgstr "Has estat convidat a compartir l'escriptori d'aquesta persona." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 +#: network/extra/msnftpconnection.cpp:204 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +msgid "Sending file %1" +msgstr "Enviant l'arxiu " + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "error. No s'ha pogut obrir l'arxiu" -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy msgid "Couldn't open a local port." msgstr "error. No s'ha pogut obrir l'arxiu" -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:478 +#: network/extra/msnftpconnection.cpp:469 #, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +msgid "The transfer of %1 failed. A connection could not be made." msgstr "error. No es pot fer la conexió" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 #, fuzzy msgid "Receiving file %1" msgstr "Rebent l'arxiu " -#: network/msnconnection.cpp:589 -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Has estat desconectat per que has \n" -"establert una conexió amb un altre client \n" -"desde un altre lloc" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Sincronitzat" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Autentificació fallida" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -msgid "Authentication failed, please verify your account name and password." -msgstr "" - -#: network/msnnotificationconnection.cpp:1993 -#, fuzzy -msgid "Connecting..." -msgstr "Conectar" - -#: network/msnnotificationconnection.cpp:2167 -msgid "Unknown command received from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 +#: network/msnconnection.cpp:404 #, fuzzy -msgid "The account name given is invalid" +msgid "The given account name is invalid" msgstr "L'usuari no es valid" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "La teva llista de contactes està plena" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 #, fuzzy msgid "This contact is already on your list" msgstr "Afegir aquest contacte a la teva llista \"Friends\"" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 #, fuzzy msgid "This contact is not on your list" msgstr "Afegir aquest contacte a la teva llista \"Friends\"" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Afegir aquest contacte a la teva llista \"Friends\"" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -#: network/msnnotificationconnection.cpp:2251 +#: network/msnconnection.cpp:444 #, fuzzy -msgid "Your contact list has too many groups" +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "La teva llista de contactes està plena" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 #, fuzzy msgid "This group can't be changed" msgstr "Aquest es un grup especial i no es pot canviar" -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "La teva llista de contactes està plena" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 #, fuzzy msgid "There was an internal error in KMess: %1" msgstr "Hi ha un error intern del servidor" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "Re&nombrar grup" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 #, fuzzy msgid "Transfer to switchboard server failed" msgstr "Notificant al servidor" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -msgid "No permissions given for this account" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "La transferència de " -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" msgstr "" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "Has cancel·lat la invitació." -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 #, fuzzy msgid "Bad friend name" msgstr "El teu nom amigable:" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "Autentificació fallida" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "No pots començar una conversa amb algú si ets invisible." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" msgstr "" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -#: network/msnnotificationconnection.cpp:2371 -msgid "Your passport account needs to be verified first." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." msgstr "" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "Hi ha un error intern del servidor" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "El servidor notifica que està caigut" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 #, fuzzy msgid "The server is going down" msgstr "El servidor caurà en breu" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "El servidor caurà en breu" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 #, fuzzy msgid "The server is not available" msgstr "El servidor no està en servei" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Autentificació fallida" -#: network/msnnotificationconnection.cpp:2449 -msgid "Unknown error code received from the server: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +#, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" +msgstr "Error en el server" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "Autentificació fallida" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "Autentificació fallida" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +#, fuzzy +msgid "Connecting..." +msgstr "Conectar" + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "minuts" msgstr[1] "minuts" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" msgstr "" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -msgid "KMess could not process Offline-IM messages.
Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "Autentificació fallida" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "Hi ha un error intern del servidor" -#: network/msnnotificationconnection.cpp:3242 -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2932 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"Has estat desconectat per que has \n" +"establert una conexió amb un altre client \n" +"desde un altre lloc" + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "La conexió al servidor ha estat erronea" -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Error en el server" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:681 +#, fuzzy +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "Hi ha un error intern del servidor" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "Conexió fallida" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 #, fuzzy msgid "1 ping lost" msgstr "Agafant les llistes" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 #, fuzzy msgid "%1 pings lost" msgstr "Agafant les llistes" -#: network/msnsockettcp.cpp:387 +#: network/msnsockettcp.cpp:395 #, fuzzy -msgid "The connection to the server was lost." +msgid "The connection to the server was lost" msgstr "La conexió al servidor ha estat erronea" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Aquesta persona está Offline o Invisible." - -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "no s'ha rebut." +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "El servidor no està en servei" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "" - -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "" - -#: notification/chatnotification.cpp:163 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/chatnotification.cpp:171 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "El servidor no està en servei" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" msgstr " esta en linea" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:158 +#, fuzzy +msgid "%1 says:
'%2'" +msgstr " esta en linea" + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" +msgstr " esta en linea" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" msgstr "" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" -msgstr "" +#: notification/chatnotification.cpp:174 +#, fuzzy +msgid "%1:
%2" +msgstr " esta en linea" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr " esta en linea" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr " esta en linea" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr " esta en linea" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 msgid "%1 wants to use the webcam!" msgstr "" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr " esta en linea" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr " esta en linea" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "Has cancel·lat la invitació." -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "Has cancel·lat la invitació." -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 msgid "%1's activity has been canceled!" msgstr "" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "Has cancel·lat la invitació." -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "Has cancel·lat la invitació." -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr " esta en linea" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "Has cancel·lat la invitació." -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "La transferència de " -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 msgid "%1's activity has ended!" msgstr "" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" msgstr "" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "La transferència de " -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 msgid "%1's activity has ended with an error!" msgstr "" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" +msgid "%1
is now online" msgstr " esta en linea" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" +msgid "%1
has gone away" msgstr " esta en linea" -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" +#: notification/contactstatusnotification.cpp:93 +#, fuzzy +msgid "%1
will be right back" +msgstr " esta en linea" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy +msgid "%1
is now busy" +msgstr " esta en linea" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy +msgid "%1
has become invisible" +msgstr " esta en linea" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy +msgid "%1
has gone idle" +msgstr " esta en linea" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy +msgid "%1
has logged out" +msgstr " esta en linea" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy +msgid "%1
is on the phone" +msgstr " esta en linea" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy +msgid "%1
is out for lunch" +msgstr " esta en linea" + +#: notification/newemailnotification.cpp:90 +#, fuzzy +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr " esta en linea" + +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Començar un &Meeting" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Missatge del sistema" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Especificar un missatge d'absencia" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" msgstr "" -#: notification/contactstatusnotification.cpp:73 +#: notification/notificationmanager.cpp:130 #, fuzzy -msgid "%1 is now busy" -msgstr " esta en linea" +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&Enviar un correu" -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr " esta en linea" - -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr " esta en linea" - -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr " esta en linea" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr " esta en linea" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr " esta en linea" - -#: notification/newemailnotification.cpp:78 -msgid "New email:
'%1'
by '%2'" +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -#: settings/accountpage.cpp:69 +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " esta escrivint." + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "" -#: settings/accountpage.cpp:70 -msgid "Browse and crop picture..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." msgstr "" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "Foto:" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "&Eliminar Contacte" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Preferéncies" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 #, fuzzy msgid "Account" msgstr "Comptes" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "Comptes" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Alertes" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "Notificació de correu" +msgid "Contact List" +msgstr "&Afegir contacte" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Parlant" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Guardar Registre" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Estás segur d'esborrar aquesta compta?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "Estás segur d'esborrar aquesta compta?" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Mostrar &Emoticones" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Estás segur d'esborrar aquesta compta?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Mostrar &Emoticones" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "Preferéncies" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Comptes" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "Notificació de correu" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "Guardar els registres en aquest directori:" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 -msgid "- %1 (%2)" +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." msgstr "" +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "&Afegir contacte" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "no s'ha rebut." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "no s'ha rebut." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "no s'ha rebut." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "no s'ha rebut." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Bloquejat" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Inserir una emoticona" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "Adreça de correu: " + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Bloquejat" + +#, fuzzy +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "La font dels teus missatges:" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "&Afegir contacte" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "Veure els contactes f&ora de linea" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "&Buscar un contacte" + +#~ msgid "Alerts" +#~ msgstr "Alertes" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "Notificació de correu" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "&Eliminar Grup" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "Enviant l'arxiu " + +#~ msgid "&Send email" +#~ msgstr "&Enviar un correu" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "Conectat" + +#~ msgid "Connect" +#~ msgstr "Conectar" + +#, fuzzy +#~ msgid "Rename group" +#~ msgstr "Re&nombrar grup" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "&Opcions del compte" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr " esta en linea" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr " esta en linea" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr " esta en linea" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr " esta en linea" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "Notificació de correu" + +#, fuzzy +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Mostrar notificacions cuan els contactes estan fora de linea" + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "Fora de linea" + +#, fuzzy +#~ msgid "S&end you a message" +#~ msgstr "Especificar un missatge d'absencia" + +#, fuzzy +#~ msgid "Go o&ffline" +#~ msgstr "Fora de linea" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "Adreça de correu:" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "" +#~ "Mostra una notificació cuan el correu rebut está a \"altres carpetes\"" + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "en una altra carpeta" + +#~ msgid "Hide popups after" +#~ msgstr "Amagar els popups despres" + +#~ msgid "seconds" +#~ msgstr "segons" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "Alertes" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "&Afegir contacte" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "Clau d'accés:" + +#, fuzzy +#~ msgid "Log &all chats" +#~ msgstr "Registrar tots els xats" + +#, fuzzy +#~ msgid "Month" +#~ msgstr "Mes" + +#~ msgid "Day" +#~ msgstr "Dia" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "&Afegir contacte" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "&Buscar un contacte" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Aquesta persona está Offline o Invisible." + +#, fuzzy +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "no s'ha rebut." + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "Mostrar/Amagar la barra de &contactes" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "Mostrar o amagar la barra de contactes" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "Mostrar o amagar la barra de contactes" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Afegir aquest contacte a la teva llista \"Friends\"" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "&Convidar" + +#, fuzzy +#~ msgid "Copy E&mail" +#~ msgstr "Correu" + +#~ msgid "Specify an Away message" +#~ msgstr "Especificar un missatge d'absencia" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "Correu" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "Afegir aquest contacte a la teva llista \"Friends\"" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "Correu" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "Afegir aquest contacte a la teva llista \"Friends\"" + +#, fuzzy +#~ msgid "Click" +#~ msgstr "Bloquejat" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Diseny web" + +#~ msgid "Co&nnect" +#~ msgstr "Co&nectar" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "&Opcions del compte" + +#~ msgid "Got synchronization" +#~ msgstr "Sincronitzat" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Preferéncies" + +#, fuzzy +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Vols acceptar l'arxiu: " + +#, fuzzy +#~ msgid "The transfer was cancelled" +#~ msgstr "Transferencia acceptada." + +#, fuzzy +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Arxiu transferit: " + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "error. No s'ha pogut obrir l'arxiu" + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "error. No es pot fer la conexió" + +#, fuzzy +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "La transferència de " + #~ msgid "Picture:" #~ msgstr "Foto:" @@ -4159,10 +6190,6 @@ msgstr "" #~ msgid "Speed:" #~ msgstr "Error en el server" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Mostra l'informació de l'email a la llista de contactes" - #~ msgid "Logging in..." #~ msgstr "Entrant al sistema" @@ -4189,10 +6216,6 @@ msgstr "" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "nous correus al compte" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "En linea" - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "error. No s'ha pogut obrir l'arxiu" @@ -4220,10 +6243,6 @@ msgstr "" #~ msgid "Your password:" #~ msgstr "La teva clau:" -#, fuzzy -#~ msgid "Display picture:" -#~ msgstr "Foto:" - #, fuzzy #~ msgid "Show notifications when you recei&ve an email" #~ msgstr "" @@ -4368,10 +6387,6 @@ msgstr "" #~ msgid "Show popup notifications for program events" #~ msgstr "Mostrar els globus de notificació per els events del programa" -#, fuzzy -#~ msgid "Connection good" -#~ msgstr "Conexió fallida" - #, fuzzy #~ msgid "Server too busy" #~ msgstr "El servidor está ocupat" @@ -4405,13 +6420,6 @@ msgstr "" #~ msgid "There may be a problem with the servers" #~ msgstr "Hi deu haver un problema amb els servers" -#~ msgid "System Message" -#~ msgstr "Missatge del sistema" - -#, fuzzy -#~ msgid "Show incoming server messages" -#~ msgstr "Mostrar gráfics en els missatges del xat" - #, fuzzy #~ msgid "Show outgoing server messages" #~ msgstr "Mostrar gráfics en els missatges del xat" @@ -4432,7 +6440,3 @@ msgstr "" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "Obtenir noves emoticones o &temes de so" - -#, fuzzy -#~ msgid "n&ame" -#~ msgstr "El teu nom" diff --git a/po/da.po b/po/da.po index 093df43..2531e43 100644 --- a/po/da.po +++ b/po/da.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: da\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2008-05-28 01:29+0200\n" "Last-Translator: Pascal d'Hermilly \n" "Language-Team: \n" @@ -17,429 +17,770 @@ msgstr "" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Tegnefilmshumørikoner" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "Klik her for at vise denne kontakts profil." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Vis tid i chat-beskeder" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Tegnefilmshumørikoner" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Specielle humørikoner" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "blink" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "Klik her for at vise denne kontakts profil." + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" msgstr "N&y linje" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "Send" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "Kontakter" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Chat" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Skjul sidebar" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +#, fuzzy +msgid "Click here to display the menu for this contact" msgstr "Klik her for at vise denne kontakts profil." -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +#, fuzzy +msgid "Click here to open your account settings" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "Stryg faneblad" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "Skriftfarve" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Ugyldig gruppe" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "Indtast e-postadressen til den person du vil tilføje her:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "E-postadresse" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "Du kan også vælge den gruppe hvor du vil placere den nye kontaktperson" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Initial group" -msgstr "Ugyldig gruppe" +msgid "Email address:" +msgstr "E-postadresse:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +#, fuzzy +msgid "Enter a shortcut for the emoticon:" msgstr "Skriv en genvej til dette humørikon" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "Vælg en billedfil:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "" "Skriv en besked der automatisk bliver vist til folk der skriver til dig" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 -msgid "&Automatic away message" +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +#, fuzzy +msgid "&Specify an automatic away message:" msgstr "&Automatisk Væk-besked" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "Søg efter Kontaktperson" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Chat-log" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "to" +msgstr "Bil" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Start eller Stop en &Samtale" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" msgstr "Tilføj denne kontaktperson til din \"Venne\"liste" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "Tilføj ikke denne kontakt, men lad vedkommende se din status" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "Blokere denne person fra at se din status og kontakte dig." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "Kontaktegenskaber for %1" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 -msgid "&Information" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 #, fuzzy -msgid "Restore" +msgid "&Information" +msgstr "Vis e-postinformation" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +#, fuzzy +msgid "Click this button to restore the display picture of this contact" +msgstr "Klik her for at vise denne kontakts profil." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" msgstr "Fjern" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Use alternative name for this person" +msgid "&Groups:" +msgstr "Gruppe" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" msgstr "Brug et alternativt navn til denne person" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 #, fuzzy -msgid "Show a popup when the contact goes online/offline" +msgid "Show a &popup when the contact goes online/offline" msgstr "Vis en pop-up-ballon når denne person går on- eller offline" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "Lyd:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Profilbillede:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 #, fuzzy msgid "&Clear Cache" msgstr "Stryg faneblad" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 #, fuzzy -msgid "Notes" +msgid "&Notes" msgstr "Node" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "Humørikoner" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +#, fuzzy +msgid "Click here to delete the selected emoticon" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "&Fjern" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "T&illad kontaktperson" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "Denne kontakt er ikke i din liste" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "%1 kontakter" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "Forbinder til %1 på port %2" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +#, fuzzy +msgid "Format" +msgstr "Ged" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "Kontakter" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +#, fuzzy +msgid "Select All" +msgstr "Markér &Alt" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +#, fuzzy +msgid "Deselect All" +msgstr "Markér &Alt" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "Forvirret" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Netværksvindue:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +#, fuzzy msgid "Command to Current Tab" -msgstr "" +msgstr "Luk faneblad" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 #, fuzzy msgid "Standard" msgstr "Stjerne" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "Send" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "Åben" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "Annuler" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "E-postadresse:" +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "&Ryd op" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "Forvirret" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Indtast e-postadressen til den person du vil tilføje her:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "Kodeord" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +#, fuzzy +msgid "Status at login:" msgstr "Login-status" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "Flere indstillinger" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -msgid " Account options " -msgstr " Konto indstillinger " +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +#, fuzzy +msgid "If enabled, KMess will save your account" +msgstr "Hvis valgt, logger KMess automatisk på denne konto." -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +#, fuzzy +msgid "Remem&ber account" msgstr "Husk denne profil" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" -msgstr "Husk også kodeordet" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "Husk Kodeord" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Forbind" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Indtast din personlige besked her" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +#, fuzzy +msgid "New Account" +msgstr "Ny &Konto" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +#, fuzzy +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Forbind" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +#, fuzzy +msgctxt "@title:menu" +msgid "&View" +msgstr "Se" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Handlinger" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "Ged" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Konti" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr " Konto indstillinger " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." msgstr "Indtast det navn som andre kontakter skal se når du er online." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "Kaldenavn" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +#, fuzzy msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" "Indtast din e-postadresse til din MSN-Passport konto. Du kan registrere en " "ny konto på http://register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "E-postadresse:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -447,45 +788,46 @@ msgstr "" "Indtast dit kodeord til din MSN-Passport konto. Du kan registrere en ny " "konto på http://register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "Kodeord" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "Husk Kodeord" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "Profilbillede:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." msgstr "S&kift" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." @@ -497,336 +839,647 @@ msgstr "" "Det er anbefalet at vælge denne indstillinge med mindre du bruger KMess som " "en gæst eller er på en offentlig computer(f.eks. en internetcafé)." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 #, fuzzy msgid "Re&member the settings of this account" msgstr "Husk denne kontos indstillinger" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "Hvis valgt, logger KMess automatisk på denne konto." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "Log ind med denne konto når programmet startes" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "Før log over alle samtaler" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 +#, fuzzy +msgid "" +"You can't change your friendly name because your Passport email address is " +"not verified." +msgstr "" +"Du kan ikke ændre dit venne-navn fordi din passport emailadresse ikke er " +"bekræftet." + +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 +msgid "Request verification email" +msgstr "Bed om bekræftigelses-e-post" + +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 +msgid "Go to accountservices.passport.net" +msgstr "Gå til accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 +#, fuzzy +msgid "" +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " "Hotmail account to connect." msgstr "" "Du skal bruge en passport konto for at forbinde til MSN Messenger netværket. " "Du kan registrere din eksistrende e-postadresse på register.passport.com " "eller bruge en hotmail konto til at forbinde." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +#, fuzzy msgid "" -"You can't change your friendly name because your passport e-mail address is " -"not verified." -msgstr "" -"Du kan ikke ændre dit venne-navn fordi din passport emailadresse ikke er " -"bekræftet." - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 -msgid "Request verification email" -msgstr "Bed om bekræftigelses-e-post" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 -msgid "https://accountservices.passport.net/" -msgstr "https://accountservices.passport.net/" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 -msgid "Go to accountservices.passport.net" -msgstr "Gå til accountservices.passport.net" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 -msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" "For at forbinde til MSN Messenger Service skal du registere en e-postadresse " "som en Passport konto." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "Registrer ny konto" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "Gå til register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 -msgid "Saved accounts:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "Klik" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" -"Klik her for at tilføje et nyt specielt humørikon som du kan sende til dine " -"kontakter." - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 #, fuzzy -msgid "&Add account..." +msgid "&Status Options" +msgstr "Login-status" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Hvis valgt vil din status automatisk blive ændret til \"Fraværende\" når du " +"ikke har brugt computeren i nogle minutter" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Skift status til \"Væk - fraværende\" når du er inaktiv" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"Kontrollerer antallet af minutter inden KMess ændrer din status til " +"\"Fraværende\"" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Bliv fraværende efter" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minutter" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 +#, fuzzy +msgid "Saved accounts:" +msgstr "Ny &Konto" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +#, fuzzy +msgid "&Add Account..." msgstr "Konti" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" msgstr "Vælg et humørikon og klik her for at slette det." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "Rediger" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +#, fuzzy +msgid "Select an account and click here to delete it" +msgstr "Vælg et humørikon og klik her for at slette det." + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "Fjern" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Pop-op bekendtgørelser" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "Chat-log" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "Gem chat til en &Fil" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Gem chat" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +#, fuzzy +msgid "Create a directory to organize chats by year" +msgstr "" +"KMess skaber automatisk undermapper når du vælger organiser chat-mapper " +"efter år, måned eller dag." + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "År" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +#, fuzzy +msgid "Create directories to organize chats by year then by month" +msgstr "" +"KMess skaber automatisk undermapper når du vælger organiser chat-mapper " +"efter år, måned eller dag." + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +#, fuzzy +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" +"KMess skaber automatisk undermapper når du vælger organiser chat-mapper " +"efter år, måned eller dag." + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Gem alle samtaler i den overliggende mappe" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "Vælg mappen på computeren hvor du vil gemme dine chat-logs" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "Gem chat-filer i denne ovenstående folder:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "Lader dig ændre temaet som KMess bruger til at vise alle chat-beskeder" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "Chat-stil:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "Indstillinger" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Tilllad humørikoner i chat-samtaler" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "Vis humørikoner" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Vis humørikoner" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +#, fuzzy +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Denne indstilling tillader dig at gruppere beskeder som en kontaktperson har " +"skrevet til dig men som var for store til at sende i en besked." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "&Gruppering af sammenhængende beskeder fra den samme kontakt" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Lader et tidstempel stå i hver chatbesked." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Vis tid i chat-beskeder" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "Kontakter" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "Vis bekendtgørelser når dine kontakter:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 -msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." -msgstr "" -"Hvis valgt bliver en pop-op besked også vist når dine kontakter forbinder " -"til MSN." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -msgid "&Go online" -msgstr "Gå online" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "" -"Hvis valgt bliver en pop-up besked også vist når dine kontakter går offline" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "Start en chat med dig" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" -"Hvis valgt bliver en pop-op besked vist når dine kontakter sender dig en " -"besked." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "Send dig en besked" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" -"Hvis valgt bliver en pop-op besked også vist når dine kontakter skifter " -"deres MSN status" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "Skift deres status" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" -"Hvis valgt bliver en hop-op besked også vist når dine kontakter går offline" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "Går offline" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Email Events" -msgstr "E-postadresse" +msgid "Show s&econds" +msgstr "Vis humørikoner" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 #, fuzzy -msgid "Show notifications when email is received:" -msgstr "Vis en notifikation når e-post er modtaget i \"andre foldere\"" +msgid "&Text" +msgstr "Kopier %tekst" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Dette er skrifttypen og farven brugt i dine chat-beskeder" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "Din meddelelses-skrifttype:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" -"Hvis valgt bliver en hop-op besked vist når du modtager en e-post i en anden " -"folder. Denne mulighed gælder kun for hotmail konti." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "Lader dig selv dikterer hvordan dine kontakters beskeder skal se ud." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "Tving andre kontakters meddelelser til at bruge denne skrifttype:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Stryg faneblad" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +#, fuzzy +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Tillader brug af skriftype effekte. Ved at skrive*fed*, /kursiv/ og " +"_understregning_ bliver hvert af ordene enten fed, kursiv eller understreget" + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +#, fuzzy +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "Brug skriftype effekter som *fed*, /kursiv/ og _understregning_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "Kontrollerer antallet af sekunder inden hop-op'er skjules" +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Skjul hop-op'er efter" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "sekunder" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "Advarsler" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Vis Offline Kontakter" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -841,1102 +1494,1404 @@ msgstr "" "slået til begrænser KMess stadig ryste effekten. Kontakter kan sende flere " "vink samtidigt men KMess ryster kun vinduet efter det første.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "Ryst chatvinduet når et vink modtages eller sendes" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Vis ikke et &profilbillede" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "Din kontaktliste har for mange grupper" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +#, fuzzy +msgid "Always" +msgstr "Væk" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +#, fuzzy +msgid "For contacts in the same group" +msgstr "Din kontaktliste har for mange grupper" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +#, fuzzy +msgid "Never" +msgstr "Nørd" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Profilbillede:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +#, fuzzy +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" "Hvis valgt bliver en hop-op besked vist når du modtager en e-post. Antallet " "af ulæste beskeder er vist over kontaktlisten. Denne mulighed gælder kun for " "hotmail konti." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 +#, fuzzy msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" "Hvis valgt informerer KMess dine kontakter om hvad du lytter til. Denne " "information hentes fra det musikprogram du kører." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" +msgid "Show contacts w&hich song I am listening to" msgstr "Fortæl mine kontakter hvilken sang jeg lytter til." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -#, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Hvis valgt vil din status automatisk blive ændret til \"Fraværende\" når du " -"ikke har brugt computeren i nogle minutter" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Skift status til \"Væk - fraværende\" når du er inaktiv" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"Kontrollerer antallet af minutter inden KMess ændrer din status til " -"\"Fraværende\"" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Bliv fraværende efter" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minutter" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "Hvis valgt bliver alle chat-samtaler gemt i en valgt mappe" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "Før log over alle samtaler" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "Vælg mappen på computeren hvor du vil gemme dine chat-logs" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Gem chat-filer i denne ovenstående folder:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" -"KMess skaber automatisk undermapper når du vælger organiser chat-mapper " -"efter år, måned eller dag." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "År" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Måned" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Dag" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Gem alle samtaler i den overliggende mappe" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "Lader dig ændre temaet som KMess bruger til at vise alle chat-beskeder" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Chat-stil:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Indstillinger" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Tilllad humørikoner i chat-samtaler" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Vis humørikoner" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Lader et tidstempel stå i hver chatbesked." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Vis tid i chat-beskeder" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Denne indstilling tillader dig at gruppere beskeder som en kontaktperson har " -"skrevet til dig men som var for store til at sende i en besked." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "&Gruppering af sammenhængende beskeder fra den samme kontakt" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Væk" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Din kontaktliste har for mange grupper" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Nørd" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "Dette er skrifttypen og farven brugt i dine chat-beskeder" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "Din meddelelses-skrifttype:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "Lader dig selv dikterer hvordan dine kontakters beskeder skal se ud." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Tving andre kontakters meddelelser til at bruge denne skrifttype:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Tillader brug af skriftype effekte. Ved at skrive*fed*, /kursiv/ og " -"_understregning_ bliver hvert af ordene enten fed, kursiv eller understreget" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "Brug skriftype effekter som *fed*, /kursiv/ og _understregning_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Venter på kontaktliste" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" msgstr "&Humørikon-temaer" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" msgstr "Tilgængelige humørikon-stile" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" msgstr "Specielle humørikoner" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" msgstr "Specielle humørikoner for denne konto" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "Tilføj &ny" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +#, fuzzy +msgid "Click here to add a new custom emoticon" msgstr "Klik her for at omdøbe det valgte humørikon" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Tilføj &ny" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +#, fuzzy +msgid "Click here to rename the selected emoticon" +msgstr "Klik her for at omdøbe det valgte humørikon" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" msgstr "O&mdøb" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "&Fjern" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 #, fuzzy msgid "Web Browser" msgstr "Vissen rose" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "&Automatisk Væk-besked" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "Postklient" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "Filoverførsler" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "Gem chat-filer i denne ovenstående folder:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 #, fuzzy msgid "and" msgstr "Ked af det" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "Filoverførsler" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "Dit navn" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "Din konto er bandlyst" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Jeg er væk fra computeren" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Dit navn" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "digselv@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "&Fjern" + +#: accountsmanager.cpp:404 +#, fuzzy +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Søvnig" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "" "Du kan ikke invitere fordi der allerede er flere kontakter i denne chat" -#: chat/chat.cpp:158 +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "%1 er kommet med i samtalen" -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "%1 har forladt samtalen" -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "%1 har forladt samtalen" -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr "%1 og %2 - Chat" -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr "%1 et al. - Chat" -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr " (denne meddelelse blev sendt automatisk)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" + +#: chat/chat.cpp:941 #, fuzzy -msgid "You received a wink from %1." +msgid "You have sent a wink" msgstr "Du har modtaget et blink fra %1" -#: chat/chat.cpp:971 +#: chat/chat.cpp:966 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "Blinket kunne ikke vises. Undersøg om du har 'cabextract' installeret" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 er blevet usynlig" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "%1 har sendt dig en offline besked: '%2'" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "%1 har sendt dig en offline besked: '%2'" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "%1 har sendt dig en håndskrevet besked!" + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." msgstr "Blinket kunne ikke vises. Det kunne ikke læses korrekt" -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1220 #, fuzzy -msgid "You have received a wink from %1" -msgstr "Du har modtaget et blink fra %1" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "Blinket kunne ikke vises. Undersøg om du har 'cabextract' installeret" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1230 #, fuzzy -msgid "You received a nudge from %1!" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "Blinket kunne ikke vises. Undersøg om du har 'cabextract' installeret" + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "Blinket kunne ikke vises. Det kunne ikke læses korrekt" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 har sendt dig et blink!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 er kommet med i samtalen" + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 er kommet med i samtalen" + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 har sendt dig et vink!" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "T&illad kontaktperson" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." msgstr "Du har modtaget et vink fra %1!" -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1381 #, fuzzy -msgid "The message '%1' could not be sent." +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Du har modtaget et blink fra %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 er kommet med i samtalen" + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1 har sendt dig en offline besked: '%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "Beskeden '%1' blev ikke sendt." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "Du har sendt et vink til %1!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "Du har sendt et vink!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 sender et blink: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 siger:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Start lyd-samtale. Lytter på %1" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "Tilføj dette humørikon: %1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Inviter" +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "&Forbind" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 +#, fuzzy msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" "Kunne ikke gemme chat-log. Undersøg om du har lov til at skrive i folderen " "hvor log-filerne bliver gemt. " -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 +#, fuzzy msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" "Filen '%1' eksisterer allerede. \n" "Vil du overskrive den?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Overskriv fil" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "Over&skriv" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." msgstr "Tilføj dette &Humørikon" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Tilføj dette &Humørikon" + +#: chat/chatview.cpp:833 msgid "Send &Email" msgstr "Send &E-post" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "&Kopier E-post" +#: chat/chatview.cpp:837 +#, fuzzy +msgid "Add &Contact" +msgstr "&Tilføj kontaktperson" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-postadresse" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "Besøg &Link" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "Kopier &Adresse" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +#, fuzzy +msgid "&Copy Text" msgstr "Kopier %tekst" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "Markér &Alt" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +#, fuzzy +msgid "C&lear Chat" +msgstr "Stryg faneblad" + +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Gem chat til en &Fil" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Chat" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Kontakter" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Humørikoner" + +#: chat/chatwindow.cpp:121 +#, fuzzy +msgid "My Emoticons" +msgstr "Mine humørikoner" + +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." +msgstr "" + +#: chat/chatwindow.cpp:331 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Luk faneblad" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "Luk faneblad" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "Luk faneblad" + +#: chat/chatwindow.cpp:409 +#, fuzzy +msgid "&Invite..." +msgstr "&Inviter" + +#: chat/chatwindow.cpp:410 +#, fuzzy +msgid "Send a &File..." msgstr "Send en &Fil" -#: chat/chatwindow.cpp:493 +#: chat/chatwindow.cpp:411 +#, fuzzy +msgid "Webcam Chat" +msgstr "Gem chat" + +#: chat/chatwindow.cpp:412 msgid "Start a &Meeting" msgstr "Start et &Møde" -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:413 msgid "Send a &Nudge!" msgstr "Send et &Vink" -#: chat/chatwindow.cpp:495 -msgid "Save chat" +#: chat/chatwindow.cpp:414 +#, fuzzy +msgid "Save Chat..." msgstr "Gem chat" -#: chat/chatwindow.cpp:496 -msgid "&Emoticons" -msgstr "Humørikoner" - -#: chat/chatwindow.cpp:498 +#: chat/chatwindow.cpp:415 #, fuzzy msgid "Close &All Tabs" msgstr "Luk faneblad" -#: chat/chatwindow.cpp:504 -msgid "Meeting" -msgstr "Møde" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "Vink" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "Start eller Stop en &Samtale" - -#: chat/chatwindow.cpp:568 +#: chat/chatwindow.cpp:420 msgid "Change &Font" msgstr "Skift &Skrifttype" -#: chat/chatwindow.cpp:569 +#: chat/chatwindow.cpp:421 msgid "Change Font &Color" msgstr "Skift Skrift&farve" -#: chat/chatwindow.cpp:576 -msgid "&Font" -msgstr "Skrifttype" - -#: chat/chatwindow.cpp:577 -msgid "Font &Color" -msgstr "Skriftfarve" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "Hjælp" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 -msgid "Emoticons" -msgstr "Humørikoner" - -#: chat/chatwindow.cpp:658 -msgid "My emoticons" -msgstr "Mine humørikoner" - -#: chat/chatwindow.cpp:738 -msgid "&Settings" -msgstr "Indstillinger" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "Brug &Stavekontrol" - -#: chat/chatwindow.cpp:742 +#: chat/chatwindow.cpp:428 msgid "Show &Emoticons" msgstr "Vis humørikoner" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -msgid "Hide Side&bar" -msgstr "Skjul sidebar" - -#: chat/chatwindow.cpp:744 +#: chat/chatwindow.cpp:429 #, fuzzy -msgid "Hide &Toolbar" -msgstr "Skjul sidebar" +msgid "Show S&tatus Messages" +msgstr "Vis tid i chat-beskeder" -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -msgid "Hide the contact sidebar" -msgstr "Skjul kontakt-sidebaren" +#: chat/chatwindow.cpp:435 +#, fuzzy +msgid "&Panels" +msgstr "Annuler" -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "Brug &Stavekontrol" + +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Møde" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Vink" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Send en &Fil" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Venter på kontaktliste" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakter" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Venter på kontaktliste" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Humørikoner" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Venter på kontaktliste" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mine humørikoner" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "Skrifttype" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "Skriftfarve" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "Stryg faneblad" + +#: chat/chatwindow.cpp:561 +#, fuzzy +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Start eller Stop en &Samtale" + +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" msgstr "" -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "Luk faneblad" +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "Luk faneblad" +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" -#: chat/chatwindow.cpp:1467 -msgid "Show Side&bar" -msgstr "Vis sidebar" +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" -#: chat/chatwindow.cpp:1468 -msgid "Show the contact sidebar" -msgstr "Vis kontakt-sidebaren" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 skriver" - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 og %2 skriver." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 og %3 andre skriver." - -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Tal" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - Chat" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "&Send e-post" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr "%1 skriver" + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr "%1 og %2 skriver." + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 og %3 andre skriver." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Start et &Møde" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" +msgstr "Send &E-post" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "&Vis profil" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Tilføj kontaktperson" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "T&illad kontaktperson" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "&Fjern kontaktperson" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Bloker kontaktperson" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "&Afbloker kontaktperson" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" msgstr "Kaldenavn" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "Personlig meddelelse" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" msgstr "E-postadresse" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" msgstr "&Kopier..." -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Blokeret" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 +#, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "Kontakten er %1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "Tilføj en kontaktperson" -#: chat/emoticonsidebar.cpp:213 -msgid "Insert new" -msgstr "" +#: chat/emoticonswidget.cpp:450 +#, fuzzy +msgid "Add New" +msgstr "Tilføj &ny" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 #, fuzzy msgid "Edit" msgstr "Rediger" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" msgstr "Fjern" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "Windows Mobile" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 msgid "Web Messenger" msgstr "Web Messenger" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "Office Communicator" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "Messenger Robot" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "MSN Messenger %1 kompatibel" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 #, fuzzy msgid "Windows Live Messenger %1" msgstr "Windows Live Messenger" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "Windows Live Messenger %1 Kompatibel" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 Kompatibel" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 Kompatibel" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Online" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Offline" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Tilladt" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Fjernet" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 (%2/%3)" - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 (%2/%3)" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Væk" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Er snart tilbage" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Optaget" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Usynlig" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Væk" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Væk med autosvar" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "Fraværende" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Er snart tilbage" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Taler i telefon" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Til frokost" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Usynlig" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Offline" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Min Status" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Af&bryd Forbindelsen" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" msgstr "Tilføj en kontaktperson" -#: dialogs/addcontactdialog.cpp:73 -msgid "No group" -msgstr "Ingen gruppe" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" msgstr "Tilføj nyt Humørikon" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "Humørikoner" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +#, fuzzy +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "Humørikonet \"%1\" eksisterer allerede. Vil du erstatte det?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "Vælg en Væk-besked" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" +msgstr "&Automatisk Væk-besked" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Chat-stil:" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Kunne ikke åbne en lokal port" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "Du er blevet tilføjet af nogen" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "" "%1\n" "har tilføjet dig til sin kontaktliste. Vil du:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Kontaktegenskaber for %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Forbundet" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "Vis tid i chat-beskeder" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "E-post: %1" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-postadresse:" -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "Klient: %1" -#: dialogs/networkwindow.cpp:79 -msgid "S&ave tab" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Klik her for at vise denne kontakts profil." + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kontakter" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "%1 kontakter" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "Kontaktegenskaber for %1" + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "Forbinder til %1 på port %2" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "" + +#: dialogs/listexportdialog.cpp:159 +#, fuzzy +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" +"Filen '%1' eksisterer allerede. \n" +"Vil du overskrive den?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "Venter på kontaktliste" + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" msgstr "Gem faneblad" -#: dialogs/networkwindow.cpp:80 -msgid "C&lear tab" +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" msgstr "Stryg faneblad" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:80 +#, fuzzy +msgid "C&lose All Tabs" +msgstr "Luk faneblad" + +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." @@ -1944,7 +2899,7 @@ msgstr "" "Ingen forbindelse.\n" "Kan ikke åbne Netværksvinduet." -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." @@ -1952,86 +2907,101 @@ msgstr "" "Kunne ikke gemme netværksvindue-loggen. Undersøg om du har skriverettigheder " "i den folder hvor logfilen gemmes." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "Kan ikke lukke hovedfanebladet" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 #, fuzzy msgid "Cannot send commands to this kind of connection!" msgstr "Kan ikke lukke hovedfanebladet" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "Annuleret" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "Fejlede!" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 msgid "Completed" msgstr "Færdig" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 #, fuzzy msgid "%1 of %2 received." msgstr "%1 af %2 modtaget" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 #, fuzzy msgid "%1 of %2 sent." msgstr "%1 af %2 sendt" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 -msgid "Cl&ean Up" -msgstr "&Ryd op" +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Forvirret" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Fjern" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Profilbillede:" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Profilbillede:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Er du sikker på du vil fjerne denne konto?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -2039,361 +3009,409 @@ msgstr "" "Kunne ikke gemme humørikon temaet. Undersøg om du har skriverettigheder i " "den folder du gemmer temaer i: '%1'." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Smil" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "blink" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Tungen ude" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "Stort smil" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Ked af det" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "Græder" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "Sur" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Forvirret" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "Forlegen" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "Skuffet" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "Varm" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "Vise tænder" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "Nørd" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "Syg" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Overrasket" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Fest" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "Søvnig" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "Tænker" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Sig det ikke til nogen" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "Hemligheds-fortælling" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "Ruller med øjnene" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "Sarkastisk" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "Det ved jeg ikke" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Er snart tilbage" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Engel" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Venstre knus" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Dreng" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Rødt hjerte" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Rød næse" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +#, fuzzy +msgid "Thumbs up" msgstr "Tommel op" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Hundeandsigte" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Sol" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Djævel" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Højre knus" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Pige" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Knust Hjerte" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "Vissen rose" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Tommel ned" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Katteandsigte" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "Sovende halvmåne" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Røde læber" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Klapper" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "Krydsede fingre" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Bil" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Flyvemaskine" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Skildpadde" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "Snegl" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Sort får" +#: emoticontheme.cpp:869 +#, fuzzy +msgid "Sheep" +msgstr "Søvnig" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Ged" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "Vampyrflagermus" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Øl-krus" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "Martini glas" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "kaffekop" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Fødselsdagskage" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Tallerken" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Skål" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Stjerne" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Regnbue" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Regnvejr" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Lyn" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Paraply" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Ø med træer" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "Telefonrør" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Mobiltelefon" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "E-post" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Ur" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "Filmstrip" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Node" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Håndjern" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Penge" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "Elpære" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +#, fuzzy +msgid "Cigarette" msgstr "Cigaret" -#: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "Fodbold" +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Gave med sløjfe" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Computer" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "KMess ikon" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Serveren er utilgængelig" + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "Serveren er utilgængelig" -#: initialview.cpp:377 +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" + +#: initialview.cpp:581 #, fuzzy -msgid "Connect" +msgctxt "Button label" +msgid "&Connect" msgstr "&Forbind" -#: initialview.cpp:382 +#: initialview.cpp:586 #, fuzzy -msgid "Disconnect" -msgstr "Af&bryd Forbindelsen" +msgctxt "Button label" +msgid "&Cancel" +msgstr "Annuler" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "Færre indstillinger... " +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "Flere indstillinger..." +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "E-postadresse" -#: kmess.cpp:223 +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "Vis e-postinformation" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Denne kontakt er allerede på din liste" + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "Ny &Gruppe" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Tilfø&j en gruppe" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Indtast navnet for denne gruppe:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" @@ -2401,567 +3419,1028 @@ msgstr "" "Er du sikker på du vil fjerne kontakten %1 fra din kontaktliste?" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" msgstr "&Fjern kontaktperson" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" msgstr "Fjern og blokér" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" "Er du sikker på du vil fjerne gruppen %1 fra din kontaktliste?" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "Fjern" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Dette er en særlig gruppe og kan ikke ændres" -#: kmess.cpp:671 -msgid "Rename group" -msgstr "&Omdøb gruppe" +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "O&mdøb gruppe" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Indtast navnet for denne gruppe:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "Godkendelse fejlede" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Forbinder..." + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Ikke forbundet" -#: kmess.cpp:1408 +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "" + +#: kmess.cpp:1475 #, fuzzy +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" "

KMess vil ikke kunne spille lyde og bekendtgørelser.

Kmess " "filen 'eventsrc' kunne ikke findes i en af de følgende foldere: %1

Undersøg din installation og kopier den manglende fil til en af de " "listede foldere.

" -#: kmess.cpp:1412 -msgid "Error with notifications" +#: kmess.cpp:1481 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Fejl i bekendtgørelser" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Handlinger" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "&Ny Kontaktperson" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Ny &Gruppe" - -#: kmessinterface.cpp:156 -msgid "Search for Contact" -msgstr "Søg efter Kontaktperson" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Søg på &Interesser" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "Søg efter Kontaktperson" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Ny &Konto" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Konto&opsætning" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "&Forbind" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "Af&bryd Forbindelsen" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "&Vis Min Profil" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Min Status" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Væk med autosvar" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "Se" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "Vis Tilla&dte Kontakter" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Vis Offline Kontakter" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "Vis F&jernede Kontakter" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &History Box" +msgstr "Chat-stil:" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Vis sidebar" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "Vis humørikoner" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "Profilbillede:" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "S&orter Kontakter Efter" + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Vis &Filoverførsel vinduet" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "&Ny Kontaktperson" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "Ny &Gruppe" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "Søg efter Kontaktperson" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "Søg efter Kontaktperson" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Søg på &Interesser" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Chat-stil:" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "Ny &Konto" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Ny &Konto" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "Smil" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "S&orter Kontakter Efter" - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "Gruppe" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Online / Offline" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "Vis &Filoverførsel vinduet" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "Vis &Netværksvindue" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "Lytter nu til %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" msgstr "" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" msgstr "" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "Chat" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Egenskaber" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" msgstr "Fjer&n fra gruppe" -#: kmessview.cpp:574 -msgid "&Listening Music" +#: kmessview.cpp:605 +msgid "Song &Name" msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "&Kopier til gruppe" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "&Flyt til gruppe" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "Flyt Gruppe &Ned" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Flyt Gruppe &Op" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "Fjer&n gruppe" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "O&mdøb gruppe" -#: kmessview.cpp:1053 -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "E-post: %1" +#: kmessview.cpp:1124 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Tilføj denne kontaktperson til din \"Venne\"liste" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-postadresse" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" msgstr "Klient: %1" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" +#: kmessview.cpp:1156 +#, fuzzy +msgid "No" +msgstr "Node" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokeret" + +#: kmessview.cpp:1179 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "" -#: kmessview.cpp:1085 +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Vis tid i chat-beskeder" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "Gruppe %1" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "%1 kontakter" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Kontakten er ikke online" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "Kontakten er ikke online" +msgstr[1] "Kontakten er ikke online" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 kontakter" +msgstr[1] "%1 kontakter" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2/%3)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "En MSN Messenger klient til KDE" -#: main.cpp:70 +#: main.cpp:46 +#, fuzzy +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 #, fuzzy msgid "Project support" msgstr "P4-Context field support" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "GnomeMeeting udvikler" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "Tysk oversættelse, test, dokumentation og netside osv." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "Webdesign" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "" "Det oprindelige- og gul/blå/violet humørikonsættet og italiensk oversættelse" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Tegnefilmshumørikoner" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Oprindeligt lydtema" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arabisk oversættelse, internationalisering af gem-fil ordning" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "Mere arabisk oversættelse" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Brasilliansk / Portugisisk oversættelse" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Brasilliansk / Portugisisk oversættelse" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Katalansk oversættelse" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "Simpelt kinesisk oversættelse, fil send-bug-fix, proxy-connect kode" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "Mere simpel kinesisk oversættelse" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "Traditionel kinesisk oversættelse" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Traditionel kinesisk oversættelse" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 msgid "Danish translation" msgstr "Dansk oversættelse" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 msgid "More Danish translation" msgstr "Mere dansk oversættelse" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "Hollandsk oversættelse" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "Mere hollandsk oversættelse" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Mere arabisk oversættelse" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Mere fransk oversættelse" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 msgid "Estonian translation" msgstr "Estisk oversættelse" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 msgid "Finnish translation" msgstr "Finsk oversættelse" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "Mere finsk oversættelse" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "Fransk oversættelse" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 msgid "More French translation, MSN6 emoticon definitions" msgstr "Mere Fransk oversættelse, MSN6 humørikon-definitioner" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" msgstr "Mere fransk oversættelse" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "Ungarsk oversættelse" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Ungarsk oversættelse" + +#: main.cpp:115 main.cpp:116 msgid "More Italian translation" msgstr "Mere italiensk oversættelse" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "Koreansk oversættelse" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 msgid "Norsk Bokmål translation" msgstr "Norsk Bokmål oversættelse" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Slovensk oversættelse" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "Slovensk oversættelse" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "Slovensk oversættelse" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Spansk oversættelse" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 msgid "More Spanish translation" msgstr "Mere spansk oversættelse" -#: main.cpp:123 -msgid "Swedish translation" -msgstr "Svensk oversættelse" - -#: main.cpp:125 -msgid "Thai translation" -msgstr "Thai oversættelse" - #: main.cpp:126 -msgid "Turkish translation" -msgstr "Tyrkisk oversættelse" +msgid "Alejandro Araiza Alvarado" +msgstr "" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "Mere türkisk oversættelse" +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" -msgstr "Billeder i kontaktliste-kode, kontakt-klient info, chat tekst zoom" +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "Svensk oversættelse" + +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Filoverførsler" - -#: main.cpp:134 -msgid "P4-Context field support" -msgstr "P4-Context field support" +msgid "More Swedish translation" +msgstr "Svensk oversættelse" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Xinerama ordninger" - -#: main.cpp:136 -msgid "Original file receive code" -msgstr "Original filmodtagelseskode" - -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Rachan Hongpairote" msgstr "" -#: main.cpp:138 -#, fuzzy -msgid "KWallet support" -msgstr "P4-Context field support" +#: main.cpp:135 +msgid "Thai translation" +msgstr "Thai oversættelse" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Tyrkisk oversættelse" + +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "Mere türkisk oversættelse" + +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "Går Online" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "Billeder i kontaktliste-kode, kontakt-klient info, chat tekst zoom" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Filoverførsler" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "P4-Context field support" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Xinerama ordninger" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "Original filmodtagelseskode" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +#, fuzzy +msgid "KWallet support" +msgstr "P4-Context field support" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "Chat-stil:" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "Forskellige internationaliseringsordninger" -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Forskellige internationaliseringsordninger" -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "GnomeMeeting udvikler" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Mand med pose over hovedet" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspiration og forskelligt kode" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "" "Gammel Hopop ballon-kode, oprindelig p2p kode, msn udfordrings-varetager" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Fraværstællerkode" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 #, fuzzy msgid "Close-to-tray icon screenshot code" msgstr "Kode for screenshot af Luk-til-systembakke-ikon" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" msgstr "Dit navn her?" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" @@ -2970,29 +4449,43 @@ msgstr "" "Du er velkommen til at poste dine fejlmeldinger og/eller rettelser på KMess " "hjælp-forumet!Hvis du føler dit navn mangler her, så kontakt os også!" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Dit navn" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "Din e-postadresse:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Log automatisk på med den givne e-post adresse" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Tilladt" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Fjernet" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "Kontakten har annulleret sessionen" @@ -3010,61 +4503,113 @@ msgstr "Du har afvist invitationen" #: network/applications/application.cpp:540 #, fuzzy -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "Vil du acceptere eller annulere" #: network/applications/application.cpp:581 #, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "Klik for at annulere." -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Vil du acceptere filen: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Filen '%1' eksisterer allerede. \n" +"Vil du overskrive den?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "Overførslen af %1 fejlede. Kunne ikke åbne filen." -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "Overførslen af %1 fejlede. Kunne ikke åbne filen." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Overførsel accepteret" -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "Forbinder til %1 på port %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "Overførsel blev annulleret" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakten annulerede overførslen" -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "Du har annulleret invitationen" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "Du har annulleret invitationen" + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Forbindelsen er etableret" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy +msgid "Successfully sent file "%1"." msgstr "Korrekt overført fil: %1" -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy +msgid "Successfully received file "%1"." +msgstr "Korrekt overført fil: %1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "Overførslen af %1 fejlede. Filen eksisterer ikke." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "Overførslen af %1 fejlede. Filen kunne ikke læses." -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "Sender fil %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy +msgid "Sending file "%1" (%2)." +msgstr "Sender fil %1 (%2)" -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Kontakten annulerede overførslen" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "Forhandler indstillinger til forbindelsen" @@ -3076,72 +4621,14 @@ msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "" "Filoverførsels-invitationen blev annulleret. Fejlagtige data blev modtaget." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"Filen '%1' eksisterer allerede. \n" -"Vil du overskrive den?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "Overførslen af %1 fejlede. Kunne ikke åbne filen." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Kontakten annulerede overførslen" - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Du har annulleret invitationen" - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "Filen kunne ikke skrives" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Korrekt overført fil: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Korrekt overført fil: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "Overførslen af %1 fejlede. Filen eksisterer ikke." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "Overførslen af %1 fejlede. Filen kunne ikke læses." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Sender fil %1 (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Kontakten annulerede overførslen" - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Du er inviteret til at starte et møde (ved hjælp af GnomeMeeting)" @@ -3154,29 +4641,29 @@ msgstr "Starter GnomeMeeting. Forbinder til %1" msgid "Inviting the contact to a meeting." msgstr "Inviterer personen til et møde" -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" "Invitationen blev afvist. Den er ikke understøttet af kontaktens program" -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "Invitationen mislykkedes. En intern fejl opstod." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "Invitationen mislykkedes. Tiden løb ud inden brugeren accepterede." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "Invitationen mislykkedes. Tiden løb ud da KMess ikke modtog nogle data" -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "Invitationen mislykkedes. Sammenkobleren lukkede chat-forbindelsen" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Invitationen mislykkedes." @@ -3188,25 +4675,18 @@ msgstr "Du er inviteret til at dele denne persons skrivebord." msgid "Starting KRDC. Connecting to %1." msgstr "Starter KRDC. Forbinder til %1" -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kontakten afviste invitationen. En intern fejl opstod" +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" +"Kontaktpersonen har brugt en MSN6 feature som KMess ikke kan bruge endnu," -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "Overførslen fejlede." - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." @@ -3214,67 +4694,50 @@ msgstr "" "Invitationen blev annulleret. Kontakten sendte enten fejlagtige data eller " "også understøtter KMess den ikke endnu" -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"Overførslen fejlede.Kontakten sendte enten fejlagtige data eller også " -"understøtter KMess den ikke endnu" - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Overførslen fejlede. Tiden løb ud inden brugeren accepterede" - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "Overførslen fejlede. En intern fejl opstod" - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "Overførslen fejlede. Kunne ikke åbne data-kilden" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" -"Kontaktpersonen har brugt en MSN6 feature som KMess ikke kan bruge endnu," - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "Overførslen fejlede. Data-forbehandling fejlede" -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." msgstr "Invitationen blev annulleret. Beskeden var ikke tilment dig. " -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" "Overførslen fejlede.Kontakten sendte enten fejlagtige data eller også " "understøtter KMess det ikke endnu." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakten afviste invitationen. En intern fejl opstod" + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "Venter på forbindelse på %1på port %2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "Overgår til indirekte filoverførsel(dette kan være langsomt)" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "Venter på forbindelse" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "Invitationen blev annulleret. Tiden løb ud inden brugeren accepterede" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." @@ -3282,11 +4745,35 @@ msgstr "" "Overførslen fejlede. Tiden løb ud inden programmet fandt ud af at " "forbindelsen havde lykkedes eller fejlet" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "Invitationen blev annulleret. Tiden løb ud inden data blev modtaget." +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Overførslen fejlede." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Overførslen fejlede.Kontakten sendte enten fejlagtige data eller også " +"understøtter KMess den ikke endnu" + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Overførslen fejlede. Tiden løb ud inden brugeren accepterede" + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Overførslen fejlede. En intern fejl opstod" + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "Overførslen fejlede. Kunne ikke åbne data-kilden" + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "Du er inviteret til at starte en lyd-samtale" @@ -3318,153 +4805,127 @@ msgstr "Start lyd-samtale. Lytter på %1" msgid "Inviting the contact to a voice conversation." msgstr "Inviterer personen til en lyd-samtale" -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "Kontakten inviterer dig til '%1', men det er ikke understøttet endnu." -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "" +"Filoverførsels-invitationen blev annulleret. Fejlagtige data blev modtaget." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:138 +#, fuzzy +msgid "You are invited to view this person's webcam." +msgstr "Du er inviteret til at dele denne persons skrivebord." + +#: network/applications/webcamtransferp2p.cpp:147 msgid "webcam" msgstr "webcam" -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "Overførslen af %1 blev annulleret" - #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "Fejlede" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Sender fil %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "Overførslen af %1 fejlede. Kunne ikke åbne en lokal port." -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." msgstr "Kunne ikke åbne en lokal port" -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Indleder filoverførsel" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy +msgid "The transfer of %1 failed. A connection could not be made." msgstr "Overførslen af %1 fejlede. Der kunne ikke forbindes." -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "Kunne ikke skabe en forbindelse" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "Modtager fil %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "KMess kunne ikke få tilgang til den eksterne webservice." - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Din forbindelse er afbrudt fordi der blev \n" -"forbundet til MSN fra en anden klient eller \n" -"et andet sted." - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Fik synkronisering" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Kontrolerer brugernavn og kode" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "Venter på kontaktliste" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "" -"Godkendelse fejlede. Undersøg om du har angivet rigtigt brugernavn og kodeord" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Forbinder..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess modtog en ukendt kommando fra serveren: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "E-postadressen du har prøvet at tilføje er ikke en MSN Messenger konto" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "Domænenavnet mangler" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "Allerede logget ind" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" +#: network/msnconnection.cpp:404 +#, fuzzy +msgid "The given account name is invalid" msgstr "Det givne brugernavn er ugyldigt" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 +#, fuzzy msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" "Brugernavnet er ugyldigt eller dit passport er ikke blevet bekræftet endnu." -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "Din kontaktliste er fyldt op" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "Denne kontakt er allerede på din liste" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "Denne kontakt er ikke i din liste" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "Kontakten er ikke online" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "Allerede i denne tilstand" -#: network/msnnotificationconnection.cpp:2243 -msgid "Contact is in the opposite list" -msgstr "Kontakten er i den modsatte liste" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 #, fuzzy msgid "" "The group name is already added to your Messenger or Hotmail contact list. " @@ -3472,514 +4933,742 @@ msgid "" msgstr "" "Gruppenavnet bruges allerede i din Messenger eller Hotmail kontaktliste." -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:444 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "Din kontaktliste har for mange grupper" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "Denne gruppe kan ikke ændres" -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "Din kontaktliste har for mange grupper" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "Denne gruppe er ikke tom" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "Gruppenavnet er for langt" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "Forsøgte at ændre gruppe \"0\"" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "Der var en intern fejl i KMess: %1" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 msgid "Invalid Group" msgstr "Ugyldig gruppe" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "Sammenkobleren fejlede" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "Overførsel til sammenkobler-server fejlede" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Direkte forbindelse (MSNSLP) fejl, forbindelsen fejlede" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "Nødvendigt felt mangler" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "Ikke logget ind" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Specielle humørikoner for denne konto" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "Din konto er bandlyst" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "Overførslen fejlede." -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 #, fuzzy msgid "You are opening chat sessions too fast" msgstr "Du åbner sessioner for hurtigt" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "Du har for mange sessioner åbne" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "Dårligt kaldenavn" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +#, fuzzy +msgid "The server reports KMess is flooding it with too much data" msgstr "Serveren siger at KMess sender for mange data." -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "Godkendelse fejlede" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "Du kan ikke snakke med nogen når du er usynlig." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 #, fuzzy msgid "Not accepting new contacts" msgstr "Modtager ikke flere overhoveder." -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 #, fuzzy msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" "Du har et børne-passport. Du skal have en forældres godkendelse for at " "chatte online" -#: network/msnnotificationconnection.cpp:2371 +#: network/msnconnection.cpp:569 #, fuzzy -msgid "Your passport account needs to be verified first." +msgid "Your Passport account needs to be verified first." msgstr "Dit passport skal først bekræftes" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "Fejl ved hentning af kontaktlisten. Prøv igen senere. " -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "Der var en intern serverfejl" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Medelelses-server nede" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "Serveren går ned" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "Serveren går snart ned" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "Skrivning er blokeret" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "Session er overbelastet" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "Serveren er utilgængelig" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Godkendelse fejlede" -#: network/msnnotificationconnection.cpp:2449 +#: network/msnconnection.cpp:642 #, fuzzy -msgid "Unknown error code received from the server: %1" +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "KMess modtog en ukendt kommando fra serveren: %1" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 #, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" msgstr "KMess - MSN fejl" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "Kontrolerer brugernavn og kode" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "Godkendelse fejlede" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Forbinder..." + +#: network/msnnotificationconnection.cpp:1949 +#, fuzzy +msgid "Unknown command received from the server: %1" +msgstr "KMess modtog en ukendt kommando fra serveren: %1" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "minutter" msgstr[1] "minutter" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 #, fuzzy msgid "Server closes for maintenance in %1!" msgstr "Advarsel: Serveren lukker for vedligeholdese om %1 minutter!" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 #, fuzzy msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" "MSN serveren har annonceret at den lukker ned for vedligeholdese om ét minut." -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 +#: network/msnnotificationconnection.cpp:2318 #, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "KMess kan ikke behandle Offline-IM beskeder.

Detaljer: %1" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "Godkendelse fejlede" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Venter på kontaktliste" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "Der var en intern fejl i KMess: %1" -#: network/msnnotificationconnection.cpp:3242 +#: network/msnnotificationconnection.cpp:2916 #, fuzzy -msgctxt "Login error message, with more details for developer versions" +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" +"Godkendelse fejlede. Undersøg om du har angivet rigtigt brugernavn og kodeord" + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2932 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"Din forbindelse er afbrudt fordi der blev \n" +"forbundet til MSN fra en anden klient eller \n" +"et andet sted." + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" "KMess kunne ikke forbinde til MSN Messenger serverne. Serverne kan være " "midlertidigt utilgænglige eller der kan være et problem med din " "internetforbindelse" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2968 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"KMess kunne ikke forbinde til MSN Messenger serverne. Serverne kan være " +"midlertidigt utilgænglige eller der kan være et problem med din " +"internetforbindelse" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "Forbindelsen til serveren gik tabt" -#: network/msnnotificationconnection.cpp:3302 -#, fuzzy +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -"Autencitet fejlede. KMess kunne ikke logge dig på \n" -"\n" -"Detaljer: %1" -#: network/msnsockethttp.cpp:765 +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 #, fuzzy -msgid "SSL Error" -msgstr "Serverfejl" +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "Der var en intern fejl i KMess: %1" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "Forbindelsen er etableret" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "Ping tabt" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "%1 ping tabt" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." +#: network/msnsockettcp.cpp:395 +#, fuzzy +msgid "The connection to the server was lost" msgstr "Forbindelsen til serveren gik tabt" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Personen er offline eller usynlig." +#: network/soap/addressbookservice.cpp:777 +#, fuzzy +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "E-postadressen du har prøvet at tilføje er ikke en MSN Messenger konto" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" -"Kontakten har started eb MSN7 feature som KMess ikke understøtter endnu." +#: network/soap/addressbookservice.cpp:787 +#, fuzzy +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "E-postadressen du har prøvet at tilføje er ikke en MSN Messenger konto" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "Beskeden \"%1\" blev ikke modtaget!" - -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "Kunne ikke forbinde: %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Serveren er utilgængelig" + +#: network/soap/httpsoapconnection.cpp:471 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "For mange videresendelser fra login-servicen" -#: notification/chatnotification.cpp:163 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "In %1's chat: %2" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Serveren er utilgængelig" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" msgstr "I %1s chat: %2" -#: notification/chatnotification.cpp:167 +#: notification/chatnotification.cpp:158 #, fuzzy -msgid "%1 says:
'%2'" +msgid "%1 says:
'%2'" msgstr "%1 siger:
'%2'" -#: notification/chatnotification.cpp:171 +#: notification/chatnotification.cpp:162 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgid "%1 has sent you an offline message:
'%2'" msgstr "%1 har sendt dig en offline besked: '%2'" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:169 #, fuzzy msgid "%1's chat requests attention!" msgstr "%1s chat beder om din opmærksomhed!" -#: notification/chatnotification.cpp:183 +#: notification/chatnotification.cpp:174 #, fuzzy -msgid "%1:
%2" +msgid "%1:
%2" msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr "%1 har sendt dig en håndskrevet besked!" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr "%1 har sendt dig et vink!" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr "%1 har sendt dig et blink!" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 #, fuzzy msgid "%1 wants to use the webcam!" msgstr "%1 vil bruge webcam!" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr "%1 sender dig en fil!" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr "%1 har sendt dig en invitation!" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "Du har annulleret invitationen" -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "%1 annullerede fil-overførslen!" -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 #, fuzzy msgid "%1's activity has been canceled!" msgstr "%1s aktivitet er blevet annulleret!" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "%1 har accepteret at bruge webcam!" -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "%1 har accepteret filoverførslen!" -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr "%1 har accepteret din invitation!" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "%1 har afsluttet webcamsessionen." -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "Filoverførslen fra %1 er afsluttet!" -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 #, fuzzy msgid "%1's activity has ended!" msgstr "%1s aktivitet er afsluttet!" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 #, fuzzy msgid "%1's webcam session has failed!" msgstr "%1s webcamsession fejlede!" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "Overførslen af %1 blev annulleret" -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 #, fuzzy msgid "%1's activity has ended with an error!" msgstr "%1s aktivitet endte med en fejl!" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" -msgstr "%1 er nu online" +msgid "%1
is now online" +msgstr "%1:
%2" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" -msgstr "%1 er gået" +msgid "%1
has gone away" +msgstr "%1:
%2" -#: notification/contactstatusnotification.cpp:72 +#: notification/contactstatusnotification.cpp:93 #, fuzzy -msgid "%1 will be right back" +msgid "%1
will be right back" msgstr "%1 kommer snart tilbage" -#: notification/contactstatusnotification.cpp:73 +#: notification/contactstatusnotification.cpp:94 #, fuzzy -msgid "%1 is now busy" -msgstr "%1 har travlt" +msgid "%1
is now busy" +msgstr "%1:
%2" -#: notification/contactstatusnotification.cpp:74 +#: notification/contactstatusnotification.cpp:95 #, fuzzy -msgid "%1 has become invisible" +msgid "%1
has become invisible" msgstr "%1 er blevet usynlig" -#: notification/contactstatusnotification.cpp:75 +#: notification/contactstatusnotification.cpp:96 #, fuzzy -msgid "%1 has gone idle" -msgstr "%1 gør ingenting" +msgid "%1
has gone idle" +msgstr "%1:
%2" -#: notification/contactstatusnotification.cpp:76 +#: notification/contactstatusnotification.cpp:97 #, fuzzy -msgid "%1 has logged out" +msgid "%1
has logged out" msgstr "%1 er logget ud" -#: notification/contactstatusnotification.cpp:77 +#: notification/contactstatusnotification.cpp:98 #, fuzzy -msgid "%1 is on the phone" +msgid "%1
is on the phone" msgstr "%1 snakker i telefon" -#: notification/contactstatusnotification.cpp:78 +#: notification/contactstatusnotification.cpp:99 #, fuzzy -msgid "%1 is out for lunch" +msgid "%1
is out for lunch" msgstr "%1 er ude og spise frokost" -#: notification/newemailnotification.cpp:78 +#: notification/newemailnotification.cpp:90 #, fuzzy -msgid "New email:
'%1'
by '%2'" +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" msgstr "Ny email:
'%1'
af '%2'" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Start et &Møde" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Personlig meddelelse" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Send dig en besked" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Djævel" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Send &E-post" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "" + +#: notification/systemtraywidget.cpp:78 +#, fuzzy +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Når du lukker hovedvinduet vil KMess blive ved med at køre i systembakken. " +"Brug 'Afslut' fra 'Forbind' menuen for at afslutte programmet." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Lægger sig i systembakken" + +#: notification/systemtraywidget.cpp:240 +#, fuzzy +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 (%2/%3)" + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "Gennemse..." -#: settings/accountpage.cpp:70 +#: settings/accountpage.cpp:81 #, fuzzy -msgid "Browse and crop picture..." +msgid "Browse and Crop Picture..." msgstr "gennemse og beskær billede..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "Downloading af profilbillede fejlede" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 #, fuzzy msgid "" "An error occurred when trying to change the display picture.\n" @@ -3988,158 +5677,746 @@ msgstr "" "En fejl opstod da du prøvede at ændre profilbilledet.\n" "Undersøg om det er en korrekt billed fil." -#: settings/accountsettingsdialog.cpp:56 -msgid "&Delete" -msgstr "&Fjern" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Indstillinger" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "Konti" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" msgstr "Min Konto" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Advarsler" +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Kontakter" -#: settings/accountsettingsdialog.cpp:81 -msgid "Alerts and Notifications" -msgstr "Alarmer og bekendtgørelser" - -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Samtale" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Chat-log" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 #, fuzzy msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "Kontakt-adressen du har indtastet er ikke korrekt: '%1'" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 #, fuzzy msgid "The email address you have entered is already in use: '%1'" msgstr "Kontakt-adressen du har indtastet er ikke korrekt: '%1'" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Er du sikker på du vil fjerne denne konto?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "Er du sikker på du vil fjerne denne konto?" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "Hej, hvordan går det? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "Stacy" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "Fint!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "Jeg er /lige/ kommet tilbage fra min ferie i Italien!" -#: settings/emoticonspage.cpp:122 +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "" + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" msgid "Replace Existing Emoticon" msgstr "Erstat eksisterende humørikon" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Er du sikker på du vil fjerne denne konto?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Humørikoner" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "Indstillinger" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 #, fuzzy msgid "Accounts" msgstr "Konti" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "E-postnotifikation" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "Gem chat-filer i denne ovenstående folder:" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"Når du lukker hovedvinduet vil KMess blive ved med at køre i systembakken. " -"Brug 'Afslut' fra 'Forbind' menuen for at afslutte programmet." -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Lægger sig i systembakken" +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" -#: systemtraywidget.cpp:245 +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 (%2/%3)" +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "Kontakt-adressen du har indtastet er ikke korrekt: '%1'" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Kontakter" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Vælg et humørikon og klik her for at slette det." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Beskeden '%1' blev ikke sendt." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "Beskeden '%1' blev ikke sendt." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Beskeden '%1' blev ikke sendt." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Beskeden '%1' blev ikke sendt." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Forvirret" + +#~ msgid "&Copy..." +#~ msgstr "&Kopier..." + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "E-postadresse:" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Klient: %1" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Blokeret" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "Kontakter" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "Vis Offline Kontakter" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "Venter på kontaktliste" + +#, fuzzy +#~ msgid "Enable in the chat windows" +#~ msgstr "Venter på kontaktliste" + +#~ msgid "Alerts" +#~ msgstr "Advarsler" + +#~ msgid "Alerts and Notifications" +#~ msgstr "Alarmer og bekendtgørelser" + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "" +#~ "Du kan også vælge den gruppe hvor du vil placere den nye kontaktperson" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Ingen gruppe" + +#, fuzzy +#~ msgid "Now listening to: %1" +#~ msgstr "Lytter nu til %1" + +#, fuzzy +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "KMess kunne ikke få tilgang til den eksterne webservice." + +#, fuzzy +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "Autencitet fejlede. KMess kunne ikke logge dig på \n" +#~ "\n" +#~ "Detaljer: %1" + +#, fuzzy +#~ msgid "Close all tabs" +#~ msgstr "Luk faneblad" + +#~ msgid "&Send email" +#~ msgstr "&Send e-post" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "Gem chat" + +#, fuzzy +#~ msgid "C&lose all tabs" +#~ msgstr "Luk faneblad" + +#, fuzzy +#~ msgid "Connect" +#~ msgstr "&Forbind" + +#~ msgid "Rename group" +#~ msgstr "&Omdøb gruppe" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "Konto&opsætning" + +#, fuzzy +#~ msgid "Select an emoticon and click here to delete it" +#~ msgstr "Vælg et humørikon og klik her for at slette det." + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 er nu online" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 er gået" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 har travlt" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 gør ingenting" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "Pop-op bekendtgørelser" + +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Vis bekendtgørelser når dine kontakter:" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "" +#~ "Hvis valgt bliver en pop-op besked også vist når dine kontakter forbinder " +#~ "til MSN." + +#~ msgid "&Go online" +#~ msgstr "Gå online" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "" +#~ "Hvis valgt bliver en pop-up besked også vist når dine kontakter går " +#~ "offline" + +#~ msgid "Start a &chat with you" +#~ msgstr "Start en chat med dig" + +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "" +#~ "Hvis valgt bliver en pop-op besked vist når dine kontakter sender dig en " +#~ "besked." + +#~ msgid "S&end you a message" +#~ msgstr "Send dig en besked" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when your contacts change their MSN " +#~ "status." +#~ msgstr "" +#~ "Hvis valgt bliver en pop-op besked også vist når dine kontakter skifter " +#~ "deres MSN status" + +#~ msgid "Change their &status" +#~ msgstr "Skift deres status" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts goes " +#~ "offline." +#~ msgstr "" +#~ "Hvis valgt bliver en hop-op besked også vist når dine kontakter går " +#~ "offline" + +#~ msgid "Go o&ffline" +#~ msgstr "Går offline" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "E-postadresse" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "Vis en notifikation når e-post er modtaget i \"andre foldere\"" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in the Inbox. " +#~ "This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Hvis valgt bliver en hop-op besked vist når du modtager en e-post i en " +#~ "anden folder. Denne mulighed gælder kun for hotmail konti." + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in other " +#~ "folders. This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Hvis valgt bliver en hop-op besked vist når du modtager en e-post i en " +#~ "anden folder. Denne mulighed gælder kun for hotmail konti." + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "Advarsler" + +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "Kontrollerer antallet af sekunder inden hop-op'er skjules" + +#~ msgid "Hide popups after" +#~ msgstr "Skjul hop-op'er efter" + +#~ msgid "seconds" +#~ msgstr "sekunder" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "Advarsler" + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "" +#~ "Kontakten har started eb MSN7 feature som KMess ikke understøtter endnu." + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Kontakter" + +#~ msgid "Also r&emember the password" +#~ msgstr "Husk også kodeordet" + +#, fuzzy +#~ msgid "" +#~ "If enabled, all chat conversations will be saved in the specified " +#~ "directory." +#~ msgstr "Hvis valgt bliver alle chat-samtaler gemt i en valgt mappe" + +#~ msgid "Log &all chats" +#~ msgstr "Før log over alle samtaler" + +#~ msgid "Month" +#~ msgstr "Måned" + +#~ msgid "Day" +#~ msgstr "Dag" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "%1 kontakter" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "Søg efter Kontaktperson" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Personen er offline eller usynlig." + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "Beskeden \"%1\" blev ikke modtaget!" + +#~ msgid "Hide Side&bar" +#~ msgstr "Skjul sidebar" + +#~ msgid "Hide the contact sidebar" +#~ msgstr "Skjul kontakt-sidebaren" + +#~ msgid "Show the contact sidebar" +#~ msgstr "Vis kontakt-sidebaren" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Kontakten er %1" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "&Inviter" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "Kunne ikke forbinde: %1" + +#, fuzzy +#~ msgid "" +#~ "Click here to add a new custom emoticon which can be sent to your contacts" +#~ msgstr "" +#~ "Klik her for at tilføje et nyt specielt humørikon som du kan sende til " +#~ "dine kontakter." + +#~ msgid "Black sheep" +#~ msgstr "Sort får" + +#~ msgid "Copy E&mail" +#~ msgstr "&Kopier E-post" + +#~ msgid "Specify an Away message" +#~ msgstr "Vælg en Væk-besked" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "E-post: %1" + +#~ msgid "Soccer ball" +#~ msgstr "Fodbold" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "Denne kontakt er allerede på din liste" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "E-post: %1" + +#~ msgid "Contact is in the opposite list" +#~ msgstr "Kontakten er i den modsatte liste" + +#~ msgid "The group name is too long" +#~ msgstr "Gruppenavnet er for langt" + +#, fuzzy +#~ msgid "No permissions given for this account" +#~ msgstr "Specielle humørikoner for denne konto" + +#~ msgid "Enter your personal message here" +#~ msgstr "Indtast din personlige besked her" + +#~ msgid "Click" +#~ msgstr "Klik" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "Netværksvindue:" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Windows Live Messenger %1 Kompatibel" + +#~ msgid "Co&nnect" +#~ msgstr "&Forbind" + +#, fuzzy +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "Venter på kontaktliste" + +#, fuzzy +#~ msgid "SSL Error" +#~ msgstr "Serverfejl" + +#~ msgid "More options..." +#~ msgstr "Flere indstillinger" + +#~ msgid " Account options " +#~ msgstr " Konto indstillinger " + +#, fuzzy +#~ msgid "You received a wink from %1." +#~ msgstr "Du har modtaget et blink fra %1" + +#~ msgctxt "Clickable label on login screen" +#~ msgid "Less options..." +#~ msgstr "Færre indstillinger... " + +#~ msgctxt "Clickable label on login screen" +#~ msgid "More options..." +#~ msgstr "Flere indstillinger..." + +#~ msgid "Got synchronization" +#~ msgstr "Fik synkronisering" + +#~ msgid "&Help" +#~ msgstr "Hjælp" + +#~ msgid "&Settings" +#~ msgstr "Indstillinger" + +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Vil du acceptere filen: %1 (%2)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "Overførsel blev annulleret" + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Korrekt overført fil: %1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "Overførslen af %1 fejlede. Filen eksisterer ikke." + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "Overførslen af %1 fejlede. Filen kunne ikke læses." + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "Overførslen af %1 blev annulleret" #~ msgid "Click to send an email to this contact." #~ msgstr "Klik for at sende en e-post til denne kontakt." @@ -4147,10 +6424,6 @@ msgstr "%1 (%2/%3)" #~ msgid "Picture:" #~ msgstr "Billede:" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Vis e-postinformation" - #~ msgid "Logging in..." #~ msgstr "Logger ind..." @@ -4171,10 +6444,6 @@ msgstr "%1 (%2/%3)" #~ msgid "Email: " #~ msgstr "E-post: %1" -#, fuzzy -#~ msgid "Client: " -#~ msgstr "Klient: %1" - #~ msgid "Remove group" #~ msgstr "&Fjern gruppe" @@ -4190,19 +6459,6 @@ msgstr "%1 (%2/%3)" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "Du har %1 nye breve i din indbakke" -#~ msgid "" -#~ "(c) 2002-2008, Mike K. Bennett\n" -#~ "(c) 2005-2008, Diederik van der Boor\n" -#~ "(c) 2007-2008, Valerio Pilo\n" -#~ msgstr "" -#~ "(c) 2002-2008, Mike K. Bennett\n" -#~ "(c) 2005-2008, Diederik van der Boor\n" -#~ "(c) 2007-2008, Valerio Pilo\n" - -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "Går Online" - #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "Overførslen af %1 fejlede. Kunne ikke åbne filen" @@ -4224,12 +6480,6 @@ msgstr "%1 (%2/%3)" #~ msgid "Your password:" #~ msgstr "Dit kodeord:" -#~ msgid "Display picture:" -#~ msgstr "Profilbillede:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "Vis ikke et &profilbillede" - #~ msgid "Status to set at login:" #~ msgstr "Sæt status ved login:" diff --git a/po/de.po b/po/de.po index 0a6ad87..4f0195b 100644 --- a/po/de.po +++ b/po/de.po @@ -3,848 +3,1493 @@ # # Jan Tönjes , 2003, 2005. # Jan Tönjes , 2005, 2006, 2007, 2008. +# Panagiotis Papadopoulos , 2008, 2009. +# Panagiotis Papadopoulos , 2009. msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2008-01-07 19:16+0100\n" -"Last-Translator: Jan Tönjes \n" -"Language-Team: \n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-03-20 22:17+0100\n" +"Last-Translator: Panagiotis Papadopoulos \n" +"Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.11.4\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 -msgid "Ne&w Line" -msgstr "N&eue Linie" +#, fuzzy +msgid "Standard text mode" +msgstr "Cartoon-Emoticons" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "" +"Klicken Sie hier, um sich zu verbinden, oder einen Verbindungsversuch " +"abzubrechen." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) #: rc.cpp:9 -msgid "S&end" -msgstr "Sen&den" +#, fuzzy +msgid "Ink message" +msgstr "Bisher keine Nachrichten erhalten" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" +"Klicken Sie hier, um sich zu verbinden, oder einen Verbindungsversuch " +"abzubrechen." + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) #: rc.cpp:15 -msgid "Contacts" -msgstr "Kontakte" +#, fuzzy +msgid "Standard emoticons" +msgstr "Cartoon-Emoticons" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) #: rc.cpp:18 -msgid "Click here to display this contact's profile." -msgstr "Klicken Sie hier im das Profil von dem Kontakt anzuzeigen." - -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 #, fuzzy +msgid "Custom emoticons" +msgstr "Eigene Emoti&cons" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "zwinkernd" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "Klicken Sie hier, um das Anzeigebild des Kontakts wiederherzustellen." + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "Ne&ue Zeile" + +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "S&enden" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Chat" + +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Haupt-Werkzeugleiste" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" +msgstr "Klicken Sie hier, um das Menü für den Kontakt anzuzeigen." + +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +#, fuzzy +msgid "Click here to open your account settings" +msgstr "Klicken Sie hier um das ausgewählte Emoticon umzubenennen." + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "Bereich säubern" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "Farbe" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "Pinselgröße" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "Radierer" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Zu Gruppen hinzufügen" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "" -"Geben Sie die Emailadresse der Person ein, die hinzugefügt werden soll." +"Geben Sie hier die E-Mail-Adresse der Person ein, die zur Kontaktliste " +"hinzugefügt werden soll." -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "Emailadresse" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "E-Mail-Adresse:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Geben Sie einen Kurzbefehl für das Emoticon ein:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -#, fuzzy -msgid "Initial group" -msgstr "Gruppe &umbenennen" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "Geben Sie einen Shortcut für das Emoticon ein:" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" -msgstr "Wählen Sie eine Datei aus:" +msgstr "Wählen Sie eine Bilddatei aus:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 -#, fuzzy +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "" -"Geben Sie die Nachricht ein, die automatisch\n" -"an die Personen gesendet wird, die versuchen Ihnen zu schreiben." +"Geben Sie eine Nachricht ein, die automatisch an die Kontakte gesendet wird, " +"die versuchen Ihnen zu schreiben." -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "Geben &Sie eine automatische Abwesenheitsnachricht ein:" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 #, fuzzy -msgid "&Automatic away message" -msgstr "Geben Sie eine Abwesenheitsnachricht ein" +msgid "Search through contacts..." +msgstr "Nach K&ontakt suchen" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Chat-Protokollierung" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "Nicht &filtern" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "Vom" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "Bis" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 #, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "Den Kontakt zu Ihrer \"Freunde\" liste &hinzufügen" +msgid "Filter by &chat" +msgstr "Na&ch Unterhaltung filtern" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Was würden Sie gerne tun?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" -msgstr "Diesen Kontakt &nicht hinzufügen, aber meinen Status sehen lassen" +msgid "&Add this person to these groups of my contact list:" +msgstr "Diesen Kont&akt zu Ihrer Kontaktliste hinzufügen" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" -msgstr "Diesen Kontakt &blockieren" +msgid "&Do not add this person; only allow them to see my status" +msgstr "" +"Diesen Kontakt nicht hinzufügen, Ihm aber erlauben Ihren Status zu sehen" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "Kontakteigenschaften für %1" +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting me or seeing my status" +msgstr "Diesen Kontakt &blockieren und meinen Onlinestatus vor Ihm verstecken" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" -msgstr "" +msgstr "&Informationen" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 -#, fuzzy -msgid "Restore" -msgstr "Gelöscht" +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "Klicken Sie hier, um das Anzeigebild des Kontakts wiederherzustellen." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "Wiede&rherstellen" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Gruppen:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -#, fuzzy -msgid "Use alternative name for this person" -msgstr "Einen alternativen zu dem vom Kontakt gegebenen Nickname benutzen" +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "Einen &alternativen Namen für diesen Kontakt nutzen" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "" -"Eine Benachrichtigung anzeigen wenn der Kontakt Online und Offline geht. " +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "Eine &Popup-Nachricht anzeigen, wenn der Kontakt online/offline geht" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Sound:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" +msgstr "Anzeigebilder" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Klicken Sie hier um das ausgewählte Emoticon zu löschen." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Anzeigebild" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +msgid "&Clear Cache" +msgstr "Zwis&chenspeicher leeren" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "&Notizen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "&Emoticons" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 -#, fuzzy -msgid "&Clear Cache" -msgstr "Tab löschen" +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "Klicken Sie hier um das ausgewählte Emoticon zu löschen." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -#, fuzzy -msgid "Notes" -msgstr "Note" +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Entfernen" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "Verfügbare Kontakte" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "Einen Kontakt einladen, der nicht auf Ihrer Liste ist:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" +"Geben Sie die E-Mail-Adresse des Kontaks ein, den Sie einladen möchten." + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "Eingeladene Kontakte" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Zu exportierende Objekte:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Format" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Kontakte:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "&Alle markieren" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Auswahl aufheben" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Exportieren ..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Schließen" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Netzwerkfenster" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +#, fuzzy msgid "Command to Current Tab" -msgstr "" +msgstr "Aktuelles Unterfenster schließen" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "Befehl:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" -msgstr "" +msgstr "Typ:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "Stern" +msgstr "Standard" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" -msgstr "" +msgstr "MIME" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" -msgstr "Sen&den" +msgstr "Senden" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" -msgstr "" +msgstr "Öffnen" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 -#, fuzzy +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" -msgstr "Abgebrochen" +msgstr "Abbrechen" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "&Download" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "&Upload" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "Aufräumen" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "Schließen" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" msgstr "" +"Klicken Sie hier, um die Einstellungen des gerade ausgewählten Zugangs " +"anzuzeigen, oder benutzen Sie das Mausrad, um zwischen den gespeicherten " +"Zugängen zu wechseln." -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "Emailadresse: " +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "" +"Geben Sie hier die E-Mail-Adresse Ihres Passport- oder Live-Zugangs ein." -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 -#, fuzzy +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" -msgstr "Passwort" +msgstr "Passwort:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" -msgstr "Status beim Einloggen" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "Geben Sie hier das Passwort Ihres Zugangs ein." -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "" +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Status beim anmelden:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 #, fuzzy -msgid " Account options " -msgstr "Konto&einstellungen" - -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" -msgstr "Dieses Profil &speichern" - -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +msgid "Choose a status to set when successfully connected." msgstr "" +"Wählen Sie einen Status, der nach erfolgreichem Verbinden gesetzt werden " +"soll." -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "Ist diese Option aktiviert, wird KMess Ihren Zugang speichern." + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" +msgstr "Zu&gang speichern" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" +"Falls Sie sich entscheiden den Zugang zu speichern, können Sie auch das " +"zugehörige Passwort speichern lassen." + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "Passwort sp&eichern" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Klicken Sie hier, um sich zu verbinden, oder einen Verbindungsversuch " +"abzubrechen." + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Verbinden" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Geben Sie hier Ihre persönliche Nachricht ein " +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Neuer Zugang" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 -#, fuzzy -msgid "Your Account Information" -msgstr "Konto&einstellungen" +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." -msgstr "" -"Geben Sie den Namen ein, den anderen Kontakte sehen wenn Sie Online sind." - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 -#, fuzzy -msgid "&Friendly name:" -msgstr "&Nickname" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" msgstr "" -"Geben Sie die Emailadresse von Ihrem MSN-Passport Account ein. Sie können " -"unter http://register.passport.com/ einen neuen Account registrieren." +"Klicken Sie hier, um einen neuen Live-Zugang zu erstellen, mit dem Sie " +"sich zu MSN verbinden können.
Sie können auch Ihre existierende E-Mail-" +"Adresse benutzen." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "Passwort vergessen?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 #, fuzzy -msgid "&Email address:" -msgstr "Emailadresse: " +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Klicken Sie hier, um zur Live-Website zu gelangen, wo Sie das Passwort " +"Ihres Zugangs zurücksetzen können." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Verbinden" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "Ansicht" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Aktionen" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "Format" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Zugangs-Informationen" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "Ihre Zugangsinformationen" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." +msgstr "" +"Geben Sie einen Namen ein, den Ihre Kontakte sehen sollen wenn Sie Online " +"sind." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 +msgid "&Friendly name:" +msgstr "&Spitzname:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Geben Sie die E-Mail-Adresse Ihres MSN-Passport-Zugangs ein. Unter http://" +"register.passport.com/ können Sie sich einen neuen Zugang einrichten." + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 +msgid "&Email address:" +msgstr "&E-Mail-Adresse:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -"Geben Sie das Passwort von Ihrem MSN-Passport Account ein. Sie können unter " -"http://register.passport.com/ einen neuen Account registrieren." +"Geben Sie das Passwort Ihres MSN-Passport-Zugangs ein. Unter http://register." +"passport.com/, können Sie sich einen neuen Zugang einrichten." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" -msgstr "Passwort" +msgstr "&Passwort:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -#, fuzzy -msgid "&Remember Password" -msgstr "Passwort" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "Passwo&rt speichern" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" -msgstr "Mein Bild" +msgstr "Anzeigebild" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." -msgstr "&Ändern..." +msgstr "Ändern ..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" -msgstr "" +msgstr "Kein Anzeigebil&d" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -"Die Option \"Profil speichern\" wurde beim Einloggen nicht aktiviert, so " -"dass Ihre Einstellungen standartmäßig nicht gespeichert werden. Aktivieren " -"Sie diese Option um Ihre Einstellungen permanent auf diesem System zu " -"speichern.\n" +"Die Option „Zugang speichern“ wurde beim Anmelden nicht aktiviert, sodass " +"Ihre Einstellungen standardmäßig nicht gespeichert werden. Aktivieren Sie " +"diese Option, wenn Sie Ihre Einstellungen dauerhaft auf diesem System " +"speichern wollen.\n" "\n" -"Es ist empfohlen diese Einstellung zu aktivieren, es sei denn Sie benutzt " -"KMess als Gast oder auf einem öffentlichen Systen (z.B. Internetcafe)." +"Es ist empfohlen diese Option zu aktivieren, es sei denn Sie benutzen KMess " +"als Gast, oder auf einem öffentlichen System (z.B. im Internetcafe)." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 -#, fuzzy +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "Accounteinstellungen merken" +msgstr "Einstellungen dieses Zugangs speichern" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -"Wenn aktiviert wird KMess sich automatisch mit diesem Account beim starten " -"einloggen." +"Ist diese Option aktiviert, meldet sich KMess automatisch mit diesem Zugang " +"an." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" -msgstr "Mit diesem Account beim Starten automatisch &Anmelden." +msgid "Log in &with this account automatically" +msgstr "Mit diesem Zugang automatisch anmelden" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "&Alle Chats speichern" +msgstr "Anmelden &als" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -"Sie benötigen einen Passport Account um sich mit dem MSN Messenger Netzwerk " -"zu verbinden. Sie können Ihre aktuelle Emailadresse unter register.passport." -"com registrieren oder einen Hotmail Account verwenden." +"Sie müssen sich mit der Passport-Seite verbinden, um zu bestätigen, dass " +"Ihre E-Mail-Adresse existiert." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -"Sie können Ihren Namen nicht ändern, da IhrePassport Emailadresse noch nicht " -"verifiziert ist." +"Sie können Ihren Spitznamen nicht ändern, da Ihre Passport-E-Mail-Adresse " +"noch nicht bestätigt worden ist." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" -msgstr "Fordere Verifizierungsmail an" +msgstr "Bestätigungs-E-Mail anfordern" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" -msgstr "Gehe zu accountservices.passport.net" +msgstr "Besuche accountservices.passport.net" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"Sie benötigen einen Passport-Zugang, um sich mit dem MSN-Messenger-Netzwerk " +"zu verbinden. Sie können Ihre aktuelle E-Mail-Adresse unter register." +"passport.com registrieren, oder einen Hotmail-Zugang verwenden." + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -"Um sich mit dem MSN-Messenger Service zu Verbinden benötigen Sie eine Email " -"Adresse als Passport Account." +"Um sich mit dem MSN-Messenger-Service verbinden zu können, ist es nötig " +"einen Passport-Zugang mit einer E-Mail-Adresse einzurichten." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" -msgstr "Einen neuen Account registrieren" +msgstr "Einen neuen Zugang erstellen" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" -msgstr "Gehe zu register.passport.com" +msgstr "Besuche register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 #, fuzzy +msgid "&Status Options" +msgstr "&Status-Optionen:" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Ist diese Option aktiviert, wird Ihr Status automatisch auf „Abwesend-" +"Inaktiv“ gesetzt, wenn Sie Ihren Computer für einige Minuten nicht benutzen. " +"Falls diese Option nicht verfügbar ist, wurde KMess ohne Unterstützung für " +"diese Funktion kompiliert." + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Status auf „Inaktiv“ setzen wenn abwesend" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"Diese Option stellt ein, nach wievielen Minuten der Status auf „Inaktiv“ " +"setzen soll." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Als inaktiv gelten nach" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "Minuten" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +#, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" +"Popup-Nac&hrichten verstecken, falls mein Status auf „Beschäftigt“ gesetzt " +"ist" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 msgid "Saved accounts:" -msgstr "Konten" +msgstr "Gespeicherte Zugänge:" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "Klick" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -"Klicken Sie hier um ein neues persönliches Emoticon hinzuzufügen, dass Sie " -"an Ihre Kontakte senden können." +"Klicken Sie hier, um einen neuen KMess-Zugang mit einer E-Mail-Adresse, " +"eines bereits registrierten Passport- oder Live-Zugangs, zu erstellen." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +msgid "&Add Account..." +msgstr "Zug&ang hinzufügen ..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 #, fuzzy -msgid "&Add account..." -msgstr "Konto" +msgid "Select an account and click here to modify it" +msgstr "" +"Wählen Sie einen Zugang aus und klicken Sie hier, um den ausgewählten Zugang " +"zu löschen." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "Wählen Sie ein Emoticon aus und klicken sie hier um es zu löschen." - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" -msgstr "" +msgstr "B&earbeiten" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 -#, fuzzy +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" +"Wählen Sie einen Zugang aus und klicken Sie hier, um den ausgewählten Zugang " +"zu löschen." + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" -msgstr "Gelöscht" +msgstr "&Löschen" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Popupbenachrichtigungen" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" +"Ist diese Option aktiviert, wird KMess ihre Chats protokollieren, so dass " +"Sie sie später erneut betrachten können." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 -#, fuzzy -msgid "Contact Events" -msgstr "Kontakte" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "Benachrichtigungen anzeigen, wenn ein Kontakt:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" msgstr "" -"Wenn aktiviert wird ebenfalls ein Popup angezeigt, wenn einer Ihrer Kontakte " -"sich mit MSN verbindet." +"

Wenn Sie die Chat-Protokollierung aktivieren, wird jeder Chat den " +"Sie haben werden, an einem bestimmten Ort den Sie unten bestimmen können, " +"gespeichert.

\n" +"

Die gespeicherten Chats erlauben es Ihnen in Ihren alten Unterhaltungen " +"nach etwas zu suchen, wie z.B. nach einer Web-Verknüpfung. Sie können auch " +"herausfinden, was Sie zu einem bestimmten Zeitpunkt gesagt haben.

\n" +"

Bedenken Sie jedoch, dass die Chat-Protokolle auch ein Problem für Ihre " +"Privatsphäre sein können. Unberechtigte Leute, die Ihren Zugang benutzen " +"könnten Ihre Chat-Protokolle lesen.

\n" +"

Stellen Sie sicher, dass diese Option auf öffentlich zugänglichen " +"Computern deaktiviert ist.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -#, fuzzy -msgid "&Go online" -msgstr "O&ffline geht" +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "Chat-Protokollierung aktivieren" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "KMess kann Ihre Chats auch als HTML-Dokumente speichern." + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "Chats als Dateien speichern" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" +"Hiermit können Sie wählen, wie KMess Ihre Chat-Protokolle speichern soll" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "Chat-Protokolle speichern als:" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" msgstr "" -"Wenn aktiviert wird ebenfalls ein Popup angezeigt, wenn einer Ihrer Kontakte " -"eine Unterhaltung mit Ihnen beginnt." +"\n" +"

Das Dateiformat das Sie verwenden wollen ist wichtig.

\n" +"

Chat-Aufzeichnungen im HTML-Format können mit jedem Web-Browser geöffnet, " +"auf anderen Computern jedoch meist nicht korrekt dargestellt werden.

\n" +"

Text-Dateien dagegen, können überall dargestellt werden, jedoch enthalten " +"sie keine Text-Formatierungen, Anzeigebilder oder Emoticons.

\n" +"" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "Einen &Chat mit Ihnen startet" +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "Webseiten (HTML)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "Einfache Textdateien" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." msgstr "" -"Wenn aktiviert wird ebenfalls ein Popup angezeigt, wenn einer Ihrer Kontakte " -"Ihnen eine Nachricht sendet." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "Ihnen eine &Nachricht sendet" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +#, fuzzy msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." msgstr "" -"Wenn aktiviert wird ebenfalls ein Popup angezeigt, wenn einer Ihrer Kontakte " -"seinen Status ändert." +"Abhängig von welcher Option Sie hier auswählen, wird KMess einige " +"Verzeichnisse erstellen, um Ihre protokollierten Chats organisiert zu " +"halten. Benutzen Sie die „Was ist das?“ auf einem bestimmten Option, um mehr " +"Informationen darüber zu erhalten." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "Seinen S&tatus ändert" +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" +msgstr "Protokollierte Chats ordnen nach:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +#, fuzzy +msgid "Create a directory to organize chats by year" +msgstr "Ein Verzeichnis erstellen, um die Chats nach Jahr zu organisieren" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" -"Wenn aktiviert wird ebenfalls ein Popup angezeigt, wenn einer Ihrer Kontakte " -"offline geht." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "O&ffline geht" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Jahr" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 #, fuzzy -msgid "Email Events" -msgstr "Emailadresse" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" +msgid "Create directories to organize chats by year then by month" msgstr "" -"Eine Benachrichtigung anzeigen, wenn eine EMail\n" -"in einem \"anderen Ordner\" angekommen ist" +"KMess erstellt automatisch Unterverzeichnisse, wenn Sie die Chat-Protokolle " +"nach Jahr, Monat, oder Tag organisieren lassen." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" -"Wenn aktiviert einen Popup Nachricht wird auch dann angezeigt, wenn neue " -"Emails in anderen Ordnern empfangen werden. Diese Option ist nur für Hotmail " -"Accounts." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "Kontrolliert die Sekunden bis ein Popup wieder ausgeblendet wird." +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "Jahr dann Monat" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Popubs ausblenden nach" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "Sekunden" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 #, fuzzy -msgid "Other Alerts" -msgstr "Alarme" +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" +"KMess erstellt automatisch Unterverzeichnisse, wenn Sie die Chat-Protokolle " +"nach Jahr, Monat, oder Tag organisieren lassen." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "Jahr, Monat dann Tag" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" +msgstr "" +"Alle protokollierten Chats direkt im angegebenen Verzeichnis speichern." + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "Chat-Protkolle nicht ordnen" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "Klicken Sie hier um ein Verzeichnis auszuwählen." + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" +"Wählen Sie ein Verzeichnis aus, in dem die Chat-Protokolle gespeichert " +"werden sollen." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "Chat-Protokolle im folgenden Verzeichnis speichern: " + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "Stil" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"Erlaubt Ihnen das Design zu wechseln, mit dem KMess die Chatnachrichten " +"anzeigt." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "&Chat-Stil:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Chat-Einstellungen" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 #, fuzzy -msgid "&Show winks from contacts" -msgstr "Kontakte die &Offline sind anzeigen" +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Aktiviert die Anzeige von Emoticons in Chats." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "Emoticon&s anzeigen" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "&Emoticons anzeigen" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Diese Option erlaubt es Nachrichten vom selben Kontakt zusammenzufassen. " +"Wenn der selbe Kontakt mehrere Nachrichten hintereinander versendet, erkennt " +"KMess dies und fasst diese zu einer Nachricht zusammen. Die genaue " +"Darstellung hängt von dem verwendeten Chat-Stil ab." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "Aufeinanderfolgende Nachrichten vom selben Kontakt &gruppieren" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Aktiviert die Anzeige von Zeitstempeln in jeder Chatnachricht." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +msgid "S&how timestamp" +msgstr "Zeitstempel anzeigen" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +msgid "Show &date" +msgstr "&Datum anzeigen" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +msgid "Show s&econds" +msgstr "S&ekunden anzeigen" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Text" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" +"Diese Schriftart und -farbe wird in Ihren Chatnachrichten verwendet werden." + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "Schriftart für Ihre Nachrichten:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"Ist diese Option aktiviert, werden die Schriftart und -farbe der Nachrichten " +"Ihrer Kontakte, mit der gewählten Schriftart und -farbe ersetzt." + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "Nachrichten von ihren Kontakten, mit dieser Schri&ftart anzeigen:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Chatfenster-Ereignisse" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Diese Option, aktiviert die Benutzung von Schrifteffekten. Wenn Sie *fett*, /" +"kursiv/ und _unterstrichen_ eingeben, erscheinen die Wörter entsprechend " +"formatiert." + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Schrift&effekte in Nachrichten benutzen, z.B. *fett*, /kursiv/ und " +"_unterstrichen_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +#, fuzzy +msgid "Enable MSN Plus formatting" +msgstr "MSN-Plus-Formatierung" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -853,2213 +1498,2978 @@ msgid "" "Contacts may send multiple nudges at once, but KMess only shakes the chat " "window with the first nudge.

" msgstr "" -"

Wenn ein Kontakt Ihre Aufmerksamkeit haben moechte kann er einen " -"Rrrrring senden. Standartmäßig wird das Chatfenster gewackelt wenn ein " -"Rrrrring gesendet oder empfangen wird. Deaktiviere diese Option, wenn der " -"Wackeleffekt nervt.

\n" -"

Wenn diese Option aktiviert ist, limitiert KMess das Wackeln trotzdem. " -"Kontakte können mehrere Rrrrrings hintereinander senden, jedoch wackelt das " -"Fenster nur beim ersten.

" +"

Wenn ein Kontakt Ihre Aufmerksamkeit haben möchte, kann er Ihnen ein " +"„Rrring!“ senden. Standardmäßig wird das Chatfenster zum Wackeln gebracht, " +"wenn ein „Rrring!“ gesendet oder empfangen wird. Deaktivieren Sie diese " +"Option, wenn der Wackeleffekt Ihnen zu aufdringlich ist.

\n" +"

Selbst wenn diese Option aktiviert ist, wird das Wackeln durch KMess " +"begrenzt. Ihre Kontakte können mehrere „Rrring!“ hintereinander senden, " +"jedoch wackelt das Fenster nur beim ersten.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" -"Das Chat&fenster wackeln wenn ein Rrrrring gesendet oder empfangen wird" +msgstr "Chatfenster &wackeln, wenn ein „Rrring!“ gesendet oder empfangen wird" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." -msgstr "" -"Wenn aktiviert wird ein Popup angezeigt sobald eine Email in dem Posteingang " -"empfangen wird. Die Anzahl der ungelesen Nachrichten wird über der " -"Kontaktliste angezeigt. Diese Option ist nur für Hotmail Accounts." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Zeige kein Displa&y Bild" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "Chats im selben Fenster g&ruppieren:" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Immer" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "Bei Kontakten in der selben Gruppe" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Nie" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Mein Bild:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." +msgstr "" +"Ist diese Option aktiviert, wird eine Popup-Nachricht angezeigt, sobald eine " +"E-Mail in Ihrem Posteingang 
eintrifft. Die Anzahl der ungelesen E-Mail-Nachrichten, wird über der " +"Kontaktliste angezeigt. Diese Option ist nur für Hotmail-Zugänge verfügbar." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Anzahl der ungelesenen E-Mails anzeigen" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" -"Wenn aktiviert, informiert KMess darüber was Sie gerade hören. Diese " -"Information wird von dem aktuell aktiven Audioplayer empfangen." +"Ist diese Option aktiviert, informiert KMess Ihre Kontakte darüber was Sie " +"gerade hören. Diese Information wird vom aktuell aktiven Audio-Player " +"abgerufen." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" +msgstr "Kontakten zeigen welc&hen Musiktitel ich gerade höre" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "H&intergrundbild anzeigen" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" -msgstr "Kontakte darüber informieren &welchen Musiktitel ich gerade höre." +msgid "List Formatting" +msgstr "MSN-Plus-Formatierung" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 #, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Wenn aktiviert, wird Ihr Status automatisch auf \"Abwesend-Idle\" gesetzte, " -"wenn Sie Ihren Computer für einige Minuten nicht benutzen." +msgid "Enable MSN &Plus formatting" +msgstr "MSN-Plus-Formatierung" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Status auf \"Abwesen&d-Idle\" setzen wenn inaktiv" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"Kontrolliert nach wievielen Minuten KMess den Status zu \"Abwesend-Idle\" " -"ändert." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Als Abwesend anzeigen nach" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "Minuten" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" -"Wenn aktiviert alle Chats werden in einem bestimmten Verzeichnis gespeichert." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "&Alle Chats speichern" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "Wählen Sie das Verzeichnis in dem die Chats gespeichert werden sollen." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Chats in diesem Verzeichnis speichern: " - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" -"KMess erstellt automatisch Unterverzeichnisse, wenn Sie die Chats nach Jahr, " -"Monat oder Tag organisieren." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Jahr" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Monat" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Tag" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Chats in diesem Verzeichnis speichern: " - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" -"Erlaubt Ihnen das Theme zu wechseln, mit dem KMess alle Chatnachrichten " -"anzeigt." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Chat Style:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Einstellungen" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Aktiviert die Anzeige von Emoticons in Chats." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "&Emoticons anzeigen" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Aktiviert die Anzeige von Zeitstempeln in jeder Chatnachricht." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Zeigt die &Zeit an in Chatsnachrichten" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Diese Option erlaubt es verschiedene Nachtichten vom selben Kontakt " -"zusammenzufassen. Wenn der schreibende Kontakt mehrere Nachichten benutzt um " -"etwas zu erklaehren, erkennt KMess dieses und fasst diese zu einer zusammen. " -"Die genaue Darstellung hängt von dem verwendeten Chat-Style ab." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "Gruppiere anschließende Nachrichten von dem selben Kontakt." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Abwesend" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Ihre Kontaktliste hat zu viele Gruppen." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Freak" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "Diese Schriftart und Farbe wird in Ihren Chatnachrichten verwendet." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "Ihre Schriftart" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"Erlaubt die Schriftart und Farbe der Nachrichten Ihrer Kontakte mit der " -"unten gewählten Schriftart und Farbe zu übergehen ." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "" -"Nachrichten von anderen Kontakten zwingen diese Schriftart zu benutzen:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Aktiviert die Benutzung von Schrifteffekten. Wenn Sie *fett*, /kursiv/ und " -"_unterstrichen_ eingeben, erscheinen die Wörter entsprechend formatiert." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"Schrifteffekte in Nachrichten &benutzen, z.B. *fett*, /kursiv/ und " -"_unterstrichen_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Warte auf die Kontaktliste..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" -msgstr "&Emoticons Themes" +msgstr "&Emoticon-Designs" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" -msgstr "Verfügbare Emoticon Styles:" +msgstr "Verfügbare Emoticon-Designs:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" -msgstr "E&igene Emoticons" +msgstr "Eigene Emoti&cons" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" -msgstr "Eigene Emoticons für diesen Account:" +msgstr "Eigene Emoticons dieses Zugangs:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "N&eues hinzufügen..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "Klicken Sie hier, um ein neues Emoticon hinzuzufügen." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "Klicken Sie hier um das gewählte Emoticon umzubenennen" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." +msgstr "Hinzufügen ..." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Klicken Sie hier um das ausgewählte Emoticon umzubenennen." + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" msgstr "Umbe&nennen" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "Ent&fernen" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" -msgstr "Welkende Rose" +msgstr "Web-Browser" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." -msgstr "" +msgstr "Wählen Sie diese Option, um den von KDE benutzten Browser zu wählen." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "Den von KDE ben&utzten Web-Browser verwenden" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" +"Wählen Sie diese Option, um aus einer Liste von installierten Browsern zu " +"wählen." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "Folgenden Web-Browser verwenden:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" +"Wählen Sie diese Option, um den Pfad zu Ihrem bevorzugten Browser einzugeben." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "Einen benutzerdefinierten Befehl eingeben:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 -#, no-c-format +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 +#, fuzzy, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" +"Geben Sie den Pfad zu einem Programm ein, dass die Verknüpfungen öffnen " +"soll. Das „%u“ wird mit der URL der Verknüpfung ersetzt." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 -#, no-c-format +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 +#, fuzzy, no-c-format msgid "Use '%u' to insert the URL in the command line." -msgstr "" +msgstr "Fügen Sie „%u“ hinzu, um die URL in der Befehlszeile einzufügen." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" -msgstr "EMail Programm" +msgstr "E-Mail-Programm" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" +"Aktivieren Sie diese Option, um die „Live Mail“-Website anzuzeigen, wenn Sie " +"sich mit einem kompatiblen Zugang anmelden." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "&Live-Mail benutzen, wenn der Zugang es unterstützt" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" +"Wählen Sie diese Option, um das von KDE benutzte E-Mail-Programm zu wählen." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "Das von &KDE benutzte E-Mail-Programm verwenden" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "Folgendes E-Ma&il-Programm verwenden:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 -#, no-c-format +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 +#, fuzzy, no-c-format msgid "Use '%u' to insert the email address in the command line." -msgstr "" +msgstr "Fügen Sie „%u“ im Befehl für die E-Mail-Adresse hinzu" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" -msgstr "Dateiübertragung" +msgstr "Dateiübertragungen" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" -msgstr "Chats in diesem Verzeichnis speichern: " +msgstr "Empfangene Dateien im folgenden Ordner &speichern:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" +msgstr "Ports zwischen" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "und" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "für Dateiübertragungen benutzen" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "Ihr Kommentar:" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 -#, fuzzy -msgid "and" -msgstr "Traurig" +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "Ihr Kommentar handelt von:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 -#, fuzzy -msgid "for file transfers" -msgstr "Dateiübertragung" +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "Etwas was Ihnen gefällt" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "Etwas was Ihnen nicht gefällt" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +#, fuzzy +msgid "An improper behavior of the application" +msgstr "Ein fehlerhaftes Verhalten der Anwendung" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +#, fuzzy +msgid "Specify an email address to be contacted back" +msgstr "Geben Sie eine E-Mail-Adresse ein, um kontaktiert zu werden" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Ich bin nicht an meinem Computer" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Ihr Name" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "sie@hotmail.de" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 +#, fuzzy msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" -"Sie können diese Einladung nicht starten, da mehrere Kontakte in diesem Chat " -"sind." +"Es ist ein nicht sicher gespeichertes Zugangspasswort gefunden worden." +"
Wollen Sie das Passwort in die KDE-Brieftasche „%1“ importieren, das " +"unsicher gespeicherte Passwort beibehalten oder es dauerhaft löschen?

Es ist nicht empfehlenswert unsicher gespeicherte Passwörter zu " +"verwenden, wenn die KDE-Brieftasche verfügbar ist, weil Ihre Passwörter in " +"den Einstellungsdateien von KMess leicht herauszulesen sind." -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Sichere Passwortspeicherung" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importieren" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Löschen" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Behalten" + +#: chat/chat.cpp:119 #, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" +"Sie können diese Einladung nicht versenden, da mehrere Kontakte in diesem " +"Chat sind." + +#: chat/chat.cpp:142 msgid "%1 has joined the chat." -msgstr "%1 ist dem Chat beigetreten." +msgstr "%1 ist dem Chat beigetreten." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "Die Unterhaltung wurde Idle, %1 hat den Chat verlassen" +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "" +"Die Unterhaltung ist inaktiv geworden, %1 hat den Chat verlassen." -#: chat/chat.cpp:215 -#, fuzzy +#: chat/chat.cpp:202 +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." -msgstr "%1 hat den Chat verlassen." +msgstr "%1 hat den Chat verlassen." -#: chat/chat.cpp:364 -#, fuzzy +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr "%1 und %2 - Chat" +msgstr "%1 und %2" -#: chat/chat.cpp:371 -#, fuzzy +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." -msgstr "%1 und andere - Chat" +msgstr "%1 und andere" -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr " (Diese Nachricht wurde automatisch verschickt)" +msgstr "%1 (Diese Nachricht wurde automatisch versendet)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 #, fuzzy -msgid "You received a wink from %1." -msgstr "Sie haben ein Animoticon von %1 empfangen" - -#: chat/chat.cpp:971 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "KMess kann die Chat" + +#: chat/chat.cpp:941 +#, fuzzy +msgid "You have sent a wink" +msgstr "Sie haben ein Animoticon von %1 empfangen" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." msgstr "" -"Das Animoticon konnte nicht angezeigt werden. Bitte stellen Sie sicher das " -"'cabextract' installiert ist." -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Es ist ein Verbindungsproblem eingetreten." + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." msgstr "" -"Das Animoticon konnte nicht angezeigt werden. Fehler beim Lesen der Daten." -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1139 #, fuzzy -msgid "You have received a wink from %1" -msgstr "Sie haben ein Animoticon von %1 empfangen" +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" +"„%1“ hat Ihnen eine Sprachaufzeichnung gesendet, jedoch unterstützt " +"KMess dies noch nicht." -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1153 #, fuzzy -msgid "You received a nudge from %1!" -msgstr "Sie haben einen Rrrring von %1 empfangen." +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" +"„%1“ hat Ihnen eine Sprachaufzeichnung gesendet, jedoch unterstützt " +"KMess dies noch nicht." -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "" + +#: chat/chat.cpp:1194 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "Die Nachricht '%1' konnte nicht gesendet werden." +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" +"Sie haben ein Animoticon von „%1“ erhalten, jedoch ist die Anzeige von " +"Animoticons in den Zugangseinstellungen deaktiviert." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" +"Sie haben ein Animoticon von „%1“ erhalten, jedoch kann es nicht angezeigt " +"werden. Bitte stellen Sie sicher, dass „cabextract“ installiert ist." + +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Sie haben ein Animoticon von „%1“ erhalten, jedoch kann es nicht angezeigt " +"werden. Das Entpacken des Animoticons mit „cabextract“ ist fehlgeschlagen." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" +"Sie haben ein Animoticon von „%1“ erhalten, jedoch kann es nicht angezeigt " +"werden. Die Daten können nicht gelesen werden." + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 hat Ihnen ein Animoticon gesendet!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 ist dem Chat beigetreten." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 ist dem Chat beigetreten." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 hat Ihnen einen „Rrring!“ gesendet!" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "alle Kontakte" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "„%1“ hat Ihnen ein „Rrring!“ gesendet!" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Sie haben ein Animoticon von %1 empfangen" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 ist dem Chat beigetreten." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "" +"%1 hat Ihnen eine Offline-Nachricht gesendet:
„%2“" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "" +"Die Datei „%1“ kann auf dem Computer weder gefunden, noch " +"heruntergeladen werden." + +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" -msgstr "Sie haben ein Rrrring zu %1 gesendet." +msgstr "Sie haben „%1“ ein „Rrring!“ gesendet!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" -msgstr "Sie haben einen Rrrring gesendet!" +msgstr "Sie haben ein „Rrring!“ gesendet!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" -msgstr "%1 sendet eine Animoticon: %2" +msgstr "%1 sendet ein Animoticon: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 sagt:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +#, fuzzy +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "Unterhaltung mit „%1“
Begonnen am: %2" + +#: chat/chatmessageview.cpp:364 +#, fuzzy +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "Unterhaltung begonnen am: %2" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Protokollierte KMess-Unterhaltungen mit %1." + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "Dieses Emoticon hinzufügen: %1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Einladen" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Wiederverbinden" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -"Konnte Chatlog nicht speichern. Bitte stellen Sie sicher, dass sie " -"Schreibrechte für den Ordner haben in dem die Chats gespeichert werden." +"Das Chat-Protokoll kann im folgenden Verzeichnis nicht gespeichert werden: „%" +"1“.\n" +"Bitte stellen Sie sicher, dass Sie Schreibrechte für den Ordner haben, in " +"dem die Protokolle gespeichert werden sollen." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +#, fuzzy +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" +"*.html *.htm|Webseite (*.html)\n" +"*.txt|Einfache Textdatei (*.txt)\n" +"*.xml|XML-Dokument (*.xml)" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -"Die Datei '%1' existiert bereits.\n" -" Möchten Sie die Datei überschreiben?" +"Die Datei „%1“ existiert bereits.\n" +"Wollen Sie sie überschreiben?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" -msgstr "Überschreibe Datei" +msgstr "Datei überschreiben" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "Über&schreiben" +msgstr "Überschreiben" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." -msgstr "&Emoticon hinzufügen..." +msgstr "Dieses &Emoticon hinzufügen ..." -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Dieses &Emoticon hinzufügen..." + +#: chat/chatview.cpp:833 msgid "Send &Email" -msgstr "Email &senden" +msgstr "&E-Mail senden" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "E&mail kopieren" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "Kont&akt hinzufügen" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +msgid "Copy E&mail Address" +msgstr "E-&Mail-Adresse kopieren" + +#: chat/chatview.cpp:847 msgid "Visit &Link" -msgstr "Link &Öffnen" +msgstr "Verknüpfung öffnen" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" -msgstr "&Adresse kopieren" +msgstr "Verknüpfungs&adresse kopieren" -#: chat/chatview.cpp:1312 -msgid "&Copy text" -msgstr "Text &kopieren" +#: chat/chatview.cpp:867 +msgid "&Copy Text" +msgstr "&Text kopieren" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "&Alles markieren" -#: chat/chatview.cpp:1314 -msgid "Find &Text" -msgstr "" +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "&Text suchen ..." -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" -msgstr "Chat in &Datei speichern" - -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Chat" - -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "Datei &Senden" - -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "&Meeting starten" - -#: chat/chatwindow.cpp:494 -msgid "Send a &Nudge!" -msgstr "&Rrrring senden!" - -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "Chat speichern" - -#: chat/chatwindow.cpp:496 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "&Emoticons" -msgstr "Emoticons" +msgid "C&lear Chat" +msgstr "Unterfenster &leeren" -#: chat/chatwindow.cpp:498 -#, fuzzy -msgid "Close &All Tabs" -msgstr "Tab schließen" +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Chat als Datei speichern ..." -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "Einstellungen" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Kontakte" -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "Starten oder Stoppen einer &Unterhaltung" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Schrift&art ändern" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Schrift&farbe ändern" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&Verbinden" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Schrift&farbe ändern" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emoticons" -#: chat/chatwindow.cpp:658 -msgid "My emoticons" -msgstr "Meine Emoticons" +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" +msgstr "Eigene Emoticons" -#: chat/chatwindow.cpp:738 +#: chat/chatwindow.cpp:328 #, fuzzy -msgid "&Settings" -msgstr "Einstellungen" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" +"Es sind mehrere Unterfenster in diesem Chat-Fenster geöffnet. Wollen " +"Sie nur das aktuelle oder alle Unterfenster schließen?

Hinweis: Mit Umschalt+Esc, können Sie auch alle Unterfenster auf einmal " +"schließen." -#: chat/chatwindow.cpp:742 +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Unterfenster schließen" + +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" +msgstr "Alle Unterfenster schließen" + +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" +msgstr "Aktuelles Unterfenster schließen" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "E&inladen ..." + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." +msgstr "Eine &Datei senden ..." + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "Webcam-Chat" + +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Eine Konferenz starten" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "Ein „Rrri&ng!“ senden" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "Chat speichern ..." + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "&Alle Unterfenster schließen" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Schri&ftart ändern" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "S&chriftfarbe ändern" + +#: chat/chatwindow.cpp:428 msgid "Show &Emoticons" msgstr "&Emoticons anzeigen" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 +#: chat/chatwindow.cpp:429 #, fuzzy -msgid "Hide Side&bar" -msgstr "Sidebar" +msgid "Show S&tatus Messages" +msgstr "Zeitstempel anzeigen" -#: chat/chatwindow.cpp:744 +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "&Seitenleisten








" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "Recht&schreibprüfung" + +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Konferenz" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "„Rrring!“" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Datei senden" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "Vo&rheriges Unterfenster" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "Nächst&es Unterfenster" + +#: chat/chatwindow.cpp:465 +msgid "Enable or disable the contacts panel" +msgstr "Die Kontaktleiste ein-/ausblenden" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakte" + +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "Die Emoticonsleiste ein-/ausblenden" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticons" + +#: chat/chatwindow.cpp:477 #, fuzzy -msgid "Hide &Toolbar" -msgstr "Sidebar" +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Die Emoticonsleiste ein-/ausblenden" -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Zeige oder Verstecke die Kontakt Sidebar" +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Meine Emoticons" -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Schriftart" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "Schrift&farbe" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "Chatfenster &leeren " + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Eine Unterhaltung beginnen oder beenden" + +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" +"Die Syntax des „/status“-Befehls, die Sie eingegeben habe, ist falsch. " +"Die korrekte Syntax lautet: /status online|away|idle|brb|busy|lunch|phone|" +"invisible.
Sie können auch /online, /phone usw. als " +"Kurzbefehle benutzen." -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "Fehlerhafte „/status“-Syntax" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +#, fuzzy +msgid "You can't block anyone in a group chat." msgstr "" +"Es ist nicht möglich, während einer Gruppen-Unterhaltung, jemanden zu " +"blockieren." -#: chat/chatwindow.cpp:855 +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 #, fuzzy -msgid "Close all tabs" -msgstr "Tab schließen" +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "Das Blockieren ist zur Zeit nicht möglich!" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "Tab schließen" +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" +"Unbekannter Befehl %1. Falls die eingegebene Nachricht nicht " +"als Befehl eingeben wollten, sollten Sie Ihrer Nachricht ein zusätzliches " +"„/“ hinzufügen." -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "Sidebar" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Unbekannter Befehl" -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "Zeige oder Verstecke die Kontakt Sidebar" - -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 gibt eine Nachricht ein." - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 und %2 schreiben" - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 und %3 andere schreiben." - -#: chat/chatwindow.cpp:1611 -#, fuzzy +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Chat" -#: chat/chatwindow.cpp:1615 -#, fuzzy +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - Chat" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "Email &senden" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" +"Sind Sie sicher, dass Sie die Menüleiste ausblenden wollen? Um Sie " +"wieder anzuzeigen, können Sie folgenden Kurzbefehl verwenden: %1" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Menüleiste ausblenden" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1 tippt gerade..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 und %2 tippen gerade..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 und %3 andere tippen gerade..." + +#: chat/chatwindow.cpp:2296 +#, fuzzy +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" +"

Chat-Information

Kontakte:
  • %1
Chat-Beginn:
%2
" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "Privaten Chat beginnen" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +msgid "&Send Email" +msgstr "E-Mail &senden" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "&Profil anzeigen" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" -msgstr "" +msgstr "Notizen bearbeiten" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Kontakt hinzufügen" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" -msgstr "Kontakt &erlauben" +msgstr "Kontakt er&lauben" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" -msgstr "Kontakt &löschen" +msgstr "Kontakt löschen" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "Kontakt &blockieren" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" -msgstr "Blockierung &wieder aufheben" +msgstr "Blockier&ung aufheben" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" -msgstr "&Nickname" +msgstr "&Spitzname" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" -msgstr "&Eigene Nachricht" +msgstr "&Statusnachricht" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" -msgstr "&Emailadresse" +msgstr "&E-Mail-Adresse" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "&Kopieren..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" +msgstr "&Kopieren" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Geblockt" -#: chat/contactframe.cpp:652 -#, fuzzy +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" -msgstr "Dieser Kontakt ist nicht Online" +msgstr "Der Kontakt ist %1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" +"

Sie haben noch keine eigenen Emoticons hinzugefügt.

Um " +"neue Emoticons hinzuzufügen, klicken Sie hier!

" -#: chat/emoticonsidebar.cpp:212 -#, fuzzy +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" -msgstr "Kontakt hinzufügen" +msgstr "Zum Chat hinzufügen" -#: chat/emoticonsidebar.cpp:213 -#, fuzzy -msgid "Insert new" -msgstr "Ein Emoticon einfügen" +#: chat/emoticonswidget.cpp:450 +msgid "Add New" +msgstr "Neues hinzufügen" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" -msgstr "" +msgstr "Bearbeiten" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 -#, fuzzy +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" -msgstr "Gelöscht" +msgstr "Entfernen" -#: contact/contactbase.cpp:280 -msgid "Windows Mobile" -msgstr "" - -#: contact/contactbase.cpp:284 +#: chat/winkswidget.cpp:106 #, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

Sie haben noch keine eigenen Emoticons hinzugefügt.

Um " +"neue Emoticons hinzuzufügen, klicken Sie hier!

" + +#: contact/contactbase.cpp:304 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:308 msgid "Web Messenger" -msgstr "Webdesign" - -#: contact/contactbase.cpp:288 -msgid "Office Communicator" -msgstr "" - -#: contact/contactbase.cpp:292 -msgid "Messenger Bot" -msgstr "" - -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 -msgid "MSN Messenger %1 compatible" -msgstr "" +msgstr "Web Messenger" #: contact/contactbase.cpp:312 -#, fuzzy -msgid "Windows Live Messenger %1" -msgstr "Webdesign" +msgid "Office Communicator" +msgstr "Office Communicator" #: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" +msgid "Messenger Bot" +msgstr "Messenger Bot" -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 kompatibel" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" -msgstr "" +msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 kompatibel" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 kompatibel" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Online" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Offline" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Erlaubt" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Gelöscht" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 %2" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 %2" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Abwesend" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Bin gleich zurück" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Beschäftigt" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Unsichtbar" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Abwesend" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "Abwesend (mit Abwesenheitsnachricht)" + +#: contact/msnstatus.cpp:160 msgid "Idle" -msgstr "Idle" +msgstr "Inaktiv" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Bin gleich zurück" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Am Telefon" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" -msgstr "Mittagessen" +msgstr "Beim Mittagessen" -#: dialogs/addcontactdialog.cpp:48 -#, fuzzy +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Unsichtbar" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Offline" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Mein Status" + +#: contact/msnstatus.cpp:215 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Verbindung trennen" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" -msgstr "Kontakt hinzufügen" +msgstr "Einen Kontakt hinzufügen" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Gruppe löschen" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" msgstr "Neues Emoticon hinzufügen" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "Emoticons" +msgstr "Emoticon bearbeiten" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "Das Emoticon \"%1\" existiert bereits, möchten Sie es ersetzen?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "Das Emoticon „%1“ existiert bereits. Wollen Sie es ersetzen?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "Geben Sie eine Abwesenheitsnachricht ein" +#: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "Automatische Abwesenheitsnachricht" -#: dialogs/contactaddeduserdialog.cpp:33 -msgid "You have been added by someone" -msgstr "" +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Chat-Verlauf" -#: dialogs/contactaddeduserdialog.cpp:85 -#, fuzzy +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." msgstr "" -"%1\n" -"hat Sie zu seiner Kontaktliste hinzugefügt. Möchten Sie:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Es kann kein lokaler Port geöffnet werden." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Sie wurden von jemandem hinzugefügt" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"
hat Sie zu seiner/ihrer Kontaktliste hinzugefügt. " + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Kontakteigenschaften von %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Verbunden" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" -msgstr "" +msgstr "Noch nicht gesehen" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "Zeigt die &Zeit an in Chatsnachrichten" +msgstr "Bisher keine Nachrichten erhalten" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" -msgstr "" +msgstr "Zuletzt online: %1" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" -msgstr "" +msgstr "Letzte Nachricht: %1" -#: dialogs/contactpropertiesdialog.cpp:383 -#, fuzzy -msgid "Email: %1" -msgstr "Email" +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-Mail-Adresse: %1" -#: dialogs/contactpropertiesdialog.cpp:384 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" msgid "Client: %1" -msgstr "EMail Programm" +msgstr "MSN-Programm: %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Klicken Sie hier, um das Anzeigebild des Kontakts wiederherzustellen." + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kontaktliste" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Kontakte einladen" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "Exportiere Kontakliste von %1" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Nichts zum exportieren" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "Datei existiert bereits" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "Die Datei „%1“ existiert bereits. Möchten Sie sie überschreiben?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "Exportieren abgeschlossen" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "Das Exportieren der Kontaktliste ist abgeschlossen" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "Unterfenster speichern" #: dialogs/networkwindow.cpp:79 -#, fuzzy -msgid "S&ave tab" -msgstr "Tab speichern" +msgid "C&lear Tab" +msgstr "Unterfenster &leeren" #: dialogs/networkwindow.cpp:80 -#, fuzzy -msgid "C&lear tab" -msgstr "Tab löschen" +msgid "C&lose All Tabs" +msgstr "A&lle Unterfenster schließen" -#: dialogs/networkwindow.cpp:1054 -#, fuzzy +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." -msgstr "Es bestehen keine Verbindungen. Kann das Netzwerkfenster nicht öffnen." +msgstr "" +"Es bestehen keine Verbindungen.\n" +"
Kann das Netzwerkfenster nicht öffnen." -#: dialogs/networkwindow.cpp:1100 -#, fuzzy +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -"Konnte das Netzwerkfenster nicht abspeichern. Bitte stellen Sie sicher, dass " -"sie Schreibrechte für den Ordner besitzen in dem der Mitschnitt gespeichert " -"werden soll." +"Das Protokoll des Netzwerkfensters kann nicht gespeichert werden. Bitte " +"stellen Sie sicher, dass Sie Schreibrechte für den Ordner besitzen, in dem " +"das Protokoll gespeichert werden soll." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." -msgstr "Kann den Hauptverbindungstab nicht schließen." +msgstr "Das Unterfenster der Hauptverbindung kann nicht geschlossen werden." -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" +"Es ist riskant dem Server Befehle zu senden.
Falls Sie nicht genau " +"wissen was Sie machen, könnten Sie Glück haben und nur Ihre Verbindung mit " +"dem MSN-Server verlieren, oder Sie könnten ernsthafteren Konsequenzen " +"gegenüber stehen.
Sie wurden gewarnt!
Wollen Sie diese " +"Nachricht weiterhin senden?" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 +#, fuzzy msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" +"Die Last die Sie zu senden versuchen, endet nicht mit der benötigten " +"„newline“ ('\\r\\n')!
Wollen Sie, dass KMess es hinzufügt?" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 #, fuzzy msgid "Cannot send commands to this kind of connection!" -msgstr "Kann den Hauptverbindungstab nicht schließen." +msgstr "Es ist nicht möglich Befehle zu dieser Art von Verbindung zu senden" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "Abgebrochen" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "Fehlgeschlagen!" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Fertig" +msgstr "Abgeschlossen" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" -msgstr "%1 kb" +msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:335 -#, fuzzy +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." -msgstr "%1 von %2 empfangen" +msgstr "%1 von %2 empfangen." -#: dialogs/transferentry.cpp:339 -#, fuzzy +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." -msgstr "%1 von %2 gesendet" +msgstr "%1 von %2 gesendet." -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "unbekannt" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "Als Anzeigebild verwenden" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Löschen" + +#: dialogs/userpicturesdialog.cpp:46 #, fuzzy -msgid "Cl&ean Up" -msgstr "&Aufräumen" +msgid "Choose or Remove Your Display Picture" +msgstr "Wählen oder entfernen Sie Ihr Anzeigebild" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Bild löschen" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete the picture?" +msgstr "Sind Sie sicher, dass Sie dieses Bild löschen wollen?" -#: emoticontheme.cpp:601 +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -"Konnte das Emoticontheme nicht abspeichern. Bitte stellen Sie sicher, dass " -"sie Schreibrechte für den Theme-Ordner besitzen '%1'." +"Das Emoticondesign kann nicht abgespeichert werden. Bitte stellen Sie " +"sicher, dass Sie Schreibrechte für den Ordner, in dem die Designs " +"gespeichert werden, besitzen: „%1“." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" -msgstr "Lächeln" +msgstr "lächelnd" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" -msgstr "Zwinkern" +msgstr "zwinkernd" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Zunge raus" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" -msgstr "Großes Lachen" +msgstr "großes Lächeln" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" -msgstr "Traurig" +msgstr "traurig" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" -msgstr "Weinen" +msgstr "weinend" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" -msgstr "Ärgerlich" +msgstr "wütend" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" -msgstr "Verwirrt" +msgstr "verwirrt" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" -msgstr "Peinlich" +msgstr "peinlich" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" -msgstr "Enttäuscht" +msgstr "enttäuscht" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" -msgstr "Heiß" +msgstr "heiß" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" -msgstr "Zähne zeigend" +msgstr "Zähne fletschend" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" -msgstr "Freak" +msgstr "Nerd" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" -msgstr "Krank" +msgstr "krank" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" -msgstr "Überrascht" +msgstr "überrascht" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Party" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" -msgstr "Müde" +msgstr "müde" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" -msgstr "Nachdenkend" +msgstr "nachdenkend" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Sag es niemandem" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" -msgstr "Geheimnis flüsternd" +msgstr "flüsternd" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" -msgstr "Augen rollend" +msgstr "augenrollend" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" -msgstr "Sarkastisch" +msgstr "sarkastisch" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "Keine Ahnung" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Bin gleich zurück" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Engel" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Umarmung von links" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Junge" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" -msgstr "Rotes Herz" +msgstr "rotes Herz" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" -msgstr "Rote Rose" +msgstr "rote Rose" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "Daumen hoch" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Hundegesicht" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Sonne" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Teufel" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Umarmung von rechts" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Mädchen" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "gebrochenes Herz" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" -msgstr "Welkende Rose" +msgstr "welkende Rose" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Daumen runter" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Katzengesicht" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "schlafender Halbmond" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" -msgstr "Rote Lippen" +msgstr "rote Lippen" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Klatschen" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "gekreuzte Finger" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Auto" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Flugzeug" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Schildkröte" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" -msgstr "Schlange" +msgstr "Schnecke" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Schwarzes Schaf" +#: emoticontheme.cpp:869 +msgid "Sheep" +msgstr "Schaf" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Ziege" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "Fledermaus" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Bierkrug" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "Martiniglas" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" -msgstr "Kaffeepott" +msgstr "Kaffeetasse" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Geburtstagskuchen" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Teller" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Schüssel" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Stern" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Regenbogen" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Gewitterwolken" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Blitz" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Regenschirm" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Insel mit Palme" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" -msgstr "Telephonhörer" +msgstr "Telefonhörer" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" -msgstr "Handy" +msgstr "Mobiltelefon" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" -msgstr "Email" +msgstr "E-Mail" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Uhr" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "Filmstreifen" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Note" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Handschellen" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Geld" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "Glühbirne" -#: emoticontheme.cpp:882 -msgid "Cigarrette" -msgstr "Zigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" +msgstr "Zigarette" -#: emoticontheme.cpp:883 -msgid "Soccer ball" +#: emoticontheme.cpp:896 +msgid "Football ball" msgstr "Fußball" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Geschenk" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Computer" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" -msgstr "KMess Icon" +msgstr "KMess-Symbol" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "Kann die Verbindung nicht wiederaufnehmen: Zugang nicht gefunden." + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" +"Kann die Verbindung nicht wiederaufnehmen: Dieser Zugang hat kein " +"gespeichertes Passwort." + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" +"Warte auf eine Internetverbindung um die Verbindung wiederherzustellen..." +"
Jetzt Wiederverbinden" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" msgid "Internet connection not available." -msgstr "Der Server ist nicht erreichbar" +msgstr "Keine Internetverbindung nicht verfügbar" -#: initialview.cpp:377 -msgid "Connect" -msgstr "Verbinden" - -#: initialview.cpp:382 +#: initialview.cpp:405 #, fuzzy -msgid "Disconnect" -msgstr "Verbindung &trennen" +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +"Warte %1 Sekunde, auf Wiederverbindung.
Jetzt " +"Wiederverbinden" +msgstr[1] "" +"Warte %1 Sekunden, auf Wiederverbindung.
Jetzt " +"Wiederverbinden" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "" +#: initialview.cpp:581 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Verbinden" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "" +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" +msgstr "Abbrechen" -#: kmess.cpp:223 -#, fuzzy +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "Bitte geben Sie Ihre E-Mail und Ihr Passwort ein." + +#: initialview.cpp:657 +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Geben Sie bitte eine gültige E-Mail-Adresse ein." + +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "Kontaktinformationen" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "Der Kontakt „%1“, ist bereits in Ihrer Liste." + +#: kmess.cpp:250 msgid "New Group" -msgstr "Neue &Gruppe" +msgstr "Neue Gruppe" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Gruppe hinzufügen" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" -msgstr "Geben Sie den neuen Namen für diese Gruppe ein:" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" +msgstr "Geben Sie einen Namen für die neue Gruppe ein:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "" -" Sind Sie sicher, dass Sie den Kontakt %1> von Ihrer Kontaktliste " -"löschen wollen?" +"Sind Sie sicher, dass Sie %1 von Ihrer Kontaktliste entfernen " +"wollen?" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +msgid "Remove Contact" msgstr "Kontakt löschen" -#: kmess.cpp:573 -msgid "Remove and block" -msgstr "Löschen und Blocken" +#: kmess.cpp:581 +msgid "Remove and Block" +msgstr "Löschen und blockieren" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" +"Die Gruppe „%1“ ist nicht leer! Entfernen Sie alle darin " +"befindlichen Kontakte und versuchen Sie es erneut." -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" -msgstr "" +msgid "Group Removal" +msgstr "Entfernen einer Gruppe" -#: kmess.cpp:628 -#, fuzzy +#: kmess.cpp:634 msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" -" Sind Sie sicher, dass Sie die Gruppe %1> von Ihrer Kontaktliste " -"löschen wollen?" +"Sind Sie sicher, dass Sie die Gruppe %1 aus Ihrer Kontaktliste " +"entfernen wollen?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" -msgstr "Gelöscht" +msgstr "Löschen" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." -msgstr "Dieses ist eine spezielle Gruppe und kann nicht verändert werden." +msgstr "Das ist eine spezielle Gruppe, die nicht verändert werden kann." -#: kmess.cpp:671 -msgid "Rename group" +#: kmess.cpp:677 +msgid "Rename Group" msgstr "Gruppe umbenennen" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Geben Sie einen neuen Namen für die Gruppe ein:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" +"

Die automatische Anmeldung funktioniert nicht mit diesem Zugang: „%1“.
Sie müssen erst das Passwort des Zugangs speichern.

" -#: kmess.cpp:746 -#, fuzzy +#: kmess.cpp:757 msgctxt "dialog title" -msgid "Autologin failed" -msgstr "Anmeldung fehlgeschlagen" +msgid "Autologin Failed" +msgstr "Automatische Anmeldung fehlgeschlagen" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Verbinde ..." + +#: kmess.cpp:1123 +msgctxt "Status bar message" msgid "Disconnected" -msgstr "Nicht Verbunden" +msgstr "Verbindung getrennt" -#: kmess.cpp:1408 -#, fuzzy +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "

KMess hat in den folgenden Ordner danach gesucht:
%1

" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" -"

KMess wird keine Sounds und Benachrichtigungen abspielen können.

Die Kmess Datei 'eventsrc' konnte nicht in einem der folgenden Ordner " -"gefunden werden: %1

Bitte überprüfen Sie Ihre Installation, und " -"kopieren sie Die fehlende Datei in einen der aufgelisteten Ordner.

" +"

KMess wird keine Sounds abspielen und keine Benachrichtigungen " +"anzeigen können.

Die benötigte Datei „kmess.notifyrc“ kann in keinem " +"der folgenden Ordner gefunden werden.

%1

Bitte überprüfen Sie Ihre " +"Installation.

" -#: kmess.cpp:1412 -msgid "Error with notifications" -msgstr "Fehler mit Benachrichtigung" +#: kmess.cpp:1481 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "" -#: kmess.cpp:1589 -#, fuzzy -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Aktionen" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Neuer K&ontakt" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Neue &Gruppe" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "Kontakt s&uchen" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Kontakt nach &Interesse suchen" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "Kontakt s&uchen" +msgstr "KMess - %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Neues &Konto" +msgid "&Disconnect" +msgstr "Verbin&dung trennen" #: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Konto&einstellungen" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "&Verbinden" - -#: kmessinterface.cpp:214 -msgid "&Disconnect" -msgstr "Verbindung &trennen" - -#: kmessinterface.cpp:215 msgid "Show My &Profile" msgstr "Mein &Profil anzeigen" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Mein Status" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Abwesend (Auto-Reply)" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" -msgstr "&Autorisierte Kontakte anzeigen" +msgstr "Erl&aubte Kontakte anzeigen" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" -msgstr "Kontakte die &Offline sind anzeigen" +msgstr "&Offline-Kontakte anzeigen" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" -msgstr "G&elöschte Kontakte anzeigen" +msgstr "Gelöschte Kontakte anzeigen" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 #, fuzzy +msgid "Show &History Box" +msgstr "C&hat-Verlauf anzeigen" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "Kontakt&suchleiste anzeigen" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" -msgstr "&Emoticons anzeigen" +msgstr "L&eere Gruppen anzeigen" -#: kmessinterface.cpp:321 -#, fuzzy -msgid "Display Pictures Size" -msgstr "Mein Bild" +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "Kontaktanzeigebilder" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -#, fuzzy -msgid "Small" -msgstr "Lächeln" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" -msgstr "&Sortiere Kontakt nach" +msgstr "Kontakte &sortieren nach" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "&Übertragungsfenster anzeigen" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "Kontakt hinzufügen ..." + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "Neue &Gruppe erstellen ..." + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "Kontaktliste &exportieren ..." + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "Nach K&ontakt suchen" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Kontakt nach &Interesse suchen" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "C&hat-Verlauf anzeigen" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "Neuen Zug&ang erstellen ..." + +#: kmessinterface.cpp:189 +msgid "Configure Account..." +msgstr "Zug&ang bearbeiten ..." + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "&KMess einrichten ..." + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "Auswahl&menü zeigen" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "Nicht anzeigen" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "Klein" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "Mittel" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "Groß" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "Gruppe" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Online/Offline" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "Gemischt" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "&Übertragungsfenster anzeigen" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "&Netzwerkfenster anzeigen" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "Höre gerade %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "[%1] angemeldet als %2" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr "" +msgstr "[%1] %2 hat sich angemeldet" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr "" +msgstr "[%1] %2 hat sich abgemeldet" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "Cha&t" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Eigenschaften" -#: kmessview.cpp:569 -msgid "&Remove from group" -msgstr "Von Gruppe &entfernen" +#: kmessview.cpp:600 +msgid "&Remove From Group" +msgstr "Aus G&ruppe entfernen" -#: kmessview.cpp:574 +#: kmessview.cpp:605 #, fuzzy -msgid "&Listening Music" -msgstr "Höre %1" +msgid "Song &Name" +msgstr "Musiktitelname" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" -msgstr "In Gruppe &kopieren" +msgstr "In Gruppe kopieren" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" -msgstr "In Gruppe &verschieben" +msgstr "In Gruppe verschieben" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" -msgstr "Gruppe nach &unten verschieben" +msgstr "Gruppe nach unten verschieben" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Gruppe nach &oben verschieben" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" -msgstr "Gruppe &löschen" +msgstr "Gruppe löschen" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" -msgstr "Gruppe &umbenennen" +msgstr "Gruppe umbe&nennen" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "Email" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Diesen Kont&akt zu Ihrer Kontaktliste hinzufügen" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" -msgstr "" - -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" - -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" - -#: kmessview.cpp:1085 +#: kmessview.cpp:1133 #, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-Mail-Adresse" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "MSN-Programm: %1" + +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "Ja" + +#: kmessview.cpp:1156 +msgid "No" +msgstr "Nein" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Geblockt" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Zuletzt online: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Letzte Nachricht: %1" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" -msgstr "
%1 (%2)" +msgstr "Gruppe %1" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "Kontakte" - -#: kmessview.cpp:1095 -#, fuzzy +#: kmessview.cpp:1212 msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Dieser Kontakt ist nicht Online" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 Kontakt, %2 online" +msgstr[1] "%1 Kontakte, %2 online" -#: kmessview.cpp:1504 -#, fuzzy +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 Kontakt" +msgstr[1] "%1 Kontakte" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" -msgstr "Geben Sie hier Ihre persönliche Nachricht ein " +msgstr "<Geben Sie hier Ihre Statusnachricht ein>" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +#, fuzzy +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" +"Geben Sie hier eine Nachricht ein, die neben Ihrem Spitznamen zu sehen sein " +"soll" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1 neue E-Mail-Nachricht" +msgstr[1] "%1 neue E-Mail-Nachrichten" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" -msgstr "" +msgstr "Ein MSN-Messenger-Programm für KDE" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:60 msgid "Developer and project founder" -msgstr "" +msgstr "Entwickler und Projektgründer" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:61 msgid "Developer" -msgstr "" +msgstr "Entwickler" -#: main.cpp:72 -#, fuzzy +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 msgid "Project support" -msgstr "P4-Kontextfeld Support" +msgstr "Unterstützung des Projekts" -#: main.cpp:73 main.cpp:74 main.cpp:75 -#, fuzzy +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" -msgstr "GnomeMeeting Entwickler" +msgstr "Aktueller Entwickler" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastasi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:69 +#, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "" -"Deutsche Übersetzung, Testen, Dokumentation und Homepage, Projektmanagement, " +"Deutsche Übersetzung, Testen, Dokumentation, Web-Master, Projekt-Management, " "etc..." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:70 msgid "Web design" msgstr "Webdesign" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "" -"Die Haupt und die gelben/blauen/violetten Emoticons sowie die Italienische " -"Übersetzung" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "gelbe, blaue und violete Emoticon-Stile, Italienische Übersetzung" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:72 msgid "Cartoon emoticons" -msgstr "Cartoon Emoticons" +msgstr "Cartoon-Emoticons" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:73 msgid "Default sound theme" -msgstr "Standart Sound Theme" - -#: main.cpp:83 -msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:74 +msgid "KMess icon in Oxygen style" +msgstr "KMess-Symbol im Oxygen-Stil" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:78 +#, fuzzy +msgid "Translations Maintainer" +msgstr "Betreuer der Übersetzungen" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:79 +#, fuzzy msgid "Arabic translation, internationalization of file saving fix." msgstr "" -"Arabische Übersetzung und Internationalisierung von Dateispeichern - FIX" +"Arabische Übersetzung, Internationalisierung der Korrektur des " +"Dateispeicherns" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:80 msgid "More Arabic translation" -msgstr "Weitere Arabische Übersetzung" +msgstr "Ergänzung der arabischen Übersetzung" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" -msgstr "Portugisische Übersetzung (Brasilien)" +msgstr "brasilianisch portugiesische Übersetzung" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "Ergänzung der brasilianisch portugiesischen Übersetzung" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Katalanische Übersetzung" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" -"Vereinfachte Chinesische Übersetzung, Dateiübertragungsbugfix. " -"Proxyverbindungscode" +"Chinesische Übersetzung (Kurzzeichen), Behebung der Dateiübertragungen, Code " +"für Proxy-Verbindungen" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" -msgstr "Weitere vereinfachte Chinesische Übersetzung" +msgstr "Ergänzung der chinesischen Übersetzung (Kurzzeichen)" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:89 msgid "Traditional Chinese translation" -msgstr "Traditionelle Chinesische Übersetzung" +msgstr "Chinesische Übersetzung (Langzeichen)" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinese" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "Ergänzung der chinesischen Übersetzung (Langzeichen)" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:92 msgid "Danish translation" msgstr "Dänische Übersetzung" -#: main.cpp:97 -msgid "More Danish translation" -msgstr "Weitere Dänische Übersetzung" +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" -#: main.cpp:98 +#: main.cpp:93 +msgid "More Danish translation" +msgstr "Ergänzung der dänischen Übersetzung" + +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:94 msgid "Dutch translation" msgstr "Niederländische Übersetzung" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" -msgstr "Weitere Niederländische Übersetzung" +msgstr "Ergänzung der niederländischen Übersetzung" -#: main.cpp:102 -msgid "Estonian translation" -msgstr "Estländische Übersetzung" +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:97 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "Ergänzung der deutschen Übersetzung, Griechische Übersetzung" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:101 +msgid "More Greek translation" +msgstr "Ergänzung der griechischen Übersetzung" #: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:103 +msgid "Estonian translation" +msgstr "Estnische Übersetzung" + +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:104 msgid "Finnish translation" msgstr "Finnische Übersetzung" -#: main.cpp:104 main.cpp:105 -msgid "More Finnish translation" -msgstr "Weitere Finnische Übersetzung" +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" -#: main.cpp:107 +#: main.cpp:105 main.cpp:106 +msgid "More Finnish translation" +msgstr "Ergänzung der finnischen Übersetzung" + +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:108 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:108 msgid "French translation" msgstr "Französische Übersetzung" -#: main.cpp:108 -msgid "More French translation, MSN6 emoticon definitions" -msgstr "Französische Übersetzung, MSN6 Emoticon definitionen" +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" #: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "" +"Ergänzung der französischen Übersetzung, Definierung der MSN6-Emoticons" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" -msgstr "Weitere Französische Übersetzung" +msgstr "Ergänzung der französischen Übersetzung" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "Ungarische Übersetzung" -#: main.cpp:112 main.cpp:113 -msgid "More Italian translation" -msgstr "Weitere Italienische Übersetzung" +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" #: main.cpp:114 +msgid "More Hungarian translation" +msgstr "Ergänzung der ungarischen Übersetzung" + +#: main.cpp:115 main.cpp:116 +msgid "More Italian translation" +msgstr "Ergänzung der italienischen Übersetzung" + +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:117 msgid "Korean translation" msgstr "Koreanische Übersetzung" -#: main.cpp:115 -msgid "Norsk Bokmål translation" -msgstr "Norwegische Übersetzung" - -#: main.cpp:117 -msgid "Slovenian translation" -msgstr "Slowakische Übersetzung" +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" #: main.cpp:118 +msgid "Norsk Bokmål translation" +msgstr "Norwegische (Bokmål) Übersetzung" + +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:120 +msgid "Serbian translation" +msgstr "Serbische Übersetzung" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "Slowakische Übersetzung" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "Matjaž kaše" + +#: main.cpp:123 +msgid "Slovenian translation" +msgstr "Slowenische Übersetzung" + +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Spanische Übersetzung" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 -msgid "More Spanish translation" -msgstr "Weitere Spanische Übersetzung" +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" -#: main.cpp:123 +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 +msgid "More Spanish translation" +msgstr "Ergänzung der spanischen Übersetzung" + +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:132 msgid "Swedish translation" msgstr "Schwedische Übersetzung" -#: main.cpp:125 +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:133 +msgid "More Swedish translation" +msgstr "Ergänzung der schwedischen Übersetzung" + +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:135 msgid "Thai translation" msgstr "Thailändische Übersetzung" -#: main.cpp:126 +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:136 msgid "Turkish translation" msgstr "Türkische Übersetzung" -#: main.cpp:127 main.cpp:128 +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:137 main.cpp:138 msgid "More Turkish translation" -msgstr "Weitere Türkische Übersetzung" +msgstr "Ergänzung der türkischen Übersetzung" -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" -#: main.cpp:132 +#: main.cpp:141 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" +msgstr "MSNP12-Unterstützung, verschiedene Verbesserungen" + +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:142 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" -#: main.cpp:133 -#, fuzzy +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:143 msgid "File transfer thumbnails" -msgstr "Dateiübertragung" +msgstr "Vorschau von Dateiübertragungen" -#: main.cpp:134 +#: main.cpp:144 msgid "P4-Context field support" -msgstr "P4-Kontextfeld Support" +msgstr "Ünterstützung für das P4-Kontextfeld" -#: main.cpp:135 +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:145 msgid "Xinerama fixes" -msgstr "Xinerama fixes" +msgstr "Xinerama-Korrekturen" -#: main.cpp:136 +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:146 msgid "Original file receive code" -msgstr "Original Dateiübertragungscode" +msgstr "Ursprünglicher Code für das Empfangen von Dateien" -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" -msgstr "" +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" -#: main.cpp:138 -#, fuzzy +#: main.cpp:147 msgid "KWallet support" -msgstr "P4-Kontextfeld Support" +msgstr "KWallet-Unterstützung" -#: main.cpp:139 +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:148 msgid "" -"Notifications blocking option,winks disabling option,last message date " +"Notifications blocking option, winks disabling option, last message date " "feature" msgstr "" -#: main.cpp:142 -#, fuzzy -msgid "Various internationalization fixes" -msgstr "Mehrere Internationalisierungs Fixes" - -#: main.cpp:143 -msgid "Various internationalization fixes." -msgstr "Mehrere Internationalisierungs Fixes" - -#: main.cpp:145 -msgid "GnomeMeeting developer" -msgstr "GnomeMeeting Entwickler" - -#: main.cpp:146 -msgid "Guy with a bag over his head" -msgstr "Typ mit der Tüte über dem Kopf" +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" #: main.cpp:149 -msgid "Inspiration and assorted code" -msgstr "Inspiration und Code" +msgid "IRC-like commands in the chat window" +msgstr "IRC-ähnliche Befehle im Chat-Fenster" #: main.cpp:150 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "Alter Popup Balloon Code, erster P2P Code, MSN Challenge Handler" +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" #: main.cpp:151 -msgid "Idle timer code" -msgstr "Idle timer Code" +msgid "Dario Freddi" +msgstr "" -#: main.cpp:152 +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "Chat-Verlauf" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "Verschiedene Internationalisierungskorrekturen" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:155 +msgid "Various internationalization fixes." +msgstr "Verschiedene Internationalisierungskorrekturen" + +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:157 +msgid "GnomeMeeting developer" +msgstr "GnomeMeeting-Entwickler" + +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:158 +msgid "Guy with a bag over his head" +msgstr "Typ mit einer Tüte über dem Kopf" + +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 +msgid "Inspiration and assorted code" +msgstr "Inspiration und verschiedener Code" + +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:162 +msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgstr "" +"Alter Popup-Balloon-Code, ursprünglicher P2P-Code, MSN-Challenge-Handler" + +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 +msgid "Idle timer code" +msgstr "" + +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" -msgstr "Ihr Name hier?" +msgstr "Ihr Name soll auch hier stehen?" -#: main.cpp:156 -#, fuzzy +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -"Sie sind eingeladen Ihre Bugfixes und Patches im KMess Hilfe Forum zu " -"posten!\n" +"Sie sind eingeladen Fehlerkorrekturen und Verbesserungen im KMess-Forum zu " +"veröffentlichen!\n" "Wenn Sie das Gefühl haben, dass Ihr Name hier fehlt kontaktieren Sie uns " -"bitte! " - -#: main.cpp:159 -#, fuzzy -msgctxt "NAME OF TRANSLATORS" -msgid "Your names" -msgstr "Ihr Name" - -#: main.cpp:160 -#, fuzzy -msgctxt "EMAIL OF TRANSLATORS" -msgid "Your emails" -msgstr "Ihre Emailadresse:" - -#: main.cpp:166 -msgid "Autologin with the given email address" -msgstr "Automatisch mit der gegebenen Emailadresse Anmelden" +"bitte!" #: main.cpp:171 -msgid "Run a debug test (developer build only)" +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:172 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your emails" +msgstr "pano_90@gmx.net" + +#: main.cpp:178 +msgid "Do not show the Contact List window initially" msgstr "" +#: main.cpp:179 +msgid "Autologin with the given email address" +msgstr "Automatisch mit der gegebenen E-Mail-Adresse anmelden" + +#: main.cpp:184 +msgid "Run a debug test (developer build only)" +msgstr "Einen Debug-Test ausführen (nur in der Entwickler-Version möglich)" + +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Erlaubt" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Entfernt" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." -msgstr "Der Kontakt hat die Session abgebrochen." +msgstr "Der Kontakt hat die Sitzung abgebrochen." #: network/applications/application.cpp:306 msgid "The contact rejected the invitation." @@ -3067,73 +4477,117 @@ msgstr "Der Kontakt hat die Einladung abgelehnt." #: network/applications/application.cpp:378 msgid "You have cancelled the session." -msgstr "Sie haben die Session abgebrochen." +msgstr "Sie haben die Sitzung abgebrochen." #: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Sie haben die Einladung abgelehnt." #: network/applications/application.cpp:540 -#, fuzzy -msgid "Do you want to accept or cancel?" -msgstr "Möchten Sie annehmen oder ablehnen ?" +msgid "Do you want to accept or cancel?" +msgstr "Wollen Sie annehmen oder ablehnen?" #: network/applications/application.cpp:581 -#, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "Hier klicken um abzubrechen." -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Möchten Sie die Datei annehmen: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "Der Kontakt will Ihnen eine Datei senden: "%1" (%2)." -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "Die Übertragung von %1 ist fehlgeschlagen. Konnte Datei nicht öffnen." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Die Datei "%1" existiert bereits.\n" +"Wollen Sie sie überschreiben?" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "" +"Die Übertragung der Datei "%1" ist fehlgeschlagen. Die Datei kann " +"nicht gespeichert werden." + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "" +"Die Übertragung von %1 ist fehlgeschlagen. Die Zieldatei kann nicht geöffnet " +"werden." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Dateiübertragung angenommen." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "Verbinde zu %1, Port %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "Die Übertragung wurde abgebrochen" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Der Kontakt hat die Übertragung der Datei "%1" abgebrochen." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "Sie haben die Übertragung der Datei "%1" abgebrochen." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "Sie haben die Übertragung der Datei "%1" abgelehnt." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Verbindung hergestellt" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" -msgstr "Datei erfolgreich übertragen: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "Die Datei "%1" wurde erfolgreich übertragen." -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Die Übertragung von %1 ist fehlgeschlagen. Die Datei existiert nicht." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "Die Datei "%1" wurde erfolgreich empfangen." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "" -"Die Übertragung von %1 ist fehlgeschlagen. Datei konnte nicht gelesen " -"werden." +"Die Übertragung von "%1" ist fehlgeschlagen. Die Datei existiert " +"nicht." -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "Sende Datei %1" +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "" +"Die Übertragung von "%1" ist fehlgeschlagen. Die Datei konnte " +"nicht gelesen werden." -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Sende Datei "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Der Kontakt hat die Übertragung der Datei "%1" angenommen." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" -msgstr "Überprüfen der Verbindungsmöglichkeiten" +msgstr "Überprüfe die Verbindungsmöglichkeiten" #: network/applications/filetransferp2p.cpp:129 #: network/applications/filetransferp2p.cpp:143 @@ -3141,1305 +4595,1436 @@ msgstr "Überprüfen der Verbindungsmöglichkeiten" #: network/extra/msnftpconnection.cpp:132 msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "" -"Die Dateiübertragungseinladung wurde abgebrochen. Fehlerhafte Daten wurden " -"empfangen." +"Die Einladung zur Dateiübertragung ist abgebrochen worden. Es sind " +"fehlerhafte Daten empfangen worden." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"Die Datei '%1' existiert bereits.\n" -" Möchten Sie die Datei überschreiben?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "Die Übertragung von %1 ist fehlgeschlagen. Konnte Datei nicht öffnen." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." -msgstr "" +msgstr "Sie haben die Übertragung der Datei "%1" angenommen." -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Der Kontakt hat den Transfer abgebrochen." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Sie haben die Session abgebrochen." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "Datei konnte nicht geschrieben werden" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Datei erfolgreich übertragen: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Datei erfolgreich übertragen: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "Die Übertragung von %1 ist fehlgeschlagen. Die Datei existiert nicht." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "" -"Die Übertragung von %1 ist fehlgeschlagen. Datei konnte nicht gelesen werden." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Sende Datei %1 (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Der Kontakt hat den Transfer abgebrochen." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "Sie sind eingeladen ein Meeting zu starten (mit GnomeMeeting)." +msgstr "Sie wurden eingeladen eine Konferenz zu starten (mit GnomeMeeting)." #: network/applications/gnomemeeting.cpp:118 msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "Starte GnomeMeeting. Verbinde zu %1" +msgstr "Starte GnomeMeeting. Verbinde zu %1." #: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." -msgstr "Lade den Kontakt zu einem Meeting ein." +msgstr "Lade den Kontakt zu einer Konferenz ein." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" -"Die Einladung wurde abgelehnt. Sie wird vom anderen Client nicht unterstützt." +"Die Einladung ist abgelehnt worden. Sie wird vom anderen Programm nicht " +"unterstützt." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." -msgstr "Die Einladung wurde abgebrochen. Ein interner Fehler ist aufgetreten." +msgstr "" +"Die Einladung ist abgebrochen worden. Ein interner Fehler ist aufgetreten." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 +#, fuzzy msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "" -"Die Einladung wurde abgebrochen. Zeitüberschreitung beim Warten auf den " -"anderen Kontakt zum Annehmen." +"Die Einladung ist abgebrochen worden. Es ist eine Zeitüberschreitung beim " +"Warten auf den anderen Kontakt zum Annehmen, eingetreten." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 +#, fuzzy msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "" -"Die Einladung wurde abgebrochen. Zeitüberschreitung beim Warten auf die " -"Daten der Datei." +"Die Einladung ist abgebrochen worden. Es ist eine Zeitüberschreitung beim " +"Warten auf die Daten der Datei eingetreten." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" -"Die Einladung wurde abgebrochen. Das Switchboard hat die Chatverbindung " +"Die Einladung ist abgebrochen worden. Das Switchboard hat die Chatverbindung " "geschlossen." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." -msgstr "Die Einladung wurde abgebrochen." +msgstr "Die Einladung ist abgebrochen worden." #: network/applications/msnremotedesktop.cpp:52 +#, fuzzy msgid "You are invited to share this person's desktop." -msgstr "Sie wurden von dieser Person eingeladen sein Desktop zu sharen." +msgstr "Sie wurden eingeladen den Desktop dieser Person, mit ihr zu teilen." #: network/applications/msnremotedesktop.cpp:159 msgid "Starting KRDC. Connecting to %1." -msgstr "Starte KRDC. Verbinde zu %1" - -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "" -"Der Kontakt hat die Einladung abgelehnt. Ein interner Fehler ist aufgetreten." - -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "Die Übertragung ist fehlgeschlagen" - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 -msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " -"support it." -msgstr "" -"Die Einladung wurde abgebrochen. Der Kontakt hat fehlerhafte Daten übersand, " -"oder KMess unterstützt es nicht." - -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"Die Übertragung wurde abgebrochen. Der Kontakt hat fehlerhafte Daten " -"übersand, oder KMess unterstützt es nicht." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "" -"Die Übertragung ist fehlgeschlagen. Zeitüberschreitung beim Warten auf den " -"anderen Kontakt zum Annehmen." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "" -"Die Übertragung ist fehlgeschlagen. Ein interner Error ist aufgetreten." - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "" -"Die Übertragung ist fehlgeschlagen. Konnte die Datenquelle nicht öffnen." +msgstr "Starte KRDC. Verbinde zu %1." #: network/applications/p2papplication.cpp:215 msgid "The contact initiated a MSN6 feature KMess can't handle yet." msgstr "" -"Der Kontakt hat ein MSN6 feature ausgeführt, welches KMess noch nicht " -"bearbeiten kann." +"Der Kontakt hat eine MSN6-Funktion ausgeführt, die KMess noch nicht " +"unterstützt." -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"support it." +msgstr "" +"Die Einladung ist abgebrochen worden. Entweder hat der Kontakt fehlerhafte " +"Daten gesendet, oder KMess unterstützt diese Einladung nicht." + +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." -msgstr "Die Übertragung ist fehlgeschlagen. Datenaufbereitungfehlgeschlagen." +msgstr "" +"Die Übertragung ist fehlgeschlagen. Die Datenvorbereitung ist fehlgeschlagen." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 +#, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "" -"Die Einladung wurde abgebrochen. Nachricht wurde nicht zu uns geleitet." +"Die Einladung ist abgebrochen worden. Die Nachricht wurde nicht zu uns " +"geleitet." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" -"Die Übertragung wurde abgebrochen. Der Kontakt hat fehlerhafte Daten " -"übersand, oder KMess unterstützt es nicht." +"Die Übertragung ist fehlgeschlagen. Der Kontakt hat entweder fehlerhafte " +"Daten gesendet, oder KMess unterstützt diese Art der Übertragung nicht." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "" +"Der Kontakt hat die Einladung abgelehnt. Ein interner Fehler ist aufgetreten." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "Warte auf Verbindung an %1, Port %2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "Wechsle zu indirekter Dateiübertragung (könnte langsam sein)." +msgstr "Falle zu indirekter Dateiübertragung zurück (dies kann langsam sein)." -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "Warte auf Verbindung" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 +#, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "" -"Die Einladung wurde abgebrochen. Zeitüberschreitung beim Warten auf den " -"anderen Kontakt zum Annehmen." +"Die Einladung ist abgebrochen worden. Es ist eine Zeitüberschreitung beim " +"Warten eingetreten." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 +#, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "" -"Die Einladung wurde abgebrochen. Zeitüberschreitung beim Warten auf eine " -"Verbindung um fortzufahren oder abzubrechen." +"Die Einladung ist abgebrochen worden. Es ist eine Zeitüberschreitung beim " +"Warten auf eine Verbindung um fortzufahren oder abzubrechen, eingetreten." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 +#, fuzzy msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" -"Die Einladung wurde abgebrochen. Zeitüberschreitung beim Warten auf die " -"Daten." +"Die Einladung ist abgebrochen worden. Es ist eine Zeitüberschreitung beim " +"Warten auf die Daten, eingetreten." + +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Die Übertragung ist fehlgeschlagen." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Die Übertragung ist fehlgeschlagen. Der Kontakt hat entweder fehlerhafte 
Daten gesendet, oder KMess unterstützt diese Art der Übertragung nicht." + +#: network/applications/p2papplicationbase.cpp:1170 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" +"Die Übertragung ist fehlgeschlagen. Eine Zeitüberschreitung Warten auf den " +"anderen Kontakt zum Annehmen trat ein." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "" +"Die Übertragung ist fehlgeschlagen. Ein interner Fehler ist aufgetreten." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "" +"Die Übertragung ist fehlgeschlagen. Die Datenquelle kann nicht geöffnet " +"werden." #: network/applications/voiceconversation.cpp:71 +#, fuzzy msgid "You are invited to start a voice conversation." -msgstr "Sie wurden eingeladen eine Sprachverbindung aufzubauen." +msgstr "Sie sind eingeladen worden, eine Sprachunterhaltung aufzubauen." #: network/applications/voiceconversation.cpp:76 +#, fuzzy msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "" -"Sie wurden eingeladen eine Sprachverbindung aufzubauen, es ist aber keine " -"Unterstützung dafür installiert." +"Sie sind eingeladen worden eine Sprachunterhaltung aufzubauen, es wurde aber " +"keine Unterstützung dafür installiert." #: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." -msgstr "Sie haben die Sprachverbindung abgebrochen." +msgstr "Sie haben die Sprachunterhaltung abgebrochen." #: network/applications/voiceconversation.cpp:205 msgid "The invitation was cancelled. The audio device couldn't be opened." msgstr "" -"Die Einladung wurde abgebrochen. Das Audiogerät konnte nicht geöffnet werden." +"Die Einladung ist abgebrochen worden. Das Audiogerät kann nicht geöffnet " +"werden." #: network/applications/voiceconversation.cpp:218 msgid "Start voice conversation. Connecting to %1." -msgstr "Starte die Sprachübertragung. Verbinde zu %1" +msgstr "Beginne die Sprachunterhaltung. Verbinde zu %1." #: network/applications/voiceconversation.cpp:224 +#, fuzzy msgid "Start voice conversation. Listening on %1." -msgstr "Starte die Dateiübertragung. Höre auf %1" +msgstr "Beginne die Sprachunterhaltung. Höre auf %1." #: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." -msgstr "Lade den Kontakt zu einer Sprachübertragung ein." +msgstr "Lade den Kontakt zu einer Sprachunterhaltung ein." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" -"Der Kontakt lädt sie ein für %1, aber dieses ist noch nicht implementiert." +"Der Kontakt lädt sie auf „%1“ ein, jedoch wird dies noch nicht unterstützt." -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." msgstr "" +"Die Webcameinladung ist abgebrochen worden. Es sind fehlerhafte Daten " +"empfangen worden." -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "Die Übertragung von %1 wurde abgebrochen." +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Sie wurden gebeten den Zugriff auf Ihre Webcam zu gewähren." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "Sie sind eingeladen, auf die Webcam des Kontakts zuzugreifen." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "Webcam" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "Fehlgeschlagen" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "" -"Die Übertragung von %1 ist fehlgeschlagen. Konnte keinen lokalen Port " -"öffnen." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Sende Datei %1" -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "" +"Die Übertragung von %1 ist fehlgeschlagen. Es kann kein lokaler Port " +"geöffnet werden." + +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." -msgstr "Konnte keinen lokalen Port öffnen." +msgstr "Es kann kein lokaler Port geöffnet werden." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" -msgstr "Initialisiere die Dateiübertragung" +msgstr "Leite Dateiübertragung ein" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." msgstr "" -"Die Übertragung von %1 ist fehlgeschlagen. Verbindung konnte nicht " -"hergestellt werden" +"Die Übertragung von %1 ist fehlgeschlagen. Es kann keine Verbindung " +"hergestellt werden." -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "Konnte keine Verbindung herstellen." -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "Empfange Datei %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"KMess konnte den Remote-Webservice nicht betreten.\n" -"\n" -"Details: %1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Die Verbindung wurde getrennt, weil Sie\n" -"von einem anderen MSN Mesenger Client\n" -"oder von einem anderen Ort eine Verbindung\n" -"hergestellt haben." - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Synchronisierung" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Authentifizierung" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "Warte auf die Kontaktliste..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "" -"Anmeldung fehlgeschlagen, bitte überprüfen Sie Ihren Accountnamen und " -"Passwort." - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Verbinden..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess hat eine unbekanntes Kommando vom Server empfangen: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" -msgstr "" +msgstr "Ungültige Befehlssyntax" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" -msgstr "" +msgstr "Ungültiger Befehlsparameter" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "Die Email ist kein MSN Messenger Account" +msgstr "" +"Die E-Mail-Adresse, die Sie eingegeben haben, ist kein MSN-Messenger-Zugang." -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" -msgstr "" +msgstr "Fehlender Domain-Name" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" -msgstr "" +msgstr "Bereits angemeldet" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" -msgstr "Der angegebene Accountname ist ungültig." +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" +msgstr "Der eingegebene Zugangsname ist ungültig" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -"Der angegebene Accountname ist ungültig, oder Dein Passportkonto ist noch " -"nicht bestätigt." +"Dieser Zugangsname ist entweder ungültig, oder Ihr Passport-Zugang ist noch " +"nicht bestätigt worden." -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" -msgstr "Ihre Kontaktliste ist voll." +msgstr "Ihre Kontaktliste ist voll" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" -msgstr "" +msgstr "Ungültiger SBP-Parameter" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "Dieser Kontakt ist bereits in Ihrer Liste." -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "Dieser Kontakt ist nicht in Ihrer Liste." -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" -msgstr "Dieser Kontakt ist nicht Online" +msgstr "Dieser Kontakt ist nicht Online." -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 +#: network/msnconnection.cpp:436 #, fuzzy -msgid "Contact is in the opposite list" -msgstr "Dieser Kontakt ist nicht in Ihrer Liste." +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" +"Dieser Kontakt kann nicht gleichzeitig auf der Erlaubt- und Blockiert-Liste " +"hinzugefügt werden." -#: network/msnnotificationconnection.cpp:2247 -#, fuzzy +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -"Dieser Gruppenname wird bereits von Ihrem Messenger oder Ihrer Hotmail " -"Kontaktliste benutzt." +"Dieser Gruppenname wird bereits in Ihrer Messenger- oder Hotmail-" +"Kontaktliste benutzt. Bitte wählen Sie einen anderen Namen." -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" -msgstr "Ihre Kontaktliste hat zu viele Gruppen." +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "" +"Ihre Kontaktliste hat zu viele Gruppen. Es sind maximal 30 Gruppen erlaubt." -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" -msgstr "Diese Gruppe kann nicht verändert werden" +msgstr "Diese Gruppe kann nicht geändert werden" -#: network/msnnotificationconnection.cpp:2260 -#, fuzzy +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" -msgstr "Ihre Kontaktliste hat zu viele Gruppen." +msgstr "Kontakt wurde nicht zu dieser Gruppe hinzugefügt" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" -msgstr "Diese Gruppe ist nicht leer." +msgstr "Diese Gruppe ist nicht leer" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "Der Gruppenname ist zu lang" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" +"Der Name der Gruppe ist zu lang. Er darf nicht länger als 61 Bytes sein." -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" -msgstr "Es gab einen internen Fehler in KMess: %1" +msgstr "Es gab einen internen Fehler: %1" -#: network/msnnotificationconnection.cpp:2277 -#, fuzzy +#: network/msnconnection.cpp:470 msgid "Invalid Group" -msgstr "Gruppe &umbenennen" +msgstr "Ungültige Gruppe" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" +msgstr "Leere Domain" + +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" -msgstr "Switchboard Server fehlgeschlagen" +msgstr "" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" -msgstr "Übertragun zum Switchboardserver fehlgeschlagen" +msgstr "Übertragung zum Switchboardserver fehlgeschlagen" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 +#, fuzzy msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "Direct Connection (MSNSLP) Fehler, Verbindung fehlgeschlagen." +msgstr "Fehler in der direkten Verbindung (MSNSLP): Verbindung fehlgeschlagen" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" -msgstr "" +msgstr "Benötigtes Feld fehlt" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" -msgstr "" +msgstr "Nicht angemeldet" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Eigene Emoticons für diesen Account:" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "Der Zugriff auf den MSN-Service, wird diesem Zugang verweigert." -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" +msgstr "Befehl ist deaktiviert" + +#: network/msnconnection.cpp:508 +msgid "Your account is banned." +msgstr "Ihr Zugang ist gesperrt." + +#: network/msnconnection.cpp:512 +msgid "Challenge response failed" msgstr "" -#: network/msnnotificationconnection.cpp:2310 -msgid "Your account is banned." -msgstr "Ihr Account ist gebannt." - -#: network/msnnotificationconnection.cpp:2314 -#, fuzzy -msgid "Challenge response failed" -msgstr "Die Übertragung ist fehlgeschlagen" - -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 #, fuzzy msgid "You are opening chat sessions too fast" -msgstr "Sie öffnen Sessions zu schnell..." +msgstr "Sie öffnen Chat-Sitzungen zu schnell" -#: network/msnnotificationconnection.cpp:2327 -#, fuzzy +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" -msgstr "Sie haben zu viele Sessions geöffnet." +msgstr "Sie haben zu viele offene Chat-Sitzungen" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" -msgstr "" +msgstr "Unerwartete Befehlssequenz" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" -msgstr "Schlechter Freund Name" +msgstr "Fehlerhafter Spitzname" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" -msgstr "" +msgstr "Fehlerhafte CVR-Daten" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "Der Server sagt KMess überflutet Ihn mit zu viel Daten." +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" +msgstr "Der Server meldet, dass KMess ihn mit zu vielen Daten überflutet." -#: network/msnnotificationconnection.cpp:2357 -#, fuzzy +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" -msgstr "Anmeldung fehlgeschlagen" +msgstr "Authentifizierungsticket war falsch" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." -msgstr "Sie können keinen Chat starten wenn Sie unsichtbar sind." +msgstr "Sie können keinen Chat starten während Sie unsichtbar sind." -#: network/msnnotificationconnection.cpp:2364 -#, fuzzy +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" -msgstr "Akzeptiere keine neuen Principals" +msgstr "Akzeptiere keine neuen Kontakte" -#: network/msnnotificationconnection.cpp:2368 -#, fuzzy +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -"Du hast einen Kinderpassportkonto. Du brauchst ein Einverständnis Deiner " -"Eltern um Online zu chatten." +"Du hast einen „Kids Passport“-Zugang. Du brauchst die Einverständnis deiner " +"Eltern, um Online zu chatten." -#: network/msnnotificationconnection.cpp:2371 -#, fuzzy -msgid "Your passport account needs to be verified first." -msgstr "Ihr Passport muss zuerst verifiziert werden." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." +msgstr "Ihr Passport-Zugang muss zuerst bestätigt werden." -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" -msgstr "" +msgstr "Fehlerhaftes USR-Ticket" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" "Fehler beim öffnen der Kontaktliste, versuchen Sie es später noch einmal" -#: network/msnnotificationconnection.cpp:2399 -#, fuzzy +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." -msgstr "Es gab einen internen Serverfehler." +msgstr "" +"Der MSN-Service ist vorübergehend nicht verfügbar. Es gab einen internen " +"Serverfehler." -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" +"Der MSN-Service ist vorübergehend nicht verfügbar. Die Server sind zu " +"beschäftigt." -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" -msgstr "Notifizierungsserver ist down" +msgstr "" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" -msgstr "Der Server fährt herunter." +msgstr "Der Server fährt herunter" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" -msgstr "Der Server fährt bald herunter." +msgstr "Der Server fährt bald herunter" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" -msgstr "Schreiben ist blockiert" +msgstr "" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" -msgstr "Die Session ist überfüllt" +msgstr "Die Sitzung ist überlastet" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" -msgstr "Der Server ist nicht erreichbar" +msgstr "Der Server ist nicht verfügbar" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" -msgstr "Anmeldung fehlgeschlagen" +msgstr "Authentifizierung fehlgeschlagen" -#: network/msnnotificationconnection.cpp:2449 -#, fuzzy -msgid "Unknown error code received from the server: %1" -msgstr "KMess hat eine unbekanntes Kommando vom Server empfangen: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "" +"Unbekannter Fehlercode vom Server empfangen: %1
Technische Details: %2" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 -#, fuzzy +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 msgctxt "Error dialog box title" -msgid "MSN error" -msgstr "KMess - MSN Fehler" +msgid "MSN Error" +msgstr "MSN-Fehler" -#: network/msnnotificationconnection.cpp:2596 -#, fuzzy +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "Versuche Ausweich-Verbindung über HTTP ..." + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Authentifiziere ..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Authentifiziert" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Schalte auf anderen Server ..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Verbinde ..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "Unbekannter Befehl vom Server empfangen: %1" + +#: network/msnnotificationconnection.cpp:2109 msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" -msgstr[0] "Minuten" -msgstr[1] "Minuten" +msgstr[0] "%1 Minute" +msgstr[1] "%1 Minuten" -#: network/msnnotificationconnection.cpp:2599 -#, fuzzy +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" -msgstr "Warnung: Server schließt für Wartungsarbeiten in %1 Minuten!" +msgstr "Der Server schließt für Wartungsarbeiten in %1!" -#: network/msnnotificationconnection.cpp:2604 -#, fuzzy +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." -msgstr "" -"Die MSN Server haben berichtet, dass Sie in einer Minute für " -"Wartungsarbeiten schließen werden." +msgstr "Die MSN-Server werden in %1 für Wartungsarbeiten heruntergefahren." -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" -msgstr "" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "Der SOAP-Client ist nicht mehr gültig." -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -#, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" -msgstr "" -"KMess konnte Offline-Nachrichten nicht bearbeiten.\n" -"\n" -"Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess kann die Offline-Nachrichten nicht verarbeiten.
Details: %1" -#: network/msnnotificationconnection.cpp:3172 -#, fuzzy +#: network/msnnotificationconnection.cpp:2589 msgid "Authentication time limit exceeded" -msgstr "Anmeldung fehlgeschlagen" +msgstr "Authentifizierungszeitlimit überschritten" -#: network/msnnotificationconnection.cpp:3218 -#, fuzzy +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Warte auf die Kontaktliste ..." + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Warnung: %1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "MSN-Warnung" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" -msgstr "Es gab einen internen Fehler in KMess: %1" +msgstr "
Grund des internen Fehlers: %1" -#: network/msnnotificationconnection.cpp:3242 -#, fuzzy -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -"KMess konnte sich nicht mit den MSN Messenger Servern verbinden. Entweder " -"sind diese zur Zeit nicht erreichbar oder es besteht ein Problem mit Ihrer " -"Internetverbindung." +"

Authentifizierung fehlgeschlagen. Bitte überprüfen Sie Ihren Zugangsnamen " +"und ihr Passwort

" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -#, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "Verbindung zum Server ging verloren." - -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:2932 #, fuzzy +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" -"Authentifizierung fehlgeschlagen, KMess konnte nicht bei Passport anmelden.\n" -"\n" -"Details: %1" +"

Ihre Verbindung ist getrennt worden!

Sie haben sich mit dem Zugang " +"%1von einem anderem MSN-Programm aus angemeldet.

" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Server Fehler" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnnotificationconnection.cpp:2947 #, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

KMess kann sich nicht mit den Live-Messenger-Servern verbinden.
" +"Entweder besteht ein Problem mit Ihrer Internetverbindung, oder die Live-" +"Messenger-Server sind zur Zeit nicht erreichbar.
Es kann auch sein, dass " +"eine Authentifizierung bei einer Webseite oder einem Proxy nötig ist, um zu " +"den Servern verbunden zu werden,

Klicken Sie hier um " +"die Messenger-Statusseite anzuzeigen.

" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

Kann nicht zum Live-Messenger-Service verbinden.

" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

KMess kann sich nicht mit den Live-Messenger-Servern verbinden.
" +"Entweder besteht ein Problem mit Ihrer Internetverbindung, oder die Live-" +"Messenger-Server könnten zur Zeit nicht erreichbar sein.

Klicken Sie hier um die Messenger-Statusseite anzuzeigen.

" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Fehler: %1

" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Der Live-Messenger-Server hat einen Fehler gemeldet:

%1

" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Messenger-Service-Fehler: %1

" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Der Live-Messenger-Server meldet einen Fehler:

%1

" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

KMess-Fehler: %1

" + +#: network/msnnotificationconnection.cpp:3004 +#, fuzzy +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

KMess ist einem internen Fehler begegnet:

%1

" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Netzwerk-Verbindung verloren.

" + +#: network/msnnotificationconnection.cpp:3017 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

Die Verbindung zum Live-Messenger-Server ist verloren gegangen.

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" +"

Entwickler-Info:
Fehlernummer: %1
Fehlertext: %2

" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Code des internen Fehlers: %2)" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" -msgstr "Zeitüberschreitung der Verbindung" +msgstr "Verbindungszeitlimit überschritten" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" -msgstr "1 ping verloren" +msgstr "1 Ping verloren" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" -msgstr "%1 pings verloren." +msgstr "%1 Pings verloren" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." -msgstr "Verbindung zum Server ging verloren." +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "Die Verbindung zum Server ging verloren" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Diese Person ist offline oder unsichtbar." - -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" -"Der Kontakt hat ein MSN7 Feature ausgeführt, welches KMess noch nicht " -"bearbeiten kann." +"Die eingegebene E-Mail-Adresse, „%1“, ist keine gültige E-Mail-Adresse!" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "Die Nachricht \"%1\" wurde nicht empfangen." +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "Die eingegebe E-Mail-Adresse, „%1“, ist kein MSN-Messenger-Zugang!" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "Konnte Verbindung nicht herstellen: %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "Zu viele Weiterleitungen beim Login-Service" - -#: notification/chatnotification.cpp:163 +#: network/soap/httpsoapconnection.cpp:402 #, fuzzy -msgid "In %1's chat: %2" -msgstr "In %1's Chat: %2" +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Der Webdienst ist nicht zugreifbar (%1)" -#: notification/chatnotification.cpp:167 +#: network/soap/httpsoapconnection.cpp:471 #, fuzzy -msgid "%1 says:
'%2'" -msgstr "%1 sagt:
'%2'" +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Zu viele Weiterleitungen durch den Login-Service" -#: notification/chatnotification.cpp:171 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 hat Ihnen eine Offline Nachricht gesendet:
'%2'" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Der Server ist nicht verfügbar" -#: notification/chatnotification.cpp:178 +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 #, fuzzy +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Ungültige Antwort vom Webdienst %1 (%2)" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Keine Antwort vom Webdienst" + +#: network/soap/passportloginservice.cpp:191 +#, fuzzy +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Unerwartete Befehlssequenz" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" +msgstr "In %1's Chat:
%2" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "%1 sagt:
„%2“" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"%1 hat Ihnen eine Offline-Nachricht gesendet:
„%2“" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" -msgstr "%1's Chat fordert Aufmerksamkeit!" +msgstr "Der Chat von %1 fordert Ihre Aufmerksamkeit!" -#: notification/chatnotification.cpp:183 -#, fuzzy -msgid "%1:
%2" -msgstr "%1:
%2" +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr "%1 hat Ihnen einen Rrrrring gesendet!" +msgstr "" +"%1 hat Ihnen eine handgeschriebene Nachricht gesendet!" -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr "%1 hat Ihnen einen Rrrrring gesendet!" +msgstr "%1 hat Ihnen einen „Rrring!“ gesendet!" -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr "%1 hat Ihnen ein Animoticon gesendet!" +msgstr "%1 hat Ihnen ein Animoticon gesendet!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 möchte die Webcam benutzen!" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 sendet Ihnen eine Datei!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 hat Ihnen eine Einladung gesendet!" #: notification/chatnotification.cpp:204 -#, fuzzy -msgid "%1 wants to use the webcam!" -msgstr "%1 möchte die Webcam benutzen!" +msgid "%1 has canceled the webcam session!" +msgstr "%1 hat die Webcam-Sitzung abgebrochen!" #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 sendet Ihnen eine Datei!" +msgid "%1 has canceled the file transfer!" +msgstr "%1 hat die Dateiübertragung abgebrochen!" #: notification/chatnotification.cpp:206 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "%1 hat Ihnen eine Einladung gesendet!" +msgid "%1's activity has been canceled!" +msgstr "Die Aktivität von %1 wurde abgebrochen!" #: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "%1 hat die Webcamsession abgebrochen!" +msgid "%1 has accepted to use the webcam!" +msgstr "%1 hat der Benutzung der Webcam zugestimmt!" #: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "%1 hat die Dateiübertragung abgebrochen!" +msgid "%1 has accepted the file transfer!" +msgstr "%1 hat die Dateiübertragung angenommen!" #: notification/chatnotification.cpp:215 -#, fuzzy -msgid "%1's activity has been canceled!" -msgstr "%1's Aktivität wurde abgebrochen!" +msgid "%1 has accepted your invitation!" +msgstr "%1 hat Ihre Einladung angenommen!" #: notification/chatnotification.cpp:222 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1> hat der Benutzung der Webcam zugestimmt!" +msgid "%1 has ended the webcam session!" +msgstr "%1 hat die Webcam-Sitzung beendet!" #: notification/chatnotification.cpp:223 -#, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "%1 hat die Dateiübertragung angenommen." +msgid "The file transfer with %1 is done!" +msgstr "Die Dateiübertragung mit %1 ist fertig!" #: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1> hat Ihre Einladung angenommen!" +msgid "%1's activity has ended!" +msgstr "Die Aktivität von %1 ist beendet!" #: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "%1 hat die Webcamsession beendet!" +msgid "%1's webcam session has failed!" +msgstr "Die Webcamsitzung von %1 ist fehlgeschlagen!" #: notification/chatnotification.cpp:232 -#, fuzzy -msgid "The file transfer with %1 is done!" -msgstr "Die Dateiübertragung mit %1 ist fertig!" +msgid "The file transfer with %1 has failed!" +msgstr "Die Dateiübertragung mit %1 ist fehlgeschlagen." #: notification/chatnotification.cpp:233 -#, fuzzy -msgid "%1's activity has ended!" -msgstr "%1's Aktivität ist beendet!" - -#: notification/chatnotification.cpp:240 -#, fuzzy -msgid "%1's webcam session has failed!" -msgstr "%1's Webcamsession ist fehlgeschlagen!" - -#: notification/chatnotification.cpp:241 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "Die Dateiübertragung von %1 ist fehlgeschlagen." - -#: notification/chatnotification.cpp:242 -#, fuzzy msgid "%1's activity has ended with an error!" -msgstr "%1's Aktivität wurde mit einem Fehler beendet!" +msgstr "" +"Die Aktivität von %1 ist mit einem Fehler beendet worden!" -#: notification/contactstatusnotification.cpp:70 -#, fuzzy -msgid "%1 is now online" -msgstr "%1 ist jetzt Online" +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
ist jetzt online" -#: notification/contactstatusnotification.cpp:71 -#, fuzzy -msgid "%1 has gone away" -msgstr "%1> ist Abwesend" +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
ist jetzt abwesend" -#: notification/contactstatusnotification.cpp:72 -#, fuzzy -msgid "%1 will be right back" -msgstr "%1 ist gleich zurück" +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
kommt gleich zurück" -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1 ist jetzt Beschäftigt" +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
ist jetzt beschäftigt" -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1 wurde Unsichtbar" +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
ist jetzt unsichtbar" -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1> ist Idle gegangen" +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
ist jetzt inaktiv" -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1> hat sich abgemeldet" +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
hat sich abgemeldet" -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 ist am Telefon" +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
ist am Telefon" -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 ist Mittagessen" +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
ist beim Mittagessen" -#: notification/newemailnotification.cpp:78 -#, fuzzy -msgid "New email:
'%1'
by '%2'" -msgstr "Neue eMail:
'%1'
von '%2'" +#: notification/newemailnotification.cpp:90 +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Neue E-Mail:
„%1“
von „%2“" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Chatten" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Nachricht hinterlassen" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Nachricht anzeigen" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Details" + +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "E-Mail lesen" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Ausblenden" + +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Wenn Sie das Hauptfenster von KMess schließen, wird KMess im Systemabschnitt " +"der Kontrollleiste weiterhin ausgeführt. Um KMess zu beenden, benutzen Sie " +"„Beenden“ aus dem Punkt „Verbinden“ in der Menüleiste." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Im Systemabschnitt der Kontrollleiste einbetten" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 msgid "Browse..." -msgstr "" +msgstr "Auswählen ..." -#: settings/accountpage.cpp:70 -#, fuzzy -msgid "Browse and crop picture..." -msgstr "Bild öffnen und zuschneiden..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Bild auswählen und zuschneiden ..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." -msgstr "" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Vorheriges Bild wählen ..." -#: settings/accountpage.cpp:448 -#, fuzzy +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" -msgstr "Herunterladen von Mein Bild fehlgeschlagen" +msgstr "Herunterladen des Anzeigebildes fehlgeschlagen" -#: settings/accountpage.cpp:507 -#, fuzzy +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -"Beim Versuch Mein Bild zu ändern ist ein Fehler aufgetreten.\n" -"Bitte überprüfen Sie , ob Sie ein korrektes Bild ausgewählt haben." +"Beim Versuch das Anzeigebild zu ändern, ist ein Fehler aufgetreten.\n" +"Bitte überprüfen Sie, ob Sie ein existierendes Bild ausgewählt haben." -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "Kontakt &löschen" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Einstellungen" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" -msgstr "Konto" +msgstr "Zugang" -#: settings/accountsettingsdialog.cpp:76 -#, fuzzy +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" -msgstr "Konto" +msgstr "Mein Zugang" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Alarme" +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "Kontaktliste" -#: settings/accountsettingsdialog.cpp:81 -#, fuzzy -msgid "Alerts and Notifications" -msgstr "KMess Benachrichtigung" - -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Chatten" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" -msgstr "Chatverlauf" +msgstr "Chat-Protokollierung" -#: settings/accountsettingsdialog.cpp:193 -#, fuzzy +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" -msgstr "Die eingegebene Kontaktadresse ist nicht gültig: '%1'" +msgstr "" +"Die eingegebene E-Mail-Adresse ist ungültig und kann nicht als Zugang " +"verwendet werden: „%1“" -#: settings/accountsettingsdialog.cpp:201 -#, fuzzy +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" -msgstr "Die eingegebene Kontaktadresse ist nicht gültig: '%1'" +msgstr "Die eingegebene E-Mail-Adresse wird bereits verwendet: „%1“" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" -msgstr "Sind Sie sicher, dass Sie dieses Profil löschen möchten?" +msgstr "Sind Sie sicher, dass Sie diesen Zugang löschen wollen?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." -msgstr "Sind Sie sicher, dass Sie dieses Profil löschen möchten?" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Sind Sie sicher, dass Sie den Zugang „%1“ löschen wollen?
Alle " +"Einstellungen des Zugangs werden verloren gehen." -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" -msgstr "Hi, wie geht es Dir? :)" +msgstr "Hi, wie geht es dir? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "Stacy" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "Gut!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" -msgstr "Ich komme /gerade/ zurück von meinem Urlaub aus Italien!" +msgstr "Ich bin /gerade/ aus meinem Urlaub in Italien zurückgekehrt!" -#: settings/emoticonspage.cpp:122 +#: settings/emoticonspage.cpp:118 +#, fuzzy +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "Sie können nur 7 Zeichen für Emoticon-Kurzbefehle benutzen." + +#: settings/emoticonspage.cpp:119 +#, fuzzy +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "Ungültiger Befehlsparameter" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" msgid "Replace Existing Emoticon" -msgstr "" +msgstr "Existierendes Emoticon ersetzen" -#: settings/globalsettingsdialog.cpp:45 -#, fuzzy +#: settings/emoticonspage.cpp:233 +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Sind Sie sicher, dass Sie das Emoticon „%1“ löschen wollen?" + +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Emoticon löschen" + +#: settings/globalsettingsdialog.cpp:46 msgid "KMess Settings" -msgstr "Einstellungen" +msgstr "KMess-Einstellungen" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" -msgstr "Konten" +msgstr "Zugänge" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 -#, fuzzy -msgid "Notification" -msgstr "Emailbenachrichtigung" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Benachrichtigungen" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." -msgstr "" +msgstr "Keine vefügbaren Web-Browser gefunden." -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." -msgstr "" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Keine verfügbaren E-Mail-Programme gefunden." -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" -msgstr "" +#: settings/miscellaneouspage.cpp:286 +#, fuzzy +msgid "You have to specify a console command to launch a custom browser!" +msgstr "Sie müssen einen Befehl für den gewünschten Browser eingeben!" -#: settings/miscellaneouspage.cpp:289 -#, c-format +#: settings/miscellaneouspage.cpp:291 +#, fuzzy, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" +"Dem Befehl, den Sie als benutzerdefinierten Browser benutzen wollen, " +"fehlt der „%u“-Parameter. Ohne diesen wird es nicht möglich sein Webseiten " +"zu öffnen.
Wollen Sie, dass KMess es hinzufügt?" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" -msgstr "" +#: settings/miscellaneouspage.cpp:316 +#, fuzzy +msgid "You have to specify a console command to launch a custom email client!" +msgstr "Sie müssen einen Befehl für das gewünschte E-Mail-Programm eingeben!" -#: settings/miscellaneouspage.cpp:319 -#, c-format +#: settings/miscellaneouspage.cpp:321 +#, fuzzy, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" +"Dem Befehl, den Sie als benutzerdefiniertes E-Mail-Programm benutzen " +"wollen, fehlt der „%u“-Parameter. Ohne diesen, ist es nicht möglich, E-Mails " +"zu erstellen.
Wollen Sie, dass KMess es hinzufügt?" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 +#, fuzzy msgid "You have to select a directory for the received files!" -msgstr "" +msgstr "Sie müssen ein Verzeichnis für die empfangenen Dateien wählen!" -#: settings/miscellaneouspage.cpp:404 -#, fuzzy +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" -msgstr "Chats in diesem Verzeichnis speichern: " +msgstr "Wählen Sie ein Verzeichnis" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"Wenn Sie das Hauptfenster von KMess schließen verbleibt KMess im Systemtray. " -"Benutzen Sie 'Beenden' aus dem Dateimenü um die Anwendung zu schließen." -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Docke im System Tray" +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" - -#: systemtraywidget.cpp:245 +#: utils/likeback/likeback.cpp:244 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 %2" +msgid "&Send a Comment to the Developers" +msgstr "Den Entwicklern einen Kommentar &senden" -#~ msgid "Click to send an email to this contact." -#~ msgstr "Klicken Sie hier um dem Kontakt eine Email zu senden." +#: utils/likeback/likeback.cpp:305 +#, fuzzy +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Willkommen zur Testversion von %1. " -#~ msgid "Picture:" -#~ msgstr "Bild:" +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "Willkommen bei %1." + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +#, fuzzy +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" +"Jedes mal, wenn Sie ein frustrierendes Erlebnis mit KMess haben, klicken Sie " +"auf das wütende Gesciht unter dem Fenstertitel, beschreiben Sie kurz was " +"Ihnen nicht gefällt und klicken Sie auf „Senden“." + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +#, fuzzy +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" +"Ich mag die neue grafische Gestaltung. Sie ist sehr erfrischend." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" +"Ich mag die Willkommensseite dieses Asisstenten nicht. Sie ist " +"zu zeitraubend." + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"Die Anwendung zeigt ein fehlerhaftes Verhalten, wenn auf den " +"„Hinzufügen“-Knopf geklickt wird. Es passiert nichts." + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "Ihre Kommentare sind wichtig, um die Anwendung zu verbessern." + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Beispiel" +msgstr[1] "Beispiele" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Helfen Sie uns die Anwendung zu verbessern" + +#: utils/likeback/likebackdialog.cpp:28 +#, fuzzy +msgid "Send a Comment to the Developers" +msgstr "Ein Kommentar an die Entwicklern senden" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Bitte verfassen sie die Kommentare auf %1 (Sie können dafür auch ein Online-Übersetzungswerkzeug verwenden).
" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an
online " +"translation tool for this).
" +msgstr "" +"Bitte verfassen sie die Kommentare auf %1 oder %2 (Sie können dafür auch ein " +"Online-Übersetzungswerkzeug verwenden).
" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" +"

Sie können den Entwicklern eine kurze Beschreibung Ihrer Meinung über %1 " +"bereitstellen.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"Die eingegebene E-Mail-Adresse ist ungültig und kann nicht als Zugang " +"verwendet werden: „%1“" + +#: utils/likeback/likebackdialog.cpp:295 +#, fuzzy +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" +"

Ihr Kommentar ist erfolgreich versendet worden. Es wird uns dabei helfen, " +"die Anwendung zu verbessern

Danke, dass Sie sich Zeit dafür genommen " +"haben.

" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Kommentar gesendet" + +#: utils/likeback/likebackdialog.cpp:309 +#, fuzzy +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" +"

Es ist ein Fehler während des senden des Reports eingetreten.

Bitte " +"versuchen Sie es später erneut.

" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Fehler beim Senden des Kommentars" #, fuzzy -#~ msgid "Login Information" -#~ msgstr "Emailinformationen in der Kontaktliste anzeigen" +#~ msgid "Conversations Filter" +#~ msgstr "Unterhaltung begonnen am: %2" -#~ msgid "Logging in..." -#~ msgstr "Verbinde ..." - -#~ msgid "" -#~ "Allows you to choose which e-mail program KMess should open to view e-" -#~ "mail messages." +#~ msgid "Select an account you wish to modify, then click here" #~ msgstr "" -#~ "Erlaubt Ihnen das Mailprogramm auszuwählen, welches KMess öffnet um Ihre " -#~ "Emails zu lesen." +#~ "Wählen Sie den Zugang den Sie bearbeiten möchten, aus und klicken Sie " +#~ "anschließend hier." -#~ msgid "Use a specified command:" -#~ msgstr "Speziellen Befehl ausführen:" +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Das „Rrring!“ kann nicht an „%1“ gesendet werden." -#~ msgid "This account does not have an Hotmail inbox!" -#~ msgstr "Dieser Account hat keinen Hotmail Posteingang." +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "Das Animoticon kann nicht an „%1“ gesendet werden." -#, fuzzy -#~ msgid "Email: " -#~ msgstr "Email" +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Die Zeichnung für „%1“ kann nicht gesendet werden." -#~ msgid "Remove group" -#~ msgstr "Gruppe löschen" - -#, fuzzy -#~ msgid "Show &Display Pictures" -#~ msgstr "Mein Bild" - -#~ msgid "You have 1 new e-mail in your inbox." -#~ msgstr "1 neue Email in Ihrem Posteingang" - -#~ msgid "You have %1 new emails in your inbox." -#~ msgstr "%1 neue Emails in Ihrem Posteingang" - -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "&Online geht" - -#~ msgid "The transfer of %1 failed. Couldn't open file" -#~ msgstr "" -#~ "Die Übertragung von %1 ist fehlgeschlagen. Konnte Datei nicht öffnen" - -#, fuzzy -#~ msgid "Sidebar" -#~ msgstr "Sidebar" - -#, fuzzy -#~ msgid "New contact's group" -#~ msgstr "Neuer K&ontakt" - -#~ msgid "Enter your login information:" -#~ msgstr "Geben Sie Ihre Logininformationen ein:" - -#~ msgid "Your friendly name:" -#~ msgstr "Ihr Nickname:" - -#, fuzzy -#~ msgid "Your email address:" -#~ msgstr "Emailadresse: " - -#~ msgid "Your password:" -#~ msgstr "Ihr Passwort:" - -#~ msgid "Display picture:" -#~ msgstr "Mein Bild:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "Zeige kein Displa&y Bild" - -#~ msgid "Status to set at login:" -#~ msgstr "Status beim Anmelden:" - -#~ msgid "Show notifications when you recei&ve an email" -#~ msgstr "Eine Benachrichtigung anzeigen, wenn Sie eine Email em&pfangen" - -#~ msgid "Organize chat folders by:" -#~ msgstr "Sortiere Chatordner nach:" - -#~ msgid "&Show graphics in chat messages" -#~ msgstr "Graphiken in Chatnachrichten &anzeigen" - -#~ msgid "Use Hotmail" -#~ msgstr "Hotmail benutzen" - -#~ msgid "says:" -#~ msgstr "sagt:" - -#~ msgid "Current name: " -#~ msgstr "Eigener Name: " - -#, fuzzy -#~ msgid "" -#~ "KMess could not connect to the MSN Messenger service.\n" -#~ "Please, be sure to be connected to the internet.\n" -#~ "reason: %1." -#~ msgstr "" -#~ "KMess konnte sich nicht mit dem MSN Messenger Service verbinden.\n" -#~ "Bitte stellen Sie sicher, dass Sie mit dem Internet verbunden sind.\n" -#~ "Systemfehler: %1 (code %2)." - -#~ msgid "The remote server has closed the connection." -#~ msgstr "Der Remote Server hat die Verbindung geschlossen" - -#~ msgid "Show MSN Messenger Service status?" -#~ msgstr "MSN Messenger Service Status anzeigen?" - -#~ msgid "Received user confirmation" -#~ msgstr "Benutzerinformationen empfangen" - -#~ msgid "Transfer to notification server" -#~ msgstr "Transfer zum Notifizierungsserver" - -#~ msgid "The server is too busy" -#~ msgstr "Der Server ist zu beschäftigt." - -#~ msgid "The server is unavailable" -#~ msgstr "Der Server ist nicht erreichbar" - -#~ msgid "KMess received an unknown error message from the server: %1" -#~ msgstr "KMess hat einen unbekannten Fehler vom Server empfangen: %1" - -#~ msgid "Warning: Server closes for maintenance in 1 minute!" -#~ msgstr "Warnung: Server schliesst für Wartungsarbeiten in 1 Minute!" - -#~ msgid "Add contact" -#~ msgstr "Kontakt hinzufügen" - -#, fuzzy -#~ msgid "KMess Notification" -#~ msgstr "Emailbenachrichtigung" - -#~ msgid "" -#~ msgstr "" - -#~ msgid "" -#~ "_: NAME OF TRANSLATORS\n" -#~ "Your names" -#~ msgstr "Jan Tönjes" - -#~ msgid "" -#~ "_: EMAIL OF TRANSLATORS\n" -#~ "Your emails" -#~ msgstr "jan.toenjes@web.de" - -#~ msgid "Show/Hide &Contact Sidebar" -#~ msgstr "Zeige/Verstecke die &Kontakt Sidebar" - -#~ msgid "Away - Idle" -#~ msgstr "Abwesend - Idle" - -#~ msgid "chat-style-text" -#~ msgstr "chat-style-text" - -#~ msgid "The e-mail address given was invalid!" -#~ msgstr "Die eingegebene Emailadresse ist ungültig!" - -#~ msgid "(Away)" -#~ msgstr "(Abwesend)" - -#~ msgid "(Be Right Back)" -#~ msgstr "(Bin gleich zurück)" - -#~ msgid "(Busy)" -#~ msgstr "(Beschäftigt)" - -#~ msgid "(Invisible)" -#~ msgstr "(Unsichtbar)" - -#~ msgid "(Away - Idle)" -#~ msgstr "(Abwesend - Idle)" - -#~ msgid "(Out to Lunch)" -#~ msgstr "(Mittagessen)" - -#~ msgid "(On the Phone)" -#~ msgstr "(Am Telefon)" - -#~ msgid "The current status of your contact." -#~ msgstr "Der aktuelle Status von Ihrem Kontakt." - -#, fuzzy -#~ msgid "The contact is listening to music" -#~ msgstr "Dieser Kontakt ist nicht in Ihrer Liste." +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Die Nachricht „%1“ kann nicht an „%2“ gesendet werden." diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..fb7de1f --- /dev/null +++ b/po/el.po @@ -0,0 +1,5785 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Panagiotis Papadopoulos , 2008. +# Glentadakis Dimitrios , 2009. +msgid "" +msgstr "" +"Project-Id-Version: el\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-02-05 19:09+0100\n" +"Last-Translator: Glentadakis Dimitrios \n" +"Language-Team: Greek \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 0.3\n" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Εμφάνιση εικονιδίων διάθεσης" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "Πατήστε εδώ για να συνδεθείτε, ή να ακυρώσετε μία προσπάθεια σύνδεσης" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "%1 νέο μήνυμα email" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "Πατήστε εδώ για να συνδεθείτε, ή να ακυρώσετε μία προσπάθεια σύνδεσης" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Εμφάνιση εικονιδίων διάθεσης" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Εικονίδια διάθεσης" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "" +"Κάντε κλικ σε αυτό το κουμπί για να επαναφέρετε την εικόνα εμφάνισης αυτής " +"της επαφής" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "Νέα γραμμή" + +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "Αποστολή" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Συνομιλία" + +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Κύρια γραμμή εργαλείων" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +#, fuzzy +msgid "Click here to display the menu for this contact" +msgstr "" +"Κάντε κλικ σε αυτό το κουμπί για να επαναφέρετε την εικόνα εμφάνισης αυτής " +"της επαφής" + +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +#, fuzzy +msgid "Click here to open your account settings" +msgstr "Κάντε κλικ εδώ για να μετονομάσετε το επιλεγμένο εικονίδιο διάθεσης." + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "&Καθαρισμός Cache" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "&Χρώμα γραμματοσειράς" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +#, fuzzy +msgid "Pen Size" +msgstr "Μέγεθος" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Αρχική ομάδα :" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 +msgid "" +"Enter here the email address of the person you wish to add to your contact " +"list" +msgstr "" +"Παρακαλώ εισάγετε τη διεύθυνση email του ατόμου που επιθυμείτε να προσθέσετε " +"στις επαφές σας" + +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "Διεύθυνση email:" + +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Εισάγετε μία συντόμευση για το εικονίδιο διάθεσης : " + +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Επιλέξτε ένα αρχείο εικόνας :" + +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 +msgid "" +"Enter a message to be automatically sent to people who try to message you." +msgstr "" + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "Ορίστε ένα αυτόματο μήνυμα απουσίας :" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "Αναζήτηση επαφής" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Καταγραφή συνομιλίας" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +#, fuzzy +msgid "to" +msgstr "Αυτοκίνητο" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +msgid "Filter by &chat" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Τι επιθυμείτε να κάνετε ;" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" +msgstr "Προσθήκη αυτού του ατόμου στην λίστα επαφών μου" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person; only allow them to see my status" +msgstr "" +"Να μην γίνει προσθήκη αυτου του ατόμου, μόνο να επιτρέπεται να δει την " +"κατάσταση μου" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting me or seeing my status" +msgstr "" +"Να μην γίνει προσθήκη αυτου του ατόμου, μόνο να επιτρέπεται να δει την " +"κατάσταση μου" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +msgid "&Information" +msgstr "&Πληροφορίες" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "" +"Κάντε κλικ σε αυτό το κουμπί για να επαναφέρετε την εικόνα εμφάνισης αυτής " +"της επαφής" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Επαναφορά" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Ομάδες:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "Χρήση &εναλλακτικού ονόματος γι αυτή την επαφή" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "Εμφάνιση αναδυόμενου μηνύματος κατά τη σύνδεση/αποσύνδεση της επαφής" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Ήχος :" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 +msgid "I&mages" +msgstr "Ε&ικόνες" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Κάντε κλικ εδώ για να μετονομάσετε το επιλεγμένο εικονίδιο διάθεσης." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Εμφάνιση εικόνας" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +msgid "&Clear Cache" +msgstr "&Καθαρισμός Cache" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "&Σημειώσεις" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "Εικονίδια διάθεσης" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +#, fuzzy +msgid "Click here to delete the selected emoticon" +msgstr "Κάντε κλικ εδώ για να μετονομάσετε το επιλεγμένο εικονίδιο διάθεσης." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Αφαίρεση" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "Διαθέσιμες επαφές" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "Προσκαλέστε μία επαφή που δεν ειναι στην λίστα :" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" +"Εισάγετε τη διεύθυνση email της επαφής που επιθυμείτε να προσκαλέσετε :" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "Προσκαλεσμένοι επαφές" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Στοιχεία προς εξαγωγή :" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Μορφή" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Επαφές:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "Επιλογή όλων" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Αποεπιλογή όλων" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Εξαγωγή..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Κλείσιμο" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 +#, fuzzy +msgid "Network Window" +msgstr "Παράθυρο δικτίου" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +#, fuzzy +msgid "Command to Current Tab" +msgstr "Κλείσιμο μίας καρτέλας συνομιλίας" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 +msgid "Command:" +msgstr "Εντολή:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 +msgid "Type:" +msgstr "Τύπος" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 +#, fuzzy +msgid "Standard" +msgstr "Αστέρας" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 +msgid "Send" +msgstr "Αποστολή" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 +msgid "Command payload (can be empty):" +msgstr "" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 +msgid "Open" +msgstr "Άνοιγμα" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 +msgid "Cancel" +msgstr "Ακύρωση" + +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "&Λήψη" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "&Αποστολή" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "&Καθαρισμός" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "Κλείσιμο" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "" +"Παρακαλώ εισάγετε τη διεύθυνση email του ατόμου που επιθυμείτε να προσθέσετε " +"στις επαφές σας" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 +msgid "Password:" +msgstr "Κωδικός πρόσβασης:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Κατάσταση κατά την σύνδεση :" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" +msgstr "Απομνημόνευση λογαριασμού" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "Απομνημόνευση κωδικού πρόσβασης" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "Πατήστε εδώ για να συνδεθείτε, ή να ακυρώσετε μία προσπάθεια σύνδεσης" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 +msgid "&Connect" +msgstr "&Σύνδεση" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Νέος λογαριασμός" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "Ξεχάσατε τον κωδικό σας ;" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Σύνδεση " + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Προβολή" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Ενέργειες" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "Μορφή" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Λογαριασμός" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +#, fuzzy +msgid "Your Account Information" +msgstr "Οι Πληροφορίες του λογαριασμού σας" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +msgid "Enter the name other contacts should see when you are online." +msgstr "" + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 +msgid "&Friendly name:" +msgstr "" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 +msgid "&Email address:" +msgstr "Διεύθυνση &email:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 +msgid "" +"Enter the password of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" + +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 +msgid "&Password:" +msgstr "Κωδικός πρόσβασης:" + +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "Απομνημόνευση κωδικού πρόσβασης" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 +msgid "Display Picture" +msgstr "Εμφάνιση εικόνας" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 +#, fuzzy +msgid "C&hange..." +msgstr "&Πρόσκληση..." + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 +msgid "&Do not use" +msgstr "" + +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +msgid "" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" +"\n" +"It's recommended to enable this option unless you're using KMess as guest or " +"you're using a public system (e.g. Internet cafe)." +msgstr "" + +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +msgid "Re&member the settings of this account" +msgstr "" + +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 +msgid "If enabled, KMess automatically logs in with this account." +msgstr "" + +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 +msgid "Log in &with this account automatically" +msgstr "" + +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 +#, fuzzy +msgid "Login &as" +msgstr "Καταγραφή όλων των συνομιλιών" + +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 +msgid "" +"You can't change your friendly name because your Passport email address is " +"not verified." +msgstr "" + +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 +msgid "Request verification email" +msgstr "" + +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 +#, fuzzy +msgid "Go to accountservices.passport.net" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 +msgid "" +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " +"address as Passport account." +msgstr "" + +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 +msgid "Register new account" +msgstr "Καταχώρηση νέου λογαριασμού" + +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 +msgid "http://register.passport.com/" +msgstr "http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 +#, fuzzy +msgid "Go to register.passport.com" +msgstr "http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +#, fuzzy +msgid "&Status Options" +msgstr "Κατάσταση κατά την σύνδεση :" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Αλλαγή κατάστασης σε \"&Αδρανής\" " + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Αδρανής μετά από" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "λεπτά" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 +msgid "Saved accounts:" +msgstr "Αποθηκευμένοι λογαριασμοί:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +#, fuzzy +msgid "&Add Account..." +msgstr "&Προσθήκη λογαριασμού..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" +msgstr "Επιλέξτε ενα λογαριασμό και κάντε κλικ εδώ για να το διαγράψετε." + +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 +msgid "&Edit" +msgstr "&Επεξεργασία" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "Επιλέξτε ενα λογαριασμό και κάντε κλικ εδώ για να το διαγράψετε." + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 +msgid "&Remove" +msgstr "&Αφαίρεση" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +#, fuzzy +msgid "Enable chat logging" +msgstr "Καταγραφή συνομιλίας" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "Αποστολή αρχείου" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +#, fuzzy +msgid "Plain Text" +msgstr "Αναζήτηση κειμένου..." + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Κάντε κλικ εδώ για να μετονομάσετε το επιλεγμένο εικονίδιο διάθεσης." + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "Στυλ" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "Στυλ συνομιλίας :" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "Ρυθμίσεις συνομιλίας" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Καταγραφή συνομιλίας" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "Εμφάνιση εικονιδίων διάθεσης" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Εμφάνιση εικονιδίων διάθεσης" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +msgid "S&how timestamp" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" +msgstr "Εμφάνιση επαφών" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +#, fuzzy +msgid "Show s&econds" +msgstr "Εμφάνιση εικονιδίων διάθεσης" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "Κείμενο" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "Παναγιώτης Παπαδόπουλος" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Καθαρισμός" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 +msgid "" +"

When contacts like to have your attention they can send a nudge. By " +"default the chat window shakes when a nudge is received or sent. Disable " +"this option if the shaking effect is too obtrusive.

\n" +"

When this option is enabled, KMess still limits the shaking effect. " +"Contacts may send multiple nudges at once, but KMess only shakes the chat " +"window with the first nudge.

" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 +msgid "" +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Πάντα" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Ποτέ" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Εμφάνιση εικόνας" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 +msgid "" +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 +#, fuzzy +msgid "&Emoticon Themes" +msgstr "Θέματα εικονιδίων διάθεσης" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 +#, fuzzy +msgid "Available emoticon styles:" +msgstr "Διαθέσημα θέματα εικονιδίων διάθεσης:" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 +#, fuzzy +msgid "&Custom Emoticons" +msgstr "Εικονίδια διάθεσης" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 +msgid "Custom emoticons for this account:" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +#, fuzzy +msgid "Click here to add a new custom emoticon" +msgstr "Κάντε κλικ εδώ για να προσθέσετε ενα νέο custom emoticon" + +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Προσθήκη νέου..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Κάντε κλικ εδώ για να μετονομάσετε το επιλεγμένο εικονίδιο διάθεσης." + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 +msgid "Re&name" +msgstr "Μετονομασία" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 +msgid "Web Browser" +msgstr "Περιηγητής ιστού" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 +msgid "&Use the KDE default browser" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 +msgid "Select this option to choose from a list of installed browsers." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 +msgid "&Use an installed browser:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 +msgid "Choose this option to enter the path to your favorite browser." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy +msgid "&Specify a custom command:" +msgstr "Ορίστε ένα αυτόματο μήνυμα απουσίας :" + +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 +#, no-c-format +msgid "" +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 +msgid "Email Client" +msgstr "Πελάτης email" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 +msgid "" +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 +msgid "Choose this option to use the email client used by the rest of KDE." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 +msgid "File Transfers" +msgstr "Μεταφορές αρχείων" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 +msgid "&Save all received files in one directory:" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 +msgid "&Use ports between" +msgstr "" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "και" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "για μεταφορές αρχείων" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "Παναγιώτης Παπαδόπουλος" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "Παναγιώτης Παπαδόπουλος" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 +msgid "I'm away from my computer" +msgstr "" + +#: account.cpp:54 +msgid "Your name" +msgstr "" + +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 +msgid "you@hotmail.com" +msgstr "" + +#: accountsmanager.cpp:388 +msgid "" +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Διαγραφή" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:119 +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" + +#: chat/chat.cpp:142 +msgid "%1 has joined the chat." +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: chat/chat.cpp:196 +#, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "" +"Η συζήτηση ειναι ανενεργή, ο χρήστης %1 έφυγε από τη συνομιλία." + +#: chat/chat.cpp:202 +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "Ο χρήστης %1 έφυγε από τη συνομιλία." + +#: chat/chat.cpp:367 +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 και %2" + +#: chat/chat.cpp:374 +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "" + +#: chat/chat.cpp:664 +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "" + +#: chat/chat.cpp:830 +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" + +#: chat/chat.cpp:941 +#, fuzzy +msgid "You have sent a wink" +msgstr "Λάβατε ενα wink από τον χρήστη %1" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Παρουσιάστηκε πρόβλημα στην σύνδεση." + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" + +#: chat/chat.cpp:1153 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" + +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "" + +#: chat/chat.cpp:1194 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the
account configuration." +msgstr "" + +#: chat/chat.cpp:1220 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" + +#: chat/chat.cpp:1230 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" + +#: chat/chat.cpp:1241 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 σας έστειλε ένα wink!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 σας έστειλε ένα wizz!" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "Διαθέσιμες επαφές" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Λάβατε ένα wizz από τον χρήστη %1!" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Λάβατε ενα wink από τον χρήστη %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "Ο χρήστης %1 συμμετέχει στη συνομιλία" + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "" +"Ο χρήστης %1 σας έστειλε ένα μήνυμα εκτός σύνδεσης :
'%2'" + +#: chat/chat.cpp:1489 +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "" + +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You've sent a nudge to %1!" +msgstr "Στείλατε μία ειδοποίηση!" + +#: chat/chat.cpp:1532 +#, fuzzy +msgid "You've sent a nudge!" +msgstr "Στείλατε μία ειδοποίηση!" + +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 +msgid "%1 is sending a wink: %2" +msgstr "" + +#: chat/chatmessagestyle.cpp:372 +msgid "%1 says:" +msgstr "Ο χρήστης %1 λεεί:" + +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Αποστολή αρχείου" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 +msgid "Add this emoticon: %1" +msgstr "" + +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Επανασύνδεση" + +#: chat/chatview.cpp:299 +msgid "" +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." +msgstr "" + +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 +#, fuzzy +msgid "" +"The file '%1' already exists.\n" +"Do you want to overwrite it?" +msgstr "" +"Το αρχείο \"%1\" υπάρχει ήδη.\n" +"Επυθυμείτε την αντικατάστασή του;" + +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Overwrite File" +msgstr "Αντικατάσταση αρχείου" + +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Over&write" +msgstr "Αντικατάσταση" + +#: chat/chatview.cpp:824 +msgid "Add this &Emoticon..." +msgstr "" + +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Επεξεργασία εικονιδίου διάθεσης" + +#: chat/chatview.cpp:833 +msgid "Send &Email" +msgstr "Αποστολή &email" + +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "Προσθήκη επαφής" + +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "Αντιγραφή διεύθυνσης e&mail" + +#: chat/chatview.cpp:847 +msgid "Visit &Link" +msgstr "" + +#: chat/chatview.cpp:851 +msgid "Copy &Address" +msgstr "Αντιγραφή διεύθυνσης" + +#: chat/chatview.cpp:867 +msgid "&Copy Text" +msgstr "Αντιγραφή κειμένου " + +#: chat/chatview.cpp:868 +msgid "Select &All" +msgstr "Επιλογή όλων" + +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "Αναζήτηση κειμένου..." + +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +#, fuzzy +msgid "C&lear Chat" +msgstr "Καθαρισμός" + +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." +msgstr "Αποστολή αρχείου" + +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Επαφές" + +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Εικονίδια διάθεσης" + +#: chat/chatwindow.cpp:121 +#, fuzzy +msgid "My Emoticons" +msgstr "Εικονίδια διάθεσης" + +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." +msgstr "" + +#: chat/chatwindow.cpp:331 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Κλείσιμο μίας καρτέλας συνομιλίας" + +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "Κλείσιμο μίας καρτέλας συνομιλίας" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "&Πρόσκληση..." + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." +msgstr "Αποστολή αρχείου" + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "" + +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "Αποστολή μίας ειδοποίησης!" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "" + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Τροποποίηση &γραμματοσειράς" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "" + +#: chat/chatwindow.cpp:429 +msgid "Show S&tatus Messages" +msgstr "" + +#: chat/chatwindow.cpp:435 +#, fuzzy +msgid "&Panels" +msgstr "&Ακύρωση" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Ειδοποίηση" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Αποστολή αρχείου" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +msgid "Enable or disable the contacts panel" +msgstr "" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Επαφές" + +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Εικονίδια διάθεσης" + +#: chat/chatwindow.cpp:477 +msgid "Enable or disable the Custom Emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Εικονίδια διάθεσης" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Γραμματοσειρά" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "&Χρώμα γραμματοσειράς" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "Καθαρισμός" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Άγνωστη εντολή" + +#: chat/chatwindow.cpp:1555 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Συνομιλία" + +#: chat/chatwindow.cpp:1559 +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Συνομιλία" + +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "Ο χρήστης %1 πληκτρολογεί..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "Οι χρηστές %1 και %2 πληκτρολογούν..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "Οι χρηστές %1, %2 και %3 άλλοι πληκτρολογούν..." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +msgid "&Send Email" +msgstr "Αποστολή Email" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 +msgid "&View Profile" +msgstr "Προβολή προφίλ" + +#: chat/contactframe.cpp:307 +msgid "Ed&it Notes" +msgstr "Επεξεργασία Σημειώσεων" + +#: chat/contactframe.cpp:309 kmessview.cpp:595 +msgid "&Add Contact" +msgstr "Προσθήκη επαφής" + +#: chat/contactframe.cpp:310 kmessview.cpp:596 +msgid "A&llow Contact" +msgstr "" + +#: chat/contactframe.cpp:311 kmessview.cpp:599 +msgid "&Delete Contact" +msgstr "&Διαγραφή επαφής" + +#: chat/contactframe.cpp:313 kmessview.cpp:597 +msgid "&Block Contact" +msgstr "&Φραγή επαφής" + +#: chat/contactframe.cpp:314 kmessview.cpp:598 +msgid "&Unblock Contact" +msgstr "&Αναίρεση φραγής επαφής" + +#: chat/contactframe.cpp:316 kmessview.cpp:602 +msgid "&Friendly Name" +msgstr "" + +#: chat/contactframe.cpp:317 kmessview.cpp:603 +msgid "&Personal Message" +msgstr "" + +#: chat/contactframe.cpp:318 kmessview.cpp:604 +msgid "&Email Address" +msgstr "Διεύθυνση &email" + +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" +msgstr "Αντιγραφή..." + +#: chat/contactframe.cpp:693 +msgid "Blocked" +msgstr "Σε φραγή" + +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" +msgid "The contact is %1" +msgstr "" + +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You haven't added any custom emoticons yet.

To add new " +"emoticons, click here!

" +msgstr "" + +#: chat/emoticonswidget.cpp:449 +msgid "Add to Chat" +msgstr "" + +#: chat/emoticonswidget.cpp:450 +#, fuzzy +msgid "Add New" +msgstr "Προσθήκη νέου..." + +#: chat/emoticonswidget.cpp:451 +msgid "Edit" +msgstr "Επεξεργασία" + +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 +msgid "Remove" +msgstr "Αφαίρεση" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:308 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:312 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:316 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Σε σύνδεση" + +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Απασχολημένος" + +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Απουσία" + +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "" + +#: contact/msnstatus.cpp:160 +msgid "Idle" +msgstr "" + +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Παρατεταμένη απουσία" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "" + +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Για γεύμα" + +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Αόρατος" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Χώρίς σύνδεση" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Κατάσταση" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Αποσύνδεση" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Προσθήκη μίας επαφής" + +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 +#, fuzzy +msgid "Add New Emoticon" +msgstr "Προσθήκη νέου εικονιδίου διάθεσης" + +#: dialogs/addemoticondialog.cpp:129 +#, fuzzy +msgid "Edit Emoticon" +msgstr "Επεξεργασία εικονιδίου διάθεσης" + +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +#, fuzzy +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "Το αρχείο %1 υπάρχει ήδη. Επυθυμείτε την αντικατάστασή του;" + +#: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "" + +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Στυλ συνομιλίας :" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"σας πρόσθεσε στην λίστα επαφών του." + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Ιδιότητες της επαφής %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 +msgid "Connected" +msgstr "Σε Σύνδεση" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 +msgid "Not seen yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 +msgid "No messages yet" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Τελευταία παρουσία: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Διεύθυνση email: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Πελάτης: %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "" +"Κάντε κλικ σε αυτό το κουμπί για να επαναφέρετε την εικόνα εμφάνισης αυτής " +"της επαφής" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Επαφές" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Προσκαλεσμένοι επαφές" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "Το αρχείο υπάρχει" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "Το αρχείο %1 υπάρχει ήδη. Επυθυμείτε την αντικατάστασή του;" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "Η εξαγωγή της λίστας τον επαφών ολοκληρώθηκε" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "" + +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "Καθαρισμός" + +#: dialogs/networkwindow.cpp:80 +msgid "C&lose All Tabs" +msgstr "" + +#: dialogs/networkwindow.cpp:1081 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" + +#: dialogs/networkwindow.cpp:1125 +msgid "" +"Could not save the Network Window log. Make sure you have permission to " +"write in the folder where it is being saved." +msgstr "" + +#: dialogs/networkwindow.cpp:1172 +msgid "Cannot close the main connection tab." +msgstr "" + +#: dialogs/networkwindow.cpp:1268 +msgid "" +"Sending commands to the server is a risky operation.
If you don't know " +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" +msgstr "" + +#: dialogs/networkwindow.cpp:1298 +msgid "" +"The payload you are trying to send does not end with the required newline " +"('\\r\\n')!
Do you want KMess to add it for you?" +msgstr "" + +#: dialogs/networkwindow.cpp:1374 +msgid "Cannot send commands to this kind of connection!" +msgstr "" + +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 +#: network/applications/filetransferp2p.cpp:99 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 +msgid "Cancelled" +msgstr "Ακυρώθηκε" + +#: dialogs/transferentry.cpp:181 +msgid "Failed!" +msgstr "Απέτυχε!" + +#: dialogs/transferentry.cpp:225 +msgid "Completed" +msgstr "Ολοκληρώθηκε" + +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +msgid "%1 MB" +msgstr "%1 MB" + +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +msgid "%1 kB" +msgstr "%1 kB" + +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +msgid "%1 bytes" +msgstr "%1 bytes" + +#: dialogs/transferentry.cpp:343 +msgid "%1 of %2 received." +msgstr "%1 από %2 λήφθηκαν." + +#: dialogs/transferentry.cpp:347 +msgid "%1 of %2 sent." +msgstr "" + +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "" + +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Κλείσιμο" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Διαγραφή" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Εμφάνιση εικόνας" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "&Διαγραφή επαφής" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Είστε σίγουροι ότι επιθυμείτε την διαγραφή αυτού του λογαριασμού;" + +#: emoticontheme.cpp:612 +msgid "" +"Could not save the emoticon theme. Make sure you have permission to write to " +"the theme folder '%1'." +msgstr "" + +#: emoticontheme.cpp:822 +msgid "Smile" +msgstr "" + +#: emoticontheme.cpp:823 +msgid "Wink" +msgstr "" + +#: emoticontheme.cpp:824 +msgid "Tongue out" +msgstr "" + +#: emoticontheme.cpp:825 +msgid "Big smile" +msgstr "" + +#: emoticontheme.cpp:826 +msgid "Sad" +msgstr "" + +#: emoticontheme.cpp:827 +msgid "Crying" +msgstr "" + +#: emoticontheme.cpp:828 +msgid "Angry" +msgstr "" + +#: emoticontheme.cpp:829 +msgid "Confused" +msgstr "" + +#: emoticontheme.cpp:830 +msgid "Embarrassed" +msgstr "" + +#: emoticontheme.cpp:831 +msgid "Disappointed" +msgstr "" + +#: emoticontheme.cpp:832 +msgid "Hot" +msgstr "" + +#: emoticontheme.cpp:833 +msgid "Baring teeth" +msgstr "" + +#: emoticontheme.cpp:834 +msgid "Nerd" +msgstr "" + +#: emoticontheme.cpp:835 +msgid "Sick" +msgstr "" + +#: emoticontheme.cpp:836 +msgid "Surprised" +msgstr "" + +#: emoticontheme.cpp:837 +msgid "Party" +msgstr "" + +#: emoticontheme.cpp:838 +msgid "Sleepy" +msgstr "" + +#: emoticontheme.cpp:839 +msgid "Thinking" +msgstr "" + +#: emoticontheme.cpp:840 +msgid "Don't tell anyone" +msgstr "" + +#: emoticontheme.cpp:841 +msgid "Secret telling" +msgstr "" + +#: emoticontheme.cpp:842 +msgid "Eye-rolling" +msgstr "" + +#: emoticontheme.cpp:843 +msgid "Sarcastic" +msgstr "" + +#: emoticontheme.cpp:844 +msgid "I don't know" +msgstr "" + +#: emoticontheme.cpp:845 +msgid "Be right back" +msgstr "Επιστρέφω αμέσως" + +#: emoticontheme.cpp:846 +msgid "Angel" +msgstr "Άγγελος" + +#: emoticontheme.cpp:847 +msgid "Left hug" +msgstr "" + +#: emoticontheme.cpp:848 +msgid "Boy" +msgstr "" + +#: emoticontheme.cpp:849 +msgid "Red heart" +msgstr "" + +#: emoticontheme.cpp:850 +msgid "Red rose" +msgstr "Λουλούδι" + +#: emoticontheme.cpp:851 +msgid "Thumbs up" +msgstr "" + +#: emoticontheme.cpp:852 +msgid "Dog face" +msgstr "" + +#: emoticontheme.cpp:853 +msgid "Sun" +msgstr "Ήλιος" + +#: emoticontheme.cpp:854 +msgid "Devil" +msgstr "Διάβολος" + +#: emoticontheme.cpp:855 +msgid "Right hug" +msgstr "" + +#: emoticontheme.cpp:856 +msgid "Girl" +msgstr "" + +#: emoticontheme.cpp:857 +msgid "Broken heart" +msgstr "" + +#: emoticontheme.cpp:858 +msgid "Wilted rose" +msgstr "Μαραμένο λουλούδι" + +#: emoticontheme.cpp:859 +msgid "Thumbs down" +msgstr "" + +#: emoticontheme.cpp:860 +msgid "Cat face" +msgstr "" + +#: emoticontheme.cpp:861 +msgid "Sleeping half-moon" +msgstr "" + +#: emoticontheme.cpp:862 +msgid "Red lips" +msgstr "" + +#: emoticontheme.cpp:863 +msgid "Clapping" +msgstr "" + +#: emoticontheme.cpp:864 +msgid "Crossed fingers" +msgstr "" + +#: emoticontheme.cpp:865 +msgid "Auto" +msgstr "Αυτοκίνητο" + +#: emoticontheme.cpp:866 +msgid "Airplane" +msgstr "Αεροπλάνο" + +#: emoticontheme.cpp:867 +msgid "Turtle" +msgstr "Χελώνα" + +#: emoticontheme.cpp:868 +msgid "Snail" +msgstr "Σαλιγκάρι" + +#: emoticontheme.cpp:869 +msgid "Sheep" +msgstr "Πρόβατο" + +#: emoticontheme.cpp:870 +msgid "Goat" +msgstr "Κατσίκα" + +#: emoticontheme.cpp:871 +msgid "Vampire bat" +msgstr "Νυχτερίδα Βαμπίρ" + +#: emoticontheme.cpp:872 +msgid "Pizza" +msgstr "Πίτσα" + +#: emoticontheme.cpp:873 +msgid "Beer mug" +msgstr "Κούπα μπύρας" + +#: emoticontheme.cpp:874 +msgid "Martini glass" +msgstr "" + +#: emoticontheme.cpp:875 +msgid "Coffee cup" +msgstr "" + +#: emoticontheme.cpp:876 +msgid "Birthday cake" +msgstr "Τούρτα" + +#: emoticontheme.cpp:877 +msgid "Plate" +msgstr "" + +#: emoticontheme.cpp:878 +msgid "Bowl" +msgstr "" + +#: emoticontheme.cpp:879 +msgid "Star" +msgstr "Αστέρας" + +#: emoticontheme.cpp:880 +msgid "Rainbow" +msgstr "Ουράνιο τόξο" + +#: emoticontheme.cpp:881 +msgid "Stormy cloud" +msgstr "" + +#: emoticontheme.cpp:882 +msgid "Lightning" +msgstr "Αστραπή" + +#: emoticontheme.cpp:883 +msgid "Umbrella" +msgstr "Ομπρέλα" + +#: emoticontheme.cpp:884 +msgid "Island with a palm tree" +msgstr "" + +#: emoticontheme.cpp:885 +msgid "Telephone receiver" +msgstr "" + +#: emoticontheme.cpp:886 +msgid "Mobile Phone" +msgstr "Κινητό" + +#: emoticontheme.cpp:887 +msgid "Email" +msgstr "Email" + +#: emoticontheme.cpp:888 +msgid "Clock" +msgstr "Ρολόι" + +#: emoticontheme.cpp:889 +msgid "Camera" +msgstr "Κάμερα" + +#: emoticontheme.cpp:890 +msgid "Filmstrip" +msgstr "" + +#: emoticontheme.cpp:891 +msgid "Note" +msgstr "" + +#: emoticontheme.cpp:892 +msgid "Handcuffs" +msgstr "Χειροπέδες" + +#: emoticontheme.cpp:893 +msgid "Money" +msgstr "Χρήματα" + +#: emoticontheme.cpp:894 +msgid "Light bulb" +msgstr "Λάμπα" + +#: emoticontheme.cpp:895 +msgid "Cigarette" +msgstr "Τσιγάρο" + +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "Μπάλα ποδοσφαίρου" + +#: emoticontheme.cpp:897 +msgid "Gift with a bow" +msgstr "Δώρο" + +#: emoticontheme.cpp:898 +msgid "X-Box" +msgstr "X-Box" + +#: emoticontheme.cpp:899 +msgid "Computer" +msgstr "Υπολογιστής" + +#: emoticontheme.cpp:900 +msgid "KMess Icon" +msgstr "Εικονίδιο KMess" + +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" +msgid "Internet connection not available." +msgstr "" + +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" + +#: initialview.cpp:581 +msgctxt "Button label" +msgid "&Connect" +msgstr "Σύνδεση" + +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" +msgstr "Ακύρωση" + +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "" + +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Μη έγκυρη διεύθυνση email" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "Πληροφορίες επαφής" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Η επαφή %1 υπάρχει ήδη στη λίστα επαφών σας." + +#: kmess.cpp:250 +msgid "New Group" +msgstr "Νέα ομάδα" + +#: kmess.cpp:253 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Προσθήκη μίας ομάδας" + +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" +msgstr "Εισάγετε το νέο όνομα για την ομάδα:" + +#: kmess.cpp:577 +#, fuzzy +msgid "" +"Are you sure you want to remove the contact %1 from your contact " +"list?" +msgstr "" +"Επιθυμείτε σίγουρα την αφαίρεση της επαφής %1 από την λιστα " +"επαφών σας;" + +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" +msgstr "Αφαίρεση επαφής" + +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" +msgstr "Αφαίρεση και φραγή" + +#: kmess.cpp:627 +msgctxt "dialog text" +msgid "" +"The group \"%1\" is not empty: remove all contacts from it, then try " +"again!" +msgstr "" + +#: kmess.cpp:629 kmess.cpp:636 +#, fuzzy +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Αφαίρεση ομάδας" + +#: kmess.cpp:634 +#, fuzzy +msgctxt "dialog text" +msgid "" +"Are you sure you want to remove the group %1 from your contact " +"list?" +msgstr "" +"Επιθυμείτε σίγουρα τη αφαίρεση της ομάδας %1 από τη λίστα επαφών σας;" + +#: kmess.cpp:637 +msgctxt "dialog button" +msgid "Remove" +msgstr "Αφαίρεση" + +#: kmess.cpp:668 +msgid "This is a special group and can't be changed." +msgstr "" + +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "Μετονoμασία ομάδας" + +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Εισάγετε το νέο όνομα για την ομάδα:" + +#: kmess.cpp:754 +msgctxt "dialog text" +msgid "" +"

Cannot login automatically with account \"%1\":
you must first " +"save the account password!

" +msgstr "" + +#: kmess.cpp:757 +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "" + +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Σύνδεση..." + +#: kmess.cpp:1123 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Εκτός Σύνδεσης" + +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" + +#: kmess.cpp:1481 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "" + +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" + +#: kmessinterface.cpp:163 +msgid "&Disconnect" +msgstr "Αποσύνδεση" + +#: kmessinterface.cpp:164 +msgid "Show My &Profile" +msgstr "Εμφάνιση των στοιχείων μου" + +#: kmessinterface.cpp:169 +msgid "Show &Allowed Contacts" +msgstr "Εμφάνιση επιτρεπόμενων επαφών" + +#: kmessinterface.cpp:170 +msgid "Show &Offline Contacts" +msgstr "Εμφάνιση μη συνδεδεμένων επαφών" + +#: kmessinterface.cpp:171 +msgid "Show &Removed Contacts" +msgstr "Εμφάνιση διαγραμμένων επαφών " + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &History Box" +msgstr "Στυλ συνομιλίας :" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "Εμφάνιση της γραμμής αναζήτησης" + +#: kmessinterface.cpp:174 +msgid "Show &Empty Groups" +msgstr "Εμφάνιση κενών ομάδων" + +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "Μέγεθος εμφάνισης εικόνων" + +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "Ταξινόμηση επαφών ανά" + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Εμφάνιση παραθύρου μεταφορών" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "Νέα επαφή..." + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "Νέα &ομάδα..." + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "Εξαγωγή της λίστας επαφών..." + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "Αναζήτηση επαφής" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Στυλ συνομιλίας :" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "Νέος &λογαριασμός..." + +#: kmessinterface.cpp:189 +msgid "Configure Account..." +msgstr "Ρύθμιση Λογαριασμού ..." + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "Ρύθμιση του &KMess..." + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 +#, fuzzy +msgid "Small" +msgstr "Μικρά" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:197 +#, fuzzy +msgid "Large" +msgstr "Μεγάλα" + +#: kmessinterface.cpp:201 +msgid "Group" +msgstr "Ομάδα" + +#: kmessinterface.cpp:202 +msgid "Online/Offline" +msgstr "" + +#: kmessinterface.cpp:203 +msgid "Mixed" +msgstr "" + +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Εμφάνιση παραθύρου δικτύου" + +#: kmessview.cpp:315 +msgid "[%1] Logged with %2" +msgstr "[%1] Σύνδεση ως %2" + +#: kmessview.cpp:352 +msgid "[%1] %2 goes online" +msgstr "[%1]Ο χρήστης %2 συνδέθηκε" + +#: kmessview.cpp:357 +msgid "[%1] %2 goes offline" +msgstr "[%1]Ο χρήστης %2 αποσυνδέθηκε" + +#: kmessview.cpp:590 +msgid "Cha&t" +msgstr "Συνομιλία" + +#: kmessview.cpp:593 +msgid "&Properties" +msgstr "&Ιδιότητες" + +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" +msgstr "Αφαίρεση από ομάδα" + +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" + +#: kmessview.cpp:632 +msgid "&Copy to Group" +msgstr "Αντιγραφή στην Ομάδα" + +#: kmessview.cpp:633 +msgid "&Move to Group" +msgstr "" + +#: kmessview.cpp:683 +msgid "Move Group &Down" +msgstr "" + +#: kmessview.cpp:684 +msgid "Move Group &Up" +msgstr "" + +#: kmessview.cpp:685 +msgid "Re&move Group" +msgstr "Αφαίρεση ομάδας" + +#: kmessview.cpp:686 +msgid "Re&name Group" +msgstr "Μετονoμασία ομάδας" + +#: kmessview.cpp:1124 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Προσθήκη αυτού του ατόμου στην λίστα επαφών μου" + +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Διεύθυνση email" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Πελάτης: %1" + +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "" + +#: kmessview.cpp:1156 +msgid "No" +msgstr "" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Σε φραγή" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Τελευταία παρουσία: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "%1 νέο μήνυμα email" + +#: kmessview.cpp:1204 +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Oμάδα %1" + +#: kmessview.cpp:1212 +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 επαφή, %2 σε σύνδεση" +msgstr[1] "%1 επαφές, %2 σε σύνδεση" + +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 επαφή" +msgstr[1] "%1 επαφές" + +#: kmessview.cpp:1631 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Γράψτε το προσωπικό σας μήνυμα>" + +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 νέο μήνυμα email" +msgstr[1] "%1 νέα μηνύματα email" + +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 +msgid "KMess" +msgstr "KMess" + +#: main.cpp:44 +msgid "A MSN Messenger client for KDE" +msgstr "Πελάτης MSN για το KDE" + +#: main.cpp:46 +#, fuzzy +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:61 +msgid "Developer" +msgstr "Προγραμματιστής" + +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 +msgid "Current developer" +msgstr "" + +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastasi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:69 +msgid "" +"German translation, testing, documentation, web master, project management, " +"etc..." +msgstr "" + +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:70 +msgid "Web design" +msgstr "" + +#: main.cpp:71 +msgid "David Vignoni" +msgstr "David Vignoni" + +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:72 +msgid "Cartoon emoticons" +msgstr "" + +#: main.cpp:73 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:73 +msgid "Default sound theme" +msgstr "" + +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:74 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:79 +msgid "Arabic translation, internationalization of file saving fix." +msgstr "" + +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:80 +msgid "More Arabic translation" +msgstr "" + +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:81 +msgid "Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:84 +msgid "Catalan translation" +msgstr "Καταλανική μετάφραση" + +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:86 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" + +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:87 main.cpp:88 +msgid "More Simplified Chinese translation" +msgstr "" + +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:89 +msgid "Traditional Chinese translation" +msgstr "Παραδοσιακή κινεζική μετάφραση" + +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Παραδοσιακή κινεζική μετάφραση" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:92 +msgid "Danish translation" +msgstr "Δανέζικη μετάφραση" + +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:93 +msgid "More Danish translation" +msgstr "" + +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:94 +msgid "Dutch translation" +msgstr "Ολλανδική μετάφραση" + +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 +msgid "More Dutch translation" +msgstr "" + +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:97 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Κορεάτικη μετάφραση" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:103 +msgid "Estonian translation" +msgstr "Εσθονική μετάφραση" + +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:104 +msgid "Finnish translation" +msgstr "Φινλανδική μετάφραση" + +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:105 main.cpp:106 +msgid "More Finnish translation" +msgstr "" + +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:108 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:108 +msgid "French translation" +msgstr "Γαλλική μετάφραση" + +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:110 main.cpp:111 +msgid "More French translation" +msgstr "" + +#: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:113 +msgid "Hungarian translation" +msgstr "Ουγγρική μετάφραση" + +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "" + +#: main.cpp:115 main.cpp:116 +msgid "More Italian translation" +msgstr "" + +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:117 +msgid "Korean translation" +msgstr "Κορεάτικη μετάφραση" + +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:118 +msgid "Norsk Bokmål translation" +msgstr "" + +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Σλοβενική μετάφραση" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "Σλοβάκικη μετάφραση" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "Matjaž kaše" + +#: main.cpp:123 +msgid "Slovenian translation" +msgstr "Σλοβενική μετάφραση" + +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:124 +msgid "Spanish translation" +msgstr "Ισπανική μετάφραση" + +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 +msgid "More Spanish translation" +msgstr "" + +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "Σουηδική μετάφραση" + +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:133 +#, fuzzy +msgid "More Swedish translation" +msgstr "Σουηδική μετάφραση" + +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:135 +msgid "Thai translation" +msgstr "Ταϊλανδική μετάφραση" + +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Τούρκικη μετάφραση" + +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "" + +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:143 +msgid "File transfer thumbnails" +msgstr "" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "Υποστήριξη KWallet" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "Στυλ συνομιλίας :" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:155 +msgid "Various internationalization fixes." +msgstr "" + +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:157 +msgid "GnomeMeeting developer" +msgstr "" + +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:158 +msgid "Guy with a bag over his head" +msgstr "" + +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 +msgid "Inspiration and assorted code" +msgstr "" + +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:162 +msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgstr "" + +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 +msgid "Idle timer code" +msgstr "" + +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 +msgid "Close-to-tray icon screenshot code" +msgstr "" + +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:165 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:168 +msgid "Your name here?" +msgstr "" + +#: main.cpp:168 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forums!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:171 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Παναγιώτης Παπαδόπουλος" + +#: main.cpp:172 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your emails" +msgstr "pano_90@gmx.net" + +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 +msgid "Autologin with the given email address" +msgstr "" + +#: main.cpp:184 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "" + +#: network/applications/application.cpp:294 +msgid "The contact cancelled the session." +msgstr "" + +#: network/applications/application.cpp:306 +msgid "The contact rejected the invitation." +msgstr "" + +#: network/applications/application.cpp:378 +msgid "You have cancelled the session." +msgstr "" + +#: network/applications/application.cpp:390 +msgid "You have rejected the invitation." +msgstr "" + +#: network/applications/application.cpp:540 +msgid "Do you want to
accept or cancel?" +msgstr "" + +#: network/applications/application.cpp:581 +msgid "Click to cancel." +msgstr "Κάντε κλικ για να ακυρώσετε." + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" + +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Το αρχείο "%1" υπάρχει ήδη.\n" +"Επυθυμείτε την αντικατάστασή του;" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "" +"Η μεταφορά του αρχείου "%1" απέτυχε. Αδύνατη η αποθήκευση του " +"αρχείου." + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "" + +#: network/applications/filetransfer.cpp:319 +#, fuzzy +msgid "Transfer accepted." +msgstr "Μεταφορά δέχτηκε" + +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 +msgid "Connecting to %1, port %2" +msgstr "" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Η επαφή ακύρωσε την μεταφορά του αρχείου "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Η σύνδεση επιτεύχθηκε" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." +msgstr "Η μεταφορά του αρχείου "%1" απέτυχε. Το αρχείο δεν υπάρχει." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "Η μεταφορά του αρχείου "%1" απέτυχε. Το αρχείο" + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Αποστολή αρχείου "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Η επαφή δέχτηκε την μεταφορά του αρχείου "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 +msgid "Negotiating options to connect" +msgstr "" + +#: network/applications/filetransferp2p.cpp:129 +#: network/applications/filetransferp2p.cpp:143 +#: network/applications/filetransferp2p.cpp:160 +#: network/extra/msnftpconnection.cpp:132 +msgid "The file transfer invitation was cancelled. Bad data was received." +msgstr "" + +#: network/applications/filetransferp2p.cpp:404 +msgid "You have accepted the transfer of file "%1"." +msgstr "" + +#: network/applications/filetransferp2p.cpp:615 +msgid "File could not be written" +msgstr "Το αρχείο δεν μπορεί να γραφτεί" + +#: network/applications/gnomemeeting.cpp:56 +msgid "You are invited to start a meeting (using GnomeMeeting)." +msgstr "" + +#: network/applications/gnomemeeting.cpp:118 +msgid "Starting GnomeMeeting. Connecting to %1." +msgstr "" + +#: network/applications/gnomemeeting.cpp:161 +msgid "Inviting the contact to a meeting." +msgstr "" + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It's not supported by the other client." +msgstr "" + +#: network/applications/mimeapplication.cpp:164 +msgid "The invitation was aborted. An internal error occured." +msgstr "" + +#: network/applications/mimeapplication.cpp:170 +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "" + +#: network/applications/mimeapplication.cpp:175 +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "" + +#: network/applications/mimeapplication.cpp:180 +msgid "" +"The invitation was aborted. The switchboard closed the chat connection." +msgstr "" + +#: network/applications/mimeapplication.cpp:186 +msgid "The invitation was aborted." +msgstr "" + +#: network/applications/msnremotedesktop.cpp:52 +msgid "You are invited to share this person's desktop." +msgstr "" + +#: network/applications/msnremotedesktop.cpp:159 +msgid "Starting KRDC. Connecting to %1." +msgstr "" + +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"support it." +msgstr "" + +#: network/applications/p2papplication.cpp:1084 +msgid "The transfer failed. Data preparation failed." +msgstr "" + +#: network/applications/p2papplication.cpp:1191 +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "" + +#: network/applications/p2papplication.cpp:1743 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" + +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "" + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 +msgid "Awaiting connection at %1, port %2" +msgstr "" + +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 +msgid "Reverting to indirect file transfer (this could be slow)." +msgstr "" + +#: network/applications/p2papplication.cpp:3166 +msgid "Waiting for connection" +msgstr "" + +#: network/applications/p2papplication.cpp:3420 +msgid "" +"The invitation was cancelled. A timeout occured waiting for the contact to " +"accept." +msgstr "" + +#: network/applications/p2papplication.cpp:3429 +msgid "" +"The invitation was cancelled. A timeout occured waiting for a connection to " +"succeed or fail." +msgstr "" + +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 +msgid "The invitation was cancelled. A timeout occured waiting for data." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Η μεταφορά απέτυχε." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "" + +#: network/applications/voiceconversation.cpp:71 +msgid "You are invited to start a voice conversation." +msgstr "" + +#: network/applications/voiceconversation.cpp:76 +msgid "" +"You are invited to start a voice conversation but support for this was not " +"installed" +msgstr "" + +#: network/applications/voiceconversation.cpp:168 +msgid "You have cancelled the voice conversation." +msgstr "" + +#: network/applications/voiceconversation.cpp:205 +msgid "The invitation was cancelled. The audio device couldn't be opened." +msgstr "" + +#: network/applications/voiceconversation.cpp:218 +msgid "Start voice conversation. Connecting to %1." +msgstr "" + +#: network/applications/voiceconversation.cpp:224 +msgid "Start voice conversation. Listening on %1." +msgstr "" + +#: network/applications/voiceconversation.cpp:289 +msgid "Inviting the contact to a voice conversation." +msgstr "" + +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +msgid "The contact is inviting you for '%1', but this is not implemented yet." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" + +#: network/extra/msnftpconnection.cpp:133 +#, fuzzy +msgid "Failed" +msgstr "Απέτυχε" + +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Αποστολή αρχείου %1" + +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "" + +#: network/extra/msnftpconnection.cpp:399 +msgid "Couldn't open a local port." +msgstr "" + +#: network/extra/msnftpconnection.cpp:456 +msgid "Initiating file transfer" +msgstr "" + +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "" + +#: network/extra/msnftpconnection.cpp:470 +msgid "Unable to make a connection." +msgstr "" + +#: network/extra/msnftpconnection.cpp:574 +msgid "Receiving file %1" +msgstr "" + +#: network/msnconnection.cpp:385 +msgid "Invalid command syntax" +msgstr "" + +#: network/msnconnection.cpp:389 +msgid "Invalid command parameter" +msgstr "" + +#: network/msnconnection.cpp:392 +msgid "The email you have tried to add is not a MSN Messenger account" +msgstr "" + +#: network/msnconnection.cpp:397 +msgid "Domain name missing" +msgstr "" + +#: network/msnconnection.cpp:401 +msgid "Already logged in" +msgstr "" + +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" +msgstr "" + +#: network/msnconnection.cpp:408 +msgid "" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" +msgstr "Ο λογαριασμός είναι άκυρος, ή δεν έχει γίνει ακόμα η επιβεβαίωσή του " + +#: network/msnconnection.cpp:411 +msgid "Your contact list is full" +msgstr "" + +#: network/msnconnection.cpp:416 +msgid "Invalid SBP parameter" +msgstr "" + +#: network/msnconnection.cpp:419 +msgid "This contact is already on your list" +msgstr "" + +#: network/msnconnection.cpp:423 +msgid "This contact is not on your list" +msgstr "" + +#: network/msnconnection.cpp:427 +msgid "This contact is not online" +msgstr "" + +#: network/msnconnection.cpp:432 +msgid "Already in this mode" +msgstr "" + +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" + +#: network/msnconnection.cpp:440 +msgid "" +"The group name is already added to your Messenger or Hotmail contact list. " +"Please use a different name." +msgstr "" + +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "" + +#: network/msnconnection.cpp:448 +msgid "This group can't be changed" +msgstr "" + +#: network/msnconnection.cpp:453 +msgid "Contact is not added to this group" +msgstr "" + +#: network/msnconnection.cpp:457 +#, fuzzy +msgid "This group is not empty" +msgstr "Αυτή η ομάδα δεν είναι κενή" + +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" + +#: network/msnconnection.cpp:466 +msgid "Attempted to change group \"0\"" +msgstr "" + +#: network/msnconnection.cpp:466 +msgid "There was an internal error in KMess: %1" +msgstr "" + +#: network/msnconnection.cpp:470 +msgid "Invalid Group" +msgstr "Μη έγκυρη ομάδα" + +#: network/msnconnection.cpp:474 +#, fuzzy +msgid "Empty domain" +msgstr "Κενός τομέας" + +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 +msgid "Switchboard server failed" +msgstr "" + +#: network/msnconnection.cpp:484 +msgid "Transfer to switchboard server failed" +msgstr "" + +#: network/msnconnection.cpp:488 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "" + +#: network/msnconnection.cpp:492 +msgid "Required field missing" +msgstr "" + +#: network/msnconnection.cpp:496 +msgid "Not logged in" +msgstr "" + +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "" + +#: network/msnconnection.cpp:505 +msgid "Command is disabled" +msgstr "" + +#: network/msnconnection.cpp:508 +msgid "Your account is banned." +msgstr "" + +#: network/msnconnection.cpp:512 +msgid "Challenge response failed" +msgstr "" + +#: network/msnconnection.cpp:517 +msgid "Bad command data" +msgstr "" + +#: network/msnconnection.cpp:521 +msgid "You are opening chat sessions too fast" +msgstr "" + +#: network/msnconnection.cpp:525 +msgid "You have too many open chat sessions" +msgstr "" + +#: network/msnconnection.cpp:532 +msgid "Unexpected command sequence" +msgstr "" + +#: network/msnconnection.cpp:536 +msgid "Bad friend name" +msgstr "" + +#: network/msnconnection.cpp:542 +msgid "Bad CVR data" +msgstr "" + +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" +msgstr "" + +#: network/msnconnection.cpp:555 +msgid "Authentication ticket was incorrect" +msgstr "" + +#: network/msnconnection.cpp:558 +msgid "You can't start a chat with someone while you are invisible." +msgstr "" + +#: network/msnconnection.cpp:562 +msgid "Not accepting new contacts" +msgstr "" + +#: network/msnconnection.cpp:566 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online." +msgstr "" + +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." +msgstr "" + +#: network/msnconnection.cpp:573 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:583 +msgid "Error accessing contact list, try again later" +msgstr "" + +#: network/msnconnection.cpp:592 +msgid "" +"The MSN service is temporarily unavailable, there was an internal server " +"error." +msgstr "" + +#: network/msnconnection.cpp:603 +msgid "The MSN service is temporarily unavailable, the server is too busy" +msgstr "" + +#: network/msnconnection.cpp:607 +msgid "Peer notification server down" +msgstr "" + +#: network/msnconnection.cpp:611 +msgid "The server is going down" +msgstr "" + +#: network/msnconnection.cpp:615 +msgid "The server is going down soon" +msgstr "" + +#: network/msnconnection.cpp:620 +msgid "Write is blocking" +msgstr "" + +#: network/msnconnection.cpp:624 +msgid "Session is overloaded" +msgstr "" + +#: network/msnconnection.cpp:631 +msgid "The server is not available" +msgstr "Ο εξυπηρετητής δεν είναι διαθέσιμος" + +#: network/msnconnection.cpp:635 +msgid "Authentication failed" +msgstr "Η ταυτοποίηση απέτυχε" + +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "" + +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "Σφάλμα MSN" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Ταυτοποίηση..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Επιβεβαιώθηκε" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Μετάβαση σε άλλο διακομιστή" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Σύνδεση..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2109 +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 λεπτό" +msgstr[1] "%1 λεπτά" + +#: network/msnnotificationconnection.cpp:2112 +msgid "Server closes for maintenance in %1!" +msgstr "" + +#: network/msnnotificationconnection.cpp:2117 +msgctxt "Server maintenance dialog box text" +msgid "The MSN Server will be going down in %1 for maintenance." +msgstr "" + +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2589 +msgid "Authentication time limit exceeded" +msgstr "" + +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Αναμονή της λίστας επαφών " + +#: network/msnnotificationconnection.cpp:2805 +#, fuzzy +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Μήνυμα MSN

%1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 +msgid "
Internal error reason: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" +msgid "" +"

Authentication has failed, please verify your account email and password." +"

" +msgstr "" +"

Η ταυτοποίηση απέτυχε. Παρακαλώ βεβαιωθείτε οτι εισάγατε το σωστό κωδικό " +"πρόσβασης ή το σωστό όνομα του λογαριασμού σας

" + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

Ο λογαριασμός %1 συνδέθηκε από άλλη τοποθεσία.

" + +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +#, fuzzy +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Μήνυμα MSN

%1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 +msgid "Connection time limit exceeded" +msgstr "" + +#: network/msnsockettcp.cpp:375 +msgid "1 ping lost" +msgstr "" + +#: network/msnsockettcp.cpp:379 +msgid "%1 pings lost" +msgstr "" + +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "" + +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" + +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Ο εξυπηρετητής δεν είναι διαθέσιμος" + +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:521 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Ο εξυπηρετητής δεν είναι διαθέσιμος" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "Ο χρήστης %1 λεεί :
'%2'" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"Ο χρήστης %1 σας έστειλε ένα μήνυμα εκτός σύνδεσης :
'%2'" + +#: notification/chatnotification.cpp:169 +msgid "%1's chat requests attention!" +msgstr "" + +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:181 +msgid "%1 has sent you a handwritten message!" +msgstr "" + +#: notification/chatnotification.cpp:185 +msgid "%1 has sent you a nudge!" +msgstr "%1 σας έστειλε ένα wizz!" + +#: notification/chatnotification.cpp:189 +msgid "%1 has sent you a wink!" +msgstr "%1 σας έστειλε ένα wink!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 σας στέλνει ένα αρχείο!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 σας έστειλε μία πρόσκληση!" + +#: notification/chatnotification.cpp:204 +msgid "%1 has canceled the webcam session!" +msgstr "" + +#: notification/chatnotification.cpp:205 +msgid "%1 has canceled the file transfer!" +msgstr "Ο χρήστης %1 ακύρωσε τη μεταφόρα του αρχείου!" + +#: notification/chatnotification.cpp:206 +msgid "%1's activity has been canceled!" +msgstr "" + +#: notification/chatnotification.cpp:213 +msgid "%1 has accepted to use the webcam!" +msgstr "" + +#: notification/chatnotification.cpp:214 +msgid "%1 has accepted the file transfer!" +msgstr "Ο χρήστης %1 δέχτηκε τη μεταφορά του αρχείου" + +#: notification/chatnotification.cpp:215 +msgid "%1 has accepted your invitation!" +msgstr "Ο χρήστης%1δέχτηκε την πρόσκληση σας!" + +#: notification/chatnotification.cpp:222 +msgid "%1 has ended the webcam session!" +msgstr "" + +#: notification/chatnotification.cpp:223 +msgid "The file transfer with %1 is done!" +msgstr "" + +#: notification/chatnotification.cpp:224 +msgid "%1's activity has ended!" +msgstr "" + +#: notification/chatnotification.cpp:231 +msgid "%1's webcam session has failed!" +msgstr "" + +#: notification/chatnotification.cpp:232 +msgid "The file transfer with %1 has failed!" +msgstr "" + +#: notification/chatnotification.cpp:233 +msgid "%1's activity has ended with an error!" +msgstr "" + +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
συνδέθηκε" + +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
είναι απών" + +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
θα επιστρέψει σε λίγο" + +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
είναι απασχολημένος" + +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
είναι αόρατος" + +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
είναι αδρανής" + +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
αποσυνδέθηκε" + +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
είναι στο τηλέφωνο" + +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
είναι έξω για φαγητό" + +#: notification/newemailnotification.cpp:90 +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Νέα αλληλογραφία:
'%1'
από '%2'" + +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "%1 νέο μήνυμα email" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "%1 νέο μήνυμα email" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Διάβολος" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Αποστολή &email" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "" + +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "" + +#: notification/systemtraywidget.cpp:240 +#, fuzzy +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "" + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "" + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "" + +#: settings/accountpage.cpp:493 +msgid "Downloading of display picture failed" +msgstr "" + +#: settings/accountpage.cpp:552 +msgid "" +"An error occurred when trying to change the display picture.\n" +"Make sure that you have selected an existing picture file." +msgstr "" + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Ρυθμίσεις" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Λογαριασμός" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Ο λογαριασμός μου" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Επαφές" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Καταγραφή συνομιλίας" + +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"Η διεύθυνση email που έχετε εισάγει δεν είναι έγκυρη και δεν μπορεί να " +"χρησιμοποιηθεί ως λογαριασμός: '%1'" + +#: settings/accountsettingsdialog.cpp:214 +msgid "The email address you have entered is already in use: '%1'" +msgstr "Η διεύθυνση email που έχετε εισάγει, χρησιμοποιείται ήδη: '%1'" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "Είστε σίγουροι ότι επιθυμείτε την διαγραφή αυτού του λογαριασμού;" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Είστε σίγουροι ότι επιθυμείτε την διαγραφή του λογαριασμού '%1' ;
Όλες οι " +"ρυθμίσεις αυτού του λογαριασμού θα χαθούν." + +#: settings/chatstylepage.cpp:378 +msgid "Hi, how are you doing? :)" +msgstr "" + +#: settings/chatstylepage.cpp:379 +msgid "Stacy" +msgstr "" + +#: settings/chatstylepage.cpp:380 +msgid "Great!" +msgstr "" + +#: settings/chatstylepage.cpp:382 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "" + +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "" + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Επεξεργασία εικονιδίου διάθεσης" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Είστε σίγουροι ότι επιθυμείτε την διαγραφή αυτού του λογαριασμού;" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Επεξεργασία εικονιδίου διάθεσης" + +#: settings/globalsettingsdialog.cpp:46 +msgid "KMess Settings" +msgstr "Ρυθμίσεις του KMess" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 +msgid "Accounts" +msgstr "Λογαριασμοί" + +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "" + +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable browsers detected." +msgstr "" + +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "" + +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" +msgstr "" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" +msgstr "" + +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" +msgstr "" + +#: settings/miscellaneouspage.cpp:321 +#, c-format +msgid "" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" +msgstr "" + +#: settings/miscellaneouspage.cpp:344 +msgid "You have to select a directory for the received files!" +msgstr "" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "Στείλτε ένα σχόλιο στην ομάδα ανάπτυξης Kmess" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Στείλτε ένα σχόλιο στην ομάδα ανάπτυξης Kmess" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +#, fuzzy +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"Η διεύθυνση email που έχετε εισάγει δεν είναι έγκυρη και δεν μπορεί να " +"χρησιμοποιηθεί ως λογαριασμός: '%1'" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "" +#~ "Επιλέξτε το λογαριασμό που θέλετε να τροποποιήσετε και κάντε κλικ εδώ." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Κλείσιμο" + +#~ msgid "&Copy..." +#~ msgstr "Αντιγραφή..." + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "Διεύθυνση mail: %1" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Πελάτης: %1" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Σε φραγή" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Τελευταία παρουσία: %1" + +#~ msgid "&Show winks from contacts" +#~ msgstr "Εμφάνιση των ειδοποιήσεων που στέλνουν οι επαφές" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "Αναμονή της λίστας επαφών " + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "Προαιρετικά, μπορείτε να επιλέξετε την ομάδα της νέας επαφής" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Νέα ομάδα" + +#~ msgid "Now listening to: %1" +#~ msgstr "Τώρα ακούω το : %s" + +#~ msgid "SOAP connection error: %1" +#~ msgstr "Σφάλμα σύνδεσης SOAP: %1" + +#~ msgid "&Send email" +#~ msgstr "&Αποστολή email" + +#~ msgid "Save complete" +#~ msgstr "Η εξαγωγή ολοκληρώθηκε" + +#~ msgid "Connect" +#~ msgstr "Σύνδεση" + +#~ msgid "Rename group" +#~ msgstr "Μετονομασία ομάδας" + +#~ msgid "Account &Settings..." +#~ msgstr "Ρυθμίσεις &λογαριασμού" + +#~ msgctxt "Connection error dialog box" +#~ msgid "%1" +#~ msgstr "%1" + +#, fuzzy +#~ msgctxt "Server error dialog box" +#~ msgid "

MSN server message

%1

" +#~ msgstr "

Μήνυμα server MSN

%1

" + +#, fuzzy +#~ msgid "Select an emoticon and click here to delete it" +#~ msgstr "" +#~ "Επιλέξτε ενα εικονίδιο διάθεσης και κάντε κλικ εδώ για να το διαγράψετε" + +#~ msgid "In the Inbox" +#~ msgstr "Στα εισερχόμενα" + +#~ msgid "In other folders" +#~ msgstr "Σε άλλους φακέλους" + +#~ msgid "seconds" +#~ msgstr "δευτερόλεπτα" + +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Απόκρυψη επαφών" + +#~ msgid "Invite contacts" +#~ msgstr "Πρόσκληση επαφών" diff --git a/po/es.po b/po/es.po index a359e18..4cf099e 100644 --- a/po/es.po +++ b/po/es.po @@ -1,850 +1,1509 @@ # translation of es.po to Spanish -# translation of es.po to -# translation of es.po to -# Copyright (C) 2002,2003, 2005, 2007 Free Software Foundation, Inc. +# Copyright (C) 2003-2009 Free Software Foundation, Inc. # # Javier Cuesta Alcocer , 2003. # Alejandro Araiza Alvarado , 2005. # Jaume Corbí , 2007. # Christian Kaiser , 2007. +# Juan Pablo González Tognarelli , 2008, 2009. +# Alexis Medina , 2009. msgid "" msgstr "" "Project-Id-Version: es\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2007-11-04 20:33-0300\n" -"Last-Translator: Christian Kaiser \n" -"Language-Team: Spanish\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-02-01 20:34-0300\n" +"Last-Translator: Alexis Medina \n" +"Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.11.4\n" +"X-Generator: Lokalize 0.3\n" "First-Translator: Javier Cuesta Alcocer \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Emoticonos de cómic" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "" +"Presione este botón para empezar a usar KMess, o cancelar un intento de " +"conexión" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Aún no hay mensajes" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" +"Presione este botón para empezar a usar KMess, o cancelar un intento de " +"conexión" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Emoticonos de cómic" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Emoticonos Personalizados" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Guiño" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "Presione este botón para restaurar la imagen de este contacto." + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" msgstr "&Nueva línea" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "&Enviar" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "Contactos" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Charla" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." -msgstr "Haz click aquí para mostrar el perfíl de este contacto." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Barra Principal" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" -msgstr "" +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" +msgstr "Presione aquí para mostrar el menú para este contacto." -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 #, fuzzy +msgid "Click here to open your account settings" +msgstr "Presione aquí para renombrar el emoticono seleccionado" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "Limpiar el área" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "Color del lápiz" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "Tamaño del lápiz" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "Goma de borrar" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Grupo inicial:" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" -msgstr "Introduzca la dirección de correo de la persona que desea agregar:" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "Correo electrónico:" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" msgstr "" +"Introduzca la dirección de correo de la persona que desea agregar a su lista " +"de contactos" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -#, fuzzy -msgid "Initial group" -msgstr "Re&nombrar grupo" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "Dirección de Correo electrónico:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "Metodo abreviado de teclado:" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Ingrese una abreviación para este emoticono:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" -msgstr "Archivo de imagen:" +msgstr "Seleccione un archivo de imagen:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 -#, fuzzy +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "" -"Introduzca el mensaje que se mandará automáticamente\n" -"a la gente que intente contactar con usted:" +"Introduzca un mensaje para enviar automáticamente a la gente que intente " +"contactarle." -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "E&specifique un Mensaje de ausencia Automático:" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 #, fuzzy -msgid "&Automatic away message" -msgstr "Especifique un mensaje de ausencia" +msgid "Search through contacts..." +msgstr "Buscar c&ontacto" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Registro de la charla" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "&No usar" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 -#, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "&Agregar este contacto a su lista de \"Amigos\"" - -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 -#, fuzzy -msgid "Do not add this person; only allow them to see my online state" -msgstr "&No agregar, pero permitir que vean mi estado de conexión." - -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 -#, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" msgstr "" -"Evitar que esta persona se ponga en contacto conmigo &y vea mi estado de " + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +#, fuzzy +msgid "to" +msgstr "Auto" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Iniciar o detener una &Charla" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "¿Que desea hacer?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" +msgstr "&Agregar a esta persona a su lista de contactos" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person; only allow them to see my status" +msgstr "" +"No agregar a esta persona; Sólo permitirle que vea mi esta&do de conexión" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting me or seeing my status" +msgstr "" +"&Bloquear a esta persona, evitando que me contacte, o vea mi estado de " "conexión" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "Propiedades de contacto %1" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" -msgstr "" +msgstr "&Información" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 -#, fuzzy -msgid "Restore" -msgstr "Eliminado" +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "Presione este botón para restaurar la imagen de este contacto." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Restaurar" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Grupos:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -#, fuzzy -msgid "Use alternative name for this person" -msgstr "Usar un nombre alternativo para esta persona" +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "Usar un nombre &alternativo para esta persona" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "Mostrar una notificación cuando esta persona se conecte o desconecte" +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "Mostrar una notificación cuando esta &persona se conecte/desconecte" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "Sonido:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Sonido:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" +msgstr "I&mágenes" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Presione aquí para eliminar el emoticono seleccionado" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Mostrar Foto" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +msgid "&Clear Cache" +msgstr "Limpiar &Cache" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "&Notas" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "&Emoticonos" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 -#, fuzzy -msgid "&Clear Cache" -msgstr "Limpiar pestaña" +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "Presione aquí para eliminar el emoticono seleccionado" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -#, fuzzy -msgid "Notes" -msgstr "Nota" +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Eli&minar" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "Contactos Disponibles" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "Invitar a un contacto que no está en su lista:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "Ingrese el correo electrónico del contacto a invitar" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "Contactos Invitados" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Elementos para exportar:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Formato" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Contactos:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "Seleccionar Todo" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Deseleccionar Todos" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Exportar..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Cerrar" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Ventana de Red" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" -msgstr "" +msgstr "Comando a la Pestaña Actual" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "Comando:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" -msgstr "" +msgstr "Tipo:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "Estrella" +msgstr "Estándar" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" -msgstr "" +msgstr "MIME" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" -msgstr "&Enviar" +msgstr "Enviar" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" -msgstr "" +msgstr "Carga del comando (puede estar vacío):" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" -msgstr "" +msgstr "Abrir" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" +msgstr "Cancelar" + +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "&Descargas" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "&Envíos" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "&Limpiar" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "&Cerrar" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" msgstr "" +"Presione aquí para mostrar las opciones para la cuenta seleccionada, o " +"utilice la rueda del ratón para cambiar entre las cuentas guardadas" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" msgstr "" +"Introduzca la dirección de correo electrónico de su cuenta Passport o Live" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "Correo electronico: " - -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 -#, fuzzy +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" -msgstr "Contraseña" +msgstr "Contraseña:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" -msgstr "Estado al iniciar sesión" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "Ingrese aquí la contraseña de su cuenta" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "" +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Estado al iniciar sesión:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 #, fuzzy -msgid " Account options " -msgstr "O&pciones de la cuenta" +msgid "Choose a status to set when successfully connected." +msgstr "Seleccione un estado de MSN para definir cuando se conecte." -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" -msgstr "Recor&dar este perfil" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "Si está activado, KMess guardará su cuenta" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" +msgstr "&Recordar ésta cuenta" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "Si selecciona recordar un perfil con KMess, también podrá guardar la 
contraseña" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "R&ecordar la contraseña" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" msgstr "" +"Presione este botón para empezar a usar KMess, o cancelar un intento de " +"conexión" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Conectar" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Escriba su mensaje personal aquí" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Nueva Cuenta" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 -#, fuzzy -msgid "Your Account Information" -msgstr "O&pciones de la cuenta" +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." -msgstr "" -"Escriba el nombre que desea que vean sus contactos cuando esté en línea." - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 -#, fuzzy -msgid "&Friendly name:" -msgstr "Nombre de usuario (nick)" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" msgstr "" -"Escriba la dirección de su cuenta MSN Passport. Puede registrar una nueva en " -"http://register.passport.com/" +"Presione aquí para crear una nueva cuenta Live, la cual puede usar " +"para conectarse a la red MSN.
Usted también puede utilizar su actual " +"cuenta de correo" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "¿Olvidó su contraseña?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 #, fuzzy -msgid "&Email address:" -msgstr "Correo electronico: " +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Presione aquí para ir al sitio web de Live, en la página usted podrá " +"definir una nueva contraseña para cuenta" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Conexión" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Ver" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Acciones" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "Formulario" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Cuenta" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "O&pciones de cuenta" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." +msgstr "" +"Escriba el nombre que desea que sus contactos vean cuando esté en línea." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 +msgid "&Friendly name:" +msgstr "&Nombre que verán los otros usuarios:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Ingrese la dirección de su cuenta MSN Passport (Windows Live ID). usted " +"puede registrar una nueva cuenta en http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 +msgid "&Email address:" +msgstr "Correo &Electrónico: " + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -"Escriba la contraseña de su cuenta de MSN Passport. Puede registrar una " -"nueva en http://register.passport.com/" +"Escriba la contraseña de su cuenta de MSN Passport (Windows Live ID). Puede " +"registrar una nueva en http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" -msgstr "Contraseña" +msgstr "&Contraseña:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -#, fuzzy -msgid "&Remember Password" -msgstr "Contraseña" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "&Recordar la Contraseña" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" -msgstr "Mostrar foto" +msgstr "Mostrar Foto" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." msgstr "Ca&mbiar" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" -msgstr "" +msgstr "&No usar" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -"La opción \"Recordar esta cuenta\" no estaba marcada cuando entró, por lo " -"que sus preferencias no serán guardadas por defecto. Active esta opción " -"cuando quiera que se guarden las preferencias de su cuenta permanentemente " -"en este ordenador.

Se recomienda que active esta opción, a no ser que " -"use KMess en un equipo de uso público." +"La opción \"Recordar esta cuenta\" no estaba seleccionada cuando entró, por " +"lo tanto, sus preferencias no serán guardadas por defecto. Habilite esta " +"opción cuando quiera que se guarden las preferencias de su cuenta " +"permanentemente en este equipo.

Se recomienda que active esta opción, " +"a no ser que use KMess en un equipo de uso público. (por ejemplo: Cibercafé)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 -#, fuzzy +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "Recordar las preferencias de esta cuenta." +msgstr "&Recordar las preferencias de esta cuenta" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" "Si está activado, KMess iniciará sesión con esta cuenta automáticamente." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" -msgstr "In&gresar con esta cuenta automáticamente al iniciar" +msgid "Log in &with this account automatically" +msgstr "In&gresar con esta cuenta automáticamente" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "Registrar todas las conversaciones" +msgstr "Entr&ar Como" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -"Necesita una cuenta para conectar a la red de MSN Messenger. Puede registrar " -"una con su cuenta de correo actual o usar una de Hotmail para conectar." +"Usted necesita conectarse al sitio de Passport para confirmar que su " +"dirección de correo electrónico existe." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -"No puedes cambiar tu nick porque aún no has verificado la dirección de e-" -"mail registrada en passport." +"No puede cambiar su apodo porque aún no ha verificado su dirección de correo " +"electrónico en Passport." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" -msgstr "Pedir correo electrónico de verificacion" +msgstr "Solicitar un correo electrónico de verificación" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "Ir a accountservices.passport.net" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"Necesita una cuenta Passport (Windows Live ID) para conectar a la red de MSN " +"Messenger. Puede registrar su actual cuenta de correo electrónico en " +"register.passport.com, o usar una cuenta de Hotmail para conectarse." + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -"Para conectar al servicio MSN Messenger, necesitarás registrar una cuenta " -"Passport con tu dirección de e-mail." +"Para conectar al servicio MSN Messenger, necesitará registrar una cuenta de " +"correo electrónico como cuenta de Passport (Windows Live ID)." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" -msgstr "Registrar nueva cuenta." +msgstr "Registrar nueva cuenta" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "Ir a register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 #, fuzzy +msgid "&Status Options" +msgstr "Estado al iniciar sesión:" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Cuando está activado, su estado será cambiado automáticamente a \"Ausente - " +"Inactivo\" cuando no use el equipo durante unos minutos. Si esta opción no " +"está disponible, KMess fue compilado sin el soporte para esta característica." + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Cambiar el estado a \"Ausente\" cuando esté inactivo" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"Controla el número de minutos que pasan antes de que KMess cambie su estado " +"a \"Inactivo-Ausente\"." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Pasar a inactivo tras" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minutos" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +#, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "&No realizar notificaciones cuando mi estado sea Ocupado" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 msgid "Saved accounts:" -msgstr "Cuentas" +msgstr "Cuentas guardadas:" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "Click" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -"Haga click aquí para agregar nuevos emoticonos personalizados para enviarle " -"a sus contactos." +"Presione aquí para crear una nueva cuenta de KMess para una cuenta de correo " +"ya asociada a una cuenta de MSN" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +msgid "&Add Account..." +msgstr "&Agregar Cuenta..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 #, fuzzy -msgid "&Add account..." -msgstr "Cuenta" +msgid "Select an account and click here to modify it" +msgstr "Seleccione una cuenta y presione aquí para borrarla" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "Seleccione un emoticono y haga click aqui para borrarlo." - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" -msgstr "" +msgstr "&Editar" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 -#, fuzzy +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "Seleccione una cuenta y presione aquí para borrarla" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" -msgstr "Eliminado" +msgstr "&Eliminar" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Notificación emergente" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" +"Habilite esta casilla para guardar sus conversaciones para una visualización " +"posterior" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 -#, fuzzy -msgid "Contact Events" -msgstr "Contactos" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "Mostrar notificaciones cuando los contactos:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" msgstr "" -"Cuando está activo, una notificación es mostrada cuando uno de sus contactos " -"se conecta." +"

Si habilita el registro de charlas, cada conversación que usted " +"tenga será guardada en un lugar determinado (el cual puede ser especificado " +"más abajo).

\n" +"

Las charlas guardadas le permitirán encontrar algo en sus discusiones " +"previas, como un enlace, o lo puede usar para recordar que le dijo a alguien " +"en una cierta ocasión.

\n" +"

Ésto puede traer posibles inconvenientes de privacidad, debido a que " +"personas no autorizadas que utilicen su cuenta pueden leer los registros de " +"conversaciones.

\n" +"

Asegúrese de mantener ésta opción deshabilitada en computadoras de " +"acceso público!

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -#, fuzzy -msgid "&Go online" -msgstr "Se desconec&ten" +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "Habilitar el registro de charlas" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" +"KMess también puede guardar sus conversaciones como archivos HTML, y " +"mantenerlas organizados" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "Guardar las charlas en archivos" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "Con esta opción, usted puede elegir como KMess guardará sus charlas" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "Formato de archivo utilizado para guardar:" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" msgstr "" -"Cuando está activo, una notificación es mostrada cuando uno de sus contactos " -"comienza una conversación con usted." +"\n" +"

El formato del archivo que utilice es importante.

\n" +"

Los registros en HTML pueden ser abiertos en cualquier navegador web, " +"pero frecuentemente no pueden ser mostrados correctamente en otros " +"computadores.

\n" +"

En cambio, los archivos de texto, pueden ser perfectamente leídos en " +"cualquier lugar; pero ellos no contendrán ningún formato de texto, imágenes " +"para mostrar, o emoticonos.

\n" +"" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "Comiencen una &conversación contigo" +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "Páginas Web (HTML)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "Texto Plano" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." msgstr "" -"Cuando está activo, una notificación es mostrada cuando uno de sus contactos " -"le evia un mensaje." +"Estas opciones le permiten seleccionar la forma en que KMess organizará los " +"registros de sus charlas en el directorio especificado más abajo." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "Le mand&en un mensaje" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." msgstr "" -"Cuando está activo, una notificación es mostrada cuando uno de sus contactos " -"cambia su estado." +"Dependiendo de qué opción seleccione aquí, KMess creará algunos directorios " +"para ayudarle a mantener los registros de charla organizados. Utilice la " +"opción \"¿Qué es esto?\" para más detalles." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "Cambien su e&stado" +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" +msgstr "Organizar los archivos por:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "Crea un directorio para organizar las charlas por año" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" msgstr "" -"Cuando está activo, una notificación es mostrada también cuando uno de sus " -"contactos se desconecta." +"Esta opción le indica a KMess que divida el registro de sus charlas " +"solamente por año.\n" +"Usted encontrará directorios para cada año de charlas; El cual agrupará " +"todas las conversaciones realizadas las charlas del año.\n" +"\n" +"Una charla realizada el 09 de abril de 2009 será guardada en el directorio " +"como:\n" +"/2009/fecha-y-nombre-del-" +"contacto.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "Se desconec&ten" +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Año" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "Crea directorios para organizar las charlas por año, y luego por mes" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "Correo electrónico:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "Mostrar una notificación cuando se reciba correo en «otras carpetas»" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" msgstr "" -"Cuando está activo, una ventana de notificacón aparece también cuando se " -"recibe un e-mail en otra carpeta. Esta opción está solo disponible para " -"cuentas de Hotmail." +"Esta opción le indica a KMess que divida el registro de sus conversaciones " +"por año, y luego por mes.\n" +"Usted encontrará algunos directorios para cada año en el que registró sus " +"conversaciones, y cada uno de éstos contendrá directorios con el nombre del " +"mes en que se registraron las charlas; y dentro de ellas estarán agrupadas " +"todas las charlas de dicho mes\n" +"\n" +"Una charla realizada el 09 de Abril de 2009 será guardada en el directorio:\n" +"/2009/04/fecha-y-nombre-del-" +"contacto.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "Año, y luego mes" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "Crea directorios para organizar las charlas por año, por mes y por día" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" msgstr "" +"Esta opción le indica a KMess que divida sus conversaciones por año, luego " +"por mes, y finalmente por día.\n" +"Usted encontrará algunos directorios para cada año de sus conversaciones " +"registradas. Cada uno contendrá un directorio por cada mes donde se " +"registraron conversaciones; y luego, cada uno de éstos tendrá un directorio " +"por cada día registrado.\n" +"\n" +"Una charla realizada el 09 de Abril de 2009 será guardada el directorio:\n" +"/2009/04/09/fecha-y-nombre-del-" +"contacto.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "Año, mes y día" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" msgstr "" -"Controla los segundos hasta que las notificaciones emergentes són ocultadas." +"Guardar todas las conversaciones en el directorio especificado más abajo" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Ocultar globos tras" +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" +"Esta opción le indica a KMess guardar todas sus charlas en los mismos " +"directorios, sin organizarlos." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "segundos" +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "No organizar los archivos" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "Presione aquí para seleccionar un directorio" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" +"El directorio donde todos los registros de sus conversaciones serán guardadas" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "Seleccione la carpeta donde se guardarán los registros de la charla." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "Guardar el registro de charla en este directorio:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "Est&ilo" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"Le permite cambiar el tema que KMess usa para mostrar los mensajes en una " +"charla." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 #, fuzzy -msgid "Other Alerts" -msgstr "Avisos" +msgid "&Chat style:" +msgstr "Estilo de la ventana de &charla:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Preferencias de charla" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 #, fuzzy -msgid "&Show winks from contacts" -msgstr "Mostrar contactos &desconectados" +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Habilita el mostrar emoticonos en las charlas." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "Mostrar emoticono&s" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Mostrar &emoticonos" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Esta opción permite que se agrupen los mensajes que provienen del mismo " +"contacto. Cuando éste escriba varios mensajes seguidos, KMess los agrupará. " +"La apariencia que consiga depende del estilo de la ventana de charla " +"seleccionado." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "A&grupar los mensajes que provienen del mismo contacto" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Activa la aparición de la hora en cada mensaje escrito." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Mostrar la &hora de los mensajes" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" +msgstr "Mostrar los Contactos" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +#, fuzzy +msgid "Show s&econds" +msgstr "Mostrar emoticono&s" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Texto" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Éste es el color y el tipo de letra usados en sus mensajes." + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "El tipo de letra de su &mensaje:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"Permite que las preferencias de fuente y color de sus contactos sean " +"cambiados con el tipo de letra y color indicado más abajo." + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "&Obligar a que los mensajes del contacto usen este tipo de letra:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Alertas de la ventana de Charla" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Activa el uso de efectos de tipos de letra. El escribir *negrita*, /cursiva/ " +"y _subrayado_ hará que esas palabras se vean con el tipo de letra negrita, " +"cursiva o subrayada, respectivamente." + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Usar &efectos de tipos de letras en mensajes, como *negrita*, /cursiva/, " +"_subrayado_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +#, fuzzy +msgid "Enable MSN Plus formatting" +msgstr "Formato de MSN Plus" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -853,1944 +1512,2357 @@ msgid "" "Contacts may send multiple nudges at once, but KMess only shakes the chat " "window with the first nudge.

" msgstr "" -"

Cuando sus contactos desean obtener su atencion pueden mandar un " -"zumbido, por defecto la ventana de conversación se sacude cuando se envia o " -"recibe un zumbido. Deshabilite esta opcion si el efecto de sacudir es " -"demaciado molesto.

\n" -"

Cuando esta opcion esta habilitada, KMess limita el efecto de sacudida, " -"sus contactos podrán mandar varios zumbidos a la ves, pero aun asi KMess " -"limita la sacudida ya que la ventana solo se sacude con el primer zumbido." +"

Cuando sus contactos desean obtener su atención pueden mandar un " +"zumbido. Por defecto, la ventana de charla se sacude cuando se envía o " +"recibe un zumbido. Deshabilite esta opción si el efecto de sacudir es " +"demasiado molesto.

\n" +"

Cuando esta opción esta habilitada, KMess limita el efecto de sacudida." +"Sus contactos podrán enviar varios zumbidos a la vez, pero aun así KMess " +"sacudirá la ventana sólo con el primer zumbido recibido.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" -msgstr "Sacudir la ventana de conversación cuando se recibe o envía un zumbido" +msgstr "Sacudir la ventana de charla cuando se recibe o envía un zumbido" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." -msgstr "" -"Cuando está activo, se mostrará una notificación cuando se reciba un e-mail. " -"El número de mensajes sin leer se muestra arriba de la lista de contactos. " -"Esta opción solo está disponible para cuentas de Hotmail." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "No mostrar una imagen" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "Ag&rupar las conversaciones en la misma ventana:" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Siempre" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "Para contactos del mismo grupo" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Nunca" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Foto del contacto:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." +msgstr "" +"Cuando está activo, se mostrará una notificación cuando se reciba un correo " +"electrónico. El 
número de mensajes sin leer se muestra sobre la lista de contactos. Esta " +"opción solo está disponible para cuentas de Hotmail." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Mostrar la cantidad de correos no leídos" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" -"Si esta activada, KMess le informa a sus contactos lo que usted esta " -"escuchando. Esta información se recolecta de los programas de audio activas " -"en su sistema." +"Si está activada, KMess informa a sus contactos lo que usted está " +"escuchando. Esta información es recolectada desde el reproductor de audio " +"que está actualmente activo." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" +msgstr "Mostrarle a mis contactos que canción estoy escuc&hando" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" -msgstr "Informarle a mis contactos que canción estoy escuchando" +msgid "List Formatting" +msgstr "Formato de MSN Plus" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 #, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Cuano está activado, su estado será cambiado automáticamente a \"Ausente - " -"Inactivo\" cuando no use el ordenador durante unos minutos." +msgid "Enable MSN &Plus formatting" +msgstr "Formato de MSN Plus" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Cambiar el estado a «Ausente-Inactivo» cuando esté inactivo" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"Controla el número de minutos que pasan antes de que KMess cambie su estado " -"a \"Ausente - Inactivo\"." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Pasar a inactivo tras" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minutos" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" -"Cuando está activo, las conversaciones serán guardadas en la carpeta " -"especificada." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "Registrar todas las conversaciones" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" -"Seleccione la carpeta donde se guardarán los registros de la conversación." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Guardar los archivos de las conversaciones en este directorio:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" -"KMess crea automáticamente subdirectorios cuando selecciones organizar la " -"carpeta de conversaciones por año, mes o día." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Año" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Mes" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Día" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Guardar todas las conversaciones en el directorio padre" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" -"Te permite cambiar el tema que KMess usa para mostrar los mensajes en una " -"conversación." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Estilo de la ventana de conversación:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Preferencias" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Habilita los emoticonos en las conversaciones." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Mostrar emot&iconos" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Activa la aparición de la hora en que cada mensaje fue escrito." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Mostrar la &hora en los mensajes" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Esta opción hace que se agrupen los mensajes que provienen del mismo " -"contacto. Cuando éste escriba varios mensajes seguidos, KMess los agrupará. " -"La apariencia que consiga depende del estilo de la ventana de conversación " -"que haya elegido." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "Agrupar los mensajes que provienen del mismo contacto" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Ausente" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Su lista de contactos tiene demasiados grupos" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Genio" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "Este el color y la tipografía usados en sus mensajes." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "La tipografía de su mensaje:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"Permite que las preferencias de fuente y color de sus contactos sean " -"cambiados." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Obligar a que los mensajes del contacto usen esta tipografía:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Activa el uso de efectos de fuente, el escribir *negrita*, /cursiva/ y " -"_subrayado_ hará que esas palabas se vean en una fuente negrita, cursiva o " -"subrayada respectivamente." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"Usar &efectos de fuente en mensajes. (*negrita*, /cursiva/, _subrayado_)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Esperando por lista de contactos..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" msgstr "Temas de &Emoticonos" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" msgstr "Temas de emoticonos disponibles:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" msgstr "Emoticonos Personalizados" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" -msgstr "Emoticones personalizados para esta cuenta:" +msgstr "Emoticonos personalizados para esta cuenta:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "Agregar nue&vo.." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "Presione aquí para agregar un emoticono personalizado" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "Haga click aquí para cambiarle el nombre al emoticono seleccionado." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." +msgstr "Agregar Nue&vo..." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Presione aquí para renombrar el emoticono seleccionado" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" msgstr "Re&nombrar" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "Eli&minar" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" -msgstr "Rosa marchita" +msgstr "Navegador Web" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." -msgstr "" +msgstr "Seleccione esta opción para usar el navegador web utilizado por KDE." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "&Usar el navegador predeterminado de KDE" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" +"Seleccione esta opción para escoger desde una lista de navegadores " +"instalados." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "&Usar un navegador instalado:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" +"Escoja esta opción para escribir la ubicación de su navegador preferido" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "E&specificar un comando personalizado:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" +"Especifica la ruta de un programa para abrir las direcciones web; Un '%u' " +"será reemplazado con la dirección del enlace." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." -msgstr "" +msgstr "Utilice '%u' para ingresar la dirección en la linea de comandos." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" -msgstr "Cliente de correo" +msgstr "Cliente de Correo Electrónico" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" +"Seleccione esta opción para usar el correo web Live Mail cuando se conecte " +"con cuentas compatibles con éste." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "Usar &Live Mail si la cuenta lo soporta" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" +"Seleccione esta opción para usar el cliente de correo electrónico definido " +"por KDE." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "Usar el cliente de correo predeterminado de &KDE" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "Usar un cliente de correo electrónico &instalado:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" +"Utilice '%u' para insertar la dirección de correo electrónico en la linea de " +"comandos." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "Transferencias de archivo" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" -msgstr "Guardar los archivos de las conversaciones en este directorio:" +msgstr "&Guardar los archivos recibidos en una carpeta:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" +msgstr "&Usar los puertos entre" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "y" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "para las transferencias de archivo" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "Su comentario:" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 -#, fuzzy -msgid "and" -msgstr "Triste" +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "Su comentario es sobre:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 -#, fuzzy -msgid "for file transfers" -msgstr "Transferencias de archivo" +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "Algo que le guste" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "Algo que no le guste" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "Un comportamiento erróneo en la aplicación" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "Una nueva característica que desea" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" +"Indique una dirección de Correo electrónico para ser contactado de vuelta" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "Muestra los botones de retroalimentación en las ventanas" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "No estoy frente al equipo" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Su nombre" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "su_identificador@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" -"No puedes aceptar esta invitación porque hay varios contactos en la " -"conversación." +"Se han encontrado algunas contraseñas inseguras.
Desea importar " +"las contraseñas a la cartera '%1', mantener las contraseñas inseguras, o " +"borrarlas de forma permanente?

Nota: no es recomendado usar " +"contraseñas inseguras si la Cartera de KDE se encuentra disponible, debido a " +"que las contraseñas serán leídas fácilmente en los archivos de configuración " +"de KMess." -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Almacenamiento de contraseñas seguro" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importar" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Eliminar" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Mantener" + +#: chat/chat.cpp:119 #, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" +"No puede enviar invitaciones cuando hay varios contactos en una charla." + +#: chat/chat.cpp:142 msgid "%1 has joined the chat." -msgstr "%1 se ha unido a la conversación." +msgstr "%1 se ha unido a la charla." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "La conversacion se ha vuelto inactiva. %1 ha dejado la conversación." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "La charla se ha vuelto inactiva, %1 ha dejado la charla." -#: chat/chat.cpp:215 -#, fuzzy +#: chat/chat.cpp:202 +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." -msgstr "%1 ha dejado la conversación." +msgstr "%1 ha dejado la charla." -#: chat/chat.cpp:364 -#, fuzzy +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr "Conversación con %1 y %2" +msgstr "%1 y %2" -#: chat/chat.cpp:371 -#, fuzzy +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." -msgstr "%1 y etc - Chat" +msgstr "%1 y otros." -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr " (Este mensaje fue enviado automáticamente)" +msgstr "%1 (Este mensaje fue enviado automáticamente)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 #, fuzzy -msgid "You received a wink from %1." -msgstr "Has recibido un guiño de %1" - -#: chat/chat.cpp:971 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -"El guiño no se puede mostrar. Asegúrate de que tienes el paquete " -"'cabextract' instalado." +"KMess no pudo registrar esta conversación.
No existe el " +"directorio de registro de charlas '%1'." -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "El guiño no se ha podido mostrar. No se ha podido leer los datos." - -#: chat/chat.cpp:1080 +#: chat/chat.cpp:941 #, fuzzy -msgid "You have received a wink from %1" -msgstr "Has recibido un guiño de %1" +msgid "You have sent a wink" +msgstr "Ha recibido un guiño de %1" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "hubo un problema de conexión." + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 #, fuzzy -msgid "You received a nudge from %1!" -msgstr "Has recibido un zumbido de %1!" +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" +"%1 le ha enviado un mensaje de voz, pero KMess aún no los soporta." -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1153 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "El mensaje \"%1\" no pudo ser enviado" +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" +"%1 le ha enviado un mensaje de acción, pero KMess aún no los soporta" -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "" +"%1 le ha enviado una característica de MSN que KMess aún no soporta." + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" +"Ha recibido un guiño de %1, pero éstos han sido deshabilitados en las " +"opciones de la cuenta" + +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" +"Recibió un guiño de %1, pero no se pudo mostrar. Asegúrese de que tiene el " +"programa 'cabextract' instalado." + +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Recibió un guiño de %1, pero no se pudo mostrar debido a que falló la " +"extracción con 'cabextract' del paquete que contenía al guiño." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" +"Recibió un guiño de %1, pero no se pudo mostrar debido a que los datos no se " +"pudieron leer." + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "¡%1 le ha enviado un guiño!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 se ha unido a la charla." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 se ha unido a la charla." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "¡%1 le ha enviado un zumbido!" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "todos los contactos" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Ha recibido un zumbido de %1!" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Ha recibido un guiño de %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 se ha unido a la charla." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1le ha mandado un mensaje desconectado:
'%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "" +"El archivo '%1' no pudo ser encontrado en el computador, tampoco pudo " +"ser descargado." + +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" -msgstr "Has enviado un zumbido a %1!" +msgstr "Usted ha enviado un zumbido a %1!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "Has enviado un zumbido!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 está enviando un guiño: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 dice: " -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +#, fuzzy +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "Conversaciones con %1
Iniciadas el: %2" + +#: chat/chatmessageview.cpp:364 +#, fuzzy +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "Conversaciones iniciadas el: %2" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Conversaciones guardadas por KMess con %1" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "Agrega este emoticono: %1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Invitar" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Reconectar" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -"No se pudo guardar el registro de la cionversación.Asegurate de tener " -"permisos de escritura en la carpeta donde quieres guardar el registro." +"No se pudo guardar el registro de charlas en el directorio '%1'.\n" +"Asegúrese de tener permisos de escritura en el directorio indicado para " +"guardar los registros." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +#, fuzzy +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" +"*.html *.htm|Página web (*.html)\n" +"*.txt|Documento de texto plano (*.txt)\n" +"*.xml|Documento XML (*.xml)" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" -msgstr "El archivo %1 ya existe. Deseas sobreescribirlo?" +"Do you want to overwrite it?" +msgstr "" +"El archivo '%1' ya existe.\n" +"Desea sobreescribirlo?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Sobreescribir archivo" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "Sobreescribir" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." msgstr "Agregar este &emoticono" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Agregar este &emoticono" + +#: chat/chatview.cpp:833 msgid "Send &Email" msgstr "&Enviar correo" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "Copiar co&rreo" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "Agregar &Contacto" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +msgid "Copy E&mail Address" +msgstr "C&opiar la Dirección de Correo electrónico" + +#: chat/chatview.cpp:847 msgid "Visit &Link" -msgstr "Visitar &Link" +msgstr "Visitar En&lace" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" -msgstr "Copiar &Direccion" +msgstr "Copi&ar Dirección" -#: chat/chatview.cpp:1312 -msgid "&Copy text" -msgstr "&Copiar texto" +#: chat/chatview.cpp:867 +msgid "&Copy Text" +msgstr "&Copiar Texto" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "Seleccionar &Todo" -#: chat/chatview.cpp:1314 -msgid "Find &Text" -msgstr "" +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "Buscar &Texto..." -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" -msgstr "Guardar conversación a un &archivo" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +msgid "C&lear Chat" +msgstr "&Limpiar la charla" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Conversación" +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Guardar la Charla a un &Archivo..." -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "Enviar un &archivo" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Contactos" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "Comenzar &videoconferencia" - -#: chat/chatwindow.cpp:494 -msgid "Send a &Nudge!" -msgstr "Enviar un &zumbido" - -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "Guardar la conversación" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Emoticonos" - -#: chat/chatwindow.cpp:498 -#, fuzzy -msgid "Close &All Tabs" -msgstr "Cerrar pestaña" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "Preferencias" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "Iniciar o detener una &Conversación" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Cambiar &tipografía" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Cambiar &color de tipografía" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&Conectar" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Cambiar &color de tipografía" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emoticonos" -#: chat/chatwindow.cpp:658 -msgid "My emoticons" -msgstr "Mis emoticonos" +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" +msgstr "Mis Emoticonos" -#: chat/chatwindow.cpp:738 +#: chat/chatwindow.cpp:328 #, fuzzy -msgid "&Settings" -msgstr "Preferencias" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "Mostrar emot&iconos" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "Barra lateral" - -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Barra lateral" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Muestra u oculta la barra lateral" - -#: chat/chatwindow.cpp:851 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" +"Hay múltiples pestañas abiertas en esta ventana de charla. ¿Desea 
cerrar sólo la pestaña actual, o todas las pestañas?

Nota:" +"Usted puede cerrar todas las pestañas de una vez presionando Shift+Esc." -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" msgid "Closing a Chat Tab" +msgstr "Cerrando una pestaña de charla" + +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" +msgstr "Cerrar Todas las Pestañas" + +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" +msgstr "Cerrar la Pestaña Actual" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "&Invitar..." + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." +msgstr "Enviar un &archivo..." + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "Charla con Cámara Web " + +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Co&menzar una videoconferencia" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "E&nviar un zumbido" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "Guardar la charla..." + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "Cerrar tod&as las pestañas" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Cambiar el tipo de letra" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Cambiar &color del tipo de letra" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Mostrar &emoticonos" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Mostrar la &hora de los mensajes" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "&Paneles" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "&Utilizar la corrección ortográfica" + +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Videoconferencia" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Zumbido" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Enviar un archivo" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" msgstr "" -#: chat/chatwindow.cpp:855 +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +msgid "Enable or disable the contacts panel" +msgstr "Mostrar u ocultar el panel de contactos" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contactos" + +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "Mostrar u ocultar el panel de emoticonos estándar" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticonos" + +#: chat/chatwindow.cpp:477 +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Mostrar u Ocultar el panel de Emoticonos Personalizados" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mis Emoticonos" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Tipo de letra" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "&Color del tipo de letra" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "&Limpiar la Ventana de Charla" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Iniciar o detener una &Charla" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" +"Utilizó una sintaxis incorrecta para el comando /status. El formato " +"correcto es : /status online|away|idle|brb|busy|lunch|phone|invisible." +"
O puede usar los comandos rápidos /online, /phone, etc." + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "La sintaxis para /status es incorrecta" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 #, fuzzy -msgid "Close all tabs" -msgstr "Cerrar pestaña" +msgid "You can't block anyone in a group chat." +msgstr "Usted no puede bloquear a nadie en una charla grupal" -#: chat/chatwindow.cpp:856 +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 #, fuzzy -msgid "Close current tab" -msgstr "Cerrar pestaña" +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "No es posible bloquear en este momento!" -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "Barra lateral" +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" +"Comando desconocido%1. Si usted no desea este mensaje sea un " +"comando, agregue al inicio otro /." -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "Muestra u oculta la barra lateral" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Comando Desconocido" -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 está escribiendo." - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 y %2 estan escribiendo." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 y %3 otros estan escribiendo." - -#: chat/chatwindow.cpp:1611 -#, fuzzy +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" -msgstr "Conversación" +msgstr "Charla" -#: chat/chatwindow.cpp:1615 -#, fuzzy +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" -msgstr "Conversación con %1" +msgstr "%1 - Charla" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "&Enviar correo" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" +"¿Está seguro que quiere ocultar la barra de menú? usted podrá verla " +"nuevamente utilizando este atajo de teclado: %1" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Ocultando el menú" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1 está escribiendo..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 y %2 están escribiendo..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 y %3 otros están escribiendo..." + +#: chat/chatwindow.cpp:2296 +#, fuzzy +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" +"

Información de la charla

Contacto:
  • %1
Charla iniciada el :
%2
" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "&Iniciar Charla Privada" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +msgid "&Send Email" +msgstr "&Enviar Correo electrónico" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "&Ver perfil" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" -msgstr "" +msgstr "Ed&itar Notas" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Agregar contacto" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "&Admitir contacto" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "&Eliminar contacto" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Bloquear contacto" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "&Readmitir contacto" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" msgstr "Nombre de usuario (nick)" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "Mensaje &Personal" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" -msgstr "Corr&eo Electrónico:" +msgstr "Corr&eo electrónico:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "&Copiar.." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" +msgstr "&Copiar..." -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Sin admisión" -#: chat/contactframe.cpp:652 -#, fuzzy +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" -msgstr "Este contacto no esta en línea" +msgstr "El contacto está %1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" +"

Aún no ha agregado emoticonos personalizados.

Para " +"agregar nuevos, presione aquí!

" -#: chat/emoticonsidebar.cpp:212 -#, fuzzy +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" -msgstr "Agregar un contacto" +msgstr "Agregar a la Charla" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Insertar un emoticono" +msgid "Add New" +msgstr "Agregar Nue&vo..." -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" -msgstr "" +msgstr "Editar" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 -#, fuzzy +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" -msgstr "Eliminado" +msgstr "Quitar" -#: contact/contactbase.cpp:280 -msgid "Windows Mobile" -msgstr "" - -#: contact/contactbase.cpp:284 +#: chat/winkswidget.cpp:106 #, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

Aún no ha agregado emoticonos personalizados.

Para " +"agregar nuevos, presione aquí!

" + +#: contact/contactbase.cpp:304 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:308 msgid "Web Messenger" -msgstr "Diseño web" - -#: contact/contactbase.cpp:288 -msgid "Office Communicator" -msgstr "" - -#: contact/contactbase.cpp:292 -msgid "Messenger Bot" -msgstr "" - -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 -msgid "MSN Messenger %1 compatible" -msgstr "" +msgstr "Web Messenger" #: contact/contactbase.cpp:312 -#, fuzzy -msgid "Windows Live Messenger %1" -msgstr "Diseño web" +msgid "Office Communicator" +msgstr "Office Communicator" #: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" +msgid "Messenger Bot" +msgstr "Robot de Messenger" -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "Compatible con MSN Messenger %1" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" -msgstr "" +msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Compatible con Windows Live Messenger %1" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Compatible con Windows Live Messenger %1" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Conectado" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Desconectado" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Admitido" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Eliminado" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 %2" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 %2" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Ausente" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Vuelvo enseguida" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Ocupado" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Desconectado" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Ausente" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "Ausente con Respuesta Automática" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "Inactivo" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Vuelvo enseguida" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Al Teléfono" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" -msgstr "Sali a Comer" +msgstr "Salí a Comer" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "No conectado" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Desconectado" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Mi Estado" + +#: contact/msnstatus.cpp:215 #, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Desconectar" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" msgstr "Agregar un contacto" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Eliminar grupo" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" msgstr "Agregar nuevo emoticono" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "Emoticonos" +msgstr "Editar Emoticono" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "El emoticono \"%1\" ya existe, desea reemplazarlo?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "El emoticono \"%1\" ya existe. ¿Desea reemplazarlo?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "Especifique un mensaje de ausencia" +#: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "Mensaje de Ausencia Automático" -#: dialogs/contactaddeduserdialog.cpp:33 -msgid "You have been added by someone" -msgstr "" - -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/chathistorydialog.cpp:48 #, fuzzy -msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " -msgstr "" -"%1\n" -"le ha agregado a su lista de contactos. ¿Qué desea hacer?" +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Estilo de la ventana de &charla:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "No se pudo abrir un puerto local" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Usted ha sido agregado por alguien" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"le ha agregado a su lista de contactos." + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Propiedades de contacto para %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Conectado" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" -msgstr "" +msgstr "Aún no ha sido visto" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "Mostrar la &hora en los mensajes" +msgstr "Aún no hay mensajes" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" -msgstr "" +msgstr "Visto por última vez: %1" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" -msgstr "" +msgstr "Último mensaje: %1" -#: dialogs/contactpropertiesdialog.cpp:383 -#, fuzzy -msgid "Email: %1" -msgstr "Email" +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Dirección de Correo Electrónico: %1" -#: dialogs/contactpropertiesdialog.cpp:384 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" msgid "Client: %1" -msgstr "Cliente de correo" +msgstr "Cliente: %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Presione este botón para restaurar la imagen de este contacto." + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Contactos" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Contactos a invitar" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "Exportar la lista de contactos para %1" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Nada que exportar" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "El archivo existe" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "El archivo %1 ya existe, ¿Desea sobreescribirlo?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "Exportación finalizada" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "Se ha completado la exportación de la lista de contactos" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "Guard&ar Pestaña" #: dialogs/networkwindow.cpp:79 -#, fuzzy -msgid "S&ave tab" -msgstr "Guardar pestaña" +msgid "C&lear Tab" +msgstr "&Limpiar pestaña" #: dialogs/networkwindow.cpp:80 -#, fuzzy -msgid "C&lear tab" -msgstr "Limpiar pestaña" +msgid "C&lose All Tabs" +msgstr "Cerrar Todas &las Pestañas" -#: dialogs/networkwindow.cpp:1054 -#, fuzzy +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." -msgstr "No hay conexiónes activas. No se puede abrir la Ventana de Red" +msgstr "" +"No hay conexiones activas.\n" +"No se puede abrir la Ventana de Red" -#: dialogs/networkwindow.cpp:1100 -#, fuzzy +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -"No se pudo guardar el registro de la Ventana de Red. Asegurate que tienes " -"permiso para escribir en la carpeta dond el registro esta siendo guardado." +"No se pudo guardar el registro de la Ventana de Red. Asegúrese que tiene " +"permiso para escribir en el directorio donde el registro está siendo " +"guardado." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." -msgstr "No se puede cerrar la pentaña principal de conexión." +msgstr "No se puede cerrar la pestaña principal de conexión." -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" +"Enviar comandos al servidor es una operación riesgosa.
Si no sabe " +"exactamente como hacerlo, usted puede tener suerte y sólo ser desconectado, " +"o pueden haber consecuencias mas serias.
Usted ha sido " +"advertido!
¿Desea continuar enviando el mensaje?" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" +"La carga útil que está intentando enviar no finaliza con la nueva línea " +"requerida('\\r\\n')!
¿Desea que KMess la agregue por usted?" -#: dialogs/networkwindow.cpp:1321 -#, fuzzy +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" -msgstr "No se puede cerrar la pentaña principal de conexión." +msgstr "¡No se puede enviar comandos a este tipo de conexión!" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" -msgstr "" +msgstr "Cancelado" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "¡Falló!" -#: dialogs/transferentry.cpp:217 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Computadora" +msgstr "Completado" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." -msgstr "" +msgstr "recibidos %1 de %2." -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." -msgstr "" +msgstr "enviados %1 de %2." -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "infinito" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Usar" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Eliminar" + +#: dialogs/userpicturesdialog.cpp:46 #, fuzzy -msgid "Cl&ean Up" -msgstr "Lim&piar" +msgid "Choose or Remove Your Display Picture" +msgstr "Seleccione o Quite su Avatar" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Borrar la imágen" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete the picture?" +msgstr "¿Está seguro de que quiere eliminar la imágen?" -#: emoticontheme.cpp:601 +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -"No se pudo guardar el tema de emoticonos. Asegurate de tener permiso para " -"escribir a la carpeta de temas \"%1\"" +"No se pudo guardar el tema de emoticonos. Asegúrese de tener permisos de " +"escritura en carpeta de temas '%1'." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Sonrisa" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "Guiño" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Lengua" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "Gran sonrisa" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Triste" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "Llorando" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "Molesto" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Confundido" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "Avergonzado" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "Desilusionado" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "Caliente" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "Muestra dientes" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "Genio" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "Enfermo" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Sorprendido" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Fiesta" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "Dormilón" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "Pensando" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Sin comentarios" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "Secreto" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "Cansado" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" -msgstr "Sarcastico" +msgstr "Sarcástico" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" -msgstr "No se" +msgstr "No sé" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Vuelvo enseguida" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Ángel" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Abrazo" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Niño" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Corazón" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Rosa" -#: emoticontheme.cpp:838 -msgid "Thumby up" -msgstr "Ok" +#: emoticontheme.cpp:851 +msgid "Thumbs up" +msgstr "Bien" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Perro" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Sol" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Demonio" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Abrazo" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Niña" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Corazón roto" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "Rosa marchita" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Mal" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Gato" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "Durmiendo" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Labios" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Aplaude" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "Cruza dedos" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Auto" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Avión" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Tortuga" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "Gusano" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Oveja negra" +#: emoticontheme.cpp:869 +msgid "Sheep" +msgstr "Oveja" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Cabra" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" -msgstr "Murcielago" +msgstr "Murciélago" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Cerveza" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" -msgstr "Martini" +msgstr "Copa de Martini" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "Café" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Pastel de cumpleaños" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Plato" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Tazón" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Estrella" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" -msgstr "Arcoiris" +msgstr "Arco iris" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Tormenta" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Rayos" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Paraguas" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" -msgstr "Isla y palmera" +msgstr "Isla con una palmera" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" -msgstr "Telefono" +msgstr "Teléfono" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Celular" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" -msgstr "Email" +msgstr "Correo Electrónico" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Reloj" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" -msgstr "Camara" +msgstr "Cámara" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" -msgstr "Pelicula" +msgstr "Película" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Nota" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Esposas" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Dinero" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "Foco" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" msgstr "Cigarrillo" -#: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "Pelota" +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "Pelota de Fútbol" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Regalo con moño" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Computadora" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "Icono KMess" -#: initialview.cpp:226 -#, fuzzy +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "No se puede reconectar: Cuenta no encontrada." + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "No se puede reconectar: esta cuenta no tiene contraseñas guardadas." + +#: initialview.cpp:280 initialview.cpp:379 +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" +"Esperando una conexión de Internet para reconectar...
¡Reconectar ahora!" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" msgid "Internet connection not available." -msgstr "El servidor no está disponible" +msgstr "No está disponible la conexión a Internet ." -#: initialview.cpp:377 -msgid "Connect" -msgstr "Conectar" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +"Esperando %1 segundo antes de la reconexión...
¡Reconectar " +"ahora!" +msgstr[1] "" +"Esperando %1 segundos antes de la reconexión...
¡Reconectar ahora!" -#: initialview.cpp:382 -#, fuzzy -msgid "Disconnect" -msgstr "&Desconectar" +#: initialview.cpp:581 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Conectar" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "" +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" +msgstr "&Cancelar" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "" +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "Por favor, complete con su usuario y contraseña." -#: kmess.cpp:223 -#, fuzzy +#: initialview.cpp:657 +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Por favor, ingrese una dirección de correo electrónico válida." + +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "Información de Contacto" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "El contacto %1 ya está en su lista de contactos." + +#: kmess.cpp:250 msgid "New Group" -msgstr "Nuevo &Grupo" +msgstr "Nuevo Grupo" -#: kmess.cpp:226 -msgid "Add a group" -msgstr "Agregar grupo" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Agregar un Grupo" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" -msgstr "Introduzca el nombre nuevo para este grupo:" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" +msgstr "Introduzca el nombre para el nuevo grupo:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" -msgstr "¿Seguro que quiere eliminar el contacto %1?" +msgstr "¿Está seguro que quiere eliminar el contacto %1?" -#: kmess.cpp:571 -msgid "Remove contact" -msgstr "Eliminar contacto" +#: kmess.cpp:579 +msgid "Remove Contact" +msgstr "Eliminar el Contacto" -#: kmess.cpp:573 -msgid "Remove and block" -msgstr "Eliminar y no admitir" +#: kmess.cpp:581 +msgid "Remove and Block" +msgstr "Eliminar y No Admitir" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" +"El grupo \"%1\" no está vacío: ¡Elimine todos los contactos de éste, " +"e intente nuevamente!" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" -msgstr "" +msgid "Group Removal" +msgstr "Eliminar el Grupo" -#: kmess.cpp:628 -#, fuzzy +#: kmess.cpp:634 msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" -msgstr "¿Seguro que quiere eliminar el grupo %1?" +msgstr "" +"¿Está Seguro que quiere eliminar el grupo %1de su lista de " +"contactos?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" -msgstr "Eliminado" +msgstr "Eliminar" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." -msgstr "Éste es un grupo especial que no puede ser cambiado." +msgstr "Éste es un grupo especial, y no puede ser cambiado." -#: kmess.cpp:671 -msgid "Rename group" -msgstr "Renombrar grupo" +#: kmess.cpp:677 +msgid "Rename Group" +msgstr "Renombrar el Grupo" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Introduzca el nombre nuevo para este grupo:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" +"

No se puede autenticar automáticamente con esta cuenta \"%1\":
Primero debe guardar la contraseña de la cuenta!

" -#: kmess.cpp:746 -#, fuzzy +#: kmess.cpp:757 msgctxt "dialog title" -msgid "Autologin failed" -msgstr "Fallo en la autentificación de usuario" +msgid "Autologin Failed" +msgstr "Falló la Autentificación Automática" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Conectando..." + +#: kmess.cpp:1123 +msgctxt "Status bar message" msgid "Disconnected" msgstr "Desconectado" -#: kmess.cpp:1408 -#, fuzzy +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "

KMess lo buscó en los siguientes directorios:
%1

" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" -"

KMess no podrá reproducir sonidos ni notificaciones.

El archivo " -"de KMess 'eventsrc' no pudo ser encontrado en una de las siguientes " -"carpetas: %1

Por favor verifica tu instalación y copia el archivo " -"faltante a una de las carpetas listadas.

" +"

KMess no podrá reproducir sonidos ni notificaciones.

El " +"archivo requerido de KMess 'kmess.notifyrc' no pudo ser encontrado en " +"ninguno de los directorios de la aplicación

%1

Por favor verifique su " +"instalación

" -#: kmess.cpp:1412 -msgid "Error with notifications" -msgstr "Error con las notificaciones" +#: kmess.cpp:1481 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Error con las Notificaciones" -#: kmess.cpp:1589 -#, fuzzy -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Acciones" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Nuevo &Contacto" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Nuevo &Grupo" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "&Buscar contacto" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Buscar por &interés" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "&Buscar contacto" +msgstr "KMess - %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Nueva &Cuenta" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "O&pciones de la cuenta" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "Co&nectar" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&Desconectar" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "Mostrar mi &perfil" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Mi Estado" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Ausente con respuesta automática" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "Mostrar contactos &admitidos" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Mostrar contactos &desconectados" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "Mostrar contactos &eliminados" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 #, fuzzy +msgid "Show &History Box" +msgstr "Estilo de la ventana de &charla:" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "Mostrar la barra de bú&squeda" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" -msgstr "Mostrar emot&iconos" +msgstr "Mostrar Grupos &Vacios" -#: kmessinterface.cpp:321 -#, fuzzy -msgid "Display Pictures Size" -msgstr "Mostrar foto" +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "&Tamaño de las imágenes" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -#, fuzzy -msgid "Small" -msgstr "Sonrisa" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" msgstr "&Ordenar contactos por" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Mostrar ventana de &transferencias" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "Nuevo &Contacto..." + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "Nuevo &Grupo..." + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "&Exportar la lista de contactos..." + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "Buscar c&ontacto" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Buscar por &interés" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Estilo de la ventana de &charla:" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "Nueva &Cuenta..." + +#: kmessinterface.cpp:189 +msgid "Configure Account..." +msgstr "Configurar la Cuenta..." + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "Configurar &Kmess..." + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "Mostrar el &menú de selección" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "No Mostrar" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "Pequeño" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "Medio" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "Grande" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "Grupo" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Conectados/Desconectados" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "Mezclado" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "Mostrar ventana de &transferencias" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "Mostrar ventana de red" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "Escuchando %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "[%1] Autenticado con %2" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr "" +msgstr "[%1] %2 se conectó" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr "" +msgstr "[%1] %2 se desconectó" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" -msgstr "Conversación" +msgstr "&Charla" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Propiedades" -#: kmessview.cpp:569 -msgid "&Remove from group" -msgstr "Eliminar del grupo" +#: kmessview.cpp:600 +msgid "&Remove From Group" +msgstr "Eliminar del G&rupo" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "Escuchando %1" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "&Copiar al grupo" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "&Mover al grupo" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "&Mover al grupo" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "&Mover al grupo" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "Eli&minar grupo" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Re&nombrar grupo" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "Email" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "&Agregar a esta persona a su lista de contactos" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" -msgstr "" - -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" - -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" - -#: kmessview.cpp:1085 +#: kmessview.cpp:1133 #, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Correo electrónico:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Cliente: %1" + +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "" + +#: kmessview.cpp:1156 +#, fuzzy +msgid "No" +msgstr "Nota" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Sin admisión" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Visto por última vez: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Último mensaje: %1" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" -msgstr "
%1 (%2)" +msgstr "Grupo %1" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "Contactos" - -#: kmessview.cpp:1095 -#, fuzzy +#: kmessview.cpp:1212 msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Este contacto no esta en línea" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 contacto, %2 en línea" +msgstr[1] "%1 contactos, %2 en línea" -#: kmessview.cpp:1504 -#, fuzzy +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 Contacto" +msgstr[1] "%1 Contactos" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" -msgstr "Escriba su mensaje personal aquí" +msgstr "<Escriba su mensaje personal aquí>" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +#, fuzzy +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" +"Ingrese aquí un mensaje para mostrar a sus contactos: Ellos lo verán junto a " +"su nombre" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1 mensaje de correo electrónico" +msgstr[1] "%1 mensajes de correo electrónico" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" -msgstr "" +msgstr "Un cliente de mensajería MSN para KDE" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:60 msgid "Developer and project founder" -msgstr "" +msgstr "Desarrollador y fundador del proyecto" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:61 msgid "Developer" -msgstr "" +msgstr "Desarrollador" -#: main.cpp:72 -#, fuzzy +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 msgid "Project support" -msgstr "Soporte para el campo \"P4-Context\"" +msgstr "Soporte para el proyecto" -#: main.cpp:73 main.cpp:74 main.cpp:75 -#, fuzzy +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" -msgstr "Desarrollador de GnomeMeeting" +msgstr "Desarrollador actual" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastasi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." @@ -2798,258 +3870,606 @@ msgstr "" "Traducción al alemán, pruebas, documentación webmaster, gestión del " "proyecto, etc..." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:70 msgid "Web design" msgstr "Diseño web" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "" -"El juego de emoticonos amarillo/azul/violeta y la traducción al italiano" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "El juego de emoticonos amarillo/azul/violeta, Traducción al italiano" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Emoticonos de cómic" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Tema de sonido por defecto" -#: main.cpp:83 -msgid "KMess icon in Oxygen style" -msgstr "" +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "Michael Anderton" -#: main.cpp:87 +#: main.cpp:74 +msgid "KMess icon in Oxygen style" +msgstr "Icono de KMess en el estilo de Oxígeno" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "Mantenedor de las traducciones" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Traducción al árabe, internacionalización de parche para guardar archivos." -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "Mas traducciones al Arabe" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Traducción al portugués brasileño" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "Más traducciones al portugués brasileño" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Traducción al catalán" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" "Traducción al chino simplificado, arreglo de un bug en elenvio de archivos, " "codigo de conexiónes proxy" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "Más traducciones al chino simplificado" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "Traducción al chino tradicional" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "Traduccion al chino" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "Más traducciones al Chino tradicional" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:92 msgid "Danish translation" -msgstr "Traducción al danes" +msgstr "Traducción al danés" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:93 msgid "More Danish translation" -msgstr "Más traducciones al danes" +msgstr "Más traducciones al danés" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:94 msgid "Dutch translation" msgstr "Traducción al danés" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "Más traducciones al danés" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:97 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "Más traducciones al Alemán, Traducción griega" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Más traducción al francés" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:103 msgid "Estonian translation" msgstr "Traducción al estonio" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:104 msgid "Finnish translation" msgstr "Traducción al finlandés" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "Más traducciónes al finlandés" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:108 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:108 msgid "French translation" msgstr "Traducción al francés" -#: main.cpp:108 -msgid "More French translation, MSN6 emoticon definitions" -msgstr "Mas traducciones al francés, emoticonos MSN6" +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" #: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "Mas traducciones al francés,definiciones de los emoticonos MSN6" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" msgstr "Más traducción al francés" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "Traducción al hungaro" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "Traducción al húngaro" + +#: main.cpp:115 main.cpp:116 msgid "More Italian translation" msgstr "Más traducciones al italiano" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:117 msgid "Korean translation" msgstr "Traducción al coreano" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:118 msgid "Norsk Bokmål translation" msgstr "Traducción al Norsk Bokmål" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Traducción al esloveno" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "Traducción al esloveno" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "Matjaž kaše" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "Traducción al esloveno" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Traducción al español" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 msgid "More Spanish translation" msgstr "Más traducciones al español" -#: main.cpp:123 -msgid "Swedish translation" -msgstr "Traducción al sueco" - -#: main.cpp:125 -msgid "Thai translation" -msgstr "Traducción al tailandés" - #: main.cpp:126 -msgid "Turkish translation" -msgstr "Traducción al turco" +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "Traducción al turco" +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "Traducción al sueco" + +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Transferencias de archivo" +msgid "More Swedish translation" +msgstr "Traducción al sueco" -#: main.cpp:134 +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:135 +msgid "Thai translation" +msgstr "Traducción al tailandés" + +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Traducción al turco" + +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "Traducción al turco" + +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:141 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" +msgstr "Soporte MSNP12, parches varios" + +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" +"Imágenes en el código de la lista de contactos, información del cliente del " +"contacto, acercamiento del tipo de letra" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:143 +msgid "File transfer thumbnails" +msgstr "Miniaturas de transferencias de archivo" + +#: main.cpp:144 msgid "P4-Context field support" msgstr "Soporte para el campo \"P4-Context\"" -#: main.cpp:135 +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:145 msgid "Xinerama fixes" msgstr "Correcciones de Xinerama" -#: main.cpp:136 +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:146 msgid "Original file receive code" msgstr "Código original de recepción de archivos" -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" -msgstr "" +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" -#: main.cpp:138 -#, fuzzy +#: main.cpp:147 msgid "KWallet support" -msgstr "Soporte para el campo \"P4-Context\"" +msgstr "Soporte para la cartera de KDE" -#: main.cpp:139 +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:148 msgid "" -"Notifications blocking option,winks disabling option,last message date " +"Notifications blocking option, winks disabling option, last message date " "feature" msgstr "" +"Opciones de bloqueo de notificaciones, opción para deshabilitar guiños, 
característica de última fecha del mensaje" -#: main.cpp:142 +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "Comandos como IRC en la ventana de charla" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 #, fuzzy -msgid "Various internationalization fixes" -msgstr "Varias correcciones a la internacionalización." +msgid "Chat history dialog" +msgstr "Estilo de la ventana de &charla:" -#: main.cpp:143 +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "Varias correcciones a la internacionalización" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Varias correcciones a la internacionalización." -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "Desarrollador de GnomeMeeting" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Tipo con una bolsa en la cabeza" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspiración y certeza del código" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:162 msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "" "Código de notificación emergente, código p2p inicial, manejo del \"msn " "challenge\"" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Código del temporizador" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" -msgstr "" +msgstr "Código de cerrar a la bandeja" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:165 msgid "Custom crash handler implementation" -msgstr "" +msgstr "Implementación del manejador de fallos personalizada" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" -msgstr "Su nombre aqui" +msgstr "Su nombre aquí?" -#: main.cpp:156 -#, fuzzy +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -"Los parches y correcciones de errores son bienvenidos en los foros de ayuda " -"de KMess! Si crees que falta tu nombre aqui, por favor contactanos." +"Sus parches y correcciones de errores son bienvenidos en los foros de ayuda " +"de KMess!\n" +"Si siente que falta su nombre aquí, por favor contactenos." -#: main.cpp:159 -#, fuzzy +#: main.cpp:171 msgctxt "NAME OF TRANSLATORS" msgid "Your names" -msgstr "Su nombre" +msgstr "Juan Pablo González Tognarelli" -#: main.cpp:160 -#, fuzzy +#: main.cpp:172 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" -msgstr "Su dirección de correo:" +msgstr "lord_jotape@yahoo.com.ar" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Iniciar sesion automáticamente con la dirección dada" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +"Ejecuta una prueba de depuración (sólo para compilación de desarrolladores)" + +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "Personas" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Admitido" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Eliminado" #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "Su contacto ha cancelado la sesión." @@ -3066,64 +4486,104 @@ msgid "You have rejected the invitation." msgstr "Ha rechazado la invitación" #: network/applications/application.cpp:540 -#, fuzzy -msgid "Do you want to accept or cancel?" -msgstr "Desea ACEPTAR o CANCELAR el envio?" +msgid "Do you want to accept or cancel?" +msgstr "Desea aceptar o cancelar?" #: network/applications/application.cpp:581 -#, fuzzy -msgid "Click to cancel." -msgstr "Clic para cancelar" +msgid "Click to cancel." +msgstr "Presione para cancelar" -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "¿Quiere aceptar el archivo: %1 (%2)?" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "El contacto desea enviarle un archivo: "%1" (%2)." -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "La transferencia de %1 falló. No se pudo abrir el archivo" +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"El archivo "%1" ya existe.\n" +"Desea sobreescribirlo?" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "" +"La transferencia de "%1" falló. No se pudo guardar el archivo." + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "La transferencia de %1 falló. No se pudo abrir el archivo destino" + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Transferencia aceptada." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "Conectando a %1, puerto %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "La transferencia fue cancelada" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Su contacto ha cancelado la transferencia del archivo "%1"." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "Usted ha cancelado la transferencia del archivo "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "Ha rechazado la transferencia del archivo "%1"." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Conexión establecida" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" -msgstr "Archivo transferido con éxito: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "El archivo "%1" fue transferido exitosamente." -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "La transferencia de %1 falló. El archivo no existe." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "Recibo el archivo "%1" con éxito." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "La transferencia de %1 falló. El archivo no pudo ser leído." +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." +msgstr "La transferencia de "%1" falló. El archivo no existe. " -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "Enviando archivo %1" - -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 -msgid "Negotiating options to connect" +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "" +"La transferencia de "%1". falló. El archivo no puedo ser leído." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Enviando archivo "%1" (%2)" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Su contacto ha aceptado la transferencia del archivo "%1"" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 +msgid "Negotiating options to connect" +msgstr "Negociando las opciones para conectar" #: network/applications/filetransferp2p.cpp:129 #: network/applications/filetransferp2p.cpp:143 @@ -3133,73 +4593,18 @@ msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "" "La transferencia de archivo fue cancelada. Fue recibida información corrupta." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "El archivo %1 ya existe. Deseas sobreescribirlo?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "La transferencia de %1 falló. No se pudo abrir el archivo" - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." -msgstr "" +msgstr "Usted ha aceptado la transferencia del archivo "%1"." -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Su contacto ha cancelado la transferencia." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Ha cancelado la sesión." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" -msgstr "" - -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Archivo transferido con éxito: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Archivo transferido con éxito: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "La transferencia de %1 falló. El archivo no existe. " - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "La transferencia de %1 falló. El archivo no puede ser leído." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Enviando archivo %1 (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Su contacto ha cancelado la transferencia." +msgstr "El archivo no pudo ser escrito" #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "Has sido invitado para comenzar videoconferencia (via GnomeMeeting)." +msgstr "" +"Has sido invitado para comenzar una videoconferencia (via GnomeMeeting)." #: network/applications/gnomemeeting.cpp:118 msgid "Starting GnomeMeeting. Connecting to %1." @@ -3209,32 +4614,32 @@ msgstr "Abriendo GnomeMeeting. Conectando a %1." msgid "Inviting the contact to a meeting." msgstr "Proponiendo al contacto el inicio de videoconferencia." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "La invitación fue rechazada. No es soportada por el otro cliente." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "La invitación fue cancelada. Ocurrió un error interno." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "" -"La invitación fue cancelada. Se acabo el tiempo esperando que el usuario " +"La invitación fue cancelada. Se acabó el tiempo esperando que el usuario " "acepte." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "" -"La invitación fue cancelada. Se acabo el tiempo esperando por la información " +"La invitación fue cancelada. Se acabó el tiempo esperando por la información " "de archivo." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." -msgstr "La invitación fue cancelada. El sistema cerro la comunicación." +msgstr "La invitación fue cancelada. El sistema cerró la comunicación." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "La invitación fue cancelada." @@ -3246,107 +4651,107 @@ msgstr "Has sido invitado a compartir el escritorio de esta persona." msgid "Starting KRDC. Connecting to %1." msgstr "Abriendo KRDC. Conectando a %1." -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Su contacto rechazo la invitación. Ocurrió un error interno." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "El contacto inició una acción MSN que KMess aún no puede manejar." -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "La transferencia falló" - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "" -"La invitación fue cancelada. El contacto envio información equivocada, o " +"La invitación fue cancelada. El contacto envió información equivocada, o " "KMess no ofrece soporte." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"La transferencia ha fallado. El contacto ha enviado datos defectuosos, o " -"KMess no lo soporta." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "" -"La transferencia falló. Fuera de tiempo esperando que el usuario acepte." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "La transferencia falló. Ocurrió un error interno." - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "La transferencia falló. No se pudo abrir la fuente de datos." - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "El contacto inicio una acción MSN que KMess aun no puede manejar." - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "La transferencia falló. La preparación falló." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." msgstr "La invitación fue cancelada. El mensaje no era dirigido a usted." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" "La transferencia ha fallado. El contacto ha enviado datos defectuosos, o " "KMess no lo soporta." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Su contacto rechazo la invitación. Ocurrió un error interno." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "Esperando conexión en %1, puerto %2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "Enviando por método indirecto (la transferencia será más lenta)." +msgstr "Enviando por método indirecto (ésto puede ser más lento)." -#: network/applications/p2papplication.cpp:3113 -#, fuzzy +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" -msgstr "Esperando por lista de contactos..." +msgstr "Esperando por la conexión" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "" -"La invitación fue cancelada. Se acabo el tiempo esperando que el contacto " -"aceptara." +"La invitación fue cancelada. Se acabó el tiempo esperando que el contacto " +"aceptará." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "" "La invitación fue cancelada. El límite de tiempo de conexión se ha excedido." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" -"La invitación fue cancelada. Se acabo el tiempo esperando la información." +"La invitación fue cancelada. Se acabó el tiempo esperando la información." + +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "La transferencia falló" + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"La transferencia ha fallado. El contacto ha enviado datos defectuosos, o " +"KMess no lo soporta." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" +"La transferencia falló. Se ha agotado el tiempo de espera para que el " +"usuario acepte." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "La transferencia falló. Ocurrió un error interno." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "La transferencia falló. No se pudo abrir la fuente de datos." #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." @@ -3357,7 +4762,7 @@ msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "" -"Has sido invitado a una conversación vocal pero el soporte para esto no fue " +"Has sido invitado a una conversación vocal pero el soporte para ésto no fue " "instalado." #: network/applications/voiceconversation.cpp:168 @@ -3381,839 +4786,1940 @@ msgstr "Inicia conversación vocal. Escuchando en %1." msgid "Inviting the contact to a voice conversation." msgstr "Proponiendo al contacto el inicio de conversación vocal." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" "Su contacto le está proponiendo iniciar %1, pero esta opción no está " -"implementada aun." +"implementada aún." -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." msgstr "" +"La invitación de cámara web fue cancelada. Fue recibida información " +"corrupta." -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "La transferencia de %1 fue cancelada" +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Usted ya solicitó mostrar su cámara web." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "Ha sido invitado a compartir la cámara web de esta persona." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "cámara web" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" -msgstr "" +msgstr "Falló" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "" -"La transferencia de %1 falló. No se ha encontrado ningún puerto local " -"abierto." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Enviando archivo %1" -#: network/extra/msnftpconnection.cpp:408 -#, fuzzy +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "La transferencia de %1 falló. No se pudo abrir un puerto local" + +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." -msgstr "" -"La transferencia de %1 falló. No se ha encontrado ningún puerto local " -"abierto." +msgstr "No se pudo abrir un puerto local" -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Iniciando transferencia de archivo" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "La transferencia de %1 falló. La conexión no se pudo realizar" +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "La transferencia de %1 falló. No se pudo establecer una conexión." -#: network/extra/msnftpconnection.cpp:479 -#, fuzzy +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." -msgstr "No se ha podido establecer la conexion: %1" +msgstr "No se ha podido establecer la conexión." -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "Recibiendo archivo %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "KMess no ha podido acceder al servicio web.

Detalles: %1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Ha sido desconectado porque se conectó \n" -"desde otro cliente de MSN Messenger \n" -"o desde otra ubicación" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Sincronización establecida..." - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Autentificando..." - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "Esperando por lista de contactos..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "Falló la autentificación, por favor verifique su nombre y contraseña." - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Conectando..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess recibió un mensaje de error desconocido del servidor: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" -msgstr "" +msgstr "La sintaxis del comando no es válida" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" -msgstr "" +msgstr "El Parámetro del comando no es válido" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "El correo que ha tratado de agregar no es una cuenta de MSN Messenger" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" -msgstr "" +msgstr "Falta el nombre de dominio" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" -msgstr "" +msgstr "Ya se encuentra autenticado" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" -msgstr "El nombre de cuenta proveído es inválido." +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" +msgstr "El nombre de cuenta provisto no es válido" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -"El nombre de cuenta es inválido, o su contraseña no fue confirmada aún." +"El nombre de cuenta es inválido, o su cuenta Passport aún no ha sido " +"confirmada" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "Su lista de contactos está completa" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" -msgstr "" +msgstr "Parámetro SBP no válido" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" -msgstr "Este contacto ya este en su lista." +msgstr "Este contacto ya está en su lista" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" -msgstr "Este contacto aún no este en su lista." +msgstr "Este contacto no está en su lista" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" -msgstr "Este contacto no esta en línea" +msgstr "Este contacto no está en línea" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" +msgstr "Ya se está en este modo" + +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." msgstr "" +"Este contacto no puede ser agregado simultáneamente a la lista de permitidos " +"y bloqueados." -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Este contacto aún no este en su lista." - -#: network/msnnotificationconnection.cpp:2247 -#, fuzzy +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -"Este nombre de grupo ya esta en uso por su lista de contactos Messenger o " -"Hotmail" +"El nombre de grupo ya fue agregado a su lista de contactos de Messenger o " +"Hotmail. Por favor utilice un nombre diferente" -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" -msgstr "Su lista de contactos tiene demasiados grupos" +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "" +"Su lista de contactos tiene demasiados grupos: Usted tiene permitido tener a " +"lo más 30." -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" -msgstr "Éste es un grupo que no puede ser cambiado." +msgstr "Este grupo no puede ser cambiado." -#: network/msnnotificationconnection.cpp:2260 -#, fuzzy +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" -msgstr "Su lista de contactos tiene demasiados grupos" +msgstr "El contacto no está agregado a este grupo" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "Este grupo no esta vacío" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "El nombre del grupo es demasiado largo" - -#: network/msnnotificationconnection.cpp:2273 -msgid "Attempted to change group \"0\"" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." msgstr "" +"El nombre del grupo es demasiado largo; Éste no puede superar los 61 bytes." -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 +msgid "Attempted to change group \"0\"" +msgstr "Se intentó cambiar el grupo \"0\"" + +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "Error interno del servidor en KMess: %1" -#: network/msnnotificationconnection.cpp:2277 -#, fuzzy +#: network/msnconnection.cpp:470 msgid "Invalid Group" -msgstr "Re&nombrar grupo" +msgstr "Grupo no válido" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" -msgstr "" +msgstr "Dominio vacío" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "Formato del comando ADL erróneo" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "Fallo del servicio" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "Transferencia al servidor de intercambio fallida" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Error de conexión directa (MSNSLP), la conexión ha fallado." -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" -msgstr "" +msgstr "Falta un campo requerido" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" -msgstr "" +msgstr "No autenticado" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Emoticones personalizados para esta cuenta:" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "A esta cuenta se le denegó el acceso al servicio MSN." -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" -msgstr "" +msgstr "El comando está deshabilitado" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "Su cuenta tiene el acceso prohibido." -#: network/msnnotificationconnection.cpp:2314 -#, fuzzy +#: network/msnconnection.cpp:512 msgid "Challenge response failed" -msgstr "La transferencia falló" +msgstr "La respuesta falló" -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" -msgstr "" +msgstr "Datos de comandos erróneos" -#: network/msnnotificationconnection.cpp:2323 -#, fuzzy +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" -msgstr "Esta abriendo sesiones demasiado rápido" +msgstr "Está abriendo sesiones de charla demasiado rápido" -#: network/msnnotificationconnection.cpp:2327 -#, fuzzy +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" -msgstr "Tiene demasiadas sesiones abiertas" +msgstr "Tiene demasiadas sesiones de charla abiertas" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" -msgstr "" +msgstr "Secuencia de comandos no esperada" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "Apodo no válido" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" -msgstr "" +msgstr "Datos CVR erróneos" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "El servidor está reportando que KMess está enviando demasiados datos." +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" +msgstr "El servidor reporta que KMess está enviando demasiados datos" -#: network/msnnotificationconnection.cpp:2357 -#, fuzzy +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" -msgstr "Fallo en la autentificación de usuario" +msgstr "La verificación de la autenticación fue incorrecta" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." -msgstr "No puedes comenzar una conversación mientras permanezcas desconectado." +msgstr "No puede comenzar una conversación mientras permanezca desconectado." -#: network/msnnotificationconnection.cpp:2364 -#, fuzzy +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" -msgstr "No se aceptan nuevos principales" +msgstr "No se están aceptando nuevos contactos" -#: network/msnnotificationconnection.cpp:2368 -#, fuzzy +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." -msgstr "Tiene un servicio infantil, requiere aprobación paterna" - -#: network/msnnotificationconnection.cpp:2371 -#, fuzzy -msgid "Your passport account needs to be verified first." -msgstr "Su contraseña debe ser verificada primero" - -#: network/msnnotificationconnection.cpp:2375 -msgid "Bad USR ticket" +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" +"Tiene una cuenta de un servicio infantil, usted requiere aprobación paterna " +"para charlar." -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." +msgstr "Su cuenta Passport primero necesita ser verificada." + +#: network/msnconnection.cpp:573 +msgid "Bad USR ticket" +msgstr "Verificación USR errónea" + +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "Error accesando a su lista de contactos, intente en otro momento" -#: network/msnnotificationconnection.cpp:2399 -#, fuzzy +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." -msgstr "Error interno del servidor" +msgstr "" +"El servicio de MSN está temporalmente no disponible, hubo un error interno " +"del servidor." -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" +"El servicio MSN no está disponible temporalmente, el servidor está muy " +"ocupado" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Servidor de notificación de usuario caído" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "El servidor está a punto de cerrarse" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "El servidor está a punto de caer" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "Bloqueo de escritura" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "La sesión esta sobrecargada" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "El servidor no está disponible" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" -msgstr "Fallo en la autentificación de usuario" +msgstr "Fallo en la autenticación de usuario" -#: network/msnnotificationconnection.cpp:2449 -#, fuzzy -msgid "Unknown error code received from the server: %1" -msgstr "KMess recibió un mensaje de error desconocido del servidor: %1" - -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 -#, fuzzy -msgctxt "Error dialog box title" -msgid "MSN error" -msgstr "KMess - Error de MSN" - -#: network/msnnotificationconnection.cpp:2596 -#, fuzzy -msgctxt "Time left before server maintenance" -msgid "1 minute" -msgid_plural "%1 minutes" -msgstr[0] "minutos" -msgstr[1] "minutos" - -#: network/msnnotificationconnection.cpp:2599 -#, fuzzy -msgid "Server closes for maintenance in %1!" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -"Advertencia: El servidor cierra por mantenimiento dentro de %1 minutos!" +"Código de error desconocido recibido desde el servidor: %1
Detalles " +"técnicos: %2" -#: network/msnnotificationconnection.cpp:2604 -#, fuzzy +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "Error de MSN" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "Intentando el HTTP alternativo..." + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Autenticando..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Autenticado" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Cambiando a otro servidor..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Conectando..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "Se recibió un mensaje de error desconocido del servidor: %1" + +#: network/msnnotificationconnection.cpp:2109 +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minuto" +msgstr[1] "%1 minutos" + +#: network/msnnotificationconnection.cpp:2112 +msgid "Server closes for maintenance in %1!" +msgstr "Advertencia: El servidor cierra por mantenimiento dentro en %1!" + +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." -msgstr "" -"El servidor de MSN ha reportado que cerrara en 1 minuto para mantenimiento." +msgstr "El servidor de MSN ha reportado que cerrará en %1 para mantenimiento." -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" -msgstr "" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "El cliente SOAP ya no es válido." -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -#, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -"KMess no ha podido procesar los mensajes recibidos offline.

Detalles: " -"%1" +"KMess no ha podido procesar los mensajes recibidos fuera de línea.
Detalles: %1" -#: network/msnnotificationconnection.cpp:3172 -#, fuzzy +#: network/msnnotificationconnection.cpp:2589 msgid "Authentication time limit exceeded" -msgstr "Fallo en la autentificación de usuario" +msgstr "Se excedió el tiempo de autenticación" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Esperando por lista de contactos..." + +#: network/msnnotificationconnection.cpp:2805 #, fuzzy +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Error: %1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" -msgstr "Error interno del servidor en KMess: %1" +msgstr "
Motivo del error interno: %1" -#: network/msnnotificationconnection.cpp:3242 -#, fuzzy -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -"KMess no ha podido conectarse con los servidores de MSN Messenger. Los " -"servidores pueden estar temporalmente no disponibles, o puede haber un " -"problema con tu conexión a internet." +"

La autenticación falló, por favor verifique su cuenta de correo " +"electrónico y su contraseña.

" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

La cuenta %1 se ha conectado desde otra ubicación.

" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -#, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "Se ha perdido la conexión con el servidor." - -#: network/msnnotificationconnection.cpp:3302 -#, fuzzy +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" -"Autenticación fallida, KMess no pudo procesar la entrada de Passport.
" -"
Detalles: %1" +"

¡Usted ha sido desconectado: Usted se conectó con la cuenta %1 " +"desde otro cliente de mensajería, o desde otra ubicación.

" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Error del servidor" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" +"

No se puede conectar al servicio de Live Messenger service.
¿Quizás " +"usted necesita autenticarse antes de acceder a al red?

" -#: network/msnsockettcp.cpp:352 -#, fuzzy +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

KMess se pudo conectarse con los servidores de Live Messenger.
Hay un " +"problema con su conexión a Internet, o los servidores pueden estar no " +"disponibles temporalmente .
También es posible que se requiera " +"autenticación en una página web o un proxy puede ser necesario para acceder " +"a la red.

Presione aquí para visitar la página de " +"estado del servicio de Messenger.

" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

No se puede conectar al servicio de Live Messenger service.

" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

KMess no ha podido conectarse con los servidores de Live Messenger.
" +"Puede haber un problema con su conexión a Internet, o quizás los servidores " +"de Live Messenger no estén disponibles temporalmente .%1

Presione aquí para visitar la página de estado del servicio de Live " +"Messenger.

" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Error: %1

" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

El servidor de Live Messenger ha reportado un error:

%1

" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Error del servicio de Messenger: %1

" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

El servidor de Live Messenger ha reportado un error:

%1

" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Error de KMess: %1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

KMess ha encontrado un error interno:

%1

" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Se ha perdido la conexión con la red.

" + +#: network/msnnotificationconnection.cpp:3017 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

Se ha perdido la conexión con el servidor de Live Messenger.

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" +"

Información para el Desarrollador:
Número de error: %" +"1
Cadena del error: %2

" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Código de error interno: %2)" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" +"%1 (Código de error interno: %2)
Respuesta: %3 %4
Objetivo " +"de la redirección: %5" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" -msgstr "Conexión fuera de tiempo." +msgstr "Excedido el tiempo límite de conexión." -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" -msgstr "Señal perdida" +msgstr "1 señal perdida" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "%1 señales perdidas" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." -msgstr "Se ha perdido la conexión con el servidor." +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "Se ha perdido la conexión con el servidor" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Este contacto está desconectado o invisible." +#: network/soap/addressbookservice.cpp:777 +#, fuzzy +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "El correo que ha tratado de agregar no es una cuenta de MSN Messenger" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "El contacto inició una acción MSN que KMess aun no soporta." +#: network/soap/addressbookservice.cpp:787 +#, fuzzy +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "El correo que ha tratado de agregar no es una cuenta de MSN Messenger" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "El mensaje \"%1\" no fue recibido" - -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "No se ha podido establecer la conexion: %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "Demaciadas redirecciónes por el servidor de entrada" - -#: notification/chatnotification.cpp:163 +#: network/soap/httpsoapconnection.cpp:402 #, fuzzy -msgid "In %1's chat: %2" -msgstr "En la conversación de %1: %2" +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "El servidor no está disponible" -#: notification/chatnotification.cpp:167 +#: network/soap/httpsoapconnection.cpp:471 #, fuzzy -msgid "%1 says:
'%2'" -msgstr "%1 dice:
'%2'" +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Demasiadas redirecciones por el servidor de autenticación" -#: notification/chatnotification.cpp:171 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1te ha mandado un mensaje desconectado:
'%2'" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "El servidor no está disponible" -#: notification/chatnotification.cpp:178 +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 #, fuzzy +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Tipo de respuesta no esperado" + +#: notification/chatnotification.cpp:154 +msgid "In %1's chat:
%2" +msgstr "En la charla de %1
%2" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "%1 dice:
'%2'" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1le ha mandado un mensaje desconectado:
'%2'" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" -msgstr "La conversacion de %1's require atención!" +msgstr "¡La conversación de %1's requiere atención!" -#: notification/chatnotification.cpp:183 -#, fuzzy -msgid "%1:
%2" -msgstr "%1:
%2" +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr "%1 te ha enviado un zumbido!" +msgstr "¡%1 le ha enviado un zumbido!" -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr "%1 te ha enviado un zumbido!" +msgstr "¡%1 le ha enviado un zumbido!" -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr "%1 te ha enviado un guiñó!" +msgstr "¡%1 le ha enviado un guiño!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 desea usar la cámara web" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "¡%1 le está enviando un archivo!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "¡%1 le ha enviado una invitación!" #: notification/chatnotification.cpp:204 -#, fuzzy -msgid "%1 wants to use the webcam!" -msgstr "%1 desea usar la camara web" +msgid "%1 has canceled the webcam session!" +msgstr "¡%1 ha cancelado la sesión de cámara web!" #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 te esta enviando un archivo!" +msgid "%1 has canceled the file transfer!" +msgstr "¡%1 ha cancelado la transferencia de archivo!" #: notification/chatnotification.cpp:206 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "%1 te ha enviado una invitación!" +msgid "%1's activity has been canceled!" +msgstr "¡La actividad con %1 ha sido cancelada!" #: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "%1 ha cancelado la sesión de camara web!" +msgid "%1 has accepted to use the webcam!" +msgstr "¡%1 ha aceptado usar la cámara web!" #: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "%1 ha cancelado la transferencia de archivo!" +msgid "%1 has accepted the file transfer!" +msgstr "¡%1 ha aceptado la transferencia de archivo!" #: notification/chatnotification.cpp:215 -#, fuzzy -msgid "%1's activity has been canceled!" -msgstr "La actividad con %1 ha sido cancelada!" +msgid "%1 has accepted your invitation!" +msgstr "¡%1 ha aceptado su invitación!" #: notification/chatnotification.cpp:222 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1 ha aceptado usar la camara web!" +msgid "%1 has ended the webcam session!" +msgstr "¡%1 ha terminado la sesión de cámara web!" #: notification/chatnotification.cpp:223 -#, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "%1 ha aceptado la transferencia de archivo!" +msgid "The file transfer with %1 is done!" +msgstr "¡La transferencia de archivo con %1 ha terminado!" #: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1 ha aceptado su invitacion!" +msgid "%1's activity has ended!" +msgstr "¡La actividad con %1 ha terminado!" #: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "%1 ha terminado la sesión de camara web!" +msgid "%1's webcam session has failed!" +msgstr "¡La sesión de cámara web con %1 ha fallado!" #: notification/chatnotification.cpp:232 -#, fuzzy -msgid "The file transfer with %1 is done!" -msgstr "La transferencia de archivo con %1 ha terminado!" +msgid "The file transfer with %1 has failed!" +msgstr "¡La transferencia con %1 ha fallado!" #: notification/chatnotification.cpp:233 -#, fuzzy -msgid "%1's activity has ended!" -msgstr "La actividad con %1 ha terminado!" - -#: notification/chatnotification.cpp:240 -#, fuzzy -msgid "%1's webcam session has failed!" -msgstr "La sesión de camara web con %1 ha fallado!" - -#: notification/chatnotification.cpp:241 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "La transferencia con %1 ha fallado!" - -#: notification/chatnotification.cpp:242 -#, fuzzy msgid "%1's activity has ended with an error!" -msgstr "La actividad de %1 ha finalizado con un error!" +msgstr "¡La actividad de %1 ha finalizado con un error!" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
se ha conectado" + +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
se ha puesto ausente" + +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
volverá enseguida" + +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
ahora está ocupado" + +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
se ha puesto invisible" + +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
se ha puesto inactivo" + +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
se ha desconectado" + +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
está al teléfono" + +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
salió a comer" + +#: notification/newemailnotification.cpp:90 +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Nuevo correo electrónico:
'%1'
de '%2'" + +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Empezar a Charlar" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Dejar un Mensaje" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Ver Mensaje" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Detalles" + +#: notification/notificationmanager.cpp:130 #, fuzzy -msgid "%1 is now online" -msgstr "%1 se ha conectado" +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&Enviar correo" -#: notification/contactstatusnotification.cpp:71 -#, fuzzy -msgid "%1 has gone away" -msgstr "%1 se ha puesto Ausente" +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Ocultar" -#: notification/contactstatusnotification.cpp:72 -#, fuzzy -msgid "%1 will be right back" -msgstr "%1 volvera enseguida" +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Cuando cierre la ventana principal, KMess seguirá ejecutándose en la bandeja " +"del sistema. Use 'Salir' desde el menú Conexión para cerrar la aplicación." -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1 ahora está Ocupado" +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Mostrando el icono en la barra del sistema." -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1 se ha puesto Invisible" +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1 se ha puesto Inactivo" +#: notification/systemtraywidget.cpp:246 +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1 se ha desconectado" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 está en el telefono" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 salió a comer" - -#: notification/newemailnotification.cpp:78 -#, fuzzy -msgid "New email:
'%1'
by '%2'" -msgstr "Nuevo correo electrónico
'%1'
de '%2'" - -#: settings/accountpage.cpp:69 +#: settings/accountpage.cpp:80 msgid "Browse..." -msgstr "" +msgstr "Examinar..." -#: settings/accountpage.cpp:70 -#, fuzzy -msgid "Browse and crop picture..." -msgstr "Examinar y cortar imagen..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Examinar y Cortar Imagen..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." -msgstr "" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Definir una Imagen Anterior..." -#: settings/accountpage.cpp:448 -#, fuzzy +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" -msgstr "Descarga de la imágen falló" +msgstr "Falló la descarga de la imagen" -#: settings/accountpage.cpp:507 -#, fuzzy +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -"Ocurrión un error al tratar de cambiar la imágen mostrada.\n" -"Asegurese de que eligipo el archivo de imágen correcto" +"Ocurrió un error al tratar de cambiar la imagen mostrada.\n" +"Asegúrese de que seleccionó un archivo de imagen existente." -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "&Eliminar contacto" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Preferencias" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "Cuenta" -#: settings/accountsettingsdialog.cpp:76 -#, fuzzy +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" -msgstr "Cuenta" +msgstr "Mi Cuenta" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Avisos" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "Notificación de KMess" +msgid "Contact List" +msgstr "Contactos" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" -msgstr "Conversación" +msgstr "Charlando" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Registro de la charla" -#: settings/accountsettingsdialog.cpp:193 -#, fuzzy +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" -msgstr "La dirección de contacto que has entrado no es valida: \"%1\"" +msgstr "" +"La dirección de contacto que ha ingresado no es válida, y no puede ser usada " +"como cuenta: '%1'" -#: settings/accountsettingsdialog.cpp:201 -#, fuzzy +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" -msgstr "La dirección de contacto que has entrado no es valida: \"%1\"" +msgstr "La dirección de contacto que ha ingresado ya está en uso : '%1'" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "¿Está seguro de que quiere eliminar esta cuenta?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." -msgstr "¿Está seguro de que quiere eliminar esta cuenta?" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"¿Está seguro de que quiere eliminar esta cuenta '%1'?
Todas las " +"preferencias de ésta cuenta se perderán" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" -msgstr "Hola, como estas? :)" +msgstr "Hola, como te ha ido? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" -msgstr "Ana" +msgstr "Teresa" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" -msgstr "Genial!" +msgstr "¡Genial!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" -msgstr "/Acabo/ de llegar de mis vacaciones en Italia!" +msgstr "¡/Acabo/ de llegar de mis vacaciones en Italia!" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 #, fuzzy -msgid "KMess Settings" -msgstr "Preferencias" +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "El Parámetro del comando no es válido" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Reemplaza el emoticono existente" + +#: settings/emoticonspage.cpp:233 +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "¿Está seguro de que quiere eliminar el emoticono \"%1\" ?" + +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Eliminar Emoticono" + +#: settings/globalsettingsdialog.cpp:46 +msgid "KMess Settings" +msgstr "Preferencias de KMess" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Cuentas" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 -#, fuzzy -msgid "Notification" -msgstr "Notificación de correo" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notificaciones" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." -msgstr "" +msgstr "No se encontraron navegadores seleccionables." -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." -msgstr "" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "No se detectaron clientes de correo electrónico seleccionables." -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" -msgstr "" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" +msgstr "¡Debe especificar un comando para un navegador personalizado!" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" +"El comando que definió para ejecutar con un navegador personalizado no " +"contiene el parámetro '%u'. Sin éste, el abrir sitios web no funcionará. " +"
¿Desea que KMess lo agregue por usted?" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" +"¡Usted tiene que definir un comando para ejecutarlo como programa de correo " +"personalizado!" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" +"El comando que definió para ejecutar como cliente de correo " +"electrónico personalizado no contiene el parámetro '%u'. Sin éste, no se " +"podrán escribir correos. 

Desea que KMess lo agregue por usted?" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" -msgstr "" +msgstr "¡Debe seleccionar un directorio para los archivos recibidos!" -#: settings/miscellaneouspage.cpp:404 -#, fuzzy +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" -msgstr "Guardar los archivos de las conversaciones en este directorio:" +msgstr "Directorio de los archivos seleccionados" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"Cuando cierres la ventana KMess seguirá funcionando. Usa 'salir' desde el " -"menú conectar para cerrar la aplicación." -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Mostrando el icono en la barra del sistema." +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

¡KMess no pudo acceder a los archivos de configuración!

" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "&Enviar un comentario a los Desarrolladores" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Bienvenido a la versión de pruebas de %1." + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "Bienvenido a %1." + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" +"Cada vez que usted tiene una experiencia genial o frustrante, por favor " +"presione la cara apropiada bajo la barra del título de la ventana, describa " +"brevemente que le gusta o disgusta, y presione enviar." + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" +"Cada vez que usted tiene una experiencia genial, por favor presione la cara " +"feliz bajo la barra de título de la ventana, describa brevemente que le " +"gustó, y presione enviar." + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" +"Cada vez que usted tenga una experiencia frustrante, por favor presione la " +"cara enojada bajo la barra del título de la ventana, describa brevemente que " +"le disgusta, y presione enviar." + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" +"Si experimenta un comportamiento erróneo en la aplicación, sólo presione el " +"icono del objeto erróneo en la esquina superior-derecha de la ventana, " +"descríbalo y presione Enviar." + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "Me gusta el nuevo trabajo artístico. Muy refrescante." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" +"No me gusta la página de bienvenida del asistente, consume mucho " +"tiempo." + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"La aplicación tiene un comportamiento erróneo cuando se presiona el " +"botón agregar, nada sucede." + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" +"Yo deseo una nueva característica permitiéndome enviar mi trabajo por " +"correo." + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "Sus comentarios son importantes para ayudarnos a mejorarlo." + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Ejemplo" +msgstr[1] "Ejemplos" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Ayude a mejorar la aplicación" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Enviar un comentario a los Desarrolladores" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Por favor, escribalo en %1 (usted puede querer usar una herramienta de traducción para ésto).
" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Por favor, escribalo en %1 o %2 (usted puede querer usar una herramienta de traducción para ésto).
" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" +"Para hacer más útiles los comentarios para mejorar la aplicación, intente " +"enviar la misma cantidad de comentarios positivos y negativos.
" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" +"Por favor, no consulte por nuevas características: Este tipo de peticiones " +"serán ignoradas.
" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" +"

Usted puede proveer a los desarrolladores una breve descripción de sus " +"opciones acerca de %1.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"La dirección de correo electrónico que ha ingresado no es válida, y no puede " +"ser usada: '%1'" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" +"

Su comentario ha sido enviado exitosamente. ¡Ésto nos ayudará a mejorar " +"la aplicación!

Gracias por su tiempo.

" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Comentarios Enviados" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" +"

Hubo un error mientras se intentaba enviar el reporte.

Por favor, " +"inténtelo después.

" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Error al enviar los comentarios" -#: systemtraywidget.cpp:245 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 %2" +#~ msgid "Conversations Filter" +#~ msgstr "Conversaciones iniciadas el: %2" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Seleccione la cuenta que desea modificar, y luego presione aquí" + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "El zumbido a %1 no pudo enviarse." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "El guiño a %1 no pudo enviarse." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "El dibujo a %1 no pudo enviarse." + +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "El mensaje '%1' a %2 no pudo enviarse." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "&Usar" + +#~ msgid "&Copy..." +#~ msgstr "&Copiar..." + +#~ msgid "Insert New" +#~ msgstr "Insertar uno Nuevo" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "Dirección de Correo Electrónico: %1" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Cliente: %1" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Sin admisión" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Visto por última vez: %1" + +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Último mensaje: %1" + +#~ msgid "Contact List Alerts" +#~ msgstr "Alertas de la lista de Contactos" + +#~ msgid "&Show winks from contacts" +#~ msgstr "Mostrar los guiños de los contacto&s" + +#~ msgid "Enable in the contact list" +#~ msgstr "Habilitar en la lista de contactos" + +#~ msgid "Enable in the chat windows" +#~ msgstr "Habilitar en la ventanas de conversaciones" + +#~ msgid "Alerts" +#~ msgstr "Avisos" + +#~ msgid "Alerts and Notifications" +#~ msgstr "Alertas y notificaciones" + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "" +#~ "Opcionalmente, puede escoger el grupo donde ubicar los nuevos contactos" + +#~ msgid "KSqueezedTextLabel" +#~ msgstr "KSqueezedTextLabel" + +#~ msgid "No Group" +#~ msgstr "Sin Grupo" + +#~ msgid "Now listening to: %1" +#~ msgstr "Escuchando ahora a: %1" + +#~ msgid "&Listening Music" +#~ msgstr "Escuchando &Música" + +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "KMess no pudo acceder al servicio web.
Detalles: %1" + +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "Autenticación fallida, KMess no pudo procesar el ingreso en Passport.
Detalles: %1" + +#~ msgid "SOAP connection error: %1" +#~ msgstr "Error de conexión SOAP: %1" + +#~ msgid "Connect" +#~ msgstr "Conectar" + +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: account not found." +#~ msgstr "No se puede conectar: Cuenta no encontrada." + +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: no password has been entered." +#~ msgstr "No se puede conectar: no se ha ingresado contraseña alguna." + +#~ msgctxt "Connection error dialog box" +#~ msgid "%1" +#~ msgstr "%1" + +#~ msgctxt "Server error dialog box" +#~ msgid "

MSN server message

%1

" +#~ msgstr "

Mensaje del servidor MSN

%1

" + +#~ msgctxt "Server-reported client error dialog box" +#~ msgid "

Internal error in KMess

%1

" +#~ msgstr "

Error interno en KMess

%1

" + +#~ msgid "" +#~ "Error in the fallback Web connection. It is possible you need to " +#~ "authenticate to a proxy server or a web page." +#~ msgstr "" +#~ "Error en la conexión alternativa HTTP. Es posible que necesite " +#~ "autenticarse a un servidor proxy o una página web." + +#~ msgid "Close all tabs" +#~ msgstr "Cerrar todas las pestañas" + +#~ msgid "&Send email" +#~ msgstr "&Enviar correo" + +#~ msgid "Save complete" +#~ msgstr "Guardar completamente" + +#~ msgid "C&lose all tabs" +#~ msgstr "Cerrar todas &las pestañas" + +#~ msgid "Rename group" +#~ msgstr "Renombrar grupo" + +#~ msgid "Account &Settings..." +#~ msgstr "O&pciones de la Cuenta..." + +#~ msgid "" +#~ "Basic DBus support, tab closing message, menu hiding shortcut, toolbars " +#~ "lock" +#~ msgstr "" +#~ "Soporte básico de DBus, mensaje de cierre de pestaña, acceso rápido para " +#~ "ocultar el menú, bloqueo de herramientas" + +#~ msgid "Select an emoticon and click here to delete it" +#~ msgstr "Seleccione un emoticono y presione aquí para borrarlo." + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 se ha conectado" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 se ha puesto Ausente" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 ahora está Ocupado" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 se ha puesto Inactivo" + +#~ msgid "Popup Notifications" +#~ msgstr "Notificaciones e&mergentes" + +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Mostrar notificaciones cuando los contactos:" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "" +#~ "Si está activo, una notificación es mostrada cuando uno de sus contactos " +#~ "se conecta a MSN." + +#~ msgid "&Go online" +#~ msgstr "S&e Conecten" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "" +#~ "Si está activo, una notificación es mostrada cuando uno de sus contactos " +#~ "comienza una charla con usted." + +#~ msgid "Start a &chat with you" +#~ msgstr "&Comiencen una charla con usted" + +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "" +#~ "Cuando está activo, una notificación es mostrada cuando uno de sus " +#~ "contactos le envía un mensaje." + +#~ msgid "S&end you a message" +#~ msgstr "Le Envíen &un mensaje" + +#~ msgid "" +#~ "If enabled, a popup message is shown when your contacts change their MSN " +#~ "status." +#~ msgstr "" +#~ "Cuando está activo, una notificación es mostrada cuando uno de sus " +#~ "contactos cambia su estado de MSN." + +#~ msgid "Change their &status" +#~ msgstr "Cambien su e&stado" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts goes " +#~ "offline." +#~ msgstr "" +#~ "Cuando está activo, una notificación es mostrada cuando uno de sus " +#~ "contactos se desconecta." + +#~ msgid "Go o&ffline" +#~ msgstr "Se desconecten" + +#~ msgid "Email Events" +#~ msgstr "Eventos de Correo electrónico" + +#~ msgid "Show notifications when email is received:" +#~ msgstr "Mostrar una notificación cuando se reciba correo:" + +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in the Inbox. " +#~ "This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Cuando está activo, se muestra una notificación cuando un correo " +#~ "electrónico es recibido en la bandeja de entrada. Ésta opción está " +#~ "disponible sólo para cuentas Hotmail/Live." + +#~ msgid "In the Inbox" +#~ msgstr "&En la bandeja de entrada" + +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in other " +#~ "folders. This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Cuando está activo, se muestra una notificación cuando un correo " +#~ "electrónico es recibido en otras carpetas. Ésta opción está disponible " +#~ "sólo para cuentas Hotmail/Live." + +#~ msgid "In other folders" +#~ msgstr "En otras carpetas" + +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "" +#~ "Controla los segundos transcurridos antes de que las notificaciones " +#~ "emergentes son ocultadas." + +#~ msgid "Hide popups after" +#~ msgstr "Ocultar globos tras" + +#~ msgid "seconds" +#~ msgstr "segundos" + +#~ msgid "Other Alerts" +#~ msgstr "Otros Avisos" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "

If you enable chat " +#~ "logging, every chat you have will be saved in a certain place (which can " +#~ "be specified below).

\n" +#~ "

The saved chats will " +#~ "allow you to find something in your old discussions, like a link, or you " +#~ "may use them to remember what you did say in a certain occasion to " +#~ "someone.

\n" +#~ "

\n" +#~ "

They may also pose some " +#~ "privacy issues though, because unauthorized people who use your account " +#~ "may read your chat logs.

\n" +#~ "

\n" +#~ "

Be sure to keep this option disabled on publicly accessible " +#~ "computers!

" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "

Si habilita el registro " +#~ "de charlas, cada charla que realice será guardada en un lugar (el cual " +#~ "puede ser especificado más abajo).

\n" +#~ "

Las conversaciones " +#~ "guardadas permitirán encontrar algo en sus viejas discusiones, como una " +#~ "dirección, o puede usarlos para recordar que le dijo a una persona en " +#~ "algún momento.

\n" +#~ "

\n" +#~ "

Esto puede plantear " +#~ "algunos problemas de privacidad, debido a que personas no autorizadas " +#~ "pueden leer los registros de sus conversaciones cuando utilicen su cuenta." +#~ "

\n" +#~ "

\n" +#~ "

Asegúrese de mantener ésta opción deshabilitada en " +#~ "computadores de acceso público!

" + +#~ msgid "These options allow you to choose the way how your chats are saved." +#~ msgstr "" +#~ "Estas opciones le permiten seleccionar la forma de como son guardadas las " +#~ "charlas." + +#~ msgid "" +#~ "You can choose the file format KMess will use to save your chats. Use the " +#~ "\"What's This?\" feature on the specific option for more details." +#~ msgstr "" +#~ "Usted puede seleccionar el formato que KMess utilizará para guardar sus " +#~ "conversaciones. Utilice la opción \"¿Qué es esto?\" para detalles más " +#~ "específicos." + +#~ msgid "Save logged chats as:" +#~ msgstr "Guardar las charlas como:" + +#~ msgid "" +#~ "Click here to have your conversations automatically saved with the HTML " +#~ "format" +#~ msgstr "" +#~ "Presione aquí para que sus conversaciones sean guardadas automáticamente " +#~ "en formato HTML" + +#~ msgid "" +#~ "Choosing this option, you will be able to open your conversations with " +#~ "every Web browser. They will only work on your computer, though." +#~ msgstr "" +#~ "Seleccionando ésta opción, usted podrá abrir sus charlas con cada " +#~ "navegador web. Sin embargo, éstos funcionará sólo en su computadora, pues " +#~ "son archivos locales." + +#~ msgid "Click here to have your conversations automatically saved as text" +#~ msgstr "" +#~ "Presione aquí para que sus conversaciones sean guardadas automáticamente " +#~ "como texto" + +#~ msgid "" +#~ "This option allows the most portability: you will be able to read your " +#~ "chats anywhere, but you'll lose the additional details - like contact " +#~ "pictures and formatting." +#~ msgstr "" +#~ "Esta opción le permite la mayor portabilidad: Usted podrá leer sus " +#~ "charlas en cualquier lugar, pero perderá detalles adicionales - Como el " +#~ "formato y las fotografías." + +#~ msgid "" +#~ "Click here to have your conversations automatically saved with the XML " +#~ "format" +#~ msgstr "" +#~ "Presione aquí para que sus conversaciones sean guardadas en formato XML" + +#~ msgid "" +#~ "Choosing this option makes your conversation files difficult to read by " +#~ "the human eye, but KMess will be able to read them better." +#~ msgstr "" +#~ "Seleccionando ésta opción, sus conversaciones serán complicadas de leer " +#~ "para el ojo humano, sin embargo, KMess podrá leerlos de una mejor forma." + +#~ msgid "XML documents" +#~ msgstr "Documentos XML" + +#~ msgid "Organization" +#~ msgstr "Organización" + +#~ msgctxt "" +#~ "Header of a chat file saved in plain text: %1 is the contact, %2 the date " +#~ "and time" +#~ msgid "" +#~ "KMess saved conversation\n" +#~ "------------------------------------------------------------\n" +#~ "Conversation with %1 - started on %2\n" +#~ "\n" +#~ msgstr "" +#~ "Conversación guardada por KMess\n" +#~ "------------------------------------------------------------\n" +#~ "Conversación con %1 - iniciada en %2\n" +#~ "\n" + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "El contacto inició una acción MSN que KMess aun no soporta." + +#~ msgctxt "Button text on KDE notification box" +#~ msgid "Ignore" +#~ msgstr "Ignorar" + +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Esconder los Contactos" + +#~ msgid "" +#~ "You can disable this checkbox to make KMess to delete this account when " +#~ "you quit" +#~ msgstr "" +#~ "Usted puede deshabilitar esta caja de selección para que KMESS no guarde " +#~ "esta cuenta al salir" + +#~ msgid "Also r&emember the password" +#~ msgstr "También r&ecordar la contraseña" + +#, fuzzy +#~ msgid "" +#~ "If enabled, all chat conversations will be saved in the specified " +#~ "directory." +#~ msgstr "" +#~ "Cuando está activo, las conversaciones serán guardadas en la carpeta " +#~ "especificada." + +#~ msgid "Log &all chats" +#~ msgstr "Registrar todas las conversaciones" + +#~ msgid "Log Structure" +#~ msgstr "Estructura del registro" + +#~ msgid "Month" +#~ msgstr "Mes" + +#~ msgid "Day" +#~ msgstr "Día" + +#~ msgid "Toggle Contacts &Dock" +#~ msgstr "Cambia el &Dock de contactos" + +#~ msgid "Invite contacts" +#~ msgstr "Invitar Contactos" + +#~ msgctxt "Status message on login screen" +#~ msgid "Reconnecting in %1 seconds..." +#~ msgstr "Reconectando en %1 segundos..." + +#~ msgid "&Search in Contact List" +#~ msgstr "Buscar en la li&sta de contactos" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Este contacto está desconectado o invisible." + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "El mensaje \"%1\" no fue recibido" + +#~ msgid "TextLabel" +#~ msgstr "Etiqueta de texto" + +#~ msgid "Other contact:" +#~ msgstr "Otro contacto:" + +#~ msgid "Invited" +#~ msgstr "Invitado" + +#~ msgid "Hide Side&bar" +#~ msgstr "Ocultar la &Barra lateral" + +#~ msgid "Hide the contact sidebar" +#~ msgstr "Oculta la barra lateral" + +#~ msgid "Show the contact sidebar" +#~ msgstr "Muestra la barra lateral" + +#~ msgid "" +#~ "Click here to add a new custom emoticon which can be sent to your contacts" +#~ msgstr "" +#~ "Presione aquí para agregar nuevos emoticonos personalizados, los cuales " +#~ "podrá enviar a sus contactos" + +#~ msgid "Black sheep" +#~ msgstr "Oveja negra" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "No se ha podido establecer la conexion: %1" + +#~ msgid "Unable to parse SOAP response" +#~ msgstr "No se pudo analizar sintácticamente la respuesta SOAP" + +#~ msgid "Copy E&mail" +#~ msgstr "Copiar co&rreo" + +#~ msgid "Specify an Away message" +#~ msgstr "Especifique un mensaje de ausencia" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "Correo electrónico: %1" + +#~ msgid "Soccer ball" +#~ msgstr "Pelota" + +#~ msgid "Contact %1 already exists." +#~ msgstr "El contacto %1 ya este en su lista." + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "Correo Electrónico: %1" + +#~ msgid "Contact is in the opposite list" +#~ msgstr "Este contacto está en la lista contraria" + +#~ msgid "The group name is too long" +#~ msgstr "El nombre del grupo es demasiado largo" + +#~ msgid "No permissions given for this account" +#~ msgstr "No se han asignado permisos para esta cuenta" + +#~ msgid "Lost reference to SOAP client" +#~ msgstr "Referencia extraviada al cliente SOAP" + +#~ msgid "Enter your personal message here" +#~ msgstr "Escriba su mensaje personal aquí" + +#~ msgid "Click" +#~ msgstr "Click" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "Ventana de Red" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Compatible con Windows Live Messenger %1" + +#~ msgid "Co&nnect" +#~ msgstr "Co&nectar" + +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "Esperando por lista de contactos (%1%)..." + +#~ msgid "" +#~ "\n" +#~ " \n" +#~ "
\n" +#~ "
\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::RichText\n" +#~ " \n" +#~ " \n" +#~ " true\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Vertical\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Vertical\n" +#~ " \n" +#~ " \n" +#~ " QSizePolicy::Minimum\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " 250\n" +#~ " 10\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Horizontal\n" +#~ " \n" +#~ " \n" +#~ " QSizePolicy::Expanding\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " 10\n" +#~ " 20\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Groups:" +#~ msgstr "" +#~ "\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::RichText\n" +#~ " \n" +#~ " \n" +#~ " true\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Vertical\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Vertical\n" +#~ " \n" +#~ " \n" +#~ " QSizePolicy::Minimum\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " 250\n" +#~ " 10\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Horizontal\n" +#~ " \n" +#~ " \n" +#~ " QSizePolicy::Expanding\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " 10\n" +#~ " 20\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Grupos:" + +#~ msgid "" +#~ "Groups:\n" +#~ " " +#~ msgstr "" +#~ "Grupos:\n" +#~ " " + +#~ msgid "SSL Error" +#~ msgstr "Error de SSL" + +#~ msgid "Size pen" +#~ msgstr "Tamaño del lápiz" + +#~ msgid "More options..." +#~ msgstr "Más opciones..." + +#~ msgid " Account options " +#~ msgstr "Opciones de la cuenta" + +#~ msgid "You received a wink from %1." +#~ msgstr "Ha recibido un guiño de %1" + +#~ msgctxt "Clickable label on login screen" +#~ msgid "Less options..." +#~ msgstr "Menos opciones..." + +#~ msgctxt "Clickable label on login screen" +#~ msgid "More options..." +#~ msgstr "Más opciones..." + +#~ msgid "Got synchronization" +#~ msgstr "Sincronización establecida..." + +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "¿Quiere aceptar el archivo: %1 (%2)?" + +#~ msgid "The transfer was cancelled" +#~ msgstr "La transferencia fue cancelada" + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Archivo transferido con éxito: %1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "La transferencia de %1 falló. El archivo no existe." + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "La transferencia de %1 falló. El archivo no pudo ser leído." + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "La transferencia de %1 fue cancelada" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Preferencias" #~ msgid "Click to send an email to this contact." #~ msgstr "Haz click para mandar un correo electrónico a este contacto." @@ -4221,10 +6727,6 @@ msgstr "%1 %2" #~ msgid "Picture:" #~ msgstr "Foto:" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Mostrar información referente al correo." - #~ msgid "Logging in..." #~ msgstr "Iniciando sesión..." @@ -4258,10 +6760,6 @@ msgstr "%1 %2" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "%1 mensajes nuevos en su bandeja de entrada" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "&Se conecten" - #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "La transferencia de %1 falló. No se pudo abrir el archivo" @@ -4286,12 +6784,6 @@ msgstr "%1 %2" #~ msgid "Your password:" #~ msgstr "Su contraseña:" -#~ msgid "Display picture:" -#~ msgstr "Foto del contacto:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "No mostrar una imagen" - #~ msgid "Status to set at login:" #~ msgstr "Estado al iniciar sesión:" diff --git a/po/et.po b/po/et.po index f6df90d..cc2c521 100644 --- a/po/et.po +++ b/po/et.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: ee\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2003-03-20 16:14+0100\n" "Last-Translator: Jyri Toomessoo \n" "Language-Team: Estonian \n" @@ -15,83 +15,185 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.0\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 #, fuzzy +msgid "Standard text mode" +msgstr "Liikuvad smile'd" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Kuva ajatempel jutus" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Liikuvad smile'd" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Liikuvad smile'd" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +#, fuzzy msgid "Ne&w Line" msgstr "Uus Rida" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 #, fuzzy msgid "S&end" msgstr "Saada" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 #, fuzzy -msgid "Contacts" -msgstr "&Lisa Kontakt" +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Jutusta" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Kuva/Peida &Kontakti Kylgriba" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "&Jutusta" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "Muuda Kirja &Varvi" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Ym&ber nimeta Grupp" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 #, fuzzy msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "Sisesta eposti aadress keda soovid lisada:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Email address" -msgstr "Eposti aadress:" +msgid "Email address:" +msgstr "Eposti aadress: " -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 #, fuzzy -msgid "Initial group" -msgstr "Ym&ber nimeta Grupp" +msgid "Enter a shortcut for the emoticon:" +msgstr "Sisesta uus nimi sellele grupile:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -99,717 +201,1223 @@ msgstr "" "Sisesta teade mis automaatselt edastatakse\n" "neile kes sinuga suhelda yritavad:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 #, fuzzy -msgid "&Automatic away message" +msgid "&Specify an automatic away message:" msgstr "Sisesta Eemal teade" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "O&tsi Kontakti" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Jutu logimine" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +msgid "Filter by &chat" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "&Add this person to these groups of my contact list:" msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "Ei lisa seda kontakti, aga lase neil vaadata su olekut" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "Blokeeri see isik nii, et ta ei saaks sind segada ega vaadata." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, fuzzy, no-c-format -msgid "Contact Properties for %1" -msgstr "Kontakti omadused " - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +#, fuzzy msgid "&Information" +msgstr "Kuva eposti info kontakti loendis" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 #, fuzzy -msgid "Restore" +msgid "&Restore" msgstr "Eemaldatud" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Use alternative name for this person" +msgid "&Groups:" +msgstr "Grupp" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" msgstr "Kasuta alternatiiv nime selle iskiku puhul" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 #, fuzzy -msgid "Show a popup when the contact goes online/offline" +msgid "Show a &popup when the contact goes online/offline" msgstr "Teata mulle kui see inimene tuleb vai lahkub" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "Heli:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Pilt:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +#, fuzzy msgid "&Clear Cache" +msgstr "&Jutusta" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -msgid "Notes" +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "Tahan &Smile'si" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +#, fuzzy +msgid "Remo&ve" +msgstr "Eemaldatud" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "&Luba Kontakt" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "&Lisa Kontakt" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "Yhenduse sai taim-audi" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "&Lisa Kontakt" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "(Blokeeritud)" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "Saada" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "Eposti aadress: " +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "&Jutusta" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "(Blokeeritud)" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Sisesta eposti aadress keda soovid lisada:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "Parool:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -#, fuzzy -msgid " Account options " -msgstr "Kasutaja &Seaded" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 #, fuzzy -msgid "Remem&ber this profile" +msgid "Remem&ber account" msgstr "Pea profiil meeles" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "Parool:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Yhenda" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +#, fuzzy +msgid "New Account" +msgstr "Uus &Kasutaja" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Yhenda" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Tegevused" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Kasutajad" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr "Kasutaja &Seaded" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +msgid "Enter the name other contacts should see when you are online." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "Sinu tore nimi:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "Eposti aadress: " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "Parool:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "Parool:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 #, fuzzy msgid "Display Picture" msgstr "Pilt:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 +#, fuzzy msgid "C&hange..." -msgstr "" +msgstr "&Kutsu" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, fuzzy msgid "Re&member the settings of this account" -msgstr "" +msgstr "Pea profiil meeles" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "Sisene alati selle kontoga automaatselt alguses" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "Logi kogu jutt" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "Pea profiil meeles" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Muuda olek \"Kaua vait\" kui vaikid" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Kuuluta ennast kaua vaikivaks peale" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minutit" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 #, fuzzy msgid "Saved accounts:" msgstr "Kasutajad" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -#, fuzzy -msgid "Click" -msgstr "(Blokeeritud)" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." +msgid "&Add Account..." msgstr "Kasutajad" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "Eemaldatud" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Eposti Teade" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "Jutu logimine" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "Saada &Fail" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Salvesta jutu failid sellesse pea kausta:" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Aasta" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Salvesta jutud peakausta" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Salvesta jutud peakausta" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "Salvesta jutu failid sellesse pea kausta:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "Seaded" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "O&tsi Kontakti" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "Tahan &Smile'si" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Tahan &Smile'si" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Kuva graafika jutu sees" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "&Lisa Kontakt" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Show notifications when your contacts:" -msgstr "Kuva teated kui kontaktid lahkuvad" +msgid "Show s&econds" +msgstr "Tahan &Smile'si" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "Sinu teate kirjatyyp:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 #, fuzzy -msgid "&Go online" -msgstr "Offline'is" +msgid "&Force messages from your contacts to use this font:" +msgstr "Sunni kontakti teated kasutama seda kausta:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "&Jutusta" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -#, fuzzy -msgid "S&end you a message" -msgstr "Sisesta Eemal teade" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -#, fuzzy -msgid "Go o&ffline" -msgstr "Offline'is" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "Eposti aadress:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "Kuva teade kui kiri tuleb \"teistesse kausta\"" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -#, fuzzy -msgid "In other folders" -msgstr "teises kaustas" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Peida teade peale" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "sekundit" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "Alarmid" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Kuva &Lubatud Kontaktid" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -819,2194 +1427,2988 @@ msgid "" "window with the first nudge.

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 -msgid "Inform contacts w&hich song I am listening to" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 #, fuzzy -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Muuda olek \"Kaua vait\" kui vaikid" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Kuuluta ennast kaua vaikivaks peale" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minutit" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -#, fuzzy -msgid "Log &all chats" -msgstr "Logi kogu jutt" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Salvesta jutu failid sellesse pea kausta:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Aasta" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -#, fuzzy -msgid "Month" -msgstr "Kuu" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "P4ev" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Salvesta jutud peakausta" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -msgid "&Chat style:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Seaded" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Tahan &Smile'si" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Kuva ajatempel jutus" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 msgid "G&roup chats in the same window:" -msgstr "" +msgstr "Su kontakti loendisse ei mahu enam" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 #, fuzzy msgid "Always" msgstr "Eemal" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 #, fuzzy msgid "For contacts in the same group" msgstr "Su kontakti loendisse ei mahu enam" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 #, fuzzy msgid "Never" msgstr "Serveri Viga" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 #, fuzzy -msgid "Your &message font:" -msgstr "Sinu teate kirjatyyp:" +msgid "Display Options" +msgstr "Pilt:" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Sunni kontakti teated kasutama seda kausta:" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "O&tsi Kontakti" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 #, fuzzy msgid "&Emoticon Themes" msgstr "Tahan &Smile'si" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 #, fuzzy msgid "Available emoticon styles:" msgstr "Tahan &Smile'si" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 #, fuzzy msgid "&Custom Emoticons" msgstr "Liikuvad smile'd" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 +#, fuzzy msgid "Custom emoticons for this account:" +msgstr "Pea profiil meeles" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Kasutajad" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 #, fuzzy msgid "Re&name" msgstr "Sinu nimi" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -#, fuzzy -msgid "Remo&ve" -msgstr "Eemaldatud" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "Sisesta Eemal teade" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "Eposti klient" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 #, fuzzy msgid "File Transfers" msgstr "Faili ylekanne valmis." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "Salvesta jutu failid sellesse pea kausta:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 msgid "and" msgstr "ja" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "Faili ylekanne valmis." -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "Sinu nimi" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "Sinu nimi" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Olen arvutist eemal" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Sinu nimi" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "sina@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "&Eemalda Kontakt" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:119 +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" + +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "lisandus jutukasse." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "lahkus jutukast." -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "lahkus jutukast." -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr " nokib nuppe." -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr " et al." -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr " (See on automaat teade)" -#: chat/chat.cpp:934 -msgid "You received a wink from %1." -msgstr "" - -#: chat/chat.cpp:971 +#: chat/chat.cpp:830 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" - -#: chat/chat.cpp:1080 -msgid "You have received a wink from %1" -msgstr "" - -#: chat/chat.cpp:1100 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chat.cpp:1119 +#: chat/chat.cpp:941 #, fuzzy -msgid "The message '%1' could not be sent." +msgid "You have sent a wink" +msgstr " on liinil" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr " on liinil" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr " on liinil" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr " on liinil" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr " on liinil" + +#: chat/chat.cpp:1194 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" + +#: chat/chat.cpp:1220 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" + +#: chat/chat.cpp:1230 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" + +#: chat/chat.cpp:1241 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr " on liinil" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "lisandus jutukasse." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "lisandus jutukasse." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr " on liinil" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "&Luba Kontakt" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "lisandus jutukasse." + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr " on liinil" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "lisandus jutukasse." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr " on liinil" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "ei l4inud kohale." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 #, fuzzy msgid "%1 says:" msgstr "lausub:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Stardin GnomeMeeting'u. Yhendan " + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Kutsu" +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Yhenda" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 #, fuzzy msgid "Add this &Emoticon..." msgstr "Tahan &Smile'si" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Tahan &Smile'si" + +#: chat/chatview.cpp:833 #, fuzzy msgid "Send &Email" msgstr "&Saada epost" -#: chat/chatview.cpp:1286 +#: chat/chatview.cpp:837 #, fuzzy -msgid "Copy E&mail" -msgstr "Epost" +msgid "Add &Contact" +msgstr "&Lisa Kontakt" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "Eposti aadress:" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "Save chat to &File" -msgstr "Saada &Fail" - -#: chat/chatwindow.cpp:489 -msgid "&Chat" +msgid "C&lear Chat" msgstr "&Jutusta" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Saada &Fail" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "Alusta &Vestlust" - -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:108 #, fuzzy -msgid "Send a &Nudge!" -msgstr "Saada &Fail" +msgid "Contacts" +msgstr "&Lisa Kontakt" -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Tahan &Smile'si" - -#: chat/chatwindow.cpp:498 -msgid "Close &All Tabs" -msgstr "" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "Seaded" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Muuda &Kirja" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Muuda Kirja &Varvi" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&Yhenda" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Muuda Kirja &Varvi" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "Tahan &Smile'si" -#: chat/chatwindow.cpp:658 +#: chat/chatwindow.cpp:121 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "Tahan &Smile'si" -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "Seaded" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "Tahan &Smile'si" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "Kuva/Peida &Kontakti Kylgriba" - -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Kuva/Peida &Kontakti Kylgriba" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Kuva, peida kontakti kylgriba" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:328 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:855 -msgid "Close all tabs" +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:856 -msgid "Close current tab" +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" msgstr "" -#: chat/chatwindow.cpp:1467 +#: chat/chatwindow.cpp:409 #, fuzzy -msgid "Show Side&bar" -msgstr "Kuva/Peida &Kontakti Kylgriba" +msgid "&Invite..." +msgstr "&Kutsu" -#: chat/chatwindow.cpp:1468 +#: chat/chatwindow.cpp:410 #, fuzzy -msgid "Show the contact sidebar" -msgstr "Kuva, peida kontakti kylgriba" +msgid "Send a &File..." +msgstr "Saada &Fail" -#: chat/chatwindow.cpp:1565 -#, fuzzy -msgid "%1 is typing." -msgstr " nokib nuppe." - -#: chat/chatwindow.cpp:1575 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr " nokib nuppe." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" msgstr "" -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Alusta &Vestlust" + +#: chat/chatwindow.cpp:413 +#, fuzzy +msgid "Send a &Nudge!" +msgstr "Saada &Fail" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "" + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Muuda &Kirja" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Muuda Kirja &Varvi" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Tahan &Smile'si" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Kuva ajatempel jutus" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 +#, fuzzy +msgid "Meeting" +msgstr "Seaded" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Saada &Fail" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "O&tsi Kontakti" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "&Lisa Kontakt" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "O&tsi Kontakti" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Tahan &Smile'si" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "O&tsi Kontakti" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Tahan &Smile'si" + +#: chat/chatwindow.cpp:491 +#, fuzzy +msgid "&Font" +msgstr "&Yhenda" + +#: chat/chatwindow.cpp:492 +#, fuzzy +msgid "Font &Color" +msgstr "Muuda Kirja &Varvi" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "&Jutusta" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Jutt" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "Jutt" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr " nokib nuppe." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr " nokib nuppe." + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr " nokib nuppe." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Alusta &Vestlust" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" msgstr "&Saada epost" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 #, fuzzy msgid "&View Profile" msgstr "&Kuva Profiil" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Lisa Kontakt" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 #, fuzzy msgid "A&llow Contact" msgstr "&Luba Kontakt" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 #, fuzzy msgid "&Delete Contact" msgstr "&Eemalda Kontakt" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Blokeeri Kontakt" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "&Eemalda Blokaad" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 #, fuzzy msgid "&Friendly Name" msgstr "Sinu tore nimi:" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 #, fuzzy msgid "&Email Address" msgstr "Eposti aadress:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" msgstr "" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 #, fuzzy msgid "Blocked" msgstr "(Blokeeritud)" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "Lisa kontakt" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Topi yks smile'i" +msgid "Add New" +msgstr "Kasutajad" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 #, fuzzy msgid "Remove" msgstr "Eemaldatud" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 #, fuzzy msgid "Web Messenger" msgstr "Veebi kujundus" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "Veebi kujundus" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 #, fuzzy msgid "Windows Live Messenger %1" msgstr "Veebi kujundus" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Veebi kujundus" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Online" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Offline'is" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Lubatud" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Eemaldatud" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr " nokib nuppe." - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Eemal" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Kohe tagasi" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Tegevuses" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Peidus" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Eemal" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Eemal teatega" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Kohe tagasi" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Telefoneerin" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Toitumas" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Peidus" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Offline'is" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Mu Staatus" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "&Katkesta" + +#: dialogs/addcontactdialog.cpp:49 #, fuzzy msgid "Add a Contact" msgstr "Lisa kontakt" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Ee&malda Grupp" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 #, fuzzy msgid "Add New Emoticon" msgstr "Tahan &Smile'si" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "Tahan &Smile'si" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "Sisesta Eemal teade" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "katkes. ei saanud faili avada." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "on lisanud sind oma kontaktidesse. Kas sa tahad:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +#, fuzzy +msgid "Contact Properties for %1" +msgstr "Kontakti omadused " + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Yhenduses" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "Kuva ajatempel jutus" -#: dialogs/contactpropertiesdialog.cpp:381 -msgid "Last seen: %1" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:419 #, fuzzy +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Sinu teate kirjatyyp:" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "Sinu teate kirjatyyp:" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "Epost" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Eposti aadress: " -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "Eposti klient" -#: dialogs/networkwindow.cpp:79 -msgid "S&ave tab" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Oled kindel et tahad konto kustutada?" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "&Lisa Kontakt" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "&Lisa Kontakt" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "Kontakti omadused " + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "Yhenduse sai taim-audi" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" msgstr "" +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "O&tsi Kontakti" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "" + +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "&Jutusta" + #: dialogs/networkwindow.cpp:80 -msgid "C&lear tab" +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" msgstr "" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Yhenduses" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 -msgid "Cl&ean Up" -msgstr "" +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "(Blokeeritud)" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "&Eemalda Kontakt" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Pilt:" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Pilt:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Oled kindel et tahad konto kustutada?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 #, fuzzy msgid "Smile" msgstr "Epost" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 #, fuzzy msgid "Sad" msgstr "ja" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 #, fuzzy msgid "Disappointed" msgstr "Yhenduseta" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 #, fuzzy msgid "Secret telling" msgstr "Seaded" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 #, fuzzy msgid "Be right back" msgstr "Kohe tagasi" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 #, fuzzy msgid "Sun" msgstr "Heli:" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 #, fuzzy msgid "Clapping" msgstr "Jutustamine" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 #, fuzzy msgid "Snail" msgstr "&Saada epost" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "" - -#: emoticontheme.cpp:857 -msgid "Goat" -msgstr "" - -#: emoticontheme.cpp:858 -msgid "Vampire bat" -msgstr "" - -#: emoticontheme.cpp:859 -msgid "Pizza" -msgstr "" - -#: emoticontheme.cpp:860 -msgid "Beer mug" -msgstr "" - -#: emoticontheme.cpp:861 -msgid "Martini glass" -msgstr "" - -#: emoticontheme.cpp:862 -msgid "Coffee cup" -msgstr "" - -#: emoticontheme.cpp:863 -msgid "Birthday cake" -msgstr "" - -#: emoticontheme.cpp:864 -msgid "Plate" -msgstr "" - -#: emoticontheme.cpp:865 -msgid "Bowl" -msgstr "" - -#: emoticontheme.cpp:866 -msgid "Star" -msgstr "" - -#: emoticontheme.cpp:867 -msgid "Rainbow" -msgstr "" - -#: emoticontheme.cpp:868 -msgid "Stormy cloud" -msgstr "" - #: emoticontheme.cpp:869 -msgid "Lightning" +msgid "Sheep" msgstr "" #: emoticontheme.cpp:870 -msgid "Umbrella" +msgid "Goat" msgstr "" #: emoticontheme.cpp:871 -msgid "Island with a palm tree" +msgid "Vampire bat" msgstr "" #: emoticontheme.cpp:872 -msgid "Telephone receiver" +msgid "Pizza" msgstr "" #: emoticontheme.cpp:873 -msgid "Mobile Phone" +msgid "Beer mug" msgstr "" #: emoticontheme.cpp:874 +msgid "Martini glass" +msgstr "" + +#: emoticontheme.cpp:875 +msgid "Coffee cup" +msgstr "" + +#: emoticontheme.cpp:876 +msgid "Birthday cake" +msgstr "" + +#: emoticontheme.cpp:877 +msgid "Plate" +msgstr "" + +#: emoticontheme.cpp:878 +msgid "Bowl" +msgstr "" + +#: emoticontheme.cpp:879 +msgid "Star" +msgstr "" + +#: emoticontheme.cpp:880 +msgid "Rainbow" +msgstr "" + +#: emoticontheme.cpp:881 +msgid "Stormy cloud" +msgstr "" + +#: emoticontheme.cpp:882 +msgid "Lightning" +msgstr "" + +#: emoticontheme.cpp:883 +msgid "Umbrella" +msgstr "" + +#: emoticontheme.cpp:884 +msgid "Island with a palm tree" +msgstr "" + +#: emoticontheme.cpp:885 +msgid "Telephone receiver" +msgstr "" + +#: emoticontheme.cpp:886 +msgid "Mobile Phone" +msgstr "" + +#: emoticontheme.cpp:887 msgid "Email" msgstr "Epost" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 #, fuzzy msgid "Clock" msgstr "(Blokeeritud)" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 #, fuzzy msgid "Camera" msgstr "Sinu nimi" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 #, fuzzy msgid "Money" msgstr "Kuu" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" msgstr "" -#: emoticontheme.cpp:883 -msgid "Soccer ball" +#: emoticontheme.cpp:896 +msgid "Football ball" msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 #, fuzzy msgid "KMess Icon" msgstr "KMess" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Yhendus serveriga jupsib." + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "Yhendus serveriga jupsib." -#: initialview.cpp:377 -msgid "Connect" -msgstr "Yhenda" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "&Katkesta" +msgctxt "Button label" +msgid "&Connect" +msgstr "&Yhenda" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: kmess.cpp:223 +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Eposti aadress:" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "Kuva eposti info kontakti loendis" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "Uus &Grupp" -#: kmess.cpp:226 +#: kmess.cpp:253 #, fuzzy -msgid "Add a group" +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "&Lisa Grupp" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Sisesta uus nimi sellele grupile:" -#: kmess.cpp:569 +#: kmess.cpp:577 #, fuzzy msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "Oled kindel et tahad grupi kustutada?" -#: kmess.cpp:571 +#: kmess.cpp:579 #, fuzzy -msgid "Remove contact" +msgid "Remove Contact" msgstr "&Eemalda Kontakt" -#: kmess.cpp:573 +#: kmess.cpp:581 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "Eemaldatud" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "Oled kindel et tahad grupi kustutada?" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "Eemaldatud" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Seda erilist gruppi ei saa muuta" -#: kmess.cpp:671 +#: kmess.cpp:677 #, fuzzy -msgid "Rename group" +msgid "Rename Group" msgstr "Ym&ber nimeta Grupp" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Sisesta uus nimi sellele grupile:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "Ei suutnud tuvastada" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Yhenduse sai taim-audi" + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Yhenduseta" -#: kmess.cpp:1408 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" msgstr "" -#: kmess.cpp:1412 +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" + +#: kmess.cpp:1481 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Eposti Teade" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Tegevused" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Uus &Kontakt" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Uus &Grupp" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "O&tsi Kontakti" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Otsi &Huvide alusel" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "O&tsi Kontakti" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Uus &Kasutaja" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Kasutaja &Seaded" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "Yh&enda" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&Katkesta" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "Kuva Mu &Profiil" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Mu Staatus" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Eemal teatega" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "Kuva &Lubatud Kontaktid" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 #, fuzzy msgid "Show &Offline Contacts" msgstr "Kuva &Lubatud Kontaktid" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "Kuva &Eemaldatud Kontaktid" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +msgid "Show &History Box" +msgstr "" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Kuva/Peida &Kontakti Kylgriba" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "Tahan &Smile'si" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "Pilt:" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "&Sorteeri Kontaktid" + +#: kmessinterface.cpp:177 +msgid "Show &Transfer Window..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "Uus &Kontakt" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "Uus &Grupp" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "O&tsi Kontakti" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "O&tsi Kontakti" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Otsi &Huvide alusel" + +#: kmessinterface.cpp:187 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "Uus &Kasutaja" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Uus &Kasutaja" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "Epost" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "&Sorteeri Kontaktid" - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "Grupp" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Sidus/Vallas" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" +#: kmessinterface.cpp:299 +msgid "Show &Network Window..." msgstr "" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 #, fuzzy msgid "[%1] %2 goes online" msgstr " on offline'is" -#: kmessview.cpp:363 +#: kmessview.cpp:357 #, fuzzy msgid "[%1] %2 goes offline" msgstr " on offline'is" -#: kmessview.cpp:559 +#: kmessview.cpp:590 #, fuzzy msgid "Cha&t" msgstr "Jutt" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Omadused" -#: kmessview.cpp:569 +#: kmessview.cpp:600 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "Ee&malda Grupp" -#: kmessview.cpp:574 +#: kmessview.cpp:605 #, fuzzy -msgid "&Listening Music" -msgstr "Saadan faili " +msgid "Song &Name" +msgstr "Sinu nimi" -#: kmessview.cpp:601 +#: kmessview.cpp:632 #, fuzzy msgid "&Copy to Group" msgstr "&Liiguta Gruppi" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "&Liiguta Gruppi" -#: kmessview.cpp:646 +#: kmessview.cpp:683 #, fuzzy msgid "Move Group &Down" msgstr "&Liiguta Gruppi" -#: kmessview.cpp:647 +#: kmessview.cpp:684 #, fuzzy msgid "Move Group &Up" msgstr "&Liiguta Gruppi" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "Ee&malda Grupp" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Ym&ber nimeta Grupp" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "Epost" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Eposti aadress:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Eposti klient" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +#: kmessview.cpp:1156 +msgid "No" msgstr "" -#: kmessview.cpp:1076 +#: kmessview.cpp:1159 #, fuzzy -msgctxt "Last time a message was received" -msgid "Last message: %1" +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "(Blokeeritud)" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "Sinu teate kirjatyyp:" -#: kmessview.cpp:1085 +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Sinu teate kirjatyyp:" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "&Lisa Kontakt" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "&Lisa Kontakt" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "&Lisa Kontakt" +msgstr[1] "&Lisa Kontakt" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "&Lisa Kontakt" +msgstr[1] "&Lisa Kontakt" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr " nokib nuppe." + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 msgid "Project support" msgstr "" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "GnomeMeeting arendaja" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "Saksa keelestanud, testimine, dokumentatsioon, ja veeb" -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "Veebi kujundus" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "Peamine ja kolla/sini/lilla smile'd ja Itaalia keelde pannud" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Liikuvad smile'd" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Algne helitaust" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Araabia keelestamine, faili salvestamise paranduseinternatsionaliseerimine." -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 #, fuzzy msgid "More Arabic translation" msgstr "Veel Tyrgi keelestamist" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Braziilia ja Portigali keelde pannud" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Braziilia ja Portigali keelde pannud" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 #, fuzzy msgid "Catalan translation" msgstr "Kataloonia keelde pannud" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "Lihtsustatud Hiina keelde pannud" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 #, fuzzy msgid "More Simplified Chinese translation" msgstr "Lihtsustatud Hiina keelde pannud" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 #, fuzzy msgid "Traditional Chinese translation" msgstr "Kataloonia keelde pannud" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Kataloonia keelde pannud" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 #, fuzzy msgid "Danish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "More Danish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "Taani keelde pannud" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 #, fuzzy msgid "More Dutch translation" msgstr "Taani keelde pannud" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Veel Tyrgi keelestamist" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Prantsuse keelde pannud" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 #, fuzzy msgid "Estonian translation" msgstr "Korea keelde pannud" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 #, fuzzy msgid "Finnish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 #, fuzzy msgid "More Finnish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "Prantsuse keelde pannud" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 #, fuzzy msgid "More French translation, MSN6 emoticon definitions" msgstr "Prantsuse keelde pannud" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 #, fuzzy msgid "More French translation" msgstr "Prantsuse keelde pannud" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 #, fuzzy msgid "Hungarian translation" msgstr "Korea keelde pannud" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Korea keelde pannud" + +#: main.cpp:115 main.cpp:116 #, fuzzy msgid "More Italian translation" msgstr "Korea keelde pannud" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "Korea keelde pannud" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 #, fuzzy msgid "Norsk Bokmål translation" msgstr "Norra keelde pannud" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Korea keelde pannud" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "Korea keelde pannud" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 #, fuzzy msgid "Slovenian translation" msgstr "Korea keelde pannud" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 #, fuzzy msgid "More Spanish translation" msgstr "lisa Hispaania keelde panekut" -#: main.cpp:123 +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 #, fuzzy msgid "Swedish translation" msgstr "Hispaania keelde pannud" -#: main.cpp:125 -#, fuzzy -msgid "Thai translation" -msgstr "Tai keelde pannud" - -#: main.cpp:126 -msgid "Turkish translation" -msgstr "Tyrgi keelde pannud" - -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "Veel Tyrgi keelestamist" - -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" - -#: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Faili ylekanne valmis." +msgid "More Swedish translation" +msgstr "Hispaania keelde pannud" -#: main.cpp:134 -msgid "P4-Context field support" +#: main.cpp:135 +msgid "Rachan Hongpairote" msgstr "" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Xinerama parandused" +#, fuzzy +msgid "Thai translation" +msgstr "Tai keelde pannud" #: main.cpp:136 -msgid "Original file receive code" -msgstr "Algne faili rabamis kood" +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Tyrgi keelde pannud" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" msgstr "" +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "Veel Tyrgi keelestamist" + #: main.cpp:138 -msgid "KWallet support" +msgid "Uğur Çetin" msgstr "" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "Online" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Faili ylekanne valmis." + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Xinerama parandused" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "Algne faili rabamis kood" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "Eri internatsionaliseerimise parandused." -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Eri internatsionaliseerimise parandused." -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "GnomeMeeting arendaja" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Kutt kellel on kott peas" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspiraator ja osa koodist" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 #, fuzzy msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "Hyppava teate kood" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "EemalTaimeri kood" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "Your name here?" msgstr "Sinu nimi" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Sinu nimi" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "Sinu eposti aadress:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Sisene automaatselt selle aadressiga" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Lubatud" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Eemaldatud" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 #, fuzzy msgid "The contact cancelled the session." msgstr "Sa loobusid kutsest." @@ -3026,69 +4428,111 @@ msgid "You have rejected the invitation." msgstr "Sa keeldusid kutsest." #: network/applications/application.cpp:540 -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "" #: network/applications/application.cpp:581 -msgid "Click to cancel." +msgid "Click to cancel." msgstr "" -#: network/applications/filetransfer.cpp:134 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Tahad sa saada faili: " +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "katkes. ei saanud faili avada." -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "katkes. ei saanud faili avada." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Ylekanne kinnitatud." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 #, fuzzy msgid "Connecting to %1, port %2" msgstr "Yhenduse sai taim-audi" -#: network/applications/filetransfer.cpp:339 +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 #, fuzzy -msgid "The transfer was cancelled" -msgstr "Ylekanne kinnitatud." +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Sa loobusid kutsest." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "Sa loobusid kutsest." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "Sa loobusid kutsest." + +#: network/applications/filetransfer.cpp:490 #, fuzzy msgid "Connection established" msgstr "Yhenduse sai taim-audi" -#: network/applications/filetransfer.cpp:456 +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 #, fuzzy -msgid "Successfully transferred file: %1" +msgid "Successfully sent file "%1"." msgstr "Edukalt rabatud fail: " -#: network/applications/filetransfer.cpp:620 +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 #, fuzzy -msgid "The transfer of %1 failed. The file does not exist." +msgid "Successfully received file "%1"." +msgstr "Edukalt rabatud fail: " + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "katkes. ei saanud faili avada." -#: network/applications/filetransfer.cpp:624 +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 #, fuzzy -msgid "The transfer of %1 failed. The file could not be read." +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "katkes. Yhendust ei saanud avada" -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 #, fuzzy -msgid "Sending file %1" +msgid "Sending file "%1" (%2)." msgstr "Saadan faili " -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Sa loobusid kutsest." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3100,69 +4544,14 @@ msgstr "" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "Sa loobusid kutsest." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "katkes. ei saanud faili avada." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Sa loobusid kutsest." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Sa loobusid kutsest." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Edukalt rabatud fail: " - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Edukalt rabatud fail: " - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "katkes. ei saanud faili avada." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "katkes. Yhendust ei saanud avada" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Saadan faili " - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Sa loobusid kutsest." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Sind on kutsutud kohtumisele (kasutades GnomeMeeting'ut)." @@ -3176,31 +4565,31 @@ msgstr "Stardin GnomeMeeting'u. Yhendan " msgid "Inviting the contact to a meeting." msgstr "Kutsun kontakti kohtumisele." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 #, fuzzy msgid "The invitation was aborted. An internal error occured." msgstr "Kontakt keeldus kutsest." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 #, fuzzy msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "katkes. Ei suutnud avada soketit" -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 #, fuzzy msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "Sa loobusid kutsest." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 #, fuzzy msgid "The invitation was aborted." msgstr "Sa loobusid kutsest." @@ -3214,106 +4603,106 @@ msgstr "Sind kutsuti selle isiku lauda jagama." msgid "Starting KRDC. Connecting to %1." msgstr "Stardin KRDC. Yhendun " -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -#, fuzzy -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kontakt keeldus kutsest." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" -#: network/applications/p2papplicationbase.cpp:609 -#, fuzzy -msgid "The transfer failed." -msgstr "Asja rabamine nagu " - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "" -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" - -#: network/applications/p2papplicationbase.cpp:996 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "katkes. Ei suutnud avada soketit" - -#: network/applications/p2papplicationbase.cpp:1015 -#, fuzzy -msgid "The transfer failed. An internal error occured." -msgstr "Kontakt keeldus kutsest." - -#: network/applications/p2papplicationbase.cpp:1176 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "katkes. Ei suutnud avada soketit" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 #, fuzzy msgid "The transfer failed. Data preparation failed." msgstr "Sa loobusid kutsest." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "Sa loobusid kutsest." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 #, fuzzy msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "katkes. Ei suutnud avada soketit" -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakt keeldus kutsest." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "katkes. Ei suutnud avada soketit" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "katkes. Ei suutnud avada soketit" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" +#: network/applications/p2papplicationbase.cpp:769 +#, fuzzy +msgid "The transfer failed." +msgstr "Asja rabamine nagu " + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1170 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "katkes. Ei suutnud avada soketit" + +#: network/applications/p2papplicationbase.cpp:1189 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Kontakt keeldus kutsest." + +#: network/applications/p2papplicationbase.cpp:1350 +#, fuzzy +msgid "The transfer failed. Couldn't open data source." +msgstr "katkes. Ei suutnud avada soketit" + #: network/applications/voiceconversation.cpp:71 #, fuzzy msgid "You are invited to start a voice conversation." @@ -3351,803 +4740,1444 @@ msgstr "Stardin GnomeMeeting'u. Yhendan " msgid "Inviting the contact to a voice conversation." msgstr "Kutsun kontakti kohtumisele." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 #, fuzzy msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "Kontakt kutsub sind alustama " -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Sa loobusid kutsest." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:119 +#: network/applications/webcamtransferp2p.cpp:138 #, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "Asja rabamine nagu " +msgid "You are invited to view this person's webcam." +msgstr "Sind kutsuti selle isiku lauda jagama." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 +#: network/extra/msnftpconnection.cpp:204 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +msgid "Sending file %1" +msgstr "Saadan faili " + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "katkes. ei saanud faili avada." -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy msgid "Couldn't open a local port." msgstr "katkes. ei saanud faili avada." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:478 +#: network/extra/msnftpconnection.cpp:469 #, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +msgid "The transfer of %1 failed. A connection could not be made." msgstr "katkes. Yhendust ei saanud avada" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 #, fuzzy msgid "Receiving file %1" msgstr "Raban faili " -#: network/msnconnection.cpp:589 -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "Yhendus katkestatud teise logini kasuks" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Saavutati synkroon" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Ei suutnud tuvastada" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -msgid "Authentication failed, please verify your account name and password." -msgstr "" - -#: network/msnnotificationconnection.cpp:1993 -#, fuzzy -msgid "Connecting..." -msgstr "Yhenda" - -#: network/msnnotificationconnection.cpp:2167 -msgid "Unknown command received from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 +#: network/msnconnection.cpp:404 #, fuzzy -msgid "The account name given is invalid" +msgid "The given account name is invalid" msgstr "Kasutaja nimi on vale" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "Su kontakti loendisse ei mahu enam" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 #, fuzzy msgid "This contact is already on your list" msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 #, fuzzy msgid "This contact is not on your list" msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -#: network/msnnotificationconnection.cpp:2251 +#: network/msnconnection.cpp:444 #, fuzzy -msgid "Your contact list has too many groups" +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "Su kontakti loendisse ei mahu enam" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 #, fuzzy msgid "This group can't be changed" msgstr "Seda erilist gruppi ei saa muuta" -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "Su kontakti loendisse ei mahu enam" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 #, fuzzy msgid "There was an internal error in KMess: %1" msgstr "Serveris oli sisene viga" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "Ym&ber nimeta Grupp" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 #, fuzzy msgid "Transfer to switchboard server failed" msgstr "Saadan teate serverile" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -msgid "No permissions given for this account" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "Asja rabamine nagu " -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" msgstr "" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "Sa loobusid kutsest." -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 #, fuzzy msgid "Bad friend name" msgstr "Sinu tore nimi:" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "Ei suutnud tuvastada" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "" -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" msgstr "" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -#: network/msnnotificationconnection.cpp:2371 -msgid "Your passport account needs to be verified first." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." msgstr "" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "Serveris oli sisene viga" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Otsa teatis server on maas" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 #, fuzzy msgid "The server is going down" msgstr "Server tuleb maha varsti" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "Server tuleb maha varsti" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 #, fuzzy msgid "The server is not available" msgstr "Server pole saadaval" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Ei suutnud tuvastada" -#: network/msnnotificationconnection.cpp:2449 -msgid "Unknown error code received from the server: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +#, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" +msgstr "Serveri Viga" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "Ei suutnud tuvastada" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "Ei suutnud tuvastada" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +#, fuzzy +msgid "Connecting..." +msgstr "Yhenda" + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "minutit" msgstr[1] "minutit" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" msgstr "" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -msgid "KMess could not process Offline-IM messages.
Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "Ei suutnud tuvastada" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "Serveris oli sisene viga" -#: network/msnnotificationconnection.cpp:3242 -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2932 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "Yhendus katkestatud teise logini kasuks" + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "Yhendus serveriga jupsib." -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Serveri Viga" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:681 +#, fuzzy +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "Serveris oli sisene viga" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "Yhenduse sai taim-audi" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 #, fuzzy msgid "1 ping lost" msgstr "Raban loendid" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 #, fuzzy msgid "%1 pings lost" msgstr "Raban loendid" -#: network/msnsockettcp.cpp:387 +#: network/msnsockettcp.cpp:395 #, fuzzy -msgid "The connection to the server was lost." +msgid "The connection to the server was lost" msgstr "Yhendus serveriga jupsib." -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "See isik on offline'is v6i peidus" - -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "ei l4inud kohale." +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Server pole saadaval" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "" - -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "" - -#: notification/chatnotification.cpp:163 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/chatnotification.cpp:171 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Server pole saadaval" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" msgstr " on liinil" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:158 +#, fuzzy +msgid "%1 says:
'%2'" +msgstr " on liinil" + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" +msgstr " on liinil" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" msgstr "" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" -msgstr "" +#: notification/chatnotification.cpp:174 +#, fuzzy +msgid "%1:
%2" +msgstr " on liinil" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr " on liinil" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr " on liinil" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr " on liinil" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 msgid "%1 wants to use the webcam!" msgstr "" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr " on liinil" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr " on liinil" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "Sa loobusid kutsest." -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "Sa loobusid kutsest." -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 msgid "%1's activity has been canceled!" msgstr "" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "Sa loobusid kutsest." -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "Sa loobusid kutsest." -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr " on liinil" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "Sa loobusid kutsest." -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "Asja rabamine nagu " -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 msgid "%1's activity has ended!" msgstr "" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" msgstr "" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "Asja rabamine nagu " -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 msgid "%1's activity has ended with an error!" msgstr "" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" +msgid "%1
is now online" msgstr " on liinil" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" +msgid "%1
has gone away" msgstr " on liinil" -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" +#: notification/contactstatusnotification.cpp:93 +#, fuzzy +msgid "%1
will be right back" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy +msgid "%1
is now busy" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy +msgid "%1
has become invisible" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy +msgid "%1
has gone idle" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy +msgid "%1
has logged out" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy +msgid "%1
is on the phone" +msgstr " on liinil" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy +msgid "%1
is out for lunch" +msgstr " on liinil" + +#: notification/newemailnotification.cpp:90 +#, fuzzy +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr " on liinil" + +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Alusta &Vestlust" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Systeemi Teade" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Sisesta Eemal teade" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" msgstr "" -#: notification/contactstatusnotification.cpp:73 +#: notification/notificationmanager.cpp:130 #, fuzzy -msgid "%1 is now busy" -msgstr " on liinil" +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&Saada epost" -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr " on liinil" - -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr " on liinil" - -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr " on liinil" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr " on liinil" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr " on liinil" - -#: notification/newemailnotification.cpp:78 -msgid "New email:
'%1'
by '%2'" +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -#: settings/accountpage.cpp:69 +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " nokib nuppe." + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "" -#: settings/accountpage.cpp:70 -msgid "Browse and crop picture..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." msgstr "" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "Pilt:" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "&Eemalda Kontakt" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Seaded" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 #, fuzzy msgid "Account" msgstr "Kasutajad" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "Kasutajad" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Alarmid" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "Eposti Teade" +msgid "Contact List" +msgstr "&Lisa Kontakt" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Jutustamine" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Jutu logimine" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Oled kindel et tahad konto kustutada?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "Oled kindel et tahad konto kustutada?" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Tahan &Smile'si" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Oled kindel et tahad konto kustutada?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Tahan &Smile'si" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "Seaded" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Kasutajad" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "Eposti Teade" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "Salvesta jutu failid sellesse pea kausta:" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 -msgid "- %1 (%2)" +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." msgstr "" +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "&Lisa Kontakt" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "ei l4inud kohale." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "ei l4inud kohale." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "ei l4inud kohale." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "ei l4inud kohale." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "(Blokeeritud)" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Topi yks smile'i" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "Eposti aadress: " + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "(Blokeeritud)" + +#, fuzzy +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Sinu teate kirjatyyp:" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "&Lisa Kontakt" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "Kuva &Lubatud Kontaktid" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "O&tsi Kontakti" + +#~ msgid "Alerts" +#~ msgstr "Alarmid" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "Eposti Teade" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Ee&malda Grupp" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "Saadan faili " + +#~ msgid "&Send email" +#~ msgstr "&Saada epost" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "Yhenduses" + +#~ msgid "Connect" +#~ msgstr "Yhenda" + +#, fuzzy +#~ msgid "Rename group" +#~ msgstr "Ym&ber nimeta Grupp" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "Kasutaja &Seaded" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr " on liinil" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr " on liinil" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr " on liinil" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr " on liinil" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "Eposti Teade" + +#, fuzzy +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Kuva teated kui kontaktid lahkuvad" + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "Offline'is" + +#, fuzzy +#~ msgid "S&end you a message" +#~ msgstr "Sisesta Eemal teade" + +#, fuzzy +#~ msgid "Go o&ffline" +#~ msgstr "Offline'is" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "Eposti aadress:" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "Kuva teade kui kiri tuleb \"teistesse kausta\"" + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "teises kaustas" + +#~ msgid "Hide popups after" +#~ msgstr "Peida teade peale" + +#~ msgid "seconds" +#~ msgstr "sekundit" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "Alarmid" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "&Lisa Kontakt" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "Parool:" + +#, fuzzy +#~ msgid "Log &all chats" +#~ msgstr "Logi kogu jutt" + +#, fuzzy +#~ msgid "Month" +#~ msgstr "Kuu" + +#~ msgid "Day" +#~ msgstr "P4ev" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "&Lisa Kontakt" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "O&tsi Kontakti" + +#~ msgid "This person is offline or invisible." +#~ msgstr "See isik on offline'is v6i peidus" + +#, fuzzy +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "ei l4inud kohale." + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "Kuva/Peida &Kontakti Kylgriba" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "Kuva, peida kontakti kylgriba" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "Kuva, peida kontakti kylgriba" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "&Kutsu" + +#, fuzzy +#~ msgid "Copy E&mail" +#~ msgstr "Epost" + +#~ msgid "Specify an Away message" +#~ msgstr "Sisesta Eemal teade" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "Epost" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "Epost" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "Lisa see kontakt oma \"Tuttavate\" loentisse" + +#, fuzzy +#~ msgid "Click" +#~ msgstr "(Blokeeritud)" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Veebi kujundus" + +#~ msgid "Co&nnect" +#~ msgstr "Yh&enda" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "Kasutaja &Seaded" + +#~ msgid "Got synchronization" +#~ msgstr "Saavutati synkroon" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Seaded" + +#, fuzzy +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Tahad sa saada faili: " + +#, fuzzy +#~ msgid "The transfer was cancelled" +#~ msgstr "Ylekanne kinnitatud." + +#, fuzzy +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Edukalt rabatud fail: " + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "katkes. ei saanud faili avada." + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "katkes. Yhendust ei saanud avada" + +#, fuzzy +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "Asja rabamine nagu " + #~ msgid "Picture:" #~ msgstr "Pilt:" @@ -4155,10 +6185,6 @@ msgstr "" #~ msgid "Speed:" #~ msgstr "Serveri Viga" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Kuva eposti info kontakti loendis" - #~ msgid "Logging in..." #~ msgstr "Login sisse..." @@ -4185,10 +6211,6 @@ msgstr "" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "uut kirja postkastis" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "Online" - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "katkes. ei saanud faili avada." @@ -4216,10 +6238,6 @@ msgstr "" #~ msgid "Your password:" #~ msgstr "Sinu parool:" -#, fuzzy -#~ msgid "Display picture:" -#~ msgstr "Pilt:" - #, fuzzy #~ msgid "Show notifications when you recei&ve an email" #~ msgstr "Kuva teade kui kiri tuleb \"teistesse kausta\"" @@ -4359,10 +6377,6 @@ msgstr "" #~ msgid "Show popup notifications for program events" #~ msgstr "Kuva teated programmi syndmustest" -#, fuzzy -#~ msgid "Connection good" -#~ msgstr "Yhenduse sai taim-audi" - #, fuzzy #~ msgid "Server too busy" #~ msgstr "Server on umbes" @@ -4396,13 +6410,6 @@ msgstr "" #~ msgid "There may be a problem with the servers" #~ msgstr "Serveritaga on ilmselt mingi kamm" -#~ msgid "System Message" -#~ msgstr "Systeemi Teade" - -#, fuzzy -#~ msgid "Show incoming server messages" -#~ msgstr "Kuva graafika jutu sees" - #, fuzzy #~ msgid "Show outgoing server messages" #~ msgstr "Kuva graafika jutu sees" @@ -4423,7 +6430,3 @@ msgstr "" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "Raba uusi smile'si ja helisi" - -#, fuzzy -#~ msgid "n&ame" -#~ msgstr "Sinu nimi" diff --git a/po/fi.po b/po/fi.po index 79b560e..08f8772 100644 --- a/po/fi.po +++ b/po/fi.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: fi\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2007-08-12 22:01+0300\n" "Last-Translator: Jussi Timperi \n" "Language-Team: Finnish\n" @@ -18,82 +18,186 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 #, fuzzy +msgid "Standard text mode" +msgstr "Cartoon-hymiöteema" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Näytä &aika viesteissä" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Cartoon-hymiöteema" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Cartoon-hymiöteema" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Olio" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +#, fuzzy msgid "Ne&w Line" msgstr "Uusi rivi" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 #, fuzzy msgid "S&end" msgstr "Lä&hetä" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "Yhteistiedot" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Keskustele" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Näytä/Piilota &yhteystietopalkki" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "Tyhjennä välilehti" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "Vaihda kirjasimen väri&ä" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "&Uudelleennimeä ryhmä" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 #, fuzzy msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "Syötä lisättävän henkilön sähköpostiosoite:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Email address" -msgstr "Sähköpostiosoite:" +msgid "Email address:" +msgstr "Sähköpostiosoite: " -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 #, fuzzy -msgid "Initial group" -msgstr "&Uudelleennimeä ryhmä" +msgid "Enter a shortcut for the emoticon:" +msgstr "Anna ryhmälle uusi nimi:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -101,355 +205,581 @@ msgstr "" "Kirjoita viesti, joka lähetetään automaattisesti\n" "henkilölle, joka yrittää lähettää sinulle viestin:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 #, fuzzy -msgid "&Automatic away message" +msgid "&Specify an automatic away message:" msgstr "Kirjoita poissaoloviesti" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "&Etsi yhteystietoa" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Keskustelun kirjoitus lokiin" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "to" +msgstr "Auto" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "&Aloita tai lopeta keskustelu" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" msgstr "&Lisää tämä yhteystieto \"Ystävät\"-listallesi" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "&Älä lisää tätä henkilöä listalle, mutta anna hänen nähdä tilasi" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "&Estä tätä henkilöä ottamasta sinuun yhteyttä ja näkemästä sinua" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "Yhteystiedon %1 ominaisuudet" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +#, fuzzy msgid "&Information" +msgstr "Näytä sähköpostitiedot" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 #, fuzzy -msgid "Restore" +msgid "&Restore" msgstr "Poistettu" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Use alternative name for this person" +msgid "&Groups:" +msgstr "Ryhmä" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" msgstr "Käytä tälle henkilölle vaihtoehtoista nimeä" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 #, fuzzy -msgid "Show a popup when the contact goes online/offline" +msgid "Show a &popup when the contact goes online/offline" msgstr "Näytä viestikupla, kun tämä henkilö kirjautuu sisään tai ulos" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "Ääni:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Keskustelukuvake" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 #, fuzzy msgid "&Clear Cache" msgstr "Tyhjennä välilehti" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 #, fuzzy -msgid "Notes" +msgid "&Notes" msgstr "Huomautus" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "Hymiöt" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +#, fuzzy +msgid "Remo&ve" +msgstr "Poistettu" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "Salli &keskustelukumppani" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "Tämä yhteystieto ei ole listallasi" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "Yhteistiedot" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "Yhdistetään kohteeseen %1, portti %2" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +#, fuzzy +msgid "Format" +msgstr "Vuohi" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "Yhteistiedot" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +#, fuzzy +msgid "Select All" +msgstr "&Valitse Kaikki" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +#, fuzzy +msgid "Deselect All" +msgstr "&Valitse Kaikki" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "Hämillään" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Verkkoyhteysikkuna" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +#, fuzzy msgid "Command to Current Tab" -msgstr "" +msgstr "Sulje välilehti" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "Tyyppi:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 #, fuzzy msgid "Standard" msgstr "Tähti" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "Lä&hetä" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "Sähköpostiosoite: " +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "&Siivoa" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "Hämillään" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Syötä lisättävän henkilön sähköpostiosoite:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "Salasana:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -#, fuzzy -msgid " Account options " -msgstr "Tilin &Asetukset" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 #, fuzzy -msgid "Remem&ber this profile" +msgid "If enabled, KMess will save your account" +msgstr "Jos valittu, KMess kirjautuu sisään automaattisesti tällä tunnuksella." + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +#, fuzzy +msgid "Remem&ber account" msgstr "Muista tämä profiili" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "Salasana:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Yhdistä" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Syötä henkilökohtainen viestisi tähän" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +#, fuzzy +msgid "New Account" +msgstr "Uusi &Tili" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +#, fuzzy +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Yhdistä" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Toiminnot" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "Vuohi" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Käyttäjätili" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr "Tilin &Asetukset" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." msgstr "Syötä nimi, jonka haluat paikalla olevien yhteystietojesi näkevän." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "Lempinimesi:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +#, fuzzy msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" "Syötä MSN Passport -tunnuksesi sähköpostiosoite. Voit luoda uuden tunnuksen " "osoitteessa http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "Sähköpostiosoite: " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -457,46 +787,47 @@ msgstr "" "Syötä MSN Passport -tunnuksesi sähköpostiosoite. Voit luoda uuden tunnuksen " "osoitteessa http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "Salasana:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "Salasana:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "Keskustelukuvake" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 #, fuzzy msgid "C&hange..." msgstr "&Vaihda..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." @@ -508,347 +839,650 @@ msgstr "" "On suositeltavaa hyväksyä tämä valinta, ellet käytä KMessiä vieraana tai " "olet julkisella tietokoneella (vaikkapa Internet-kahvilassa)." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 #, fuzzy msgid "Re&member the settings of this account" msgstr "Muista tämän tilin asetukset" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "Jos valittu, KMess kirjautuu sisään automaattisesti tällä tunnuksella." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "Käynnistettäessä kirjaudu automaattisesti tällä tunnuksella" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "&Tallenna lokiin kaikki keskustelut" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 +#, fuzzy +msgid "" +"You can't change your friendly name because your Passport email address is " +"not verified." +msgstr "" +"Et voi vaihtaa lempinimeäsi, koska passport-sähköpostiasi ei olla vielä " +"varmistettu." + +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 +msgid "Request verification email" +msgstr "Pyydä varmistussähköpostia" + +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 +msgid "Go to accountservices.passport.net" +msgstr "Mene sivulle accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 +#, fuzzy +msgid "" +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " "Hotmail account to connect." msgstr "" "Tarvitset passport-tunnuksen yhdistääksesi MSN-palveluun. Voit rekisteröidä " "nykyisen sähköpostisi osoitteessa register.passport.com tai käyttää Hotmail-" "tiliä." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +#, fuzzy msgid "" -"You can't change your friendly name because your passport e-mail address is " -"not verified." -msgstr "" -"Et voi vaihtaa lempinimeäsi, koska passport-sähköpostiasi ei olla vielä " -"varmistettu." - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 -msgid "Request verification email" -msgstr "Pyydä varmistussähköpostia" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 -msgid "https://accountservices.passport.net/" -msgstr "https://accountservices.passport.net/" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 -msgid "Go to accountservices.passport.net" -msgstr "Mene sivulle accountservices.passport.net" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 -msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" "Yhdistääksesi MSN Messenger -palveluun, sinun tulee rekisteröidä " "sähköpostiosoite Passport-tiliksi." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "Luo uusi tili" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "Mene sivulle register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Jos valittu, tilasi muuttuu automaattisesti \"Poissa-Jouten\", kun et käytä " +"tietokonetta muutamaan minuuttiin." + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "&Vaihda tilaksi \"Poissa-jouten\", kun olet ollut hetken poissa" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"Muuttaa minuuttien määrää, ennen kuin KMess muuttaa tilaksi \"Poissa-Jouten" +"\"." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Vaihda tila kun on kulunut" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minuuttia" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 #, fuzzy msgid "Saved accounts:" msgstr "Käyttäjätilit" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -#, fuzzy -msgid "Click" -msgstr "Kello" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." +msgid "&Add Account..." msgstr "Käyttäjätili" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "Poistettu" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Virhe ilmoituksissa" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "Keskustelun kirjoitus lokiin" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "Tallenna &Tiedostoon" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Tallenna keskustelu" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +#, fuzzy +msgid "Create a directory to organize chats by year" +msgstr "" +"KMess luo automaattisesti alahakemistot, kun valitset lokien " +"järjesteltäväksi vuoden, kuukauden tai päivän mukaan." + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Vuosittain" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +#, fuzzy +msgid "Create directories to organize chats by year then by month" +msgstr "" +"KMess luo automaattisesti alahakemistot, kun valitset lokien " +"järjesteltäväksi vuoden, kuukauden tai päivän mukaan." + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +#, fuzzy +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" +"KMess luo automaattisesti alahakemistot, kun valitset lokien " +"järjesteltäväksi vuoden, kuukauden tai päivän mukaan." + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Tallenna kaikki keskustelut samaan hakemistoon" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Tallenna kaikki keskustelut samaan hakemistoon" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "Valitse hakemisto, jonne haluat lokitiedostojen tallentuvan." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "Tallennettujen keskustelujen juurihakemisto:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "Sallii KMessin kaikkien keskustelujen teeman vaihdon." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "Keskustelun tyyli:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "Asetukset" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Ottaa käyttöön hymiöt keskusteluissa." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "Näytä &hymiöt" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Näytä &hymiöt" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +#, fuzzy +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Tämä valinta mahdollistaa saman yhteystiedon viestien ryhmittämisen. Kun " +"yhteystieto kirjoittaa usean viestin kerrallaan, KMess ryhmittelee viestit " +"yhtenä viestinä. Tarkka ulkonäkö riippuu käyttämästäsi keskustelutyylistä." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "&Ryhmitä allekkain samalta henkilöltä tulleet viestit" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Näyttää aikaleiman jokaisessa viestissä." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Näytä &aika viesteissä" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "Yhteistiedot" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Show notifications when your contacts:" -msgstr "Näytä ilmoitus kun yhteystieto lähtee pois linjoilta" +msgid "Show s&econds" +msgstr "Näytä &hymiöt" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +#, fuzzy +msgid "&Text" +msgstr "&Kopioi teksti" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Tämä on kirjasimen tyyli ja väri, joka näkyy keskusteluviesteissäsi." + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "Keskustelujen kirjasinlaji:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"Sallii käytettävän tätä fonttia ennemmin kuin keskustelukavereiden " +"määrittämiä." + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "Pakota keskustelukavereiden viesteihin kirjasinlaji:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Tyhjennä välilehti" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 #, fuzzy msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." msgstr "" -"Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto katoaa " -"linjoilta." +"Mahdollistaa kirjasinefektit seuraavalla tavalla: Kirjoittamalla " +"*lihavoitua*, /kursivoitua/ ja _alleviivattua_ tekstiä, saat lihavoitua, " +"kursivoitua tai alleviivattua tekstiä." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 #, fuzzy -msgid "&Go online" -msgstr "Poissa linjoilta" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 -#, fuzzy -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" msgstr "" -"Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto katoaa " -"linjoilta." +"Käytä kirjasin&efektejä viesteissä, esim. *lihavointi*, /kursiivi/ ja " +"_alleviivaus_" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -#, fuzzy -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" -"Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto katoaa " -"linjoilta." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -#, fuzzy -msgid "S&end you a message" -msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -#, fuzzy -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" -"Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto katoaa " -"linjoilta." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" -"Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto katoaa " -"linjoilta." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -#, fuzzy -msgid "Go o&ffline" -msgstr "Poissa linjoilta" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "Sähköpostiosoite:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "Näytä tiedote kun saat sähköpostia \"muihin kansioihin\"" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" -"Jos otettu käyttöön, viestikupla ilmestyy myös silloin, kun olet saanut " -"sähköpostia muihin kansioihin kuin vastaanotettuihin. Tämä valinta toimii " -"vain Hotmail-tilien kanssa." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "Muuttaa sekuntien määrää, jolloin puhekuplat katoavat." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Piilota puhekuplat " - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "sekunnin kuluttua" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "Hälytykset" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Näytä myös &poissaolevat" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -865,1158 +1499,1436 @@ msgstr "" "Keskustelukumppanit voivat lähettää useita herätteitä kerralla, mutta KMess " "ravistelee keskusteluikkunaa vain ensimmäisellä herätteellä.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 #, fuzzy msgid "Shake the chat &window when a nudge is received or sent" msgstr "Ravistele keskusteluikkunaa kun vastaanotetaan tai lähetetään heräte" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Älä näytä keskustelukuv&aketta" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "Yhteystietolistallasi on liian monta ryhmää" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +#, fuzzy +msgid "Always" +msgstr "Poissa" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +#, fuzzy +msgid "For contacts in the same group" +msgstr "Yhteystietolistallasi on liian monta ryhmää" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +#, fuzzy +msgid "Never" +msgstr "Nörtti" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Keskustelukuvake:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +#, fuzzy +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" "Jos otettu käyttöön, viestikupla näyttää, kun olet saanut sähköpostia. " "Numero lukemattomista sähköposteista näkyy yhteystietolistan yläpuolella. " "Tämä valinta toimii vain Hotmail-tilien kanssa." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 +#, fuzzy msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" "Jos käytössä, Kmess ilmoittaa keskustelukumppaneille mitä kuuntelet. Tämä " "tieto haetaan aktiivisista musiikkisoitinohjelmista." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" +msgid "Show contacts w&hich song I am listening to" msgstr "Ilmoita keskustelukumppaneille mitä kappaletta kuuntelen." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -#, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Jos valittu, tilasi muuttuu automaattisesti \"Poissa-Jouten\", kun et käytä " -"tietokonetta muutamaan minuuttiin." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "&Vaihda tilaksi \"Poissa-jouten\", kun olet ollut hetken poissa" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"Muuttaa minuuttien määrää, ennen kuin KMess muuttaa tilaksi \"Poissa-Jouten" -"\"." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Vaihda tila kun on kulunut" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minuuttia" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "Jos valittu, keskustelut tallennetaan määritettyyn hakemistoon." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "&Tallenna lokiin kaikki keskustelut" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "Valitse hakemisto, jonne haluat lokitiedostojen tallentuvan." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Tallennettujen keskustelujen juurihakemisto:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" -"KMess luo automaattisesti alahakemistot, kun valitset lokien " -"järjesteltäväksi vuoden, kuukauden tai päivän mukaan." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Vuosittain" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Kuukausittain" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Päivittäin" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Tallenna kaikki keskustelut samaan hakemistoon" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "Sallii KMessin kaikkien keskustelujen teeman vaihdon." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Keskustelun tyyli:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Asetukset" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Ottaa käyttöön hymiöt keskusteluissa." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Näytä &hymiöt" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Näyttää aikaleiman jokaisessa viestissä." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Näytä &aika viesteissä" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Tämä valinta mahdollistaa saman yhteystiedon viestien ryhmittämisen. Kun " -"yhteystieto kirjoittaa usean viestin kerrallaan, KMess ryhmittelee viestit " -"yhtenä viestinä. Tarkka ulkonäkö riippuu käyttämästäsi keskustelutyylistä." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "&Ryhmitä allekkain samalta henkilöltä tulleet viestit" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Poissa" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Yhteystietolistallasi on liian monta ryhmää" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Nörtti" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "Tämä on kirjasimen tyyli ja väri, joka näkyy keskusteluviesteissäsi." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "Keskustelujen kirjasinlaji:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"Sallii käytettävän tätä fonttia ennemmin kuin keskustelukavereiden " -"määrittämiä." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Pakota keskustelukavereiden viesteihin kirjasinlaji:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Mahdollistaa kirjasinefektit seuraavalla tavalla: Kirjoittamalla " -"*lihavoitua*, /kursivoitua/ ja _alleviivattua_ tekstiä, saat lihavoitua, " -"kursivoitua tai alleviivattua tekstiä." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"Käytä kirjasin&efektejä viesteissä, esim. *lihavointi*, /kursiivi/ ja " -"_alleviivaus_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Odotetaan yhteystietolistaa..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 #, fuzzy msgid "&Emoticon Themes" msgstr "Hymiöt" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 #, fuzzy msgid "Available emoticon styles:" msgstr "Hymiöiden tyyli:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 #, fuzzy msgid "&Custom Emoticons" msgstr "Cartoon-hymiöteema" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 #, fuzzy msgid "Custom emoticons for this account:" msgstr "Muista tämän tilin asetukset" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Käyttäjätili" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 #, fuzzy msgid "Re&name" msgstr "&Uudelleennimeä ryhmä" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -#, fuzzy -msgid "Remo&ve" -msgstr "Poistettu" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 #, fuzzy msgid "Web Browser" msgstr "Kuihtunut ruusu" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 #, fuzzy msgid "&Use the KDE default browser" msgstr "&Käytä oletuskuvaa" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 +#, fuzzy msgid "&Use an installed browser:" -msgstr "" +msgstr "&Käytä oletuskuvaa" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "Kirjoita poissaoloviesti" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "Sähköpostiohjelma" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 #, fuzzy -msgid "&Use the KDE default email client" +msgid "Use the &KDE default email client" msgstr "&Käytä oletuskuvaa" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +#, fuzzy +msgid "Use an &installed email client:" +msgstr "&Käytä oletuskuvaa" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "Tiedostosiirrot" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "Tallennettujen keskustelujen juurihakemisto:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 #, fuzzy msgid "and" msgstr "Surullinen" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "Tiedostosiirrot" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "Nimesi" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "Nimesi" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Olen poissa koneelta" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Nimesi" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "sinä@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "&Poista yhteystieto" + +#: accountsmanager.cpp:404 +#, fuzzy +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Uninen" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "" "Et voi aloittaa tätä kutsua, koska tässä keskustelussa on useita " "keskustelukumppaneita." -#: chat/chat.cpp:158 +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "%1 on liittynyt keskusteluun." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "%1 poistunut keskustelusta." -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "%1 poistunut keskustelusta." -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr "%1 ja %2 - Keskustele" -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr "%1 ja muut - Keskustele" -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr " (Tämä viesti lähetettiin automaattisesti)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" + +#: chat/chat.cpp:941 #, fuzzy -msgid "You received a wink from %1." +msgid "You have sent a wink" msgstr "Olet vastaanottanut olion henkilöltä %1" -#: chat/chat.cpp:971 +#: chat/chat.cpp:966 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 on nyt paikalla" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "on lähettänyt sinulle herätteen!" + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "Oliota ei voitu näyttää. Dataa ei voitu lukea." + +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." msgstr "" "Oliota ei voitu näyttää. Varmista, että sinulla on 'cabextract' asennettuna." -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Oliota ei voitu näyttää. Varmista, että sinulla on 'cabextract' asennettuna." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." msgstr "Oliota ei voitu näyttää. Dataa ei voitu lukea." -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1252 #, fuzzy -msgid "You have received a wink from %1" -msgstr "Olet vastaanottanut olion henkilöltä %1" +msgid "%1 has sent you a wink!" +msgstr "on lähettäny sinulle olion!" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 #, fuzzy -msgid "You received a nudge from %1!" +msgid "%1 has gone offline." +msgstr "%1 on liittynyt keskusteluun." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 on liittynyt keskusteluun." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "on lähettänyt sinulle herätteen!" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "Salli &keskustelukumppani" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." msgstr "Olet saanut herätteen henkilöltä %1!" -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1381 #, fuzzy -msgid "The message '%1' could not be sent." +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Olet vastaanottanut olion henkilöltä %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 on liittynyt keskusteluun." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "Viestiä \"%1\" ei vastaanotettu." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "Olet lähettänyt herätteen henkilölle %1!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "Lähetit herätteen!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 lähettää olion: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 sanoo:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Äänikeskustelua aloitetaan. Kuunnellaan: %1" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Kutsu" +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Yhdistä" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 +#, fuzzy msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" "Keskustelulokia ei voitu tallentaa. Varmista että sinulla on " "kirjoitusoikeudet kansioon johon lokit tallennetaan." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 +#, fuzzy msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" "Tiedosto %1 on jo olemassa.\n" "Haluatko ylikirjoittaa sen?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Ylikirjoita tiedosto" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "Yli&kirjoita" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 #, fuzzy msgid "Add this &Emoticon..." msgstr "Näytä &hymiöt" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Näytä &hymiöt" + +#: chat/chatview.cpp:833 #, fuzzy msgid "Send &Email" msgstr "&Lähetä sähköposti" -#: chat/chatview.cpp:1286 +#: chat/chatview.cpp:837 #, fuzzy -msgid "Copy E&mail" -msgstr "Sähköposti" +msgid "Add &Contact" +msgstr "&Lisää yhteystieto" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "Sähköpostiosoite:" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +#, fuzzy +msgid "&Copy Text" msgstr "&Kopioi teksti" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "&Valitse Kaikki" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "Save chat to &File" +msgid "C&lear Chat" +msgstr "Tyhjennä välilehti" + +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Tallenna &Tiedostoon" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Keskustele" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Yhteistiedot" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Hymiöt" + +#: chat/chatwindow.cpp:121 +#, fuzzy +msgid "My Emoticons" +msgstr "Hymiöt" + +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." +msgstr "" + +#: chat/chatwindow.cpp:331 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Sulje välilehti" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "Sulje välilehti" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "Sulje välilehti" + +#: chat/chatwindow.cpp:409 +#, fuzzy +msgid "&Invite..." +msgstr "&Kutsu" + +#: chat/chatwindow.cpp:410 +#, fuzzy +msgid "Send a &File..." msgstr "Lähetä &Tiedosto" -#: chat/chatwindow.cpp:493 +#: chat/chatwindow.cpp:411 +#, fuzzy +msgid "Webcam Chat" +msgstr "Tallenna keskustelu" + +#: chat/chatwindow.cpp:412 msgid "Start a &Meeting" msgstr "Aloita &Ryhmäkeskustelu" -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:413 msgid "Send a &Nudge!" msgstr "Lähetä &Heräte!" -#: chat/chatwindow.cpp:495 -msgid "Save chat" +#: chat/chatwindow.cpp:414 +#, fuzzy +msgid "Save Chat..." msgstr "Tallenna keskustelu" -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Hymiöt" - -#: chat/chatwindow.cpp:498 +#: chat/chatwindow.cpp:415 #, fuzzy msgid "Close &All Tabs" msgstr "Sulje välilehti" -#: chat/chatwindow.cpp:504 +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "&Vaihda kirjasin" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Vaihda kirjasimen väri&ä" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Näytä &hymiöt" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Näytä &aika viesteissä" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 #, fuzzy msgid "Meeting" msgstr "Asetukset" -#: chat/chatwindow.cpp:505 +#: chat/chatwindow.cpp:443 msgid "Nudge" msgstr "" -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "&Aloita tai lopeta keskustelu" +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Lähetä &Tiedosto" -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "&Vaihda kirjasin" +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Vaihda kirjasimen väri&ä" +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" -#: chat/chatwindow.cpp:576 +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Odotetaan yhteystietolistaa..." + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Yhteistiedot" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Odotetaan yhteystietolistaa..." + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Hymiöt" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Odotetaan yhteystietolistaa..." + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Hymiöt" + +#: chat/chatwindow.cpp:491 #, fuzzy msgid "&Font" msgstr "&Yhdistä" -#: chat/chatwindow.cpp:577 +#: chat/chatwindow.cpp:492 #, fuzzy msgid "Font &Color" msgstr "Vaihda kirjasimen väri&ä" -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 -msgid "Emoticons" -msgstr "Hymiöt" - -#: chat/chatwindow.cpp:658 +#: chat/chatwindow.cpp:493 #, fuzzy -msgid "My emoticons" -msgstr "Hymiöt" +msgid "C&lear Chat Window" +msgstr "Tyhjennä välilehti" -#: chat/chatwindow.cpp:738 +#: chat/chatwindow.cpp:561 #, fuzzy -msgid "&Settings" -msgstr "Asetukset" +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "&Aloita tai lopeta keskustelu" -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "Näytä &hymiöt" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "Näytä/Piilota &yhteystietopalkki" - -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Näytä/Piilota &yhteystietopalkki" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Näytä tai piilota yhteystietopalkki" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" msgstr "" -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "Sulje välilehti" - -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "Sulje välilehti" - -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "Näytä/Piilota &yhteystietopalkki" - -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "Näytä tai piilota yhteystietopalkki" - -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 kirjoittaa viestiä." - -#: chat/chatwindow.cpp:1575 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1 ja %2 - Keskustele" - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." msgstr "" -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Keskustele" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - Keskustele" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr "%1 kirjoittaa viestiä." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr "%1 ja %2 - Keskustele" + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr "%1 ja %2 - Keskustele" + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Aloita &Ryhmäkeskustelu" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" msgstr "&Lähetä sähköposti" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "&Näytä profiili" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Lisää yhteystieto" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "Salli &keskustelukumppani" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "&Poista yhteystieto" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Estä keskustelukumppani" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "&Salli käyttäjä" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 #, fuzzy msgid "&Friendly Name" msgstr "Lempinimesi:" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 #, fuzzy msgid "&Email Address" msgstr "Sähköpostiosoite:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "" +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" +msgstr "&Kopioi teksti" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Estetty" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "Tämä keskustelukumppani ei ole paikalla" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "Lisää yhteystieto" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Lisää hymiö" +msgid "Add New" +msgstr "Käyttäjätili" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 #, fuzzy msgid "Remove" msgstr "Poistettu" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 #, fuzzy msgid "Web Messenger" msgstr "Web-suunnittelu" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "Web-suunnittelu" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 #, fuzzy msgid "Windows Live Messenger %1" msgstr "Web-suunnittelu" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Web-suunnittelu" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Paikalla" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Poissa linjoilta" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Sallittu" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Poistettu" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 Mt" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 Mt" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Poissa" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Tulen pian takaisin" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Kiireinen" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Näkymätön" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Poissa" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Poissa (Automaattivastaus)" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Tulen pian takaisin" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Puhelimessa" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Lounaalla" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Näkymätön" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Poissa linjoilta" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Oma tila" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "&Katkaise yhteys" + +#: dialogs/addcontactdialog.cpp:49 #, fuzzy msgid "Add a Contact" msgstr "Lisää yhteystieto" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Poista ryhmä" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 #, fuzzy msgid "Add New Emoticon" msgstr "Näytä &hymiöt" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "Hymiöt" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 #, fuzzy -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "" "Tiedosto %1 on jo olemassa.\n" "Haluatko ylikirjoittaa sen?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "Kirjoita poissaoloviesti" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Keskustelun tyyli:" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Tiedoston %1 siirto epäonnistui. Paikallinen portti on kiinni." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "" "%1\n" "on lisännyt sinut yhteystietolistalleen. Haluatko:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Yhteystiedon %1 ominaisuudet" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Yhdistetty" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 #, fuzzy msgid "Not seen yet" msgstr "on lähettänyt sinulle" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "Näytä &aika viesteissä" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 #, fuzzy +msgctxt "Contact props dialog info" msgid "Last seen: %1" msgstr "on lähettänyt sinulle" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 #, fuzzy +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "on lähettänyt sinulle" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "Sähköposti" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Sähköpostiosoite: " -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "Sähköpostiohjelma" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Oletko varma, että haluat poistaa tämän tilin?" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Yhteistiedot" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Yhteistiedot" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "Yhteystiedon %1 ominaisuudet" + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "Yhdistetään kohteeseen %1, portti %2" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "" + +#: dialogs/listexportdialog.cpp:159 +#, fuzzy +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" +"Tiedosto %1 on jo olemassa.\n" +"Haluatko ylikirjoittaa sen?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "Odotetaan yhteystietolistaa..." + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "Tallenna välilehti" + #: dialogs/networkwindow.cpp:79 #, fuzzy -msgid "S&ave tab" -msgstr "Tallenna välilehti" +msgid "C&lear Tab" +msgstr "Tyhjennä välilehti" #: dialogs/networkwindow.cpp:80 #, fuzzy -msgid "C&lear tab" -msgstr "Tyhjennä välilehti" +msgid "C&lose All Tabs" +msgstr "Sulje välilehti" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 #, fuzzy msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "Yhteyksiä ei ole saatavilla. Verkkoikkunaa ei voi avata." -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 #, fuzzy msgid "" "Could not save the Network Window log. Make sure you have permission to " @@ -2025,86 +2937,101 @@ msgstr "" "Verkkoikkunan lokia ei voitu tallentaa. Varmista, että sinulla on " "kirjoitusoikeudet kansioon johon loki tallennetaan." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "Yhteysvälilehteä ei voida sulkea." -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 #, fuzzy msgid "Cannot send commands to this kind of connection!" msgstr "Yhteysvälilehteä ei voida sulkea." -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Tietokone" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 Mt" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kt" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 tavua" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 #, fuzzy -msgid "Cl&ean Up" -msgstr "&Siivoa" +msgid "&Use" +msgstr "Hämillään" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "&Poista yhteystieto" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Keskustelukuvake" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Keskustelukuvake" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Oletko varma, että haluat poistaa tämän tilin?" + +#: emoticontheme.cpp:612 #, fuzzy msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " @@ -2113,360 +3040,408 @@ msgstr "" "Verkkoikkunan lokia ei voitu tallentaa. Varmista, että sinulla on " "kirjoitusoikeudet kansioon johon loki tallennetaan." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Hymy" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "Olio" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Kieli ulkona" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "Iso hymy" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Surullinen" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "Itkee" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "Vihainen" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Hämillään" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "Häpeissään" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "Pettynyt" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "Kuuma" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "Hampaat paljaana" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "Nörtti" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "Sairas" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Yllättynyt" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Juhlii" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "Uninen" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "Miettii" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Älä kerro kenellekään" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "Salainen juttu" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "Pyörittelee silmiään" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "Sarkastinen" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "Tietämätön" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Tulen pian takaisin" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Enkeli" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Halaa vasemmalta" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Poju" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Punainen sydän" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Punainen ruusu" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +#, fuzzy +msgid "Thumbs up" msgstr "Peukku pystyssä" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Koiran naama" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Aurinko" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Piru" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Halaa oikealta" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Tyttö" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Särkynyt sydän" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "Kuihtunut ruusu" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Peukku alas" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Kissan naama" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "Nukkuva puolikuu" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Punaiset huulet" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Taputtaa" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "Ristityt sormet" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Auto" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Lentokone" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Kilpikonna" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "Etana" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Musta lammas" +#: emoticontheme.cpp:869 +#, fuzzy +msgid "Sheep" +msgstr "Uninen" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Vuohi" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "Vampyyrilepakko" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Olutmuki" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "Martini-lasi" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "Kahvikuppi" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Synttärikakku" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Lautanen" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Kulho" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Tähti" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Sateenkaari" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Myrskypilvi" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Salama" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Sateenvarjo" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Palmusaari" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "Puhelinvastaanotin" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Kännykkä" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "Sähköposti" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Kello" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "Filminpätkä" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Huomautus" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Käsiraudat" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Raha" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "Hehkulamppu" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +#, fuzzy +msgid "Cigarette" msgstr "Savuke" -#: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "Jalkapallo" +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Lahja ja kumarrus" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Tietokone" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "KMess-ikoni" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Yhdistäminen palvelimeen epäonnistui." + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "Yhdistäminen palvelimeen epäonnistui." -#: initialview.cpp:377 -msgid "Connect" -msgstr "Yhdistä" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "&Katkaise yhteys" +msgctxt "Button label" +msgid "&Connect" +msgstr "&Yhdistä" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: kmess.cpp:223 +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Sähköpostiosoite:" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "Näytä sähköpostitiedot" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Tämä yhteystieto on jo listallasi" + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "Uusi &Ryhmä" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Lisää ryhmä" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Anna ryhmälle uusi nimi:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" @@ -2474,349 +3449,460 @@ msgstr "" " Oletko varma että haluat poistaa yhteystiedon %1 " "yhteystietoluettelostasi?" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" msgstr "Poista yhteystieto" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" msgstr "Poista ja estä" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" "Oletko varma, että haluat poistaa ryhmän %1 yhteystietolistastasi?" "" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "Poistettu" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Tämä on erityinen ryhmä eikä sitä voi muuttaa." -#: kmess.cpp:671 -msgid "Rename group" -msgstr "Nimeä ryhmä uudelleen" +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "&Uudelleennimeä ryhmä" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Anna ryhmälle uusi nimi:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "Tunnistautuminen epäonnistui" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Yhdistetään..." + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Yhteys poikki" -#: kmess.cpp:1408 +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "" + +#: kmess.cpp:1475 #, fuzzy +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" "

KMess ei voi toistaa ääniä tai ilmoituksia.

KMess tiedostoa " "'eventsrc' ei löytynyt seuraavista kansioista: %1

Varmista asennus ja " "kopioi puuttuva tiedosto yhteen listatuista kansioista.

" -#: kmess.cpp:1412 -msgid "Error with notifications" +#: kmess.cpp:1481 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Virhe ilmoituksissa" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Toiminnot" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Uusi &Yhteystieto" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Uusi &Ryhmä" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "&Etsi yhteystietoa" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Etsi &Kiinnostusten perusteella" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "&Etsi yhteystietoa" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Uusi &Tili" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Tilin &Asetukset" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "&Yhdistä" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&Katkaise yhteys" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "Näytä oma &profiili" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Oma tila" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Poissa (Automaattivastaus)" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "&Näytä sallitut yhteystiedot" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Näytä myös &poissaolevat" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "Näytä &poistetut yhteystiedot" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &History Box" +msgstr "Keskustelun tyyli:" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Näytä/Piilota &yhteystietopalkki" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "Näytä &hymiöt" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "Keskustelukuvake" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "&Yhteystietojen järjestys..." + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Näytä &siirtoikkuna" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "Uusi &Yhteystieto" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "Uusi &Ryhmä" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "&Etsi yhteystietoa" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "&Etsi yhteystietoa" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Etsi &Kiinnostusten perusteella" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Keskustelun tyyli:" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "Uusi &Tili" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Uusi &Tili" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "Hymy" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "&Yhteystietojen järjestys..." - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "Ryhmä" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Paikalla/Poissa" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "Näytä &siirtoikkuna" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "&Näytä verkkoikkuna" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "Kuuntelee nyt %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" msgstr "" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" msgstr "" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "Keskus&tele" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Ominaisuudet" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" msgstr "&Poista ryhmästä" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "Kuuntele kappaletta %1" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "&Kopioi ryhmään" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "Siirrä ryh&mään" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "Siirrä ryhmää &alas" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Siirrä ryhmää &ylös" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "Poista ryh&mä" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "&Uudelleennimeä ryhmä" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "Sähköposti" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "&Lisää tämä yhteystieto \"Ystävät\"-listallesi" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Sähköpostiosoite:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Sähköpostiohjelma" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 +#: kmessview.cpp:1156 #, fuzzy -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +msgid "No" +msgstr "Huomautus" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Estetty" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "on lähettänyt sinulle" -#: kmessview.cpp:1076 +#: kmessview.cpp:1194 #, fuzzy -msgctxt "Last time a message was received" -msgid "Last message: %1" +msgctxt "Contact last message label in list tooltip" +msgid "Last message" msgstr "on lähettänyt sinulle" -#: kmessview.cpp:1085 +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "Yhteistiedot" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Tämä keskustelukumppani ei ole paikalla" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "Tämä keskustelukumppani ei ole paikalla" +msgstr[1] "Tämä keskustelukumppani ei ole paikalla" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "Yhteistiedot" +msgstr[1] "Yhteistiedot" + +#: kmessview.cpp:1631 #, fuzzy msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "Syötä henkilökohtainen viestisi tähän" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +#, fuzzy +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 Mt" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 Mt" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 msgid "Project support" msgstr "" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "GnomeMeeting-kehittäjä" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." @@ -2824,271 +3910,628 @@ msgstr "" "Saksankielinen käännös, testaus, dokumentointi, kotisivut, " "projektinhallinta, jne..." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "Web-suunnittelu" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "" "Italiankielinen käännös sekä oletushymiöt ja keltainen/sininen/violetti " "hymiövalikoima" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Cartoon-hymiöteema" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Oletusääniteema" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Arabinkielinen käännös, tiedoston tallentamisen kansainvälistämiskorjaus." -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 #, fuzzy msgid "More Arabic translation" msgstr "Lisää turkinkielisiä käännöksiä" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Portugalinkielinen käännös (Brasilia)" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Portugalinkielinen käännös (Brasilia)" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 #, fuzzy msgid "Catalan translation" msgstr "Katalankielinen käännös" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" "Yksinkertaistetun kiinankielinen käännös, tiedostonlähetyksen bugikorjaus" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 #, fuzzy msgid "More Simplified Chinese translation" msgstr "" "Yksinkertaistetun kiinankielinen käännös, tiedostonlähetyksen bugikorjaus" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 #, fuzzy msgid "Traditional Chinese translation" msgstr "Perinteinen kiinankielinen käännös" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Perinteinen kiinankielinen käännös" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 #, fuzzy msgid "Danish translation" msgstr "Tanskankielinen käännös" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "More Danish translation" msgstr "Lisää Tanskankielistä käännöstä" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "Hollanninkielinen käännös" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "Lisää Hollanninkielistä käännöstä" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Lisää turkinkielisiä käännöksiä" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Ranskankielinen käännös" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 #, fuzzy msgid "Estonian translation" msgstr "Eestinkielinen käännös" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 #, fuzzy msgid "Finnish translation" msgstr "Suomenkielinen käännös" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 #, fuzzy msgid "More Finnish translation" msgstr "Lisää Suomenkielistä käännöstä" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "Ranskankielinen käännös" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 msgid "More French translation, MSN6 emoticon definitions" msgstr "Ranskankielinen lisäkäännös, MSN6 hymiö -määritykset" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 #, fuzzy msgid "More French translation" msgstr "Ranskankielinen käännös" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 #, fuzzy msgid "Hungarian translation" msgstr "Unkarinkielinen käännös" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Unkarinkielinen käännös" + +#: main.cpp:115 main.cpp:116 #, fuzzy msgid "More Italian translation" msgstr "Koreankielinen käännös" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "Koreankielinen käännös" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 #, fuzzy msgid "Norsk Bokmål translation" msgstr "Norjankielinen käännös" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Sloveniankielinen käännös" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "Sloveniankielinen käännös" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "Sloveniankielinen käännös" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Espanajankielinen käännös" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 #, fuzzy msgid "More Spanish translation" msgstr "Espanankieliset lisäkäännökset" -#: main.cpp:123 -msgid "Swedish translation" -msgstr "Ruotsinkielinen käännös" - -#: main.cpp:125 -#, fuzzy -msgid "Thai translation" -msgstr "Thaimaankielinen käännös" - #: main.cpp:126 -msgid "Turkish translation" -msgstr "Turkinkielinen käännös" +msgid "Alejandro Araiza Alvarado" +msgstr "" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "Lisää turkinkielisiä käännöksiä" +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "Ruotsinkielinen käännös" + +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Tiedostosiirrot" +msgid "More Swedish translation" +msgstr "Ruotsinkielinen käännös" -#: main.cpp:134 -msgid "P4-Context field support" +#: main.cpp:135 +msgid "Rachan Hongpairote" msgstr "" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Xinerama-korjaukset" +#, fuzzy +msgid "Thai translation" +msgstr "Thaimaankielinen käännös" #: main.cpp:136 -msgid "Original file receive code" -msgstr "Alkuperäinen tiedostojen vastaanottokoodi" +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Turkinkielinen käännös" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" msgstr "" +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "Lisää turkinkielisiä käännöksiä" + #: main.cpp:138 -msgid "KWallet support" +msgid "Uğur Çetin" msgstr "" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "Paikalla" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Tiedostosiirrot" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Xinerama-korjaukset" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "Alkuperäinen tiedostojen vastaanottokoodi" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "Keskustelun tyyli:" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "Erilaisia kansainvälistämiskorjauksia." -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Erilaisia kansainvälistämiskorjauksia." -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "GnomeMeeting-kehittäjä" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Kaveri jolla on kassi päänsä päällä" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspiraatio ja ohjelmakoodi" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 #, fuzzy msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "Puhekuplakoodit, alustava P2P-koodi, MSN:n käsittelijäkoodi" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Joutenololaskurin koodi" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "Your name here?" msgstr "Nimesi" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Nimesi" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "Sähköpostiosoitteesi:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Kirjaudu automaattisesti annetulla sähköpostiosoitteella" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Sallittu" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Poistettu" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "Keskustelukumppani katkaisi istunnon." @@ -3106,62 +4549,113 @@ msgstr "Olet hylännyt kutsun." #: network/applications/application.cpp:540 #, fuzzy -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "Haluatko hyväksyä vai hylätä ?" #: network/applications/application.cpp:581 #, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "Paina hylätäksesi." -#: network/applications/filetransfer.cpp:134 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Haluatko hyväksyä tiedoston: %1 (%2 tavua)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Tiedosto %1 on jo olemassa.\n" +"Haluatko ylikirjoittaa sen?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu avata." -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu avata." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Siirto hyväksytty." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "Yhdistetään kohteeseen %1, portti %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "Siirto peruuntui" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Keskustelukumppani peruutti siirron." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "Olet katkaissut istunnon." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "Olet katkaissut istunnon." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Yhteys muodostettu" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy +msgid "Successfully sent file "%1"." msgstr "Siirrettiin onnistuneesti tiedosto: %1" -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy +msgid "Successfully received file "%1"." +msgstr "Siirrettiin onnistuneesti tiedosto: %1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei ole." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu lukea." -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy +msgid "Sending file "%1" (%2)." msgstr "Lähetetään tiedostoa %1" -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Keskustelukumppani peruutti siirron." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3173,72 +4667,14 @@ msgstr "" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "Tiedostonsiirtokutsu peruttu viallisen vastaanotetun datan vuoksi." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"Tiedosto %1 on jo olemassa.\n" -"Haluatko ylikirjoittaa sen?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu avata." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Keskustelukumppani peruutti siirron." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Olet katkaissut istunnon." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Siirrettiin onnistuneesti tiedosto: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Siirrettiin onnistuneesti tiedosto: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei ole." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu lukea." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Lähetetään tiedostoa %1" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Keskustelukumppani peruutti siirron." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Sinut on kutsuttu tapaamiseen (GnomeMeeting)." @@ -3252,28 +4688,28 @@ msgstr "Käynnistetään GnomeMeeting. Yhdistetään: %1" msgid "Inviting the contact to a meeting." msgstr "Kutsutaan keskustelukumppania tapaamiseen." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "Kutsu peruuntui. Toisen käyttäjän sovellus ei tue kutsua." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "Kutsu peruuntui. Tapahtui sisäinen virhe." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "Kutsu keskeytyi. Aikaraja ylittyi käyttäjän hyväksyntää odotettaessa." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "Kutsu keskeytyi. Aikaraja ylittyi dataa odotettaessa." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "Kutsu keskeytyi. Kytkentäkeskus sulki chat-yhteyden." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Kutsu keskeytyi." @@ -3286,25 +4722,19 @@ msgstr "Sinut on kutsuttu jakamaan henkilön työpöytä." msgid "Starting KRDC. Connecting to %1." msgstr "Käynnistetään KRDC. Yhdistetään: %1." -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Keskustelukumppani hylkäsi kutsun. Tapahtui sisäinen virhe." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" +"Keskustelukumppanisi yritti käyttää MSN6-ominaisuutta, jota KMess ei vielä " +"osaa käsitellä." -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "Siirto epäonnistui." - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." @@ -3312,43 +4742,16 @@ msgstr "" "Kutsu peruttiin. Keskustelukumppani lähetti dataa, jota KMess ei tue tai " "joka on viallista." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"Siirto epäonnistui. Keskustelukumppani lähetti dataa, jota KMess ei tue tai " -"joka on viallista." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Siirto epäonnistui. Aikaraja ylittyi hyväksyntää odotettaessa." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "Siirto epäonnistui. Tapahtui sisäinen virhe." - -#: network/applications/p2papplicationbase.cpp:1176 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "Siirto epäonnistui. Tietojen lähdettä ei saatu auki." - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" -"Keskustelukumppanisi yritti käyttää MSN6-ominaisuutta, jota KMess ei vielä " -"osaa käsitellä." - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "Siirto epäonnistui. Tietojen valmistelu ei onnistunut." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "Kutsu peruuntui. Viesti ei kohdistunut meihin." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 #, fuzzy msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." @@ -3356,22 +4759,30 @@ msgstr "" "Siirto epäonnistui. Keskustelukumppani lähetti dataa, jota KMess ei tue tai " "joka on viallista." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Keskustelukumppani hylkäsi kutsun. Tapahtui sisäinen virhe." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "Odotetaan yhteyttä kohteeseen %1, portti %2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "Palataan ei-suoraan tiedostojen siirtoon (tämä voi olla hidasta)." -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 #, fuzzy msgid "Waiting for connection" msgstr "Odotetaan yhteystietolistaa..." -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " @@ -3380,7 +4791,7 @@ msgstr "" "Kutsu peruuntui. Aikaraja ylittyi odotettaessa keskustelukumppanin " "hyväksyntää." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." @@ -3388,11 +4799,36 @@ msgstr "" "Kutsu peruuntui. Aikaraja ylittyi odotettaessa yhteyden onnistumista tai " "epäonnistumista." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "Kutsu peruuntui. Aikaraja ylittyi dataa odotettaessa." +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Siirto epäonnistui." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Siirto epäonnistui. Keskustelukumppani lähetti dataa, jota KMess ei tue tai " +"joka on viallista." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Siirto epäonnistui. Aikaraja ylittyi hyväksyntää odotettaessa." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Siirto epäonnistui. Tapahtui sisäinen virhe." + +#: network/applications/p2papplicationbase.cpp:1350 +#, fuzzy +msgid "The transfer failed. Couldn't open data source." +msgstr "Siirto epäonnistui. Tietojen lähdettä ei saatu auki." + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "Sinut kutsuttiin aloittamaan puhekeskustelu." @@ -3428,160 +4864,130 @@ msgstr "Äänikeskustelua aloitetaan. Kuunnellaan: %1" msgid "Inviting the contact to a voice conversation." msgstr "Kutsutaan keskustelukumppania äänikeskusteluun." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" "Keskustelukumppani kutsuu sinua '%1', mutta tätä ominaisuutta ei vielä ole." -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Tiedostonsiirtokutsu peruttu viallisen vastaanotetun datan vuoksi." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:138 +#, fuzzy +msgid "You are invited to view this person's webcam." +msgstr "Sinut on kutsuttu jakamaan henkilön työpöytä." + +#: network/applications/webcamtransferp2p.cpp:147 msgid "webcam" msgstr "webcam" -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "Tiedoston %1 siirto peruutettiin." - #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Lähetetään tiedostoa %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "Tiedoston %1 siirto epäonnistui. Paikallinen portti on kiinni." -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy msgid "Couldn't open a local port." msgstr "Tiedoston %1 siirto epäonnistui. Paikallinen portti on kiinni." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Alustetaan tiedostonsiirtoa" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy +msgid "The transfer of %1 failed. A connection could not be made." msgstr "Tiedoston %1 epäonnistui. Yhteyttä ei voida muodostaa." -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 #, fuzzy msgid "Unable to make a connection." msgstr "Ei saada yhteyttä luotua: %1" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "Vastaanotetaan tiedostoa %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"KMess ei saanut yhteyttä etäweb-palveluun.\n" -"\n" -"Lisätiedot: %1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Yhteys on katkaistu koska koska olet \n" -"yhdistänyt MSN Messenger palveluun \n" -"toisella sovelluksella tai toiselta koneelta" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Synkronoidaan" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Lähetetään käyttöoikeustietoja" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "Odotetaan yhteystietolistaa..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "Tunnustautuminen epäonnistui. Tarkista tilinimi ja salasana." - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Yhdistetään..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess on vastaanottanut tuntemattoman käskyn palvelimelta: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "Yritettiin lisätä sähköpostiosoite ei ole MSN Messenger tili" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" +#: network/msnconnection.cpp:404 +#, fuzzy +msgid "The given account name is invalid" msgstr "Annettu tilin nimi on virheellinen" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 +#, fuzzy msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" "Annettu tilin nimi on virheellinen tai MSN passport -tiliäsi ei ole vielä " "vahvistettu" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "Yhteystietolistasi on täynnä" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "Tämä yhteystieto on jo listallasi" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "Tämä yhteystieto ei ole listallasi" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "Tämä keskustelukumppani ei ole paikalla" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Tämä yhteystieto ei ole listallasi" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 #, fuzzy msgid "" "The group name is already added to your Messenger or Hotmail contact list. " @@ -3589,213 +4995,248 @@ msgid "" msgstr "" "Tämä ryhmänimi on jo käytössä Messenger- tai Hotmail-yhteystietoilistallasi" -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:444 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "Yhteystietolistallasi on liian monta ryhmää" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "Tätä ryhmää ei voi muuttaa" -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "Yhteystietolistallasi on liian monta ryhmää" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "Tämä ryhmä ei ole tyhjä" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "Ryhmän nimi liian pitkä" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "Tapahtui sisäinen KMess-virhe: %1" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "&Uudelleennimeä ryhmä" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "Kytkentäpalvelimessa tapahtui virhe" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "Siirto kytkentäpalvelimelle epäonnistui" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Muista tämän tilin asetukset" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "Siirto epäonnistui." -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 #, fuzzy msgid "You are opening chat sessions too fast" msgstr "Avaat istuntoja liian nopeaan tahtiin" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "Sinulla on liian monta istuntoa avoinna" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "Virheellinen ystävän nimi" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +#, fuzzy +msgid "The server reports KMess is flooding it with too much data" msgstr "Palvelin ilmoittaa KMessin tulvivan sitä datalla" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "Tunnistautuminen epäonnistui" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "Et voi aloittaa keskustelua kun olet näkymätön." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 #, fuzzy msgid "Not accepting new contacts" msgstr "Ei vastaanoteta uusia tavoitteita" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 #, fuzzy msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" "Sinulla on lasten passport-tunnus ja tarvitset vanhempiesi hyväksynnän " "keskustellaksesi verkossa." -#: network/msnnotificationconnection.cpp:2371 +#: network/msnconnection.cpp:569 #, fuzzy -msgid "Your passport account needs to be verified first." +msgid "Your Passport account needs to be verified first." msgstr "Passport-tunnuksesi pitää ensin vahvistaa." -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "Tapahtui sisäinen palvelinvirhe" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Tarkastuspalvelin alhaalla" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "Palvelin on menossa alas" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "Palvelin on pian menossa alas" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "Kirjoittaminen on estetty" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "Istunto on ylikuormitettu" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "Palvelin ei ole saatavilla" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Tunnistautuminen epäonnistui" -#: network/msnnotificationconnection.cpp:2449 +#: network/msnconnection.cpp:642 #, fuzzy -msgid "Unknown error code received from the server: %1" +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "KMess on vastaanottanut tuntemattoman käskyn palvelimelta: %1" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 #, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" msgstr "KMess - MSN virhe" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "Lähetetään käyttöoikeustietoja" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "Tunnistautuminen epäonnistui" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Yhdistetään..." + +#: network/msnnotificationconnection.cpp:1949 +#, fuzzy +msgid "Unknown command received from the server: %1" +msgstr "KMess on vastaanottanut tuntemattoman käskyn palvelimelta: %1" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "minuuttia" msgstr[1] "minuuttia" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 #, fuzzy msgid "Server closes for maintenance in %1!" msgstr "Varoitus: Palvelin sulkeutuu huollettavaksi %1 minuutin kuluttua!" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 #, fuzzy msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." @@ -3803,302 +5244,495 @@ msgstr "" "MSN Palvelin on ilmoittanut, että se menee alas huollettavaksi minuutin " "kuluttua." -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 +#: network/msnnotificationconnection.cpp:2318 #, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" "KMess ei voinut käsitellä Poissa linjoilta -viestejä.\n" "\n" "Lisätiedot: %1" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "Tunnistautuminen epäonnistui" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Odotetaan yhteystietolistaa..." + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "Tapahtui sisäinen KMess-virhe: %1" -#: network/msnnotificationconnection.cpp:3242 +#: network/msnnotificationconnection.cpp:2916 #, fuzzy -msgctxt "Login error message, with more details for developer versions" +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" +msgstr "Tunnustautuminen epäonnistui. Tarkista tilinimi ja salasana." + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2932 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"Yhteys on katkaistu koska koska olet \n" +"yhdistänyt MSN Messenger palveluun \n" +"toisella sovelluksella tai toiselta koneelta" + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" msgstr "" "KMess ei saanut yhteyttä MSN Messenger palvelimiin. MSN Messenger -palvelun " "palvelimet voivat olla alhaalla, tai sinun Internet-yhteydessäsi on jotain " "vikaa." -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2966 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" +"Jos valittu, välipalvelinta tullaan käyttämään yhdistettäessä MSN Messenger " +"palveluun." + +#: network/msnnotificationconnection.cpp:2968 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"KMess ei saanut yhteyttä MSN Messenger palvelimiin. MSN Messenger -palvelun " +"palvelimet voivat olla alhaalla, tai sinun Internet-yhteydessäsi on jotain " +"vikaa." + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "Yhteys palvelimeen katosi." -#: network/msnnotificationconnection.cpp:3302 -#, fuzzy +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -"Tunnistautuminen epäonnistui, KMess ei voinut käsitellä passport " -"kirjautumista.\n" -"\n" -"Lisätiedot: %1" -#: network/msnsockethttp.cpp:765 +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 #, fuzzy -msgid "SSL Error" -msgstr "Palvelinvirhe" +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "Tapahtui sisäinen KMess-virhe: %1" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "Yhteyden aikakatkaisu" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "1 ping hukattu" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "%1 pingiä hukattu." -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." +#: network/msnsockettcp.cpp:395 +#, fuzzy +msgid "The connection to the server was lost" msgstr "Yhteys palvelimeen katosi." -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Henkilö on poissa linjoilta tai näkymätön." - -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" -"Keskustelukumppanisi yritti käyttää MSN7-ominaisuutta, jota KMess ei vielä " -"osaa käsitellä." - -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 +#: network/soap/addressbookservice.cpp:777 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "Viestiä \"%1\" ei vastaanotettu." +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "Yritettiin lisätä sähköpostiosoite ei ole MSN Messenger tili" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "Ei saada yhteyttä luotua: %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "" - -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "" - -#: notification/chatnotification.cpp:163 +#: network/soap/addressbookservice.cpp:787 #, fuzzy -msgid "In %1's chat: %2" +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "Yritettiin lisätä sähköpostiosoite ei ole MSN Messenger tili" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Palvelin ei ole saatavilla" + +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:521 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Palvelin ei ole saatavilla" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" msgstr "Henkilön %1 keskustelussa" -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/chatnotification.cpp:171 +#: notification/chatnotification.cpp:158 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgid "%1 says:
'%2'" +msgstr "Henkilön %1 keskustelussa" + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:169 #, fuzzy msgid "%1's chat requests attention!" msgstr "Henkilön %1 keskustelu vaatii huomiota!" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" -msgstr "" +#: notification/chatnotification.cpp:174 +#, fuzzy +msgid "%1:
%2" +msgstr "Henkilön %1 keskustelussa" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr "on lähettänyt sinulle herätteen!" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr "on lähettänyt sinulle herätteen!" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr "on lähettäny sinulle olion!" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 #, fuzzy msgid "%1 wants to use the webcam!" msgstr "%1 on kirjautunut ulos" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr "%1 on nyt paikalla" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr "on lähettäny sinulle olion!" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "Olet katkaissut istunnon." -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "Keskustelukumppani peruutti siirron." -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 msgid "%1's activity has been canceled!" msgstr "" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "%1 on kirjautunut ulos" -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "Keskustelukumppani peruutti siirron." -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr "%1 on kirjautunut ulos" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "Olet katkaissut istunnon." -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "Tiedoston %1 siirto peruutettiin." -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 msgid "%1's activity has ended!" msgstr "" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" msgstr "" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "Tiedoston %1 siirto peruutettiin." -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 msgid "%1's activity has ended with an error!" msgstr "" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" +msgid "%1
is now online" +msgstr "Henkilön %1 keskustelussa" + +#: notification/contactstatusnotification.cpp:92 +#, fuzzy +msgid "%1
has gone away" +msgstr "Henkilön %1 keskustelussa" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy +msgid "%1
will be right back" +msgstr "Henkilön %1 keskustelussa" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy +msgid "%1
is now busy" +msgstr "Henkilön %1 keskustelussa" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy +msgid "%1
has become invisible" msgstr "%1 on nyt paikalla" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:96 #, fuzzy -msgid "%1 has gone away" +msgid "%1
has gone idle" +msgstr "Henkilön %1 keskustelussa" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy +msgid "%1
has logged out" msgstr "%1 on kirjautunut ulos" -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" -msgstr "" - -#: notification/contactstatusnotification.cpp:73 +#: notification/contactstatusnotification.cpp:98 #, fuzzy -msgid "%1 is now busy" +msgid "%1
is on the phone" msgstr "%1 on nyt paikalla" -#: notification/contactstatusnotification.cpp:74 +#: notification/contactstatusnotification.cpp:99 #, fuzzy -msgid "%1 has become invisible" +msgid "%1
is out for lunch" msgstr "%1 on nyt paikalla" -#: notification/contactstatusnotification.cpp:75 +#: notification/newemailnotification.cpp:90 #, fuzzy -msgid "%1 has gone idle" -msgstr "%1 on kirjautunut ulos" - -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1 on kirjautunut ulos" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 on nyt paikalla" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 on nyt paikalla" - -#: notification/newemailnotification.cpp:78 -#, fuzzy -msgid "New email:
'%1'
by '%2'" +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" msgstr "Uusi sähköposti:
'%1'
kirjoittanut '%2'" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Aloita &Ryhmäkeskustelu" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Piru" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&Lähetä sähköposti" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "" + +#: notification/systemtraywidget.cpp:78 +#, fuzzy +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Pääikkunan ei sammuta KMessiä, vaan se pysyy käynnissä ilmoitusalueella. " +"Käytä 'Yhdistä -> Lopeta' valikosta sulkeaksesi ohjelman." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Pienennetään ilmoitusalueelle" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 Mt" + +#: settings/accountpage.cpp:80 #, fuzzy msgid "Browse..." msgstr "&Selaa..." -#: settings/accountpage.cpp:70 +#: settings/accountpage.cpp:81 #, fuzzy -msgid "Browse and crop picture..." +msgid "Browse and Crop Picture..." msgstr "Selaa ja rajaa kuvaa..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "Keskustelukuvakkeen lataus epäonnistui" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 #, fuzzy msgid "" "An error occurred when trying to change the display picture.\n" @@ -4107,161 +5741,745 @@ msgstr "" "Keskustelukuvan vaihdossa tapahtui virhe.\n" " Varmista että valitsit oikean kuvatiedoston" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "&Poista yhteystieto" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Asetukset" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "Käyttäjätili" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "Käyttäjätili" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Hälytykset" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "KMess-ilmoitus" +msgid "Contact List" +msgstr "Yhteistiedot" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Keskustelee" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Keskustelun kirjoitus lokiin" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 #, fuzzy msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "Annettu yhteystiedon osoite ei ole kelvollinen: %1" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 #, fuzzy msgid "The email address you have entered is already in use: '%1'" msgstr "Annettu yhteystiedon osoite ei ole kelvollinen: %1" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Oletko varma, että haluat poistaa tämän tilin?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "Oletko varma, että haluat poistaa tämän tilin?" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "Stacy" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 #, fuzzy msgid "Great!" msgstr "Vuohi" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Hymiöt" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Oletko varma, että haluat poistaa tämän tilin?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Hymiöt" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "Asetukset" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Käyttäjätilit" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "Sähköposti-ilmoitin" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "Tallennettujen keskustelujen juurihakemisto:" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." -msgstr "" -"Pääikkunan ei sammuta KMessiä, vaan se pysyy käynnissä ilmoitusalueella. " -"Käytä 'Yhdistä -> Lopeta' valikosta sulkeaksesi ohjelman." - -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Pienennetään ilmoitusalueelle" - -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 Mt" +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "Annettu yhteystiedon osoite ei ole kelvollinen: %1" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Yhteistiedot" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Viestiä \"%1\" ei vastaanotettu." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "Viestiä \"%1\" ei vastaanotettu." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Viestiä \"%1\" ei vastaanotettu." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Viestiä \"%1\" ei vastaanotettu." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Hämillään" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Lisää hymiö" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "Sähköpostiosoite: " + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Estetty" + +#, fuzzy +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "on lähettänyt sinulle" + +#, fuzzy +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "on lähettänyt sinulle" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "Yhteistiedot" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "Näytä myös &poissaolevat" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "Odotetaan yhteystietolistaa..." + +#, fuzzy +#~ msgid "Enable in the chat windows" +#~ msgstr "Odotetaan yhteystietolistaa..." + +#~ msgid "Alerts" +#~ msgstr "Hälytykset" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "KMess-ilmoitus" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Poista ryhmä" + +#, fuzzy +#~ msgid "Now listening to: %1" +#~ msgstr "Kuuntelee nyt %1" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "Kuuntele kappaletta %1" + +#, fuzzy +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "" +#~ "KMess ei saanut yhteyttä etäweb-palveluun.\n" +#~ "\n" +#~ "Lisätiedot: %1" + +#, fuzzy +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "Tunnistautuminen epäonnistui, KMess ei voinut käsitellä passport " +#~ "kirjautumista.\n" +#~ "\n" +#~ "Lisätiedot: %1" + +#, fuzzy +#~ msgid "Close all tabs" +#~ msgstr "Sulje välilehti" + +#~ msgid "&Send email" +#~ msgstr "&Lähetä sähköposti" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "Tallenna keskustelu" + +#, fuzzy +#~ msgid "C&lose all tabs" +#~ msgstr "Sulje välilehti" + +#~ msgid "Connect" +#~ msgstr "Yhdistä" + +#~ msgid "Rename group" +#~ msgstr "Nimeä ryhmä uudelleen" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "Tilin &Asetukset" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 on nyt paikalla" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 on kirjautunut ulos" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 on nyt paikalla" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 on kirjautunut ulos" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "Virhe ilmoituksissa" + +#, fuzzy +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Näytä ilmoitus kun yhteystieto lähtee pois linjoilta" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "" +#~ "Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto " +#~ "katoaa linjoilta." + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "Poissa linjoilta" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "" +#~ "Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto " +#~ "katoaa linjoilta." + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "" +#~ "Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto " +#~ "katoaa linjoilta." + +#, fuzzy +#~ msgid "S&end you a message" +#~ msgstr "on lähettänyt sinulle poissa linjoilta -viestin viestin" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when your contacts change their MSN " +#~ "status." +#~ msgstr "" +#~ "Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto " +#~ "katoaa linjoilta." + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts goes " +#~ "offline." +#~ msgstr "" +#~ "Jos valittu, puhekupla näkyy ruudulla myös silloin, kun yhteystieto " +#~ "katoaa linjoilta." + +#, fuzzy +#~ msgid "Go o&ffline" +#~ msgstr "Poissa linjoilta" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "Sähköpostiosoite:" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "Näytä tiedote kun saat sähköpostia \"muihin kansioihin\"" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in the Inbox. " +#~ "This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Jos otettu käyttöön, viestikupla ilmestyy myös silloin, kun olet saanut " +#~ "sähköpostia muihin kansioihin kuin vastaanotettuihin. Tämä valinta toimii " +#~ "vain Hotmail-tilien kanssa." + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in other " +#~ "folders. This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Jos otettu käyttöön, viestikupla ilmestyy myös silloin, kun olet saanut " +#~ "sähköpostia muihin kansioihin kuin vastaanotettuihin. Tämä valinta toimii " +#~ "vain Hotmail-tilien kanssa." + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "Hälytykset" + +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "Muuttaa sekuntien määrää, jolloin puhekuplat katoavat." + +#~ msgid "Hide popups after" +#~ msgstr "Piilota puhekuplat " + +#~ msgid "seconds" +#~ msgstr "sekunnin kuluttua" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "Hälytykset" + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "" +#~ "Keskustelukumppanisi yritti käyttää MSN7-ominaisuutta, jota KMess ei " +#~ "vielä osaa käsitellä." + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Yhteistiedot" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "Salasana:" + +#, fuzzy +#~ msgid "" +#~ "If enabled, all chat conversations will be saved in the specified " +#~ "directory." +#~ msgstr "Jos valittu, keskustelut tallennetaan määritettyyn hakemistoon." + +#~ msgid "Log &all chats" +#~ msgstr "&Tallenna lokiin kaikki keskustelut" + +#~ msgid "Month" +#~ msgstr "Kuukausittain" + +#~ msgid "Day" +#~ msgstr "Päivittäin" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "Yhteistiedot" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "&Etsi yhteystietoa" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Henkilö on poissa linjoilta tai näkymätön." + +#, fuzzy +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "Viestiä \"%1\" ei vastaanotettu." + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "Näytä/Piilota &yhteystietopalkki" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "Näytä tai piilota yhteystietopalkki" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "Näytä tai piilota yhteystietopalkki" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Tämä keskustelukumppani ei ole paikalla" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "&Kutsu" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "Ei saada yhteyttä luotua: %1" + +#~ msgid "Black sheep" +#~ msgstr "Musta lammas" + +#, fuzzy +#~ msgid "Copy E&mail" +#~ msgstr "Sähköposti" + +#~ msgid "Specify an Away message" +#~ msgstr "Kirjoita poissaoloviesti" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "Sähköposti" + +#~ msgid "Soccer ball" +#~ msgstr "Jalkapallo" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "Tämä yhteystieto on jo listallasi" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "Sähköposti" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "Tämä yhteystieto ei ole listallasi" + +#~ msgid "The group name is too long" +#~ msgstr "Ryhmän nimi liian pitkä" + +#, fuzzy +#~ msgid "No permissions given for this account" +#~ msgstr "Muista tämän tilin asetukset" + +#~ msgid "Enter your personal message here" +#~ msgstr "Syötä henkilökohtainen viestisi tähän" + +#, fuzzy +#~ msgid "Click" +#~ msgstr "Kello" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "Verkkoyhteysikkuna" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Web-suunnittelu" + +#~ msgid "Co&nnect" +#~ msgstr "&Yhdistä" + +#, fuzzy +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "Odotetaan yhteystietolistaa..." + +#, fuzzy +#~ msgid "SSL Error" +#~ msgstr "Palvelinvirhe" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "Tilin &Asetukset" + +#, fuzzy +#~ msgid "You received a wink from %1." +#~ msgstr "Olet vastaanottanut olion henkilöltä %1" + +#~ msgid "Got synchronization" +#~ msgstr "Synkronoidaan" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Asetukset" + +#, fuzzy +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Haluatko hyväksyä tiedoston: %1 (%2 tavua)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "Siirto peruuntui" + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Siirrettiin onnistuneesti tiedosto: %1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei ole." + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu lukea." + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "Tiedoston %1 siirto peruutettiin." #~ msgid "Picture:" #~ msgstr "Kuva:" @@ -4270,10 +6488,6 @@ msgstr "%1 Mt" #~ msgid "Speed:" #~ msgstr "Palvelin:" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Näytä sähköpostitiedot" - #~ msgid "Logging in..." #~ msgstr "Kirjaudutaan sisään..." @@ -4302,10 +6516,6 @@ msgstr "%1 Mt" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "Postilaatikossasi on %1 uutta sähköpostia" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "Paikalla" - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "Tiedoston %1 siirto epäonnistui. Tiedostoa ei voitu avata" @@ -4331,12 +6541,6 @@ msgstr "%1 Mt" #~ msgid "Your password:" #~ msgstr "Salasanasi:" -#~ msgid "Display picture:" -#~ msgstr "Keskustelukuvake:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "Älä näytä keskustelukuv&aketta" - #, fuzzy #~ msgid "Show notifications when you recei&ve an email" #~ msgstr "Näytä tiedote kun saat sähköpostia \"muihin kansioihin\"" @@ -4602,13 +6806,6 @@ msgstr "%1 Mt" #~ msgid "I want to use a proxy" #~ msgstr "Haluan käyttää välityspalvelinta" -#~ msgid "" -#~ "If enabled, a proxy server will be used to connect to the MSN Messenger " -#~ "service." -#~ msgstr "" -#~ "Jos valittu, välipalvelinta tullaan käyttämään yhdistettäessä MSN " -#~ "Messenger palveluun." - #~ msgid "Port:" #~ msgstr "Portti:" diff --git a/po/fr.po b/po/fr.po index bb08460..f8ecfc0 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,93 +6,199 @@ # Sébastien Phélep , 2003. # Choplair, , 2007. # Andrea Blankenstijn , 2007. +# Guillaume BARTHE , 2008. +# Guillaume BARTHE , 2009. msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2007-10-17 09:48+0200\n" -"Last-Translator: Andrea Blankenstijn \n" -"Language-Team: Français \n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-03-07 22:47+0100\n" +"Last-Translator: Guillaume BARTHE \n" +"Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.11.4\n" +"X-Generator: Lokalize 0.3\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Les Emoticons \"Cartoon\"" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "Cliquez ici pour affiche le profil de ce contact." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Pas de messages pour le moment" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Les Emoticons \"Cartoon\"" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Émoticônes &personnalisées" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Clin d'œil" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "Cliquez ici pour affiche le profil de ce contact." + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" msgstr "Nouvelle ligne" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "&Envoyer" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "Contacts" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Conversation" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Barre d'outils principale" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +#, fuzzy +msgid "Click here to display the menu for this contact" msgstr "Cliquez ici pour affiche le profil de ce contact." -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 #, fuzzy +msgid "Click here to open your account settings" +msgstr "Cliquez ici pour renommer l'émoticone sélectionnée" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "Effacer la zone" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "Couleur du stylo" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "&Taille du stylo" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "&Effacer la brosse" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Re&nommer le Groupe" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" -msgstr "Entrer l'adresse e-mail de la personne que vous voulez ajouter :" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "Adresse e-mail :" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" msgstr "" +"Entrer l'adresse e-mail de la personne que vous voulez ajouter à votre liste " +"de contacts :" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -#, fuzzy -msgid "Initial group" -msgstr "Re&nommer le Groupe" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "Adresse E-mail : " -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "Entrez un raccourci pour cette émoticône :" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Entrez un raccourci pour cet émoticône :" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" -msgstr "Choisissez une image _" +msgstr "Choisissez une image : " -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -100,356 +206,552 @@ msgstr "" "Tappez le message qui sera automatiquement envoyé\n" "aux personnes qui tenteront de vous contacter :" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 -#, fuzzy -msgid "&Automatic away message" -msgstr "Rédiger un message d'Absence" +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "Rédiger un me&ssage de réponse automatique en cas d'absence" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" -msgstr "" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +msgid "Search through contacts..." +msgstr "Chercher parmi les contacts..." -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 #, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "&Ajouter cette personne dans votre liste de contact." +msgid "Chat Log Filter" +msgstr "Archivage des conversations" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" -msgstr "&Ne pas ajouter ce contact, mais le laisser voir votre statut." +msgid "&Do not filter" +msgstr "&Ne pas &filtrer" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "Filtrer par &date" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "de" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "à" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "Filter by &chat" +msgstr "Filtrer par &date" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Que voulez-vous faire ?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" +msgstr "&Ajouter cette personne dans votre liste de contact" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person; only allow them to see my status" +msgstr "Ne pas ajouter ce contact, mais le laisser voir votre statut." + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting me or seeing my status" msgstr "&Empêcher cette personne de vous contacter et de voir votre statut." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "Propriétés du contact %s" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" -msgstr "" +msgstr "&Information" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 #, fuzzy -msgid "Restore" -msgstr "Supprimé" +msgid "Click this button to restore the display picture of this contact" +msgstr "Cliquez ici pour affiche le profil de ce contact." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Récupéré" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Groupes :" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -#, fuzzy -msgid "Use alternative name for this person" +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" msgstr "Choisir un autre pseudo pour cette personne" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "Afficher une Bulle quand ce contact se connecte ou se déconnecte" +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "Afficher une Popup quand ce contact se connecte ou se déconnecte" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "Son : " +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Son : " -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" +msgstr "Images" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Cliquez ici pour supprimer l'émoticône sélectionnée" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Avatar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +msgid "&Clear Cache" +msgstr "Effacer les données du cache" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "&Notes" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "&Emoticônes" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 -#, fuzzy -msgid "&Clear Cache" -msgstr "Effacer l'onglet" +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "Cliquez ici pour supprimer l'émoticône sélectionnée" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -#, fuzzy -msgid "Notes" -msgstr "Note" +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Supprimer" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "Contacts à inviter" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "Inviter un contact qui n'est pas dans votre liste :" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "Saisissez l'email du contact que vous souhaitez inviter" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "Contacts invités" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Elements à exporter :" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Format" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Contacts : " + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "Tout sélectionner" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Tout &désélectionner" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Exporter..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Fermer" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Fenêtre du réseau" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +#, fuzzy msgid "Command to Current Tab" -msgstr "" +msgstr "Fermer l'onglet" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "Commande : " -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" -msgstr "" +msgstr "Type : " -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "Etoille" +msgstr "Standard" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" -msgstr "" +msgstr "MIME" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" -msgstr "&Envoyer" +msgstr "Envoyer" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" -msgstr "" +msgstr "Commande payload (facultatif)" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" -msgstr "" +msgstr "Ouvrir" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" +msgstr "Annuler" + +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "&Télécharger" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "Envoyer" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "Vider" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "Fermer" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" -msgstr "" - -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 #, fuzzy -msgid "Email address:" -msgstr "Adresse e-mail : " +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Entrer l'adresse e-mail de la personne que vous voulez ajouter :" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 -#, fuzzy +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" msgstr "Mot de passe :" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" -msgstr "État à la connexion" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "Saisissez votre mot de passe" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "" +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Etat à la connexion" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 #, fuzzy -msgid " Account options " -msgstr "&Paramètres du Compte" +msgid "Choose a status to set when successfully connected." +msgstr "Choix du status MSN lorsque la connection a réussie." -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "Si activé, KMess sauvegardera votre compte" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" msgstr "Mémoriser ce profil" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" +"Si vous choisissez de mémoriser votre identifiant avec KMess, vous pouvez " +"également mémoriser votre mot de passe" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "R&etenir le mot de passe :" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Connexion" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Rédigez ici votre message perso " +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Nouveau Compte" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "Mot de passe oublié ?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Connexion" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Vue" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Actions" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 #, fuzzy -msgid "Your Account Information" -msgstr "&Paramètres du Compte" +msgid "Form" +msgstr "Format" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Compte" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "Paramètres de votre Compte" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." msgstr "" "Entrez le nom que vous voulez que vos contacts voient lorsque vous " "apparaissez en ligne." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 -#, fuzzy +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 msgid "&Friendly name:" -msgstr "&Pseudonyme" +msgstr "&Pseudonyme : " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +#, fuzzy msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" "Entrez l'adresse e-mail de votre compte MSN Passport. Vous pouvez créer un " "nouveau compte sur http//register.passport.com/." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 -#, fuzzy +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 msgid "&Email address:" -msgstr "Adresse e-mail : " +msgstr "Adresse &E-mail : " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -457,45 +759,44 @@ msgstr "" "Entrez le mot de passe de votre compte MSN Passport. Vous pouvez créer un " "nouveau compte sur http//register.passport.com/." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" -msgstr "Mot de passe :" +msgstr "Mot de &passe :" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -#, fuzzy -msgid "&Remember Password" -msgstr "Mot de passe :" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "En®istrer le mot de passe :" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "Avatar" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." msgstr "&Changer..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" -msgstr "" +msgstr "&Ne pas utiliser" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." @@ -507,341 +808,645 @@ msgstr "" "Nous vous recommandons d'activer cette option à moins que vous utilisiez " "KMess en tant qu'invité ou bien dans un environement public (type cybercafé)." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 -#, fuzzy +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "Mémoriser les paramêtres de ce compte" +msgstr "Mémoriser les paramètres de ce compte" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "Si activé, KMess se connectera automatiquement avec ce compte." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "Se &connecter automatiquement avec ce compte au démarrage" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "&Archiver toutes les conversations" +msgstr "Connecter en t&ant que" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 +msgid "" +"You can't change your friendly name because your Passport email address is " +"not verified." +msgstr "" +"Vous ne pouvez pas modifier votre pseudo car l'adresse e-mail associée a " +"votre compte Passport n'a pas été vérifiée." + +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 +msgid "Request verification email" +msgstr "Demander un e-mail de vérification" + +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 +msgid "Go to accountservices.passport.net" +msgstr "Aller sur accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 +msgid "" +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " "Hotmail account to connect." msgstr "" "Vous avez besoin d'un compte Passport pour vous connecter au réseau de " "messagerie MSN. Vous pouvez vous enregistrer avec votre adresse e-mail " -"actuelle, ou utilisez un compte Hotmail pour vous connecter." +"actuelle sur register.passport.com ou utiliser un compte Hotmail pour vous " +"connecter." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 msgid "" -"You can't change your friendly name because your passport e-mail address is " -"not verified." -msgstr "" -"Vous ne pouvez pas modifier votre pseudo car l'adresse e-mail associée a " -"votre compte passport n'a pas été vérifiée." - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 -msgid "Request verification email" -msgstr "Demander un e-mail de vérification" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 -msgid "https://accountservices.passport.net/" -msgstr "https://accountservices.passport.net/" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 -msgid "Go to accountservices.passport.net" -msgstr "Aller sur accountservices.passport.net" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 -msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" "Pour vous connecter au service de messagerie MSN, vous aurez besoin de creer " -"un nouveau compte Passport lié à votre adresse e-mail." +"un nouveau compte Passport." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "Créer un nouveau compte" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "Aller sur register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 #, fuzzy -msgid "Saved accounts:" -msgstr "Comptes" +msgid "&Status Options" +msgstr "Etat à la connexion" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "Cliquez" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." msgstr "" -"Cliquez ici pour ajouter une nouvelle émoticône personnalisée pour envoyer à " -"vos contacts." +"Si activé, votre statut sera modifié automatiquement en \"Absent - Innactif" +"\" lorsque vous n'utilisez pas votre ordinateur depuis un certain nombre de " +"minutes." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Changer le statut en \"Absent - &Inactif\" quand vous êtes inactif" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"Choisissez le délai d'innactivité, en minute, avant que KMess ne change " +"votre statut en \"Absent - Innactif\"." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Apparaître comme innactif après" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minutes" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 #, fuzzy -msgid "&Add account..." -msgstr "Compte" +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "&Masquer les notifications quand mon état est occupé" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 +msgid "Saved accounts:" +msgstr "Sauvegarder les comptes : " + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" +msgstr "" +"Cliquez ici pour créer un nouveau compte KMess si vous avez déjà un compte e-" +"mail associé à un compte MSN" + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +msgid "&Add Account..." +msgstr "&Ajouter un compte..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" msgstr "Choisissez une émoticône et cliquez ici pour la supprimer." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" +msgstr "&Edition" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +#, fuzzy +msgid "Select an account and click here to delete it" +msgstr "Choisissez une émoticône et cliquez ici pour la supprimer." + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 +msgid "&Remove" +msgstr "Supp&rimé" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 -#, fuzzy -msgid "&Remove" -msgstr "Supprimé" +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Notification popup" +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "Activer l'archivage des conversations" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "Enregistrer les conversations" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" +"Avec cette option, vous pouvez choisir comment KMess sauvegardera vos " +"conversations" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "Format de fichier pour la sauvegarde : " + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "Pages Web (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "Texte plein" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 #, fuzzy -msgid "Contact Events" +msgid "Separate logged chats by:" +msgstr "Sauvegarder la conversation" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "Créer un répertoire pour classer les conversations par année" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Année" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" +"KMess créé automatiquement les sous-répertoires lorsque vous optez pour une " +"organisation annuelle, mensuelle." + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "Année suivie du mois" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" +"KMess créer automatiquement les sous-répertoires lorsque vous optez pour une " +"organisation annuelle, mensuelle et quotidienne." + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "Année suivie du mois et du jour" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Enregistrer toutes les conversations dans le répertoire parent" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "Ne pas organiser les fichiers " + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "Cliquez ici pour choisir un répertoire" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" +"Sélectionnez le répertoire de votre système dans lequel vous souhaiteriez " +"enregistrer les conversations." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "Archiver les conversations dans ce répertoire :" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "St&yle" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"Vous permet de modifier le thème qu'utilise KMess pour afficher les messages " +"lors des conversations." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "Thème de la fenêtre de dis&cussion :" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "Obtenir de &nouveaux styles..." + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Paramètres de la fenêtre de discussion" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Active l'affichage d'émoticônes dans les conversations." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "&Afficher les Emoticônes" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Afficher les &Emoticônes" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +#, fuzzy +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Cette option active le regroupement des message du même contact. Lorsque le " +"contact rédige plusieurs messages à la suite pour s'exprimer, KMess les " +"regroupe comme s'il n'en former qu'un seul. L'apparence finale dépend du " +"thème choisi pour les conversations." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "Re&grouper les suites de messages d'un même contact" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" +"Active l'affichage de l'heure correspondant à la recepetion de chaque " +"message." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Afficher l'&heure à côté des messages" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "Contacts" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "Me notifier quand mes contacts :" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 -msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." -msgstr "" -"Si activé, un message popup est affiché lorsque l'un de vos contacts se " -"connecte." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "&Go online" -msgstr "Se &déconnectent" +msgid "Show s&econds" +msgstr "&Afficher les Emoticônes" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Texte" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Ceci est le style de police est la couleur utilisés pour vos messages." + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "Police de vos &messages :" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -"Si activé, un message popup est affiché lorsque l'un de vos contacts débute " -"une conversation avec vous." +"Permet d'avoir le dernier mot concernant la police de caractère et la " +"couleur des messages de vos contacts, en utilisant celles que vous " +"choisissez." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "Débutent une conversation avec moi" +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "Contraindre les messages de vos contacts à utiliser cette police :" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" -"Si activé, un message popup est affiché à chaque fois qu'un contact vous " -"envoi un message." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "M'&envoient un message" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" -"Si activé, un message popup est affiché lorsque l'un de vos contacts change " -"d'état MSN." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "Changent d'état" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" -"Si activité, un message popup est aussi affiché lorsque l'un de vos contacts " -"se deconnecte." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "Se &déconnectent" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 #, fuzzy -msgid "Email Events" -msgstr "Adresse e-mail :" +msgid "Chat Window Formatting" +msgstr "Alertes de la fenêtre de discussion" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 #, fuzzy -msgid "Show notifications when email is received:" -msgstr "" -"Afficher une notification lorsqu'un e-mail est reçu dans d'autres dossiers" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." msgstr "" -"Si activié, un popup apparait aussi lorsqu'un e-mail est reçu dans d'autres " -"dossiers. Cette options n'est disponibles que pour les comptes Hotmail." +"Rend possible l'utilisation d'effet de police. Ecrire *gras*, /italique/ ou " +"_souligné_ fait que les mots encradrés apparaissent respectivement en gras, " +"italiques ou soulignés." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +#, fuzzy +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"&Utiliser les effets de police dans les messages, ex : *gras*, /italique/ et " +"_souligné_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +#, fuzzy +msgid "Enable MSN Plus formatting" +msgstr "Format MSN Plus" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "Choisissez la durée d'affichage des popups de notification." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Masquer les popups après" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "secondes" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "Alertes" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Afficher les Contacts &Déconnectés" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -859,1149 +1464,1370 @@ msgstr "" "wizz en un intervalle réduit, mais dans ce cas là KMess ne fera s'agiter la " "fenêtre de conversation qu'à la réception du premier wizz.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "" "Remuer la fenêtre de conversation lors de la réception ou l'envois d'un wizz." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Ne pas afficher d'avatar" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "Reg&ouper les conversations dans la même fenêtre :" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Toujours" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "Pour les contacts du même groupe" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Jamais" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Avatar :" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +#, fuzzy +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" "Si activé, une popup apparait lorsqu'un nouvel e-mail est arrivé dans votre " "boite de réception. Le nombre de messages non-lus est afiché au dessus de la " "liste de contact. Cette option n'est disponible que pour les comptes Hotmail." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" -msgstr "" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Afficher le nombre de mails non lus" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" "Si activé, KMess informe les contacts du morceau que vous êtes en train " "d'écouter. Cette information est obtenue depuis votre logiciel de lecture " "audio, s'il est en activité et supporté. " -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 -#, fuzzy -msgid "Inform contacts w&hich song I am listening to" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" msgstr "Informer les contacts du morceau que j'écoute." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 #, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Si activé, votre statut sera modifié automatiquement en \"Absent - Innactif" -"\" lorsque vous n'utilisez pas votre ordinateur depuis un certain nombre de " -"minutes." +msgid "List Formatting" +msgstr "Format MSN Plus" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Changer le statut en \"Absent - &Inactif\" quand vous êtes inactif" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"Choisissez le délai d'innactivité, en minute, avant que KMess ne change " -"votre statut en \"Absent - Innactif\"." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Apparaître comme innactif après" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minutes" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" -"Si activivé, les conversations seront archivées dans un répertoire " -"particulier." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "&Archiver toutes les conversations" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" -"Sélectionnez le répertoire de votre système dans lequel vous souhaiteriez " -"enregistrer les conversations." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 #, fuzzy -msgid "Save chat files in this directory:" -msgstr "Archiver les conversations dans ce répertoire :" +msgid "Enable MSN &Plus formatting" +msgstr "Format MSN Plus" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" -"KMess créer automatiquement les sous-répertoires lorsque vous optez pour une " -"organisation annuelle, mensuelle ou quotidienne." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Année" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Mois" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Jour" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Enregistrer toutes les conversations dans le répertoire parent" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" -"Vous permet de modifier le thème qu'utilise KMess pour afficher les messages " -"lors des conversations." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Thème de la fénêtre de discussion :" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Paramètres" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Active l'affichage d'émoticônes dans les conversations." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Afficher les &Emoticônes" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" -"Active l'affichage de l'heure correspondant à la recepetion de chaque " -"message." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Afficher l'&heure à côté des messages" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Cette option active le regroupement des message du même contact. Lorsque le " -"contact rédige plusieurs messages à la suite pour s'exprimer, KMess les " -"regroupe comme s'il n'en former qu'un seul. L'apparence finale dépend du " -"thème choisi pour les conversations." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "Re&grouper les suites de messages d'un même contact" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Absent" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Votre liste de contacts contient trop de groupes" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Nerd" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "Ceci est le style de police est la couleur utilisés pour vos messages." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "Police de vos messages :" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"Permet d'avoir le dernier mot concernant la police de caractère et la " -"couleur des messages de vos contacts, en utilisant celles que vous " -"choisissez." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Contraindre les messages des contacts à utiliser cette police :" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Rend possible l'utilisation d'effet de police. Ecrire *gras*, /italique/ ou " -"_souligné_ fait que les mots encradrés apparaissent respectivement en gras, " -"italiques ou soulignés." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"&Utiliser les effets de police dans les messages, ex : *gras*, /italique/ et " -"_souligné_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "En attente de la liste de contact..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" msgstr "Thèmes d'&émoticônes" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" msgstr "Styles d'émoticônes disponibles :" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" msgstr "Émoticônes &personnalisées" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" -msgstr "Émoticônes personnalisée de ce compte :" +msgstr "Émoticônes personnalisées de ce compte :" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "Ajouter" +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "Cliquez ici pour ajouter une nouvelle émoticône personnalisée" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." +msgstr "Ajouter un nouveau..." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 -#, fuzzy +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Cliquez ici pour renommer l'émoticone sélectionnée" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" -msgstr "Re&nommer le Groupe" +msgstr "Re&nommer" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "Supprimer" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" -msgstr "Rose fanée" +msgstr "Navigateur web" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." -msgstr "" +msgstr "Choisissez cette option pour utiliser le navigateur par défaut de KDE." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "&Utiliser le navigateur par défaut de KDE" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." -msgstr "" +msgstr "Choisissez le navigateur parmi ceux disponibles." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "&Utiliser un navigateur déjà installé : " -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" +"Choisissez cette option pour entrer le chemin du navigateur de votre choix." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "&Spécifiez une commande personnalisée : " -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." -msgstr "" +msgstr "Utiliser '%u' pour insérer une URL dans la ligne de commande." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" msgstr "Client e-mail" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" +"Choisissez cette option pour utiliser le client e-mail par défaut de KDE." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "Utiliser le client Email par défaut de KDE" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "Utiliser un client e-mail déjà installé : " -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" +"Utiliser '%u' pour insérer une adresse e-mail dans la ligne de commande." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" -msgstr "Transferts de fichiers" +msgstr "Transfert de fichiers" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" -msgstr "Archiver les conversations dans ce répertoire :" +msgstr "&Archiver toutes les conversations dans ce répertoire :" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" +msgstr "&Utiliser les ports entre" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "et" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "pour le transfert de fichiers" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "Votre commentaire : " + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 -#, fuzzy -msgid "and" -msgstr "Triste" +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "Votre avis est : " -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 -#, fuzzy -msgid "for file transfers" -msgstr "Transferts de fichiers" +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "Quelque chose que vous aimez" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "Quelque chose que vous détestez" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +#, fuzzy +msgid "An improper behavior of the application" +msgstr "Aider à l'amélioration de l'application" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "Vous désirez une nouvelle fonctionnalité" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "Saisissez une adresse email pour être recontacté" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Je ne suis pas devant mon ordinateur" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Votre pseudo" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "vous@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Stockage du mot de passe sécurisé" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importer" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Supprimer" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Parti" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "" "Vous ne pouvez pas lancer cette invitation car il y a plusieurs contacts " "dans cette conversation." -#: chat/chat.cpp:158 -#, fuzzy +#: chat/chat.cpp:142 msgid "%1 has joined the chat." -msgstr "%1 a rejoint la conversation." +msgstr "%1 a rejoint la conversation." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "La conversation est devenue inactive, %1 a quitté la conversation." -#: chat/chat.cpp:215 -#, fuzzy +#: chat/chat.cpp:202 +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." -msgstr "%1 a quitté la conversation." +msgstr "%1 a quitté la conversation." -#: chat/chat.cpp:364 -#, fuzzy +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr "%1 et %1 - Conversation" +msgstr "%1 et %1" -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr "%1 etc. - Conversation" -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr " (Ce message a été envoyé automatiquement)" +msgstr "%1 (Ce message a été envoyé automatiquement)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 #, fuzzy -msgid "You received a wink from %1." -msgstr "Vous avez reçu un clin d'oeil de la part de %1" - -#: chat/chat.cpp:971 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" +"KMess ne pas pas sauvegarder les évènements pour cette conversation." +"
Le dossier des évènements, '%1\", n'existe pas." + +#: chat/chat.cpp:941 +#, fuzzy +msgid "You have sent a wink" +msgstr "Vous avez reçu un clin d'oeil de la part de %1" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Il y a eu un problème de connection." + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" +"%1 vous a envoyé un clip vocal mais KMess ne supporte pac cette " +"fonction pour l'instant." + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" +"%1 vous a envoyé un message action, mais KMess ne supporte pas encore " +"cette fonctionnalité." + +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "" +"%1 vous a envoyé un objet MSN qui n'est pas encore géré par KMess." + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" +"Le clin d'oeil n'a pas pu être affiché. Les données n'ont pas pu être lues." + +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." msgstr "" "Le clin d'oeil n'a pas pu être affiché. Vérifiez que \"cabextract\" soit " "bien installé." -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Le clin d'oeil n'a pas pu être affiché. Vérifiez que \"cabextract\" soit " +"bien installé." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." msgstr "" "Le clin d'oeil n'a pas pu être affiché. Les données n'ont pas pu être lues." -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1252 #, fuzzy -msgid "You have received a wink from %1" -msgstr "Vous avez reçu un clin d'oeil de la part de %1" +msgid "%1 has sent you a wink!" +msgstr "%1 vous a envoyé un clin d'œil !" -#: chat/chat.cpp:1100 -#, fuzzy -msgid "You received a nudge from %1!" -msgstr "Vous avez reçu un wizz de la part de %1 !" +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1289 #, fuzzy -msgid "The message '%1' could not be sent." +msgid "%1 has gone offline." +msgstr "%1 a rejoint la conversation." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 a rejoint la conversation." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 Vous a envoyez un wizz !" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "tous les contacts" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Vous avez reçu un nudge de la part de %1 !" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Vous avez reçu un clin d'oeil de la part de %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 a rejoint la conversation." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1 vous a envoyé un message différé :
'%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "Le message \"%1\" n'a pas pu être envoyé." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" -msgstr "Vous avez envoyé un wizz à %1 !" +msgstr "Vous avez envoyé un nudge à %1 !" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "Vous avez envoyé un wizz !" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 vous envoie un clin d'œil : %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 dit :" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +#, fuzzy +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "La conversation avec %1
a commencé à : %2" + +#: chat/chatmessageview.cpp:364 +#, fuzzy +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "Conversation démarrée à : %2" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "KMess a enregistré les conversations avec %1" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "Ajouter cette émoticône : %1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Inviter" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Reconnexion" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 +#, fuzzy msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" "Impossible d'archiver la conversation. Vérifiez d'avoir les droits " "d'écriture dans le répertoire où les archives sont enregistrées." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +#, fuzzy +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" -msgstr "Le fichier « %1 » existe déjà.
Voulez-vous l'écraser ?" +"Do you want to overwrite it?" +msgstr "" +"Le fichier « %1 » existe déjà.\n" +"Voulez-vous l'écraser ?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Écraser le fichier" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "&Ecraser" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." msgstr "Afficher les &Emoticônes" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +msgid "Ignore this &Emoticon" +msgstr "Ignorer cet &émoticône" + +#: chat/chatview.cpp:833 msgid "Send &Email" msgstr "&Envoyer un e-mail" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "Copier l'adresse e-mail" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "&Ajouter le Contact" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +msgid "Copy E&mail Address" +msgstr "Copier l'adresse &E-mail :" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "Suivre le &lien" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "Copier l'adresse" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "&Copier le texte" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "Tout &sélectionner" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "Trouver le &texte..." + +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +msgid "C&lear Chat" +msgstr "Effacer &la conversation" + +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Enregistrer la conversation dans le &fichier..." + +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Contacts" + +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Emoticônes" + +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" +msgstr "Mes émoticônes" + +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" -msgstr "&Enregistrer la conversation" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Fermer un onglet de conversation" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Conversation" +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" +msgstr "Fermer tous les onglets" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" +msgstr "Fermer l'onglet courant" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "&Inviter" + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." msgstr "Envoyer un &Fichier" -#: chat/chatwindow.cpp:493 +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "Conversation Webcam" + +#: chat/chatwindow.cpp:412 msgid "Start a &Meeting" msgstr "Démarrer une &Conférence" -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:413 msgid "Send a &Nudge!" -msgstr "Envoyer un &Wizz" +msgstr "Envoyer un &Wizz !" -#: chat/chatwindow.cpp:495 -msgid "Save chat" +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." msgstr "Sauvegarder la conversation" -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Emoticônes" - -#: chat/chatwindow.cpp:498 -#, fuzzy +#: chat/chatwindow.cpp:415 msgid "Close &All Tabs" -msgstr "Fermer l'onglet" +msgstr "Fermer tous les onglets" -#: chat/chatwindow.cpp:504 +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Changer la &Police" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Changer la &Couleur" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Afficher les &Emoticônes" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Afficher l'&heure à côté des messages" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "&Panneaux" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "Utili&Ser la correction orthographique" + +#: chat/chatwindow.cpp:442 #, fuzzy msgid "Meeting" msgstr "Paramètres" -#: chat/chatwindow.cpp:505 +#: chat/chatwindow.cpp:443 msgid "Nudge" -msgstr "" +msgstr "Nudge" -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "Démarrer ou Arréter une &Conversation" +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Envoyer un &Fichier" -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Changer la &Police" +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "Onglet p&récédent" -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Changer la &Couleur" +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "Onglet suivant" -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&Connexion" +#: chat/chatwindow.cpp:465 +msgid "Enable or disable the contacts panel" +msgstr "Activer ou désactiver le panneau de contacts" -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Changer la &Couleur" +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contacts" -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "Activer ou désactiver le panneau des émoticônes standards" -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" msgid "Emoticons" msgstr "Emoticônes" -#: chat/chatwindow.cpp:658 -msgid "My emoticons" +#: chat/chatwindow.cpp:477 +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Activer ou désactiver le panneau des émoticônes personnels" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" msgstr "Mes émoticônes" -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "Paramètres" +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Police" -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "Changer la &Couleur" -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "Afficher les &Emoticônes" +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "Effacer la fenêtre de Chat" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "Bar latérale" +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Démarrer ou Arréter une &Conversation" -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Bar latérale" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Afficher ou masquer la barre latérale" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" msgstr "" -#: chat/chatwindow.cpp:855 +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 #, fuzzy -msgid "Close all tabs" -msgstr "Fermer l'onglet" +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "Ne peut pas bloquer maintenant !" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "Fermer l'onglet" +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "Bar latérale" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Commande inconnue" -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "Afficher ou masquer la barre latérale" - -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 est en train d'écrire." - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 et %1 - sont en train d'écrire." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 et %3 autres sont en train d'écrire." - -#: chat/chatwindow.cpp:1611 -#, fuzzy +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Conversation" -#: chat/chatwindow.cpp:1615 -#, fuzzy +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - Conversation" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Masquer le menu" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1 est en train d'écrire..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 et %1 sont en train d'écrire..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 et %3 autres sont en train d'écrire..." + +#: chat/chatwindow.cpp:2296 +#, fuzzy +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" +"

Informations sur la conversation

Contacts:
  • %1
Début de la conversation:
" +"%2
" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "Démarrer une Conférence privée" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +msgid "&Send Email" msgstr "&Envoyer un e-mail" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "&Voir son Profil" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" -msgstr "" +msgstr "Ed&iter les notes" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Ajouter le Contact" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "Autoriser &le Contact" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "&Supprimer le contact" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Bloquer le Contact" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "&Débloquer le Contact" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" msgstr "&Pseudonyme" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "&Message Personnel" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" -msgstr "&Adresse e-mail :" +msgstr "Adresse &e-mail :" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "&Copier..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" +msgstr "&Copier" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Bloqué" -#: chat/contactframe.cpp:652 -#, fuzzy +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" -msgstr "Ce contact n'est pas en ligne" +msgstr "Le contact est %1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" +"

Vous n'avez pas encore ajouté d'émoticones personnalisées.

Pour ajouter une nouvelle émoticone, cliquez ici!

" -#: chat/emoticonsidebar.cpp:212 -#, fuzzy +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" -msgstr "Ajouter un Contact" +msgstr "Ajouter à la conversation" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Insérer une émoticône" +msgid "Add New" +msgstr "Ajouter un nouveau..." -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" -msgstr "" +msgstr "Edition" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 -#, fuzzy +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" -msgstr "Supprimé" +msgstr "Supprimer" -#: contact/contactbase.cpp:280 -msgid "Windows Mobile" -msgstr "" - -#: contact/contactbase.cpp:284 +#: chat/winkswidget.cpp:106 #, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

Vous n'avez pas encore ajouté d'émoticones personnalisées.

Pour ajouter une nouvelle émoticone, cliquez ici!

" + +#: contact/contactbase.cpp:304 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:308 msgid "Web Messenger" -msgstr "Design web" - -#: contact/contactbase.cpp:288 -msgid "Office Communicator" -msgstr "" - -#: contact/contactbase.cpp:292 -msgid "Messenger Bot" -msgstr "" - -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 -msgid "MSN Messenger %1 compatible" -msgstr "" +msgstr "Web Messenger" #: contact/contactbase.cpp:312 -#, fuzzy -msgid "Windows Live Messenger %1" -msgstr "Design web" +msgid "Office Communicator" +msgstr "Office Communicator" #: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" +msgid "Messenger Bot" +msgstr "Robot Messenger" -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "Compatible MSN Messenger %1" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" -msgstr "" +msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Compatible Windows Live Messenger %1" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Compatible Windows Live Messenger %1" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "En ligne" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Déconnecté" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Autorisé" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Supprimé" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 %2" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 %2" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Absent" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Bientôt de retour" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Occupé" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Invisible" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Absent" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "Absent avec auto-réponse" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "Inactif" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Bientôt de retour" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Au téléphone" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Parti manger" -#: dialogs/addcontactdialog.cpp:48 -#, fuzzy +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Invisible" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Déconnecté" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Mon Statut" + +#: contact/msnstatus.cpp:215 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Déconnecter" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" msgstr "Ajouter un Contact" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Supprimer le Groupe" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" msgstr "Ajouter une nouvelle émoticône" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "Emoticônes" +msgstr "Editer l'émoticône" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "L'émoticône « %1 » existe déjà. Voulez-vous l'écraser ?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "L'émoticône \"%1\" existe déjà. Voulez-vous l'écraser ?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "Rédiger un message d'Absence" +#: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "Rédiger un message automatique d'absence" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Historique de la fenêtre de discussion :" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Le transfert de %1 a échoué. Impossible d'ouvrir le port local." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 -#, fuzzy +#: dialogs/contactaddeduserdialog.cpp:58 msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "" -"%1\n" -"vous a ajouté(e) dans sa liste de contact. Que voulez-vous faire ?" +"%1 (%2)\n" +"vous a ajouté(e) dans sa liste de contact." -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Propriétés du contact %s" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Connecté" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" -msgstr "" +msgstr "Pas encore aperçu" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "Afficher l'&heure à côté des messages" +msgstr "Pas de messages pour le moment" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" -msgstr "" +msgstr "Vue pour la dernière fois : %1" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" -msgstr "" +msgstr "Dernier message : %1" -#: dialogs/contactpropertiesdialog.cpp:383 -#, fuzzy -msgid "Email: %1" -msgstr "E-mail" +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Adresse e-mail : %1" -#: dialogs/contactpropertiesdialog.cpp:384 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" msgid "Client: %1" -msgstr "Client e-mail" +msgstr "Client e-mail : %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Cliquez ici pour affiche le profil de ce contact." + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Contacts" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Inviter des contacts" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "&Exporter les propriétés du contact %1" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Rien a exporter" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "Fichier déjà existant" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "Le fichier « %1 » existe déjà, voulez-vous l'écraser ?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "Export terminé" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "L'export de la list des contacts a réussi" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "S&auvegarder l'onglet" #: dialogs/networkwindow.cpp:79 -#, fuzzy -msgid "S&ave tab" -msgstr "Sauvegarder l'onglet" +msgid "C&lear Tab" +msgstr "Effacer l'ong&let" #: dialogs/networkwindow.cpp:80 -#, fuzzy -msgid "C&lear tab" -msgstr "Effacer l'onglet" +msgid "C&lose All Tabs" +msgstr "Fermer tous les ong&lets" -#: dialogs/networkwindow.cpp:1054 -#, fuzzy +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "" -"Pas de connexions disponibles. Impossible d'ouvrir la fenêtre du réseau" +"Pas de connexions disponibles.\n" +" Impossible d'ouvrir la fenêtre du réseau" -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 #, fuzzy msgid "" "Could not save the Network Window log. Make sure you have permission to " @@ -2010,86 +2836,95 @@ msgstr "" "Impossible d'archiver la fenêtre du réseau. Vérifiez d'avoir les droits " "d'écriture dans le répertoire d'archivage." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "Impossible de fermer l'onglet de connexion principal." -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 -#, fuzzy +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" -msgstr "Impossible de fermer l'onglet de connexion principal." +msgstr "Impossible d'envoyer cette commande pour ce type de connection." -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" -msgstr "" +msgstr "Annulé" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "Echec !" -#: dialogs/transferentry.cpp:217 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Ordinateur" +msgstr "Complet" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" -msgstr "%1 Mo" +msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" -msgstr "%1 ko" +msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 octets" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." -msgstr "" +msgstr "%1 sur %2 reçus." -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." -msgstr "" +msgstr "%1 sur %2 envoyé." -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "inifini" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Utiliser" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Supprimer" + +#: dialogs/userpicturesdialog.cpp:46 #, fuzzy -msgid "Cl&ean Up" -msgstr "&Vider" +msgid "Choose or Remove Your Display Picture" +msgstr "Choisissez ou supprimez votre avatar" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Effacer l'avatar" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete the picture?" +msgstr "Etes-vous sûr(e) de vouloir supprimer cet avatar ?" -#: emoticontheme.cpp:601 +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -2097,360 +2932,402 @@ msgstr "" "Impossible de sauvegarder le thème d'émoticônes. Vérifier que vous avez les " "droits d'écriture sur le dossier de thèmes '%1'." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Sourire" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "Clin d'œil" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Tirrage de langue" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "Grand sourire" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Triste" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "En pleur" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "En colère" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Perplexe" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "Géné" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "Déçu" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "Lunette de soleil" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "Dents sorties" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "Nerd" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "Malade" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Etonné" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Fête" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "Fatigué" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "Songeur" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Bouche cousue" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "Chuchotement" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "Mouvement occulaire" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "Sarcastique" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" -msgstr "Hésitant" +msgstr "Je ne sais pas" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Bientôt de retour" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Ange" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Calin gauche" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Homme" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Cœur rouge" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Rose rouge" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +#, fuzzy +msgid "Thumbs up" msgstr "Pouce en haut" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Tête de chien" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Soleil" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Démon" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Calin droite" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Femme" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Cœur brisé" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "Rose fanée" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Pouce en bas" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Tête de chat" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "Demi-lune assoupie" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Lèvres rouges" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Applauddisement" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "Doigts croisés" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Voiture" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Avion" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Tortue" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "Escargot" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Mouton noir" +#: emoticontheme.cpp:869 +msgid "Sheep" +msgstr "Mouton" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Chèvre" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "Chauve sourie" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Choppe de bière" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "Verre de Martini" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "Tasse de café" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Gateau d'anniversaire" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Couverts" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Bol" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Etoille" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Arc-en-ciel" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Mauvais temps" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Eclair" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Parapluie" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Île avec palmier" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" -msgstr "Combinet téléphonique" +msgstr "Combiné téléphonique" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Téléphone portable" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "E-mail" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Horloge" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "Appareil photo" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "Bobine de film" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Note" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Menottes" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Argent" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" -msgstr "Ampoulle" +msgstr "Ampoule" -#: emoticontheme.cpp:882 -msgid "Cigarrette" -msgstr "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" +msgstr "Cigarette" -#: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "Ballon de foot" +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "Ballon de football" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Cadeau emballé" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Ordinateur" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "Icone KMess" -#: initialview.cpp:226 -#, fuzzy +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "Reconnection impossible : le compte n'a pas été trouvé." + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" +"Reconnection impossible : ce compte n'a pas de mot de passe sauvegardé." + +#: initialview.cpp:280 initialview.cpp:379 +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" +"En attente d'une reconnectin de la ligne Internet...
Reconnection maintenant !" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" msgid "Internet connection not available." -msgstr "Le serveur est indisponible" +msgstr "Connection Internet indisponible" -#: initialview.cpp:377 -msgid "Connect" -msgstr "Connexion" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +"Attendez %1 secondes avant la reconnection...
Reconnection " +"maintenant !" +msgstr[1] "" -#: initialview.cpp:382 -#, fuzzy -msgid "Disconnect" -msgstr "&Déconnexion" +#: initialview.cpp:581 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Connexion" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "" +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" +msgstr "Annuler" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "" +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "S'il vous plaît, remplissez votre adresse e-mail et mot de passe." -#: kmess.cpp:223 -#, fuzzy +#: initialview.cpp:657 +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Saisissez une adresse e-mail valide." + +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "Information sur le contact" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "Le contact %1 est déjà présent dans votre liste." + +#: kmess.cpp:250 msgid "New Group" -msgstr "Nouveau &Groupe" +msgstr "Nouveau Groupe" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Ajouter un Groupe" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" -msgstr "Entrer le nouveau nom pour ce groupe :" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" +msgstr "Entrer un nom pour le nouveau groupe :" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" @@ -2458,350 +3335,438 @@ msgstr "" "Etes-vous sûr(e) de vouloir supprimer %1 de votre liste de " "contact ?" -#: kmess.cpp:571 -msgid "Remove contact" -msgstr "Supprimer le Contact" +#: kmess.cpp:579 +msgid "Remove Contact" +msgstr "Supprimer le contact" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +msgid "Remove and Block" msgstr "Supprimer et bloquer" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" -msgstr "" +msgid "Group Removal" +msgstr "Supprimé du groupe" -#: kmess.cpp:628 -#, fuzzy +#: kmess.cpp:634 msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" "Etes-vous sûr(e) de vouloir supprimer le groupe %1 de votre liste " "de contact ?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" msgstr "Supprimé" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "C'est un groupe spécial qui ne peut être changé." -#: kmess.cpp:671 -msgid "Rename group" +#: kmess.cpp:677 +msgid "Rename Group" msgstr "Renommer le Groupe" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Entrer le nouveau nom pour ce groupe :" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 -#, fuzzy +#: kmess.cpp:757 msgctxt "dialog title" -msgid "Autologin failed" -msgstr "L'authentification a échouée" +msgid "Autologin Failed" +msgstr "L'authentification automatique a échouée" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Connexion en cours..." + +#: kmess.cpp:1123 +msgctxt "Status bar message" msgid "Disconnected" msgstr "Déconnecté" -#: kmess.cpp:1408 -#, fuzzy +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" "

KMess ne pourra pas jouer de son ou de notification.

Le fichier " "KMess « eventsrc » ne peut être trouvé dans aucun des répertoires suivants : %" "1

Veuillez vérifier votre installation et copier le fichier manquant " "dans un des répertoires listés." -#: kmess.cpp:1412 -msgid "Error with notifications" +#: kmess.cpp:1481 +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Erreur avec notifications" -#: kmess.cpp:1589 -#, fuzzy -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "Ac&tions" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Nouveau &Contact" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Nouveau &Groupe" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "Rech&ercher un Contact" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Rechercher par &Intérêts" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "Rech&ercher un Contact" +msgstr "KMess - %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Nouve&au Compte" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "&Paramètres du Compte" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "Con&nexion" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&Déconnexion" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "Voir mon &Profil" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Mon Statut" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Absent avec auto-réponse" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "Afficher les Contacts &Autorisés" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Afficher les Contacts &Déconnectés" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "Afficher les Contacts Supp&rimés" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 #, fuzzy +msgid "Show &History Box" +msgstr "Historique de la fenêtre de discussion :" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "Afficher la barre de recherche" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" -msgstr "Afficher les &Emoticônes" +msgstr "Affich&er les groupes vides" -#: kmessinterface.cpp:321 -#, fuzzy -msgid "Display Pictures Size" -msgstr "Avatar" +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "Taille &des Avatars" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -#, fuzzy -msgid "Small" -msgstr "Sourire" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" msgstr "Cla&sser les Contacts par" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Afficher la fenêtre de &Transfert" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "Nouveau &Contact..." + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "Nouveau &Groupe..." + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "&Exporter la liste des contacts..." + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "Rechercher par C&ontact" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Rechercher par &Intérêts" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Historique de la fenêtre de discussion :" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "Nouve&au Compte..." + +#: kmessinterface.cpp:189 +msgid "Configure Account..." +msgstr "Configuration du Compte..." + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "Configurer &KMess..." + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "Voir le menu Sélection" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "Ne pas afficher" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "Petit" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "Moyen" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "Large" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "Groupe" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Connecté/Déconnecté" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "Mélangé" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "Afficher la fenêtre de &Transfert" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "Afficher la fenêtre du &Réseau" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "En train d'écouter %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "[%1] Indentifié avec %2" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr "" +msgstr "[%1] %2 vient de se connecter" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr "" +msgstr "[%1] %2 vient de se déconnecter" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "Conversa&tion" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Propriétés" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +msgid "&Remove From Group" msgstr "Supp&rimer du groupe" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "En train d'écouter %1" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "&Copier dans le groupe" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "Déplacer dans le &Groupe" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "Placer le Groupe en &Bas" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Placer le Groupe en &Haut" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "Suppri&mer le Groupe" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Re&nommer le Groupe" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "E-mail" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "&Ajouter cette personne dans votre liste de contact" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" -msgstr "" - -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" - -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" - -#: kmessview.cpp:1085 +#: kmessview.cpp:1133 #, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Adresse e-mail :" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Client e-mail : %1" + +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "Oui" + +#: kmessview.cpp:1156 +msgid "No" +msgstr "Non" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Bloqué" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Vue pour la dernière fois : %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Dernier message : %1" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" -msgstr "
%1 (%2)" +msgstr "Groupe %1" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "Contacts" - -#: kmessview.cpp:1095 -#, fuzzy +#: kmessview.cpp:1212 msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Ce contact n'est pas en ligne" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 contact, %2 en ligne" +msgstr[1] "Ce contact n'est pas en ligne" -#: kmessview.cpp:1504 -#, fuzzy +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contact" +msgstr[1] "Contacts" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" -msgstr "Rédigez ici votre message perso " +msgstr "<Rédigez ici votre message perso>" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" -msgstr[0] "" +msgstr[0] "%1 nouveau mail" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" -msgstr "" +msgstr "Un client MSN Messenger pour KDE" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:60 msgid "Developer and project founder" -msgstr "" +msgstr "Développeur et fondateur du projet" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:61 msgid "Developer" -msgstr "" +msgstr "Développeur" -#: main.cpp:72 -#, fuzzy +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 msgid "Project support" -msgstr "support du champ P4-Context" +msgstr "Support du projet" -#: main.cpp:73 main.cpp:74 main.cpp:75 -#, fuzzy +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" -msgstr "Développeur de GnomeMeeting" +msgstr "Développeur actif" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastasi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." @@ -2809,228 +3774,561 @@ msgstr "" "Traduction allemande, tests, documentation, webmaster, gestion du projet, " "etc." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:70 msgid "Web design" msgstr "Design web" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "David Vignoni" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "Traduction italienne et les Emoticons originaux/jaune/bleu/violet" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Les Emoticons \"Cartoon\"" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Thème sonore par defaut" -#: main.cpp:83 -msgid "KMess icon in Oxygen style" -msgstr "" +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "Michael Anderton" -#: main.cpp:87 +#: main.cpp:74 +msgid "KMess icon in Oxygen style" +msgstr "Icône KMess pour le style Oxygen" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "Responsable de la traduction" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Traduction arabe, Correction de l'internationalisation des fichiers " "sauvegardés." -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "Traduction arabe supplémentaire" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Traduction portugaise/brésilienne" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "Traduction portugaise / brésilienne supplémentaire" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Traduction catalane" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" "Traduction chinoise simplifiée, correction de bug dans l'envoi de fichiers " "et connexion au proxy" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "Traduction chinois simplifié supplémentaire" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "Traduction chinois traditionnel" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinese" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "Traduction chinois traditionnel supplémentaire" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:92 msgid "Danish translation" msgstr "Traduction danoise" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:93 msgid "More Danish translation" msgstr "Traduction danoise supplémentaire" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:94 msgid "Dutch translation" msgstr "Traduction néerlandaise" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "Traduction néerlandaise supplémentaire" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:97 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "Traduction allemande, grecque supplémentaires" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Traduction française supplémentaire" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:103 msgid "Estonian translation" msgstr "Traduction estonienne" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:104 msgid "Finnish translation" msgstr "Traduction finnoise" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "Traduction finnoise supplémentaire" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:108 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:108 msgid "French translation" msgstr "Traduction française" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:109 msgid "More French translation, MSN6 emoticon definitions" msgstr "Traduction française supplémentaire, définitions des emoticons de MSN6" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" msgstr "Traduction française supplémentaire" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "Traduction hongroise" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "Traduction hongroise supplémentaire" + +#: main.cpp:115 main.cpp:116 msgid "More Italian translation" msgstr "Traduction italienne supplémentaire" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:117 msgid "Korean translation" msgstr "Traduction coréenne" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:118 msgid "Norsk Bokmål translation" msgstr "Traduction norvégien oriental (Norsk Bokmål)" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:120 +msgid "Serbian translation" +msgstr "Traduction serbe" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "Traduction slovaque" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "Matjaž kaše" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "Traduction slovène" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Traduction espagnole" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 msgid "More Spanish translation" msgstr "Traduction espagnole supplémentaire" -#: main.cpp:123 +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:132 msgid "Swedish translation" msgstr "Traduction suédoise" -#: main.cpp:125 +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:133 +#, fuzzy +msgid "More Swedish translation" +msgstr "Traduction suédoise" + +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:135 msgid "Thai translation" msgstr "Traduction thaï" -#: main.cpp:126 +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:136 msgid "Turkish translation" msgstr "Traduction turque" -#: main.cpp:127 main.cpp:128 +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:137 main.cpp:138 msgid "More Turkish translation" msgstr "Traduction turque supplémentaire" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:141 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" -#: main.cpp:132 +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:142 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" -#: main.cpp:133 +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:143 #, fuzzy msgid "File transfer thumbnails" msgstr "Transferts de fichiers" -#: main.cpp:134 +#: main.cpp:144 msgid "P4-Context field support" msgstr "support du champ P4-Context" -#: main.cpp:135 +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:145 msgid "Xinerama fixes" msgstr "Correction Xinerama" -#: main.cpp:136 +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:146 msgid "Original file receive code" msgstr "Code Original pour le transfert de fichier" -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" -msgstr "" +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" -#: main.cpp:138 -#, fuzzy +#: main.cpp:147 msgid "KWallet support" -msgstr "support du champ P4-Context" +msgstr "Support de KWallet" -#: main.cpp:139 +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:148 msgid "" -"Notifications blocking option,winks disabling option,last message date " +"Notifications blocking option, winks disabling option, last message date " "feature" msgstr "" -#: main.cpp:142 +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 #, fuzzy +msgid "Chat history dialog" +msgstr "Historique de la fenêtre de discussion :" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:154 msgid "Various internationalization fixes" msgstr "Corrections d'internationalisation diverses." -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Corrections d'internationalisation diverses." -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "Développeur de GnomeMeeting" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Le gars avec un sac sur la tête" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspirations et code allant avec" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:162 msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "" "Ancien code des popups de notification, début du code pour le P2P, et " "gestion des problème avec MSN" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Code du compteur d'inactivité" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" msgstr "Votre nom ici ?" -#: main.cpp:156 -#, fuzzy +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" @@ -3040,29 +4338,42 @@ msgstr "" "S'il vous semble que votre nom manque à cette liste, s'il vous plaît " "contactez-nous également !" -#: main.cpp:159 -#, fuzzy +#: main.cpp:171 msgctxt "NAME OF TRANSLATORS" msgid "Your names" -msgstr "Votre pseudo" +msgstr "Vos pseudos" -#: main.cpp:160 -#, fuzzy +#: main.cpp:172 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" -msgstr "Votre adresse e-mail :" +msgstr "Vos e-mails :" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "Ne pas montrer la liste de contact sur la fenêtre au départ" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Se connecter automatiquement avec ce compte" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +"Lancer le mode de débuggage (pour la version de développement uniquement)" + +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "Individus" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Autorisé" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Supprimé" #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "Le contact a annulé la session." @@ -3079,62 +4390,104 @@ msgid "You have rejected the invitation." msgstr "Vous avez rejeté l'invitation." #: network/applications/application.cpp:540 -#, fuzzy -msgid "Do you want to accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "Voulez-vous accepter ou refuser ?" #: network/applications/application.cpp:581 -#, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "Cliquez pour annuler." -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Voullez-vous accepter le fichier : %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "Le contact veut vous envoyer un fichier : "%1" (%2)." -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Le fichier "%1" existe déjà.\n" +"Voulez-vous l'écraser ?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "Le transfert de %1 a échoué. Impossible d'ouvrir le fichier." -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "Le transfert de %1 a échoué. Impossible d'ouvrir le fichier." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Transfert accepté." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "Connexion à %1, port %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "Le transfert a été annulé" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Le contact a annulé le transfert du fichier "%1"." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "Vous avez annulé le transfert du fichier "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "Vous avez rejeté le transfer du fichier "%1"." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Connexion établie" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" -msgstr "Fichier transféré avec succès : %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "Fichier transféré avec succès "%1"." -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "Fichier reçu avec succès "%1"." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "Le transfert de %1 a échoué. Le fichier n'existe pas." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "Le transfert de %1 a échoué. Le fichier n'a pas pu être lu." -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "Envoi du fichier %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Envoi du fichier "%1" (%2)." -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Le contact a accepté le transfert du fichier "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3147,69 +4500,13 @@ msgstr "" "L'invitation au transfert du fichier a été annulée. Des données invalides " "ont été reçues." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "Le fichier « %1 » existe déjà.
Voulez-vous l'écraser ?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "Le transfert de %1 a échoué. Impossible d'ouvrir le fichier." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." -msgstr "" +msgstr "Vous avez accepté le transfert du fichier "%1"." -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Le contact a annulé le transfert." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Vous avez annulé la session.." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" -msgstr "" - -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Fichier transféré avec succès : %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Fichier transféré avec succès : %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "Le transfert de %1 a échoué. Le fichier n'existe pas." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "Le transfert de %1 a échoué. Le fichier n'a pas pu être lu." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Envoi du fichier %1" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Le contact a annulé le transfert." +msgstr "Le fichier ne peut pas être écrit" #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." @@ -3224,35 +4521,35 @@ msgstr "Démarrage de GnomeMeeting. Connexion à %1." msgid "Inviting the contact to a meeting." msgstr "Invitation du contact pour à une conférence." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" "L'invitation a été rejetée. La fonctionnalité n'est pas supportée par " "l'autre client." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "L'invitation a été annulée. Un erreur interne est survenue." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "" "L'invitation a été annulée. Trop de temps s'est écoulé sans que " "l'utilisateur ne se prononce." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "" "L'invitation·a·été·annulée. Trop·de·temps·s'est·écoulé·en attente de donnée." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" "L'invitation a été annulé. Le serveur de commutation a mis fin à la " "conversation." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "L'invitation a été annulée." @@ -3264,25 +4561,19 @@ msgstr "Vous êtes invité(e) à partager le bureau de cette personne." msgid "Starting KRDC. Connecting to %1." msgstr "Démarrage de KRDC. Connexion à %1." -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Le contact a rejeté l'invitation. Une erreur interne s'est produite." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" +"Le contact essaye d'utiliser une fonctionnalité MSN6 que KMess ne supporte " +"par encore." -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "Le transfert a échoué." - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." @@ -3290,67 +4581,46 @@ msgstr "" "L'invitation a été annulée. Le contact a envoyé des données invalides, ou " "bien KMess ne les comprend pas." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"Le transfert a échoué. Le contact a envoyé des données invalides, ou bien " -"KMess ne les gère pas." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "" -"Le transfert à échoué. Trop de temps s'est écoulé sans que l'utilisateur " -"n'accepte." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "Le transfert a échoué. Une erreur interne est survenue." - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "Le transfert a échoué. Impossible d'ouvrir la source de données." - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" -"Le contact essaye d'utiliser une fonctionnalité MSN6 que KMess ne supporte " -"par encore." - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "Le transfert à échoué. La préparation des données a échouée." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." msgstr "L'invitation a été annulé. Le message ne nous était pas destiné." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" "Le transfert a échoué. Le contact a envoyé des données invalides, ou KMess " "ne les gère pas." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Le contact a rejeté l'invitation. Une erreur interne s'est produite." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "En attente d'une connexion à %1, port %2." -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" "Passage contraint en mode indirect de transfert de fichier (cela peut " "prendre du temps)." -#: network/applications/p2papplication.cpp:3113 -#, fuzzy +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" -msgstr "En attente de la liste de contact..." +msgstr "En attente de connection" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." @@ -3358,7 +4628,7 @@ msgstr "" "L'invitation a été annulée. Trop·de·temps·s'est " "écoulé·sans·que·l'utilisateur·n'accepte." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." @@ -3366,12 +4636,38 @@ msgstr "" "L'invitation a été annulée. Trop·de·temps·s'est écoulé·en attendant que la " "connexion s'établisse." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" "L'invitation a été annulée. Trop·de·temps·s'est écoulé·en attente de donnée." +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Le transfert a échoué." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Le transfert a échoué. Le contact a envoyé des données invalides, ou bien " +"KMess ne les gère pas." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" +"Le transfert à échoué. Trop de temps s'est écoulé sans que l'utilisateur " +"n'accepte." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Le transfert a échoué. Une erreur interne est survenue." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "Le transfert a échoué. Impossible d'ouvrir la source de données." + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "Vous êtes invité(e) à démarrer une conversation vocale." @@ -3405,164 +4701,132 @@ msgstr "Démarrage·de·la·conversation·vocale. A l'écoute sur %1." msgid "Inviting the contact to a voice conversation." msgstr "Invitation du contact à une conversation vocale." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" "Le contact vous invite à démarrer '%1', mais cette fonctionnalité n'est pas " "encore implantée." -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." msgstr "" +"L'invitation au transfert du fichier a été annulée. Des données invalides " +"ont été reçues." -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "Le transfert de %1 a été annulé." +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Vous avez demandé à voir votre webcam." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "" +"Vous êtes invité(e) à débuter une conférence avec la webcam de cette " +"personne." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "Webcam" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" -msgstr "" +msgstr "Echec" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Envoi du fichier %1" + +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "Le transfert de %1 a échoué. Impossible d'ouvrir le port local." -#: network/extra/msnftpconnection.cpp:408 -#, fuzzy +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." -msgstr "Le transfert de %1 a échoué. Impossible d'ouvrir le port local." +msgstr "Impossible d'ouvrir le port local." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Amorce du transfert de fichier" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy +msgid "The transfer of %1 failed. A connection could not be made." msgstr "Le transfert de %1 a échoué. La connexion n'a pas pu être établie" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 #, fuzzy msgid "Unable to make a connection." msgstr "Impossible d'établir la connexion : %1" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "Réception du fichier %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"Kmess n'a pas pu accéder au service web à distance.\n" -"\n" -"Détails : %1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Vous avez été déconnecté car vous vous\n" -"êtes connecté(e) avec un autre client MSN ou\n" -"depuis un autre endroit" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Synchronisation" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Authentification" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "En attente de la liste de contact..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "" -"L'authentification a échouée, merci de vérifier vos identifiants (nom " -"d'utilisateur et mot de passe)" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Connexion en cours..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess a reçu une commande inconnue de la part du serveur: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" -msgstr "" +msgstr "Syntaxe de commande invalide" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" -msgstr "" +msgstr "Paramètre de commande invalide" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" "L'e-mail que vous avez essayé d'ajouté n'est pas un compte MSN Messenger" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" -msgstr "" +msgstr "Nom de domaine incorrect" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" -msgstr "" +msgstr "Déja connecté en" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" -msgstr "Le nom de compte entré est invalide" +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" +msgstr "Le nom de compte saisi est invalide" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 +#, fuzzy msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" "Le nom de compte entré est invalide, ou bien votre adresse e-mail Passport " "n'a pas encore été confirmée" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "Votre liste de contacts est pleine" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" -msgstr "" +msgstr "Paramètre SBP invalide" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "Ce contact est déjà présent dans votre liste" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "Ce contact n'est pas dans votre liste" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "Ce contact n'est pas en ligne" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" +msgstr "Déja dans ce mode" + +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Ce contact n'est pas dans votre liste" - -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 #, fuzzy msgid "" "The group name is already added to your Messenger or Hotmail contact list. " @@ -3570,520 +4834,697 @@ msgid "" msgstr "" "Ce nom de groupe est déjà utilisé dans votre liste de contact MSN ou Hotmail" -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" -msgstr "Votre liste de contacts contient trop de groupes" +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "" +"Votre liste de contacts contient trop de groupes ; vous ne devez pas en " +"avoir plus de 30." -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "Ce groupe ne peut pas être modifié" -#: network/msnnotificationconnection.cpp:2260 -#, fuzzy +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" -msgstr "Votre liste de contacts contient trop de groupes" +msgstr "Le contact n'a pas été ajouté au groupe" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "Ce groupe n'est pas vide" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "Ce nom de groupe est trop long" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "Le nom du groupe est trop long ; il ne peut pas dépasser 61 bytes." -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "Il y a eu une erreur interne dans KMess : %1" -#: network/msnnotificationconnection.cpp:2277 -#, fuzzy +#: network/msnconnection.cpp:470 msgid "Invalid Group" -msgstr "Re&nommer le Groupe" +msgstr "Groupe invalide" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" -msgstr "" +msgstr "Domaine vide" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "Mauvais format de commande ADL" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "Echec de commutation" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "Le transfert vers le serveur de commutation a échoué" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Erreur de connexion directe (MSNSLP), la connexion a échouée" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Émoticônes personnalisée de ce compte :" - -#: network/msnnotificationconnection.cpp:2307 -msgid "Command is disabled" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:505 +msgid "Command is disabled" +msgstr "La commande est désactivée" + +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "Votre compte est banni." -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "Le transfert a échoué." -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" -msgstr "" +msgstr "Mauvaise commande de données" -#: network/msnnotificationconnection.cpp:2323 -#, fuzzy +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" -msgstr "Vous ouvrez des sessions trop rapidement" +msgstr "Vous ouvrez des sessions de conversations trop rapidement" -#: network/msnnotificationconnection.cpp:2327 -#, fuzzy +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" msgstr "Vous avez trop de sessions ouvertes" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "Nom antipathique" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" -msgstr "" +msgstr "Mauvaise donnée CVR" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +#, fuzzy +msgid "The server reports KMess is flooding it with too much data" msgstr "" "Le serveur indique que KMess le polue avec un nombre trop important de " "données" -#: network/msnnotificationconnection.cpp:2357 -#, fuzzy +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" -msgstr "L'authentification a échouée" +msgstr "Le ticket d'authentification est incorrect" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "" "Vous ne pouvez entammer une conversation avec quiconque tant que vous êtes " "invisible." -#: network/msnnotificationconnection.cpp:2364 -#, fuzzy +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" -msgstr "Nouveaux directeurs non acceptés" +msgstr "Nouveaux contacts non acceptés" -#: network/msnnotificationconnection.cpp:2368 -#, fuzzy +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -"Tu as un compte Passport pour enfant, tu dois obtenir l'accord de tes " +"Vous avez un compte Passport pour enfant, vous devez obtenir l'accord de vos " "parents pour discuter en ligne." -#: network/msnnotificationconnection.cpp:2371 -#, fuzzy -msgid "Your passport account needs to be verified first." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." msgstr "Votre compte Passport doit d'abord être vérifié." -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" -msgstr "" +msgstr "Mauvais ticket USR" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "Erreur en accédant à la liste de contact, réessayez plus tard" -#: network/msnnotificationconnection.cpp:2399 -#, fuzzy +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." -msgstr "Il y a eu une erreur interne au serveur" - -#: network/msnnotificationconnection.cpp:2410 -msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" +"Le service MSN est temporairement indisponible suite à une erreur interne." -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:603 +msgid "The MSN service is temporarily unavailable, the server is too busy" +msgstr "Le service MSN est temporairement indisponible, le serveur est saturé" + +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Le serveur de notification est innaccessible" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "Le serveur va être innaccessible" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "Le·serveur·va·bientôt être·innaccessible" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "L'écriture bloque" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "La session sature" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "Le serveur est indisponible" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "L'authentification a échouée" -#: network/msnnotificationconnection.cpp:2449 +#: network/msnconnection.cpp:642 #, fuzzy -msgid "Unknown error code received from the server: %1" +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "KMess a reçu une commande inconnue de la part du serveur: %1" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 -#, fuzzy +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 msgctxt "Error dialog box title" -msgid "MSN error" -msgstr "KMess - Erreur MSN" +msgid "MSN Error" +msgstr "Erreur MSN" -#: network/msnnotificationconnection.cpp:2596 -#, fuzzy -msgctxt "Time left before server maintenance" -msgid "1 minute" -msgid_plural "%1 minutes" -msgstr[0] "minutes" -msgstr[1] "minutes" - -#: network/msnnotificationconnection.cpp:2599 -#, fuzzy -msgid "Server closes for maintenance in %1!" -msgstr "Attention : Le serveur s'arrêtera pour maintenance dans %1 minutes !" - -#: network/msnnotificationconnection.cpp:2604 -#, fuzzy -msgctxt "Server maintenance dialog box text" -msgid "The MSN Server will be going down in %1 for maintenance." -msgstr "Le serveur MSN subira un arrêt pour maintenance dans une minute" - -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Authentification..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Authentifié" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Basculer sur un autre seveur..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Connexion en cours..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "KMess a reçu une commande inconnue de la part du serveur: %1" + +#: network/msnnotificationconnection.cpp:2109 +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minute" +msgstr[1] "minutes" + +#: network/msnnotificationconnection.cpp:2112 +msgid "Server closes for maintenance in %1!" +msgstr "Le serveur est arrêté pour maintenance dans %1 !" + +#: network/msnnotificationconnection.cpp:2117 +msgctxt "Server maintenance dialog box text" +msgid "The MSN Server will be going down in %1 for maintenance." +msgstr "Le serveur MSN subira un arrêt pour maintenance dans %1." + +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2318 #, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" "KMess n'a pas pu procéder à l'envois de vos message en direction d'un " "contact déconnecté.\n" "\n" "Détails : %1" -#: network/msnnotificationconnection.cpp:3172 -#, fuzzy +#: network/msnnotificationconnection.cpp:2589 msgid "Authentication time limit exceeded" -msgstr "L'authentification a échouée" +msgstr "L'authentification a échouée (délai dépassé)" -#: network/msnnotificationconnection.cpp:3218 -#, fuzzy +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "En attente de la liste de contact..." + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Attention: %1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "Avertissement MSN" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" -msgstr "Il y a eu une erreur interne dans KMess : %1" +msgstr "
Erreur interne pour la raison : %1" -#: network/msnnotificationconnection.cpp:3242 -#, fuzzy -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" +"

L'authentification a échouée, merci de vérifier vos identifiants (nom " +"d'utilisateur et mot de passe)

" + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"

Vous avez été déconnecté car vous vous\n" +"êtes connecté(e) avec un autre compte %1 ou\n" +"depuis un autre endroit.

" + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" "KMess n'a pas été en mesure de se connecter aux serveurs de messagerie MSN. " "Ces derniers peuvent être en phase maintenance temporaire, ou bien il s'agit " "d'un problème concernant votre connexion à internet." -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

Activer la connection au service Live Messenger.

" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -#, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "La connexion avec le serveur a été perdue." - -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:2968 #, fuzzy +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" msgstr "" -"Échec d'authentification, KMess ne peut procéder au login passport.

" -"Détails : %1" +"KMess n'a pas été en mesure de se connecter aux serveurs de messagerie MSN. " +"Ces derniers peuvent être en phase maintenance temporaire, ou bien il s'agit " +"d'un problème concernant votre connexion à internet." -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Erreur du serveur" +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Erreur: %1

" -#: network/msnsockettcp.cpp:352 -#, fuzzy +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Le serveur Live Messenger a rapportée une erreur :

%1

" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Erreur du Service Messenger: %1

" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Le serveur Live Messenger a signalé une erreur :

%1

" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

KMess Erreur: %1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

KMess a rencontré une erreur interne :

%1

" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Connection au réseau perdu.

" + +#: network/msnnotificationconnection.cpp:3017 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

La connexion avec le serveur Live Messenger a été perdue.

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" +"

Developpeur info :
Erreur numéro : %1
Chaîne " +"erreur : %2

" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Erreur interne code : %2)" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" +"%1 (Erreur interne code : %2)
Réponse : %3 %4
Source de " +"redirection : %5" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" -msgstr "Temps limite de connexion" +msgstr "Temps limite de connexion dépassé" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "1 perte de ping" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" -msgstr "% pertes de pings" +msgstr "%1 pertes de pings" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" msgstr "La connexion avec le serveur a été perdue." -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Cette personne est déconnectée ou invisible." - -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "Le·contact·essaye·d'utiliser·une·fonctionnalité·MSN7·que·KMess·ne·supporte·par·encore." - -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "Le message \"%1\" n'a pas été reçu !" - -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "Impossible d'établir la connexion : %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/addressbookservice.cpp:777 +#, fuzzy +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" +"L'e-mail que vous avez essayé d'ajouté n'est pas un compte MSN Messenger" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" +#: network/soap/addressbookservice.cpp:787 +#, fuzzy +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" +"L'e-mail que vous avez essayé d'ajouté n'est pas un compte MSN Messenger" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Requête du service web invalide (%1)" + +#: network/soap/httpsoapconnection.cpp:402 +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Le service web est inaccessible (%1)" + +#: network/soap/httpsoapconnection.cpp:471 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "Trop de redirections du service de login" -#: notification/chatnotification.cpp:163 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "In %1's chat: %2" -msgstr "Dans la conversation de %2" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Le serveur est indisponible" -#: notification/chatnotification.cpp:167 -#, fuzzy -msgid "%1 says:
'%2'" -msgstr "%1 dit :
'%2'" +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" -#: notification/chatnotification.cpp:171 -#, fuzzy -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 vous a envoyé un message hors ligne :
'%2'" +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Réponse du service web invalide (%1)" -#: notification/chatnotification.cpp:178 -#, fuzzy +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Pas de réponse du service web" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Type de réponse inattendue du serveur (%1)" + +#: notification/chatnotification.cpp:154 +msgid "In %1's chat:
%2" +msgstr "Dans la discussion de %1 :
%2" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "%1 dit :
'%2'" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 vous a envoyé un message différé :
'%2'" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" -msgstr "Conversation de %1 demande votre attention" +msgstr "Conversation avec %1 demande votre attention !" -#: notification/chatnotification.cpp:183 -#, fuzzy -msgid "%1:
%2" -msgstr "%1 :
%2" +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr "%1 Vous a envoyez un wizz !" +msgstr "%1 vous a écrit un message à main levée !" -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr "%1 Vous a envoyez un wizz !" +msgstr "%1 Vous a envoyez un wizz !" -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr "%1 vous a envoyé un clin d'œil !" +msgstr "%1 vous a envoyé un clin d'œil !" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 désire utiliser la webcam !" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 vous envoie un fichier !" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 vous a envoyé une invitation !" #: notification/chatnotification.cpp:204 -#, fuzzy -msgid "%1 wants to use the webcam!" -msgstr "%1 désire utiliser la webcam !" +msgid "%1 has canceled the webcam session!" +msgstr "%1 a annulé la session webcam !" #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 vous envoie un fichier !" +msgid "%1 has canceled the file transfer!" +msgstr "%1 a annulé le transfert de fichier !" #: notification/chatnotification.cpp:206 #, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "%1 vous a envoyé une invitation !" - -#: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "%1 a annulé la session webcam !" - -#: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "%1 a annulé le transfert de fichier !" - -#: notification/chatnotification.cpp:215 -#, fuzzy msgid "%1's activity has been canceled!" msgstr "L'activité de %1 a été annulée !" -#: notification/chatnotification.cpp:222 -#, fuzzy +#: notification/chatnotification.cpp:213 msgid "%1 has accepted to use the webcam!" -msgstr "%1 a accepté d'afficher la webcam !" +msgstr "%1 a accepté d'afficher la webcam !" + +#: notification/chatnotification.cpp:214 +msgid "%1 has accepted the file transfer!" +msgstr "%1 a accepté le transfert de fichier !" + +#: notification/chatnotification.cpp:215 +msgid "%1 has accepted your invitation!" +msgstr "%1 a accepté votre invitation !" + +#: notification/chatnotification.cpp:222 +msgid "%1 has ended the webcam session!" +msgstr "%1 a mis fin à la session webcam !" #: notification/chatnotification.cpp:223 #, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "%1 a accepté le transfert de fichier !" - -#: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1 a accepté votre invitation !" - -#: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "%1 a mis fin à la session webcam !" - -#: notification/chatnotification.cpp:232 -#, fuzzy msgid "The file transfer with %1 is done!" msgstr "Le transfert de fichier avec %1 est terminé !" -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 #, fuzzy msgid "%1's activity has ended!" msgstr "L'activité de %1 s'est terminée !" -#: notification/chatnotification.cpp:240 -#, fuzzy +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" -msgstr "La session webcam de %1 a échouée !" +msgstr "La session webcam de %1 a échouée !" -#: notification/chatnotification.cpp:241 -#, fuzzy +#: notification/chatnotification.cpp:232 msgid "The file transfer with %1 has failed!" -msgstr "Le transfert de fichier avec %1 a échoué !" +msgstr "Le transfert de fichier avec %1 a échoué !" -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 #, fuzzy msgid "%1's activity has ended with an error!" msgstr "L'activité de %1 s'est terminée avec une erreur !" -#: notification/contactstatusnotification.cpp:70 -#, fuzzy -msgid "%1 is now online" -msgstr "%1 s'est connecté" +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
est maintenant connecté" -#: notification/contactstatusnotification.cpp:71 -#, fuzzy -msgid "%1 has gone away" -msgstr "%1 s'est absenté" +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
vient de s'absenter" -#: notification/contactstatusnotification.cpp:72 -#, fuzzy -msgid "%1 will be right back" -msgstr "%1 sera de retour dans un instant" +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
sera de retour dans un instant" -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1 est maintenant occupé" +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
is désormais occupé" -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1 est devenu invisible" +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
est devenu invisible" -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1 est passé inactif" +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
a été ralenti" -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1 s'est déconnecté" +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
s'est déconnecté" -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 téléphone" +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
Au téléphone" -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 est partit manger" +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
est partit manger" -#: notification/newemailnotification.cpp:78 -#, fuzzy -msgid "New email:
'%1'
by '%2'" -msgstr "E-mail reçu :
« %1 »
de « %2 »" +#: notification/newemailnotification.cpp:90 +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "E-mail reçu :
'%1'
de '%2'" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Démarrer une conversation" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Laissez un message" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Voir le message" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Détails" + +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Lire l'e-mail" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Masquer" + +#: notification/systemtraywidget.cpp:78 +#, fuzzy +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"La fermeture de la fenêtre principale laisse KMess fonctionner en arrière " +"plan. Cliquez sur \"Quitter\" dans le menu \"Fichier\" pour quitter " +"véritablement le programme." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Ancrage dans le System Tray" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " - %1 (%2)" + +#: settings/accountpage.cpp:80 msgid "Browse..." -msgstr "" +msgstr "Parcourir..." -#: settings/accountpage.cpp:70 -#, fuzzy -msgid "Browse and crop picture..." -msgstr "Parcourir et couper l'image " +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Parcourir et couper l'image..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." -msgstr "" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Voir les images..." -#: settings/accountpage.cpp:448 -#, fuzzy +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" msgstr "Le téléchargement de l'avatar a échoué." -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 #, fuzzy msgid "" "An error occurred when trying to change the display picture.\n" @@ -4092,161 +5533,771 @@ msgstr "" "Une erreur est survenue en tentant de modifier votre avatar.\n" "Vérifiez bien d'avoir sélectionner un fichier image valide." -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "&Supprimer le contact" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Paramètres" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "Compte" -#: settings/accountsettingsdialog.cpp:76 -#, fuzzy +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" -msgstr "Compte" +msgstr "Mon compte" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Alertes" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "Notification KMess" +msgid "Contact List" +msgstr "Contacts" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Conversation" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Archivage des conversations" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 #, fuzzy msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "L'adresse de contacte que vous avez saisie est invalide : %1" -#: settings/accountsettingsdialog.cpp:201 -#, fuzzy +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" -msgstr "L'adresse de contacte que vous avez saisie est invalide : %1" +msgstr "L'adresse e-mail que vous avez saisi est déjà utilisée : '%1'" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Etes-vous sûr(e) de vouloir supprimer ce compte ?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." -msgstr "Etes-vous sûr(e) de vouloir supprimer ce compte ?" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Etes-vous sûr(e) de vouloir supprimer ce compte '%1' ? Tous les paramètres " +"seront également supprimés." -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "Salut, comment ça va ? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "Stacy" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "Super !" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "Je viens /juste/ de rentrer de mes vacances en Italie !" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" +"Vous pouvez seulement utiliser 7 caractères pour les raccourcis des " +"émoticônes." -#: settings/globalsettingsdialog.cpp:45 -#, fuzzy +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "Nom d'émoticône invalide" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Remplacer l'émoticône existante" + +#: settings/emoticonspage.cpp:233 +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Etes-vous sûr(e) de vouloir supprimer cet émoticône \"%1\" ?" + +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Effacer l'émoticône" + +#: settings/globalsettingsdialog.cpp:46 msgid "KMess Settings" -msgstr "Paramètres" +msgstr "Paramètres KMess" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Comptes" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 -#, fuzzy -msgid "Notification" -msgstr "Notification d'e-mails" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notifications" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." +msgstr "Aucun navigateur détecté." + +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Aucun client e-mail détecté." + +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." -msgstr "" - -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" -msgstr "" - -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 -#, fuzzy +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" -msgstr "Archiver les conversations dans ce répertoire :" +msgstr "Sélectionner le répertoire des fichiers" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"La fermeture de la fenêtre principale laisse KMess fonctionner en arrière " -"plan. Cliquez sur \"Quitter\" dans le menu \"Fichier\" pour quitter " -"véritablement le programme." -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Ancrage dans le System Tray" +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "Envoyer un message aux développeur&s" -#: systemtraywidget.cpp:245 +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Bienvenue sur cette version de test de %1." + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "Bienvenue sur %1." + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "J'aime beaucoup ce nouveau thème. Très agréable." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 %2" +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" +"Je souhaiterais un nouveau design contactez moi et je vous enverrais " +"mon trvail par email" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "Pour nous aider à améliorer Kmess, vos commentaires sont importants." + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Exemple" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Aider à l'amélioration de l'application" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Envoyer un commentaires aux développeurs" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"L'adresse de contacte que vous avez saisie est invalide et ne peut pas être " +"utilisée : %1" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Commentaire envoyé" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#~ msgid "Conversations Filter" +#~ msgstr "Filtre de conversation" + +#~ msgid "Filter by &conversation" +#~ msgstr "Filtrer par &conversation" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Choisissez le compte que vous souhaitez modifier puis cliquez ici" + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Le nudge pour %1 n'a pas été envoyé." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "Le clin d'oeil de %1 n'a pas été envoyé." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Le dessin pour %1 n'a pas pu être envoyé." + +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Le message '%1' pour %2 n'a pas été envoyé." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "&Utiliser" + +#~ msgid "&Copy..." +#~ msgstr "&Copier..." + +#~ msgid "Insert New" +#~ msgstr "Insérer nouveau" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "Adresse e-mail : %1" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Client : %1" + +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Bloqué : %1" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Vue pour la dernière fois : %1" + +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Dernier message : %1" + +#~ msgctxt "Message in list tooltip" +#~ msgid "Has you: %1" +#~ msgstr "Vous a dans sa liste : %1" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "Contacts" + +#~ msgid "&Show winks from contacts" +#~ msgstr "Afficher le&s clins d'oeil des contacts" + +#~ msgid "Enable in the contact list" +#~ msgstr "Activer dans la liste de contacts" + +#~ msgid "Enable in the chat windows" +#~ msgstr "Activer dans les fenêtres de conversation " + +#~ msgid "Alerts" +#~ msgstr "Alertes" + +#~ msgid "Alerts and Notifications" +#~ msgstr "Alertes et notifications" + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "Vous pouvez choisir le groupe auquel appartient le nouveau contact" + +#~ msgid "No Group" +#~ msgstr "Aucun groupe" + +#, fuzzy +#~ msgid "Now listening to: %1" +#~ msgstr "En train d'écouter %1" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "En train d'écouter %1" + +#, fuzzy +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "" +#~ "Kmess n'a pas pu accéder au service web à distance.\n" +#~ "\n" +#~ "Détails : %1" + +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "Échec d'authentification, KMess ne peut procéder au login Passport.
" +#~ "Détails : %1" + +#~ msgid "SOAP connection error: %1" +#~ msgstr "Erreur de connection SOAP : %1" + +#, fuzzy +#~ msgid "Close all tabs" +#~ msgstr "Fermer l'onglet" + +#~ msgid "&Send email" +#~ msgstr "&Envoyer un e-mail" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "Sauvegarder la conversation" + +#, fuzzy +#~ msgid "C&lose all tabs" +#~ msgstr "Fermer l'onglet" + +#~ msgid "Connect" +#~ msgstr "Connexion" + +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: account not found." +#~ msgstr "Impossible de se connecter : compte non trouvé." + +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: no password has been entered." +#~ msgstr "Impossible de se connecter : aucun mot de passe a été saisi." + +#~ msgid "Rename group" +#~ msgstr "Renommer le Groupe" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "&Paramètres du Compte" + +#, fuzzy +#~ msgid "Select an emoticon and click here to delete it" +#~ msgstr "Choisissez une émoticône et cliquez ici pour la supprimer." + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 s'est connecté" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 s'est absenté" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 est maintenant occupé" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 est passé inactif" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "Notification popup" + +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Me notifier quand mes contacts :" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "" +#~ "Si activé, un message popup est affiché lorsque l'un de vos contacts se " +#~ "connecte." + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "Se &déconnecte" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "" +#~ "Si activé, un message popup est affiché lorsque l'un de vos contacts " +#~ "débute une conversation avec vous." + +#~ msgid "Start a &chat with you" +#~ msgstr "Débuter une conversation avec moi" + +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "" +#~ "Si activé, un message popup est affiché à chaque fois qu'un contact vous " +#~ "envoi un message." + +#~ msgid "S&end you a message" +#~ msgstr "M'&envoyer un message" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when your contacts change their MSN " +#~ "status." +#~ msgstr "" +#~ "Si activé, un message popup est affiché lorsque l'un de vos contacts " +#~ "change d'état MSN." + +#~ msgid "Change their &status" +#~ msgstr "Changer votre état" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts goes " +#~ "offline." +#~ msgstr "" +#~ "Si activité, un message popup est aussi affiché lorsque l'un de vos " +#~ "contacts se deconnecte." + +#~ msgid "Go o&ffline" +#~ msgstr "Se &déconnecte" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "Adresse e-mail :" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "" +#~ "Afficher une notification lorsqu'un e-mail est reçu dans d'autres dossiers" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in the Inbox. " +#~ "This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Si activié, un popup apparait aussi lorsqu'un e-mail est reçu dans " +#~ "d'autres dossiers. Cette options n'est disponibles que pour les comptes " +#~ "Hotmail." + +#~ msgid "In the Inbox" +#~ msgstr "Dans la boîte de réception" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in other " +#~ "folders. This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Si activié, un popup apparait aussi lorsqu'un e-mail est reçu dans " +#~ "d'autres dossiers. Cette options n'est disponibles que pour les comptes " +#~ "Hotmail." + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "Alertes" + +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "Choisissez la durée d'affichage des popups de notification." + +#~ msgid "Hide popups after" +#~ msgstr "Masquer les popups après" + +#~ msgid "seconds" +#~ msgstr "secondes" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "Alertes" + +#~ msgid "" +#~ "Click here to have your conversations automatically saved with the XML " +#~ "format" +#~ msgstr "" +#~ "Cliquez ici pour sauvegarder automatiquement vos conversations au format " +#~ "XML" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Contacts" + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "Le·contact·essaye·d'utiliser·une·fonctionnalité·MSN7·que·KMess·ne·supporte·par·encore." + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "Mot de passe :" + +#, fuzzy +#~ msgid "" +#~ "If enabled, all chat conversations will be saved in the specified " +#~ "directory." +#~ msgstr "" +#~ "Si activivé, les conversations seront archivées dans un répertoire " +#~ "particulier." + +#~ msgid "Log &all chats" +#~ msgstr "&Archiver toutes les conversations" + +#~ msgid "Month" +#~ msgstr "Mois" + +#~ msgid "Day" +#~ msgstr "Jour" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "Contacts" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "Rech&ercher un Contact" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Cette personne est déconnectée ou invisible." + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "Le message \"%1\" n'a pas été reçu !" + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "Bar latérale" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "Afficher ou masquer la barre latérale" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "Afficher ou masquer la barre latérale" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Ce contact n'est pas en ligne" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "&Inviter" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "Impossible d'établir la connexion : %1" + +#~ msgid "Black sheep" +#~ msgstr "Mouton noir" + +#~ msgid "Copy E&mail" +#~ msgstr "Copier l'adresse e-mail" + +#~ msgid "Specify an Away message" +#~ msgstr "Rédiger un message d'Absence" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "E-mail" + +#~ msgid "Soccer ball" +#~ msgstr "Ballon de foot" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "Ce contact est déjà présent dans votre liste" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "E-mail" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "Ce contact n'est pas dans votre liste" + +#~ msgid "The group name is too long" +#~ msgstr "Ce nom de groupe est trop long" + +#, fuzzy +#~ msgid "No permissions given for this account" +#~ msgstr "Émoticônes personnalisée de ce compte :" + +#~ msgid "Enter your personal message here" +#~ msgstr "Rédigez ici votre message perso " + +#~ msgid "Click" +#~ msgstr "Cliquez" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "Fenêtre du réseau" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Design web" + +#~ msgid "Co&nnect" +#~ msgstr "Con&nexion" + +#, fuzzy +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "En attente de la liste de contact..." + +#, fuzzy +#~ msgid "SSL Error" +#~ msgstr "Erreur du serveur" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "&Paramètres du Compte" + +#, fuzzy +#~ msgid "You received a wink from %1." +#~ msgstr "Vous avez reçu un clin d'oeil de la part de %1" + +#~ msgid "Got synchronization" +#~ msgstr "Synchronisation" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Paramètres" + +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Voullez-vous accepter le fichier : %1 (%2)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "Le transfert a été annulé" + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Fichier transféré avec succès : %1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "Le transfert de %1 a échoué. Le fichier n'existe pas." + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "Le transfert de %1 a échoué. Le fichier n'a pas pu être lu." + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "Le transfert de %1 a été annulé." #~ msgid "Click to send an email to this contact." #~ msgstr "Cliquez pour envoyer un e-mail à ce contact." @@ -4254,10 +6305,6 @@ msgstr "%1 %2" #~ msgid "Picture:" #~ msgstr "Image : " -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Afficher les infos relatives aux e-mails" - #~ msgid "Logging in..." #~ msgstr "Connexion en cours..." @@ -4291,10 +6338,6 @@ msgstr "%1 %2" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "Vous avez %1 nouveaux messages dans votre boîte de réception." -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "Se &connectent" - #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "Le transfert de % a échoué. Impossible d'ouvrir le fichier" @@ -4319,12 +6362,6 @@ msgstr "%1 %2" #~ msgid "Your password:" #~ msgstr "Votre mot de passe :" -#~ msgid "Display picture:" -#~ msgstr "Avatar :" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "Ne pas afficher d'avatar" - #~ msgid "Status to set at login:" #~ msgstr "État utilisé à la connexion" diff --git a/po/hu.po b/po/hu.po index 8526745..f72460d 100644 --- a/po/hu.po +++ b/po/hu.po @@ -1,14 +1,19 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. # rezso , 2006. +# Pauli Henrik , 2008. # +# A gettext manuálból: “# translator-comments” +# Úgyhogy a hashmark-duplaspace-szel lehet megjegyzést hagyni magunknak az adott stringnél. Lesz ilyen bőven. +# Note to translation managers: please don’t remove hash-space-space comments, they’re useful :) +# Except those which are in English and are preceded by ‘REPORT’ for example: those are bug reports for the original strings. msgid "" msgstr "" "Project-Id-Version: Kmess\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2007-12-02 19:10+0100\n" -"Last-Translator: rezso \n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2008-09-20 01:10+0200\n" +"Last-Translator: Ralesk \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,438 +21,755 @@ msgstr "" "X-Poedit-Language: Hungarian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Country: HUNGARY\n" +"X-Previous-Translators: rezso \n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Cartoon emotikonok" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "" +"Ezzel a gombbal kezdheted meg a KMess használatát vagy szakíthatod meg a " +"kapcsolódási kisérletet" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Nem üzent még sose" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" +"Ezzel a gombbal kezdheted meg a KMess használatát vagy szakíthatod meg a " +"kapcsolódási kisérletet" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Cartoon emotikonok" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "&Saját emotikonok" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Kacsintás" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "Kattints ide a partner megjelenített képének visszaállításához" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" msgstr "Új &sor" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "&Küldés" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "Partnerek" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Társalgás" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." -msgstr "Kattints ide a partnered profiljának megtekintéséhez." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Fő eszköztár" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" -msgstr "" +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" +msgstr "Kattints ide a partnered menüjének megtekintéséhez" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 #, fuzzy +msgid "Click here to open your account settings" +msgstr "Kattints ide a kiválasztott emotikon átnevezéséhez" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "Rajzterület &törlése" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "Toll &színe" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "Toll mérete" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "&Radír" + +# FIXME -- Kezdő? Kezdeti? Első? Valami ilyesmi. +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Csoport:" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" -msgstr "A felvenni kívánt személy e-mail címe:" +msgstr "Írd be ide a felvenni kívánt személy e-mail címét:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "E-mail cím" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "E-mail cím:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" +# FIXME -- shortcutra mit mondjunk? +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Add meg az emotikont előhívó karaktersorozatot:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -#, fuzzy -msgid "Initial group" -msgstr "Csoport át&nevezése" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "Add meg az emotikon kódját:" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "Válassz egy képfájlt:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 -#, fuzzy +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "" -"Add meg az automatikus válaszüzenetet\n" -"amit azok fognak megkapni, akik üzenni akarnak neked:" +"Add meg az automatikus válaszüzenetet amit azok fognak megkapni, akik üzenni " +"akarnak neked:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "&Automatikus távolléti üzenet:" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 #, fuzzy -msgid "&Automatic away message" -msgstr "Távollét üzenet megadása" +msgid "Search through contacts..." +msgstr "Partner &keresése" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Társalgás naplózása" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "&Ne legyen kép" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 -#, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "Partner &felvétele a \"Barátok\" listájára" - -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 -#, fuzzy -msgid "Do not add this person; only allow them to see my online state" -msgstr "&Nem veszem fel, de láthatja, ha bejelentkezem." - -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 -#, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" msgstr "" -"Partner tiltása (nem léphet kapcsolatba veled és az elérhetőségedet sem " + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +#, fuzzy +msgid "to" +msgstr "Autó" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Hangos &megbeszélés indítása vagy befejezése" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Mit szeretnél tenni?" + +# FIXME -- jó-e a partner szó arra, aki még nem kontaktlista-tag? A személy és az illető szó kicsit túl formális... +# FIXME -- jó-e a kontaktlista szó? +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" +msgstr "Az illető &felvétele a kontaktlistára" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person; only allow them to see my status" +msgstr "&Nem veszem fel, de láthatja, ha bejelentkezem" + +# FIXME -- jó-e a partner szó arra, aki még nem kontaktlista-tag? A személy és az illető szó kicsit túl formális... +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting me or seeing my status" +msgstr "" +"Az illető &tiltása (nem léphet kapcsolatba veled és az elérhetőségedet sem " "láthatja)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "%1 partner adatai" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" -msgstr "" +msgstr "&Információ" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 -#, fuzzy -msgid "Restore" -msgstr "Törölve" +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "Kattints ide a partner megjelenített képének visszaállításához" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Visszaállítás" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Csoportok:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -#, fuzzy -msgid "Use alternative name for this person" -msgstr "Alternatív név használata e személyhez" +# FIXME -- kicsit fura, majd tekerünk rajta +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "&Alternatív név használata ehhez a személyhez" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "Buborékjelző megjelenítése, amikor a partner be- vagy kijelentkezik" +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "&Buborékjelző megjelenítése, amikor a partner be- vagy kijelentkezik" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "Hang:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Hang:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" -msgstr "" +msgstr "&Képek" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 #, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Kattints ide a kiválasztott emotikon törléséhez" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Megjelenítendő kép" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 msgid "&Clear Cache" -msgstr "Fül törlése" +msgstr "Fül &törlése" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "&Feljegyzések" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 #, fuzzy -msgid "Notes" -msgstr "Jegyzet" +msgid "&Emoticons" +msgstr "Emotikonok" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "Kattints ide a kiválasztott emotikon törléséhez" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Tör&lés" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "Elérhető partnerek" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "Kontaktlistán nem szereplő személy meghívása:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "Írd be a meghívandó személy e-mail címét" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "Meghívott partnerek" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Exportálandó elemek:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Formátum" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Partnerek:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "Mindet kijelöl" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Kielölés megszüntetése" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Exportálás…" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Bezárás" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" -msgstr "Hálózat ablak" +msgstr "Hálózatablak" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" -msgstr "" +msgstr "Parancs küldése az aktuális fülbe" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "Parancs:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" -msgstr "" +msgstr "Típus:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "Csillag" +msgstr "Szabványos" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" -msgstr "" +msgstr "MIME" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" -msgstr "&Küldés" +msgstr "Küldés" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" -msgstr "" +msgstr "Parancs adattartalma (payload, lehet üres):" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" -msgstr "" +msgstr "Megnyitás" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 -#, fuzzy +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" -msgstr "Megszakítva" +msgstr "Mégsem" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "&Letöltés" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "&Feltöltés" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "&Takarítás" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "&Bezárás" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" msgstr "" +"Kattints ide az éppen kiválasztott fiók beállításainak " +"megtekintéséhez, vagy használd az egér görgőjét a tárolt fiókok közötti " +"váltáshoz" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "E-mail cím: " +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Írd be ide a Passport vagy Live fiókod e-mail címét" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 -#, fuzzy +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" -msgstr "Jelszó" +msgstr "Jelszó:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" -msgstr "Státusz bejelentkezéskor" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "Írd be ide a fiókod jelszavát" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "" +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Státusz bejelentkezéskor:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 #, fuzzy -msgid " Account options " -msgstr "Fiók &beállítások" +msgid "Choose a status to set when successfully connected." +msgstr "Válaszd ki, mi legyen a státuszod miután bejelentkeztél." -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "Ha engedélyezett, a KMess elmenti ezt a fiókot" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" msgstr "Profil megje&gyzése" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" +"Ha úgy döntesz, hogy a KMess jegyezze meg a fiókod adatait, lehetőséged van " +"a jelszót is elmenteni" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "Jelszó megjegy&zése" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Ezzel a gombbal kezdheted meg a KMess használatát vagy szakíthatod meg a " +"kapcsolódási kisérletet" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 +msgid "&Connect" +msgstr "&Kapcsolódás" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Új fiók" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" +"Kattints ide új Live fiók létrehozásához, amivel az MSN hálózatához " +"tudsz majd kapcsolódni.
Használhatod egy már meglévő e-mail címedet is a " +"regisztrációkor." + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "Elfelejtett jelszó" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +#, fuzzy +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Kattints ide a Live website meglátogatásához – ezen a weblapon tudsz " +"új jelszót kérni az elfelejtett helyett." + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" msgid "&Connect" msgstr "&Kapcsolat" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Add meg a személyes üzeneted itt" +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Nézet" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Műveletek" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 #, fuzzy +msgid "Form" +msgstr "Formátum" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Fiók" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 msgid "Your Account Information" -msgstr "Fiók &beállítások" +msgstr "Fiók&beállítások" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." -msgstr "Add meg a nevet, amit partnereid látnak, amikor online vagy." - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 #, fuzzy -msgid "&Friendly name:" -msgstr "&Baráti név" +msgid "Enter the name other contacts should see when you are online." +msgstr "Add meg a nevet, amit partnereid látnak, amikor be vagy jelentkezve." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 +msgid "&Friendly name:" +msgstr "&Baráti név:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" "Add meg az MSN Passport fiókod e-mail címét. Új fiókot a http://register." "passport.com/ címen tudsz létrehozni." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 -#, fuzzy +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 msgid "&Email address:" -msgstr "E-mail cím: " +msgstr "&E-mail cím:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -455,390 +777,721 @@ msgstr "" "Add meg az MSN Passport fiókod jelszavát. Új fiókot a http://register." "passport.com/ címen tudsz létrehozni." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" -msgstr "Jelszó" +msgstr "&Jelszó:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -#, fuzzy -msgid "&Remember Password" -msgstr "Jelszó" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "Jelszó megjegy&zése" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" -msgstr "Kép megjelenítése" +msgstr "Megjelenítendő kép" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." -msgstr "&Módosítás..." +msgstr "&Módosítás…" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" -msgstr "" +msgstr "&Ne legyen kép" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -"A \"Profil megjegyzése\" opciót kikapcsoltad a bejelentkezés alatt, így a " +"A „Profil megjegyzése” opciót kikapcsoltad a bejelentkezés alatt, így a " "beállításaid nem lesznek elmentve. Ha a beállításaidat folyamatosan el " "akarod menteni, engedélyezd.\n" "\n" -"Ha a KMess-t nem vendégként, vagy nyilvános helyen (pl. internet kávézóban) " +"Ha a KMess-t nem vendégként, vagy nyilvános helyen (pl. internetkávézóban) " "használod, ajánlott engedélyezni ezt az opciót." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 -#, fuzzy +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "Fiók beállításainak megjegyzése" +msgstr "&Fiók beállításainak megjegyzése" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." -msgstr "Ha engedélyezett, a KMess automatikusan bejelentkezik e fiókkal." +msgstr "Ha engedélyezett, a KMess automatikusan bejelentkezik ezzel a fiókkal." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" -msgstr "&Automatikus bejelentkezés e fiókkal induláskor" +msgid "Log in &with this account automatically" +msgstr "&Automatikus bejelentkezés ezzel a fiókkal induláskor" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "Ö&sszes társalgás naplózása" +msgstr "Bejelentkezés &mint" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -"Egy passport fiókra van szükséged az MSN Messenger használatához. " -"Regisztrálhatod a jelenlegi e-mail címedet a register.passport.com címen, " -"vagy használj Hotmail fiókot a kapcsolódáshoz." +"Meg kell látogatnod a Passport site-ot, hogy megerősítsd, az e-mail címed " +"létezik." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" "Nem módosíthatod a megjelenítendő neved, mert az e-mail címed nincs " "megerősítve." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "Megerősítő e-mail kérése" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "Ugrás az accountservices.passport.net címre" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"Egy Passport fiókra van szükséged az MSN Messenger használatához. " +"Regisztrálhatod a jelenlegi e-mail címedet a register.passport.com címen, " +"vagy használj Hotmail fiókot a kapcsolódáshoz." + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" "Az MSN Messenger szolgáltatás használatához regisztrálnod kell egy e-mail " "címet Passport fiókként." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "Új fiók létrehozása" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "Ugrás a register.passport.com címre" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 #, fuzzy +msgid "&Status Options" +msgstr "Státusz bejelentkezéskor:" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Ha engedélyezett, a státuszod automatikusan „Inaktív” lesz, ha pár percig " +"nem használod a gépet. Amennyiben ez a beállítás nem elérhető, a KMess ennek " +"a támogatása nélkül készült." + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Státusz módosítása „Inaktív”-ra tétlenség esetén" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "A KMess ennyi perc után változtatja a státuszod „Inaktív”-ra." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Távollét ideje" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "perc" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +#, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "&Ne legyenek értesítések ha Elfoglalt állapotban vagyok" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 msgid "Saved accounts:" -msgstr "Fiókok" +msgstr "Tárolt fiókok:" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "Kattints" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -"Kattints ide új saját emotikonok hozzáadásához, hogy elküldhesd a " -"partnereidnek." +"Kattints ide egy új KMess profil létrehozásához (ehhez olyan e-mail cím " +"szükséges, amihez tartozik MSN fiók)" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." -msgstr "Fiók" +msgid "&Add Account..." +msgstr "Fiók &hozzáadása…" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "Válassz egy emotikont és kattints ide a törléséhez." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" +msgstr "Válassz egy profilt és kattints ide a törléséhez" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" -msgstr "" +msgstr "S&zerkesztés" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 -#, fuzzy +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "Válassz egy profilt és kattints ide a törléséhez" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" -msgstr "Törölve" +msgstr "&Törlés" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Popup értesítések" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "Engedélyezd ezt a beszélgetéseid automatikus elmentéséhez" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 -#, fuzzy -msgid "Contact Events" -msgstr "Partnerek" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "Értesítések megjelenítése amikor egy partner:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" msgstr "" -"Ha engedélyezett, egy felugró üzenet is megjelenik, amikor egy partnered " -"bejelentkezik." +"

Ha engedélyezed a társalgások naplózását, minden beszélgetésed egy " +"meghatározott helyre lesz elmentve, amit alább adhatsz meg.

\n" +"

Az beszélgetések mentése lehetővé teszi, hogy később ezeket újra " +"elolvashasd, és találhass bennük régen küldött linkeket, vagy csak hogy " +"eszedbe jusson, mit is mondtál valamikor valakinek.

\n" +"

Viszont ez problémát is okozhat, ha valaki hozzáfér a számítógépedhez és " +"azon megtalálja ezeket a fájlokat, elolvashatja ezeket.

\n" +"

Amennyiben egy mások által is használt számítógépen vagy, ezt a " +"beállítást hagyd kikapcsolva!

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -#, fuzzy -msgid "&Go online" -msgstr "&Kijelentkezik" +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "Társalgás naplózása" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +# REPORT -- space at the end +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" +"A KMess HTML formátumba is tudja menteni a beszélgetéseket és ezeket a " +"fájlokat rendezetten tárolja" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "Társalgás mentése fájlba" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "Itt be tudod állítani, hogy mentse el a KMess a beszélgetéseket" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "Mentéshez használt fájlformátum:" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" msgstr "" -"Ha engedélyezett, egy felugró üzenet is megjelenik, amikor egy partnered " -"társalgást kezdeményez." +"\n" +"

Fontos, hogy milyen formátumot választasz.

\n" +"

A HTML fájlokat bármilyen böngészővel meg lehet nyitni, de nem biztos, " +"hogy egy másik számítógépen is jól jelennek meg.

\n" +"

Az egyszerű szöveges fájlok viszont mindenhol ugyanúgy néznek ki, ám nem " +"tartalmaznak szövegformázást, felhasználói képeket és emotikonokat.

\n" +"" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "&Társalgást kezdeményez" +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "HTML-oldal" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "Egyszerű szöveg" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." msgstr "" -"Ha engedélyezett, egy felugró üzenet is megjelenik, amikor egy partnered " -"üzenetet küld." +"Itt adhatod meg, hogyan rendezze a KMess az elmentett beszélgetéseket az " +"alul kiválasztott könyvtáron belül." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "Üz&enetet küld" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." msgstr "" -"Ha engedélyezett, egy felugró üzenet is megjelenik, amikor egy partnered " -"státusza megváltozik." +"Attól függően, hogy hogy választasz, a KMess létre fog hozni könyvtárakat a " +"fájlok tárolására. Részletesebb információkért használd a „Mi ez?” funkciót." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "&Státusza megváltozik" +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" +msgstr "Elmentett társalgások szétválogatása:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "Könyvtárak létrehozása évek szerint" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" msgstr "" -"Ha engedélyezett, egy felugró üzenet is megjelenik, amikor egy partnered " -"kijelentkezik." +"Ebben az esetben a KMess évenként válogatja szét az elmentett " +"beszélgetéseket.\n" +"Minden évnek külön könyvtára lesz, amiben megtalálhatod az abban az évben " +"történt összes társalgást.\n" +"\n" +"Például egy 2008 november 29-i beszélgetés itt lesz elmentve:\n" +"/2008/dátum-felhasználónév.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "&Kijelentkezik" +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Év szerint" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "Könyvtárak létrehozása év majd hónap szerint" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "E-mail cím" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "Értesítés, ha e-mail érkezik az \"egyéb mappák\"-ba" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" msgstr "" -"Ha engedélyezett, egy felugró üzenet jelenik meg, amikor egyéb mappákba e-" -"mail érkezik. Ez az opció csak Hotmail fiókoknál használható." +"Ebben az esetben a KMess először évek, majd hónapok szerint is szétválogatja " +"az elmentett beszélgetéseket.\n" +"Minden év könyvtárában hónap könyvtárakat fogsz találni, és azokban pedig az " +"összes, adott évben és hónapban történt beszélgetést.\n" +"\n" +"Például egy 2008 november 29-i beszélgetés itt lesz elmentve:\n" +"/2008/11/dátum-felhasználónév.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "Év, majd hónap szerint" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "Könyvtárak létrehozása év, hónap majd nap szerint" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" +"Ebben az esetben a KMess először évek, majd hónapok, végül napok szerint " +"válogatja szét az elmentett beszélgetéseket.\n" +"Minden év könyvtárában lesznek hónap könyvtárak, azokon belül pedig a napok " +"könyvtárait találod. Ezekben az adott dátumon történt beszélgetések fájljai " +"foglalnak helyet.\n" +"\n" +"Például egy 2008 november 29-i beszélgetés itt lesz elmentve:\n" +"/2008/11/29/dátum-felhasználónév.html" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "Év, hónap, majd nap szerint" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" +msgstr "Összes társalgás mentése a kijelölt könyvtárba, szétválogatás nélkül" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" +"Ebben az esetben a KMess nem válogatja szét a fájlokat, mindet ugyanabba a " +"könyvtárba menti." + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "Sehogy" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "Kattints ide a könyvtár kiválasztásához" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "A könyvtár, ahova az összes beszélgetésed mentve lesz" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "Válaszd ki azt a könyvtárat, ahová a társalgásokat szeretnéd menteni." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "Társalgások mentése ebbe a könyvtárba:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "&Téma" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"Lehetővé teszi a Kmess üzenetek megjelenítéséhez használt témájának cseréjét." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "&Társalgás stílusa:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "Megadja, hogy hány másodpercig legyen látható a buborékjelző." +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Beállítások" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Buborékjelző megjelenítése ennyi ideig:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "másodperc" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 #, fuzzy -msgid "Other Alerts" -msgstr "Jelzések" +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Engedélyezi az emotikonok használatát a társalgásokban." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "&Emotikonok megjelenítése" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 #, fuzzy -msgid "&Show winks from contacts" -msgstr "&Kijelentkezett partnerek megjelenítése" +msgid "Show &winks" +msgstr "&Emotikonok megjelenítése" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Az opció lehetővé teszi az ugyanazon partnertől kapott üzenetek " +"csoportosítását. Amikor a partner több üzenetet ír, a KMess egy üzenetté " +"csoportosítja ezeket, ennek megjelenése a választott stílustól függ." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "Ugyanazon partner egymást &követő üzeneteinek összevonása" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Engedélyezi az idő megjelenítését minden üzenetnél." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "&Idő megjelenítése" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +msgid "Show &date" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +#, fuzzy +msgid "Show s&econds" +msgstr "&Emotikonok megjelenítése" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Szöveg" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "A társalgás üzeneteidben használt betűtípus és betűszín." + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "Üzeneteid &betűtípusa:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"Lehetővé teszi, hogy a parnereid üzeneteinek betűtípusát és színét az " +"általad választottra cseréld." + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "" +"&Mindig ezen betűtípus használata a partnerek üzeneteinek megjelenítéséhez:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Beszélgetésablak-események" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Formázások használatának engedélyezése. A *vastag*, /dőlt/, és _aláhúzott_ " +"jelzések hatására az adott szavakat vastag betűvel, döntve illetve aláhúzva " +"jeleníti meg." + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"&Formázások használata az üzenetekben, pl. *vastag*, /dőlt/, vagy _aláhúzott_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +#, fuzzy +msgid "Enable MSN Plus formatting" +msgstr "MSN Plus formázás" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -855,2189 +1508,2975 @@ msgstr "" "több rezgő figyelmeztetést is küldhetnek egyszerre, de a KMess csak az " "elsőre reagál.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "A társalgás ablakának megrázása rezgő figyelmeztetésnél" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "&Társalgások egy ablakba helyezése:" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Mindig" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "Az egy csoportba tartozó partnerekét" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Soha" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Megjelenítendő kép" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" "Ha engedélyezett, egy felugró üzenet jelenik meg, ha e-mail érkezik a bejövő " "leveleid mappájába. Az olvasatlan levelek száma a partnerlista felett " "jelenik meg. Ez az opció csak Hotmail fiókoknál használható." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" -msgstr "" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Olvasatlan levelek számának kijelzése" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" "Ha engedélyezett, a KMess kijelzi a partnereknek az általad hallgatott dalt. " "Ezt az információt az aktív lejátszóprogramtól kéri le a KMess." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" +msgstr "Az általam hallgatott &dal kijelzése a partnereknek" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" -msgstr "Az általam hallgatott dal kijelzése a partnereknek." +msgid "List Formatting" +msgstr "MSN Plus formázás" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 #, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Ha engedélyezett, a státuszod automatikusan \"Nincs a gépnél\" lesz, ha pár " -"percig nem használod a gépet." +msgid "Enable MSN &Plus formatting" +msgstr "MSN Plus formázás" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Státusz módosítása \"Nincs a gépnél\"-re tétlenség esetén" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"A KMess ennyi idő után változtatja a státuszod \"Nincs a gépnél\"-re (perc)." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Távollét ideje" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "perc" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" -"Ha engedélyezett, a társalgások a megadott könyvtárba lesznek elmentve." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "Ö&sszes társalgás naplózása" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "Válaszd ki azt a könyvtárat, ahová a társalgásokat szeretnéd menteni." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Társalgások mentése e könyvtárba:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" -"A KMess automatikusan létrehozza az alkönyvtárakat, ha az év, hónap, vagy " -"nap szerinti rendezést választod." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Év" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Hónap" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Nap" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Összes társalgás mentése a főkönyvtárba" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" -"Lehetővé teszi a Kmess üzenetek megjelenítéséhez használt témájának cseréjét." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Társalgás stílusa:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Beállítások" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Emotikonok használatának engedélyezése a társalgásokban." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "&Emotikonok megjelenítése" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Engedélyezi az idő megjelenítését minden üzenetnél." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "&Idő megjelenítése a társalgások üzeneteiben" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Az opció lehetővé teszi az ugyanazon partnertől kapott üzenetek " -"csoportosítását. Amikor a partner több üzenetet ír, a KMess egy üzenetté " -"csoportosítja ezeket, ennek megjelenése a választott stílustól függ." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "Ugyanazon partner egymást követő üzeneteinek összevonása" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Távol" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Túl sok csoport van a partnerlistádon (max: 30)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Idióta" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "A társalgás üzeneteidben használt betűtípus és betűszín." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "Üzeneteid betűtípusa:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"Lehetővé teszi, hogy a parnereid üzeneteinek betűtípusát és színét az " -"általad választottra cseréld." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "" -"Mindig e betűtípus használata a partnerek üzeneteinek megjelenítéséhez:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Betűeffektusok használatának engedélyezése. A *vastag*, /dőlt/, és " -"_aláhúzott_ az adott szavakat vastag betűvel, döntve vagy aláhúzva jeleníti " -"meg." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"&Betűformázások használata az üzenetekben, pl. *vastag*, /dőlt/, vagy " -"_aláhúzott_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Várakozás a partnerlistára..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" msgstr "&Emotikon témák" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" msgstr "Jelenlegi emotikon stílusok:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" msgstr "&Saját emotikonok" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" msgstr "Saját emotikonok e fiókhoz:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "Ú&j hozzáadása..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "Kattints ide új emotikon felvételéhez" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "Kattints ide a kiválasztott emotikon átnevezéséhez." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." +msgstr "Ú&j hozzáadása…" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Kattints ide a kiválasztott emotikon átnevezéséhez" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" msgstr "Át&nevezés" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "Tör&lés" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" -msgstr "Hervadó rózsa" +msgstr "Webböngésző" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." -msgstr "" +msgstr "Válaszd ezt a lehetőséget a KDE-ben beállított böngésző használatához." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "&KDE alapértelmezett böngésző" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" +"Válaszd ezt a lehetőséget a telepített böngészők listájából való " +"választáshoz." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "&Telepített böngésző használata:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" +"Válaszd ezt a lehetőséget, hogy te adhasd meg a használni kívánt böngészőt." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "&Saját parancs:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" +"Írd be a linkek megnyitásához használandó program nevét; a %u paraméter " +"helyére a hivatkozás URL-je fog behelyettesítődni." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." -msgstr "" +msgstr "Használd a %u paramétert az URL parancssorba illesztéséhez." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" -msgstr "Levelező kliens" +msgstr "Levelezőkliens" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" +"Jelöld be ezt a négyzetet, ha Live Mail kompatibilis fiókkal csatlakozol és " +"a Live Mail webes felületét szeretnéd használni e-mailezésre." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "Live Mail használata, amennyiben a fiók támogatja" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" +"Válaszd ezt a lehetőséget a KDE-ben beállított e-mail kliens használatához." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "&KDE alapértelmezett e-mail kliens használata" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "&Egyéb telepített e-mail kliens használata:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." -msgstr "" +msgstr "A %u paraméter helyére az e-mail cím fog behelyettesítődni." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "Fájlátvitelek" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" -msgstr "Társalgások mentése e könyvtárba:" +msgstr "&Minden fogadott fájl mentése ebbe a könyvtárba:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +# NOTE -- This and the other two with this tag are correct as of around r3800+ +# NOTE -- Direct translation: "For filetransfers, use ports [nnn]-from [mmm]-to" +# NOTE -- Just in case anyone wanted to fuzzy those two down there. +# TAG -- port_range +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" +msgstr "Fájlátvitelhez használandó &portok:" + +# TAG -- port_range +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "-tól" + +# TAG -- port_range +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "-ig" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "Megjegyzés:" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" +"

Információ

Partnerek:
  • %1
Beszélgetés kezdete:
%2
" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "&Privát beszélgetés indítása" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" +msgstr "&E-mail küldése" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "&Profil megjelenítése" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" -msgstr "" +msgstr "&Megjegyzések szerkesztése" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "Partner &felvétele" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "Partner &engedélyezése" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "Partner &törlése" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "Partner ti<ása" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "Partner tiltásának &feloldása" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" msgstr "&Baráti név" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "&Személyes üzenet" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" msgstr "&E-mail cím" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "&Másolás..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" +msgstr "&Másolás…" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Letiltott" -#: chat/contactframe.cpp:652 -#, fuzzy +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" -msgstr "A partner nincs bejelentkezve" +msgstr "A partner %1 állapotú" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" +"

Nem vettél még fel saját emotikonokat.

Új emotikonok " +"felvételéhez kattints ide!

" -#: chat/emoticonsidebar.cpp:212 -#, fuzzy +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" -msgstr "Partner felvétele" +msgstr "Beszúrás a társalgásba" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Emotikon beszúrása" +msgid "Add New" +msgstr "Ú&j hozzáadása…" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" -msgstr "" +msgstr "Szerkesztés" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 -#, fuzzy +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" -msgstr "Törölve" +msgstr "Törlés" -#: contact/contactbase.cpp:280 -msgid "Windows Mobile" -msgstr "" - -#: contact/contactbase.cpp:284 +#: chat/winkswidget.cpp:106 #, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

Nem vettél még fel saját emotikonokat.

Új emotikonok " +"felvételéhez kattints ide!

" + +#: contact/contactbase.cpp:304 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:308 msgid "Web Messenger" -msgstr "Web tervezés" - -#: contact/contactbase.cpp:288 -msgid "Office Communicator" -msgstr "" - -#: contact/contactbase.cpp:292 -msgid "Messenger Bot" -msgstr "" - -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 -msgid "MSN Messenger %1 compatible" -msgstr "" +msgstr "Web Messenger" #: contact/contactbase.cpp:312 -#, fuzzy -msgid "Windows Live Messenger %1" -msgstr "Web tervezés" +msgid "Office Communicator" +msgstr "Office Communicator" #: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" +msgid "Messenger Bot" +msgstr "Messenger Bot" -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 verzióval kompatibilis" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" -msgstr "" +msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 verzióval kompatibilis" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 verzióval kompatibilis" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Elérhető" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Kijelentkezve" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Engedélyezett" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Törölve" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 %2" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 %2" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Távol" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Rögtön jövök" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Elfoglalt" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Láthatatlan" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Távol" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Távol, automatikus válasszal" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "Inaktív" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Rögtön jövök" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Telefon" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Ebéd" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Láthatatlan" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Kijelentkezve" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Státuszom" + +#: contact/msnstatus.cpp:215 #, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Kijelentkezés" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" msgstr "Partner felvétele" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Csoport törlése" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" msgstr "Új emotikon hozzáadása" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "Emotikonok" +msgstr "Emotikon szerkesztése" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "\"%1\" emotikon már létezik, lecseréled?" - -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "Távollét üzenet megadása" - -#: dialogs/contactaddeduserdialog.cpp:33 -msgid "You have been added by someone" -msgstr "" - -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 #, fuzzy -msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " -msgstr "" -"%1\n" -"felvett a partnerlistájára. A Te választásod:" +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "„%1” emotikon már létezik, lecseréled?" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" +msgstr "Automatikus távolléti üzenet" + +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "&Társalgás stílusa:" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Nem nyitható meg a helyi port." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Valaki felvett a kontaktlistájára" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"felvett a partnerlistájára." + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "%1 partner adatai" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Kapcsolódva" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" -msgstr "" +msgstr "Még nem láttuk online" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "&Idő megjelenítése a társalgások üzeneteiben" +msgstr "Nem üzent még sose" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" -msgstr "" +msgstr "Utoljára láttuk: %1" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" +msgstr "Utoljára üzent: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-mail cím: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Kliens: %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Kattints ide a partner megjelenített képének visszaállításához" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Partnerek" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Partner meghívása" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "%1 partnerlistájának exportálása" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Nincs mit exportálni" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "A fájl már létezik" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "„%1” fájl már létezik, felülírod?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/listexportdialog.cpp:272 #, fuzzy -msgid "Email: %1" -msgstr "E-mail" +msgid "The export of the contact list is finished" +msgstr "Partnerlista elmentése megtörtént" -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/networkwindow.cpp:78 #, fuzzy -msgid "Client: %1" -msgstr "Levelező kliens" +msgid "S&ave Tab" +msgstr "Fül &mentése" #: dialogs/networkwindow.cpp:79 #, fuzzy -msgid "S&ave tab" -msgstr "Fül mentése" +msgid "C&lear Tab" +msgstr "Fül &törlése" #: dialogs/networkwindow.cpp:80 #, fuzzy -msgid "C&lear tab" -msgstr "Fül törlése" +msgid "C&lose All Tabs" +msgstr "&Minden fül bezárása" -#: dialogs/networkwindow.cpp:1054 -#, fuzzy +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." -msgstr "Nincsenek kapcsolatok. A hálózat ablak nem nyitható meg." +msgstr "" +"Nincsenek kapcsolatok.\n" +"A hálózatablak nem nyitható meg." -#: dialogs/networkwindow.cpp:1100 -#, fuzzy +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -"A hálózat ablak napló nem menthető. Győződj meg róla, hogy van írási " +"A hálózatablak naplója nem menthető. Győződj meg róla, hogy van írási " "jogosultságod a naplók könyvtárára." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "A fő kapcsolat fül nem zárható be." -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" +"Kézzel parancsot küldeni a szervernek veszélyes.
Ha nem tudod, hogyan " +"kell, ha szerencséd van, csak bontja a kapcsolatot, de ha nincs, akár " +"sokkal súlyosabb következményekkel is járhat!
Mi figyelmeztettünk!" +"
Biztosan szeretnéd elküldeni ezt az üzenetet?" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" +"Az adattartalom (payload) amit küldeni próbálsz, nem az előírt újsorra (\\r" +"\\n) végződik!
Szeretnéd, hogy a KMess hozzáfűzze?" -#: dialogs/networkwindow.cpp:1321 -#, fuzzy +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" -msgstr "A fő kapcsolat fül nem zárható be." +msgstr "Ilyen fajta kapcsolatnak nem lehet parancsot küldeni!" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "Megszakítva" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "Sikertelen!" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 msgid "Completed" msgstr "Kész" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 byte" -#: dialogs/transferentry.cpp:335 -#, fuzzy +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." -msgstr "%1 / %2 fogadva" +msgstr "%1 / %2 fogadva." -#: dialogs/transferentry.cpp:339 -#, fuzzy +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." -msgstr "%1 / %2 elküldve" +msgstr "%1 / %2 elküldve." -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "végtelen" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 #, fuzzy -msgid "Cl&ean Up" -msgstr "&Tisztítás" +msgid "&Use" +msgstr "Kiválaszt" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Törlés" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Válaszd ki vagy töröld az avatarodat" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Megjelenítendő kép" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Biztosan törölni akarod ezt a fiókot?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" "Az emotikon téma nem menthető. Győződj meg róla, hogy van írási " -"jogosultságod e témakönyvtárra: '%1'." +"jogosultságod a „%1” témakönyvtárra." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Mosoly" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" -msgstr "Animáció" +msgstr "Kacsintás" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Nyelvöltés" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "Vigyor" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Szomorú" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "Sír" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "Mérges" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Zavarodott" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "Zavarban van" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "Csalódott" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "Forró" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "Vicsorgás" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "Idióta" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "Beteg" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Meglepett" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Party" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "Álmos" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "Gondolkodó" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Ne mondd el senkinek" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "Titok" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "Meglepődik" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "Gúnyos" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "Nem tudom" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Rögtön jövök" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Angyal" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Ölelés (fiú)" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Fiú" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Vörös szív" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Vörös rózsa" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "Oké!" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Kutya pofa" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Nap" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Ördög" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Ölelés (lány)" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Lány" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Törött szív" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "Hervadó rózsa" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Na ne..." -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Macska pofa" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "Alvó félhold" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Vörös ajkak" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Taps" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "Keresztezett ujjak" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Autó" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Repülőgép" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Teknős" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" -msgstr "Kígyó" +msgstr "Csiga" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Fekete bárány" +#: emoticontheme.cpp:869 +msgid "Sheep" +msgstr "Birka" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Kecske" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "Denevér" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Söröskorsó" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "Martinis pohár" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "Kávéscsésze" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Születésnapi torta" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Tányér" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Tál" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Csillag" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Szivárvány" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Viharfelhő" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Villámlás" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Esernyő" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Sziget pálmafával" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "Telefonkagyló" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Mobiltelefon" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "E-mail" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Óra" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "Filmszalag" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Jegyzet" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Bilincs" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Pénz" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "Izzó" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" msgstr "Cigaretta" -#: emoticontheme.cpp:883 -msgid "Soccer ball" +#: emoticontheme.cpp:896 +msgid "Football ball" msgstr "Focilabda" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Ajándék" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Számítógép" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "KMess ikon" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "Nem lehet újracsatlakozni, mert nem található a fiók." + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "Nem lehet újracsatlakozni, mert a fióknak nincs elmentve a jelszava." + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Internetkapcsolatra vár…" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" msgid "Internet connection not available." -msgstr "A szerver nem érhető el" +msgstr "Nincs internetkapcsolat" -#: initialview.cpp:377 -msgid "Connect" -msgstr "Kapcsolódás" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "&Kijelentkezés" +msgctxt "Button label" +msgid "&Connect" +msgstr "&Kapcsolódás" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "" - -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "" - -#: kmess.cpp:223 +#: initialview.cpp:586 #, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "Mégsem" + +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "Töltsd ki mint az e-mail címedet, mind a jelszavadat." + +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Helytelen e-mail cím" + +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "Partner információ" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "%1 partner már szerepel a listádon" + +#: kmess.cpp:250 msgid "New Group" -msgstr "Új &csoport" +msgstr "Új csoport" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Csoport hozzáadása" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" -msgstr "A csoport új neve:" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" +msgstr "Az új csoport neve:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "" "Biztosan el akarod távolítani %1 partnert a partnerlistádról?" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" msgstr "Partner törlése" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" msgstr "Törlés és tiltás" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" +"A %1 csoport nem üres. Vedd ki belőle az összes partnert, majd " +"próbáld meg újra!" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 +#, fuzzy msgctxt "dialog title" -msgid "Group removal" -msgstr "" +msgid "Group Removal" +msgstr "Csoport törlése" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" "Biztosan el akarod távolítani %1 csoportot a partnerlistádról?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" -msgstr "Törölve" +msgstr "Törlés" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Speciális csoport, nem módosítható" -#: kmess.cpp:671 -msgid "Rename group" -msgstr "Csoport átnevezése" +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "Csoport át&nevezése" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "A csoport új neve:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" +"

Nem lehet automatikusan bejelentkezni a %1 fiókkal:
ehhez el " +"kell menteni a fiók jelszavát!

" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" -msgstr "Azonosítás sikertelen" +msgid "Autologin Failed" +msgstr "Automatikus bejelentkezés nem sikerült" -#: kmess.cpp:1078 -msgid "Disconnected" -msgstr "Kijelentkezett" - -#: kmess.cpp:1408 +#: kmess.cpp:1053 #, fuzzy -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" -msgstr "" -"

A KMess nem fogja tudni kezelni a hangokat és az értesítéseket.

A KMess 'eventsrc' fájlja nem található egyik könyvtárban sem ezek " -"közül: %1

Ellenőrizd a telepítést, és másold a hiányzó fájlt a " -"felsorolt könyvtárak egyikébe.

" +msgid "Connection could be down..." +msgstr "Kapcsolódás..." -#: kmess.cpp:1412 -msgid "Error with notifications" +#: kmess.cpp:1123 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Kijelentkezve" + +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "

A KMess a következő könyvtárakban keresett:
%1

" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" +"

A KMess nem fogja tudni kezelni a hangokat és az értesítéseket.

A KMess 'kmess.notifyrc' fájlja nem található egyik könyvtárban sem " +"ezek közül: %1

Ellenőrizd a telepítést, és másold a hiányzó fájlt a " +"felsorolt könyvtárak egyikébe.

" + +#: kmess.cpp:1481 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Hiba az értesítéseknél" -#: kmess.cpp:1589 -#, fuzzy -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Műveletek" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Új &partner" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Új &csoport" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "Partner k&eresése" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Keresés ér&deklődés szerint" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "Partner k&eresése" +msgstr "KMess - %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Új &fiók" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Fiók &beállítások" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "Bejele&ntkezés" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&Kijelentkezés" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "&Profilom megjelenítése" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Státuszom" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Távol automatikus válasszal" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "&Engedélyezett partnerek megjelenítése" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "&Kijelentkezett partnerek megjelenítése" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "&Törölt partnerek megjelenítése" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 #, fuzzy +msgid "Show &History Box" +msgstr "&Társalgás stílusa:" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "&Keresőmező megjelenítése" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" -msgstr "&Emotikonok megjelenítése" +msgstr "Üres &csoportok megjelenítése" -#: kmessinterface.cpp:321 -#, fuzzy -msgid "Display Pictures Size" -msgstr "Kép megjelenítése" +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "&Avatarok mérete" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -#, fuzzy -msgid "Small" -msgstr "Mosoly" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" msgstr "Partnerek &rendezési módja" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Á&tviteli ablak megjelenítése" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "Új &partner…" + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "Új &csoport…" + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "Partnerlista exportálása…" + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "Partner &keresése" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Keresés ér&deklődés szerint" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "&Társalgás stílusa:" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "Új &fiók…" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Új &fiók…" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "&KMess beállításai…" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "Kijelölés &menüje" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "Ne mutassa" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "Kicsi" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "Közepes" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "Nagy" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "Csoport" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Online/Offline" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "Vegyes" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "Á&tvitel ablak megjelenítése" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." +msgstr "&Hálózatablak megjelenítése" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "&Hálózat ablak megjelenítése" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "Vétel itt: %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "[%1] Bejelentkezés %2 felhasználóként" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr "" +msgstr "[%1] %2 bejelentkezett" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr "" +msgstr "[%1] %2 kijelentkezett" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "&Társalgás" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Tulajdonságok" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" msgstr "Tör&lés a csoportból" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "Vétel itt: %1" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "&Másolás másik csoportba" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "Á&thelyezés másik csoportba" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "Csoport mozgatása &lefelé" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Csoport mozgatása &felfelé" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "Csoport &törlése" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Csoport át&nevezése" -#: kmessview.cpp:1053 +# FIXME -- jó-e a partner szó arra, aki még nem kontaktlista-tag? A személy és az illető szó kicsit túl formális... +# FIXME -- jó-e a kontaktlista szó? +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "E-mail" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Az illető &felvétele a kontaktlistára" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" -msgstr "" - -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" - -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" - -#: kmessview.cpp:1085 +#: kmessview.cpp:1133 #, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-mail cím:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Kliens: %1" + +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "" + +#: kmessview.cpp:1156 +#, fuzzy +msgid "No" +msgstr "Jegyzet" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Letiltott" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Utoljára láttuk: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Utoljára üzent: %1" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" -msgstr "
%1 (%2)" +msgstr "%1 csoport" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "Partnerek" - -#: kmessview.cpp:1095 -#, fuzzy +#: kmessview.cpp:1212 msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "A partner nincs bejelentkezve" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 partnerből %2 bejelentkezve" +msgstr[1] "%1 partnerből %2 bejelentkezve" -#: kmessview.cpp:1504 -#, fuzzy +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 partner" +msgstr[1] "%1 partner" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" -msgstr "Add meg a személyes üzeneted itt" +msgstr "<Add meg a személyes üzeneted itt>" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +#, fuzzy +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "Írd be ide a partnereid számára megjelenítendő üzenetet" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1 új e-mail" +msgstr[1] "%1 új e-mail" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" -msgstr "" +msgstr "Egy MSN Messenger kliens KDE-hez" -#: main.cpp:70 +#: main.cpp:46 +#, fuzzy +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:60 msgid "Developer and project founder" -msgstr "" +msgstr "Fejlesztő, a projekt alapítója" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:61 msgid "Developer" -msgstr "" +msgstr "Fejlesztő" -#: main.cpp:72 -#, fuzzy +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 msgid "Project support" -msgstr "P4-Context mező támogatás" +msgstr "Projekttámogatás" -#: main.cpp:73 main.cpp:74 main.cpp:75 -#, fuzzy +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" -msgstr "GnomeMeeting fejlesztő" +msgstr "Aktív fejlesztő" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastasi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "" -"Német fordítás, tesztelés, dokumentáció, webmester, project kezelés, stb..." +"Német fordítás, tesztelés, dokumentáció, webmester, projektmenedzsment, " +"stb..." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:70 msgid "Web design" -msgstr "Web tervezés" +msgstr "Webdesign" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "A fő és sárga/kék/viola emotikonkészletek, olasz fordítás" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "Az alap és a sárga/kék/ibolya emotikonkészletek, olasz fordítás" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Cartoon emotikonok" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Alapértelmezett hangok" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" +msgstr "Oxygen stílusú KMess ikon" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotisz Papadopulosz" + +#: main.cpp:78 +msgid "Translations Maintainer" msgstr "" -#: main.cpp:87 +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arab fordítás, fájlmentés javításának nemzetközisétése" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "További arab fordítások" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Brazíliai portugál fordítás" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "További brazíliai portugál fordítás" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Katalán fordítás" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "Lin Hao-Hsziang" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" "Egyszerűsített kínai fordítás, fájlküldés hibajavítása, proxy kapcsolat kódja" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "Liu Szi-Zsuang" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "További egyszerűsített kínai fordítás" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "Jen-Csu Csen" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "Hagyományos kínai fordítás" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Hagyományos kínai fordítás" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:92 msgid "Danish translation" msgstr "Dán fordítás" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:93 msgid "More Danish translation" msgstr "További dán fordítások" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:94 msgid "Dutch translation" msgstr "Holland fordítás" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "További holland fordítások" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:97 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "Német fordítás folytatása, görög fordítás" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "További francia fordítások" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:103 msgid "Estonian translation" msgstr "Észt fordítás" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:104 msgid "Finnish translation" msgstr "Finn fordítás" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "További finn fordítások" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:108 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:108 msgid "French translation" msgstr "Francia fordítás" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:109 msgid "More French translation, MSN6 emoticon definitions" msgstr "További francia fordítás, MSN6 emotikon definíciók" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" -msgstr "Francia fordítás" +msgstr "További francia fordítások" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "Magyar fordítás" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "További magyar fordítások" + +#: main.cpp:115 main.cpp:116 msgid "More Italian translation" msgstr "További olasz fordítások" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:117 msgid "Korean translation" msgstr "Koreai fordítás" -#: main.cpp:115 -msgid "Norsk Bokmål translation" -msgstr "Norvég Bokmal fordítás" +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" -#: main.cpp:117 +#: main.cpp:118 +msgid "Norsk Bokmål translation" +msgstr "Bokmål norvég fordítás" + +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Szlovén fordítás" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "Szlovák fordítás" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "Matjaž kaše" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "Szlovén fordítás" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Spanyol fordítás" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 msgid "More Spanish translation" msgstr "További spanyol fordítások" -#: main.cpp:123 -msgid "Swedish translation" -msgstr "Svéd fordítás" - -#: main.cpp:125 -msgid "Thai translation" -msgstr "Thai fordítás" - #: main.cpp:126 -msgid "Turkish translation" -msgstr "Török fordítás" +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "További török fordítás" +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "Svéd fordítás" + +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Fájlátvitelek" +msgid "More Swedish translation" +msgstr "Svéd fordítás" -#: main.cpp:134 +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:135 +msgid "Thai translation" +msgstr "Thai fordítás" + +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Török fordítás" + +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "További török fordítások" + +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" + +#: main.cpp:141 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" +msgstr "MSNP12 támogatás, különböző javítások" + +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" +"Kontaktlista avatar támogatás, partnerek kliensinformációja, társalgás " +"betűinek zoomolása" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:143 +msgid "File transfer thumbnails" +msgstr "Fájlátvitelek előnézeti képei" + +#: main.cpp:144 msgid "P4-Context field support" msgstr "P4-Context mező támogatás" -#: main.cpp:135 +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:145 msgid "Xinerama fixes" msgstr "Ximerama javítások" -#: main.cpp:136 +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:146 msgid "Original file receive code" msgstr "Eredeti fájl vételi kód" -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" -msgstr "" +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" -#: main.cpp:138 -#, fuzzy +#: main.cpp:147 msgid "KWallet support" -msgstr "P4-Context mező támogatás" +msgstr "KWallet támogatás" -#: main.cpp:139 +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:148 msgid "" -"Notifications blocking option,winks disabling option,last message date " +"Notifications blocking option, winks disabling option, last message date " "feature" +msgstr "Figyelmeztetések blokkolása, winkek kikapcsolása, utolsó üzenet ideje" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "IRC-szerű parancsok a társalgási ablakban" + +#: main.cpp:150 +msgid "Andrea Decorte" msgstr "" -#: main.cpp:142 -#, fuzzy -msgid "Various internationalization fixes" -msgstr "Különböző többnyelvűségi javítások." +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" -#: main.cpp:143 +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "&Társalgás stílusa:" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "Különböző többnyelvűségi javítások" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Különböző többnyelvűségi javítások." -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "GnomeMeeting fejlesztő" -#: main.cpp:146 -msgid "Guy with a bag over his head" -msgstr "Mindenes" +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" -#: main.cpp:149 +#: main.cpp:158 +msgid "Guy with a bag over his head" +msgstr "Az ürge a papírszatyorral a fején" + +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Alapötlet és kódrészletek" -#: main.cpp:150 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "Előző buborékjelző kódja, kezdeti p2p kód, msn feladatkezelő" +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" -#: main.cpp:151 +#: main.cpp:162 +msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgstr "Előző buborékjelző kódja, kezdeti p2p kód, msn kihíváskezelő" + +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Tétlenségi időzítő kódja" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" -msgstr "" +msgstr "Tálcára zárás screenshot kód" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" + +# FIXME -- öööö, hogy van az magyarul, hogy crash? XD +#: main.cpp:165 msgid "Custom crash handler implementation" -msgstr "" +msgstr "Saját crashkezelő implementáció" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" msgstr "A te neved itt lesz?" -#: main.cpp:156 -#, fuzzy +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -"Köszönettel vesszük a hibajavításaidat és patch-eidet a KMess segítség " -"fórumokban!\n" +"Örömmel várjuk hibajavításaidat és patch-eidet a KMess fórumokban!\n" "Ha úgy érzed, a neved hiányzik innét, vedd fel velünk a kapcsolatot!" -#: main.cpp:159 -#, fuzzy +#: main.cpp:171 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Neved" -#: main.cpp:160 -#, fuzzy +#: main.cpp:172 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" -msgstr "E-mail címed:" +msgstr "E-mail címed" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Automatikus bejelentkezés a megadott e-mail címmel" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" -msgstr "" +msgstr "Debug teszt futtatása (csak fejlesztői változatnál)" + +# FIXME -- ugh. +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "Egyének" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Engedélyezett" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Törölve" #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "A partner visszavonta a folyamatot." @@ -3054,62 +4493,100 @@ msgid "You have rejected the invitation." msgstr "Visszautasítottad a meghívást." #: network/applications/application.cpp:540 -#, fuzzy -msgid "Do you want to
accept or cancel?" -msgstr " Elfogadod vagy elutasítod?" +msgid "Do you want to accept or cancel?" +msgstr "Elfogadod vagy elutasítod?" #: network/applications/application.cpp:581 -#, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "Visszavonás." -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Elfogadod %1 fájlt (%2 byte)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "A partner egy fájlt szeretne küldeni: „%1” (%2)." -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"A „%1” fájl már létezik.\n" +"Felülírod?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "%1 fájl átvitele sikertelen. A fájlt nem sikerült elmenteni." + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." msgstr "%1 fájl átvitele sikertelen. A fájl nem nyitható meg." -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Átvitel elfogadva." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" -msgstr "Kapcsolódás %1 címhez, %2 porton" +msgstr "Kapcsolódás %1 címhez, %2 porton" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "Az átvitel megszakítva" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "A partner visszavonta „%1” fájl átvitelét." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "Visszavontad „%1” fájl átvitelét." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "Visszautasítottad „%1” fájl átvitelét." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" -msgstr "A kapcsolat lérejött" +msgstr "A kapcsolat létrejött" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" -msgstr "%1 fájl átvitele sikeres." +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "%1 fájl sikeresen átküldve." -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "%1 fájl sikeresen fogadva." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "%1 átvitele sikertelen. A fájl nem található." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "%1 átvitele sikertelen. A fájl nem olvasható." -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "%1 fájl küldése." +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "%1 fájl küldése (%2)." -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "A partner elfogadta „%1” fájl átvitelét." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "Opciók egyeztetése a kapcsolódáshoz" @@ -3120,72 +4597,14 @@ msgstr "Opciók egyeztetése a kapcsolódáshoz" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "A fájlátvitel meghívás törölve. A vett adat rossz." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"'%1' fájl már létezik.\n" -"Felülírod?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "%1 fájl átvitele sikertelen. A fájl nem nyitható meg." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." -msgstr "" +msgstr "Elfogadtad „%1” fájl átvitelét." -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "A partner visszavonta a küldést." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Visszavontad a folyamatot." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "A fájl nem írható" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "%1 fájl átvitele sikeres." - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "%1 fájl átvitele sikeres." - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "%1 átvitele sikertelen. A fájl nem található." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "%1 átvitele sikertelen. A fájl nem olvasható." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "%1 fájl küldése (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "A partner visszavonta a küldést." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Megbeszélésre kaptál meghívást (a GnomeMeeting használatával)." @@ -3198,28 +4617,28 @@ msgstr "Ekiga (GnomeMeeting) indítása. Kapcsolódás: %1." msgid "Inviting the contact to a meeting." msgstr "Partner meghívása megbeszélésre." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." -msgstr "A meghívás elutasítva. Más kliens nem támogatja." +msgstr "A meghívás elutasítva. A másik kliens nem támogatja." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "A meghívás megszakítva. Belső hiba történt." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "A meghívás megszakítva. A felhasználó nem válaszolt." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "A meghívás megszakítva. Időtúllépés a fájladatra várakozás közben." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "A meghívás megszakítva. A szerver bontotta a csevegés kapcsolatot." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "A meghívás megszakítva." @@ -3231,25 +4650,19 @@ msgstr "A partner az asztala megosztását kezdeményezte." msgid "Starting KRDC. Connecting to %1." msgstr "KRDC indítása. Kapcsolódás: %1." -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "A partner elutasította a meghívást. Belső hiba lépett fel." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" +"A partner egy olyan MSN6 lehetőséget kezdeményezett, amit a KMess nem " +"támogat." -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "Az átvitel nem sikerült." - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." @@ -3257,62 +4670,44 @@ msgstr "" "A meghívás megszakítva. A partner rossz adatot küldött, vagy a KMess nem " "támogatja azt." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"Az átvitel nem sikerült. A partner rossz adatot küldött, vagy a KMess nem " -"támogatja azt." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Az átvitel nem sikerült. A felhasználó nem válaszolt." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "Az átvitel nem sikerült. Belső hiba lépett fel." - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "Az átvitel nem sikerült. Az adatforrás nem nyitható meg." - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" -"A partner egy olyan MSN6 lehetőséget kezdeményezett, amit a KMess nem " -"támogat." - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "Az átvitel nem sikerült. Adatelőkészítés sikertelen." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." msgstr "A meghívás törölve. Az üzenet nem nekünk szól." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" "Az átvitel nem sikerült. A partner rossz adatot küldött, vagy a KMess nem " "támogatja azt." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "A partner elutasította a meghívást. Belső hiba lépett fel." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "Várakozás kapcsolatra %1 címmel, %2 porton" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "Visszatérés a közvetett fájlátvitelhez (ez lassú lehet)." -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "Várakozás a kapcsolódásra" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." @@ -3320,17 +4715,41 @@ msgstr "" "A meghívás törölve. Időtúllépés a partner elfogadó válaszára várakozás " "közben." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "A meghívás törölve. Időtúllépés a kapcsolat létrehozásakor." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "A meghívás törölve. Időtúllépés az adatra várakozás közben." +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Az átvitel nem sikerült." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Az átvitel nem sikerült. A partner rossz adatot küldött, vagy a KMess nem " +"támogatja azt." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Az átvitel nem sikerült. A felhasználó nem válaszolt." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Az átvitel nem sikerült. Belső hiba lépett fel." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "Az átvitel nem sikerült. Az adatforrás nem nyitható meg." + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "Hang alapú beszélgetésre kaptál meghívást." @@ -3363,1027 +4782,1346 @@ msgstr "Hang alapú beszélgetés indítása. Vétel: %1" msgid "Inviting the contact to a voice conversation." msgstr "Partner meghívása hang alapú beszélgetésre." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "A partner '%1' meghívást küldött, de ez nem támogatott." -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" -msgstr "" +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "A webkamera meghívás törölve. A vett adat rossz." -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "%1 átvitele törölve." +# FIXME -- nagyon bután néz ez így ki +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Megkértek, hogy mutasd meg webkamerád képét." + +# FIXME -- nagyon bután néz ez így ki +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "A partner meghívott a webkamerájának megtekintésére." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "webkamera" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "Sikertelen" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "%1 fájl küldése" + +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "%1 átvitele sikertelen. Nem nyitható meg a helyi port." -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." msgstr "Nem nyitható meg a helyi port." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Fájlátvitel előkészítése" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "%1 átvitele nem sikerült. Nem létesíthető kapcsolat" +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "%1 átvitele nem sikerült. Nem létesíthető kapcsolat." -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "Nem hozható létre kapcsolat." -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "%1 fájl vétele" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"A Kmess nem tudja elérni a távoli webszolgáltatást.\n" -"\n" -"Részletek: %1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Nem tudsz bejelentkezni.\n" -"Más klienssel vagy más helyről már bejelentkeztél.\n" -" " - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Szinkronizálás" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Azonosítás" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "Várakozás a partnerlistára..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "" -"Az azonosítás nem sikerült, ellenőrizd a felhasználóneved és a jelszavad" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Kapcsolódás..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "A KMess ismeretlen parancsot kapott a szervertől: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" -msgstr "" +msgstr "Helytelen parancsformátum" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" -msgstr "" +msgstr "Helytelen parancs paraméter" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "A megadott e-mail cím nincs regisztrálva az MSN Messenger-hez" +msgstr "A megadott e-mail cím nincs regisztrálva az MSN Messengerhez" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" -msgstr "" +msgstr "Hiányzó domainnév" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" -msgstr "" +msgstr "Már be vagy jelentkezve" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" -msgstr "A megadott fióknév érvénytelen." +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" +msgstr "A megadott fióknév érvénytelen" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "A fióknév érvénytelen, vagy a passport-od nincs megerősítve." +"That account name is invalid, or your Passport account has not been " +"confirmed yet" +msgstr "A fióknév érvénytelen, vagy a Passportod még nincs megerősítve" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "A partnerlistád megtelt" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" -msgstr "" +msgstr "Helytelen SBP paraméter" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "A partner már szerepel a listádon" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "A partner nincs rajta a listádon" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "A partner nincs bejelentkezve" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" +msgstr "Már ebben a módban vagy" + +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." msgstr "" +"A partnert nem lehet egyszerre az engedélyező és a blokkoló listára tenni." -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "A partner nincs rajta a listádon" - -#: network/msnnotificationconnection.cpp:2247 -#, fuzzy +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -"A csoportnév már használatban van a Messenger vagy Hotmail partnerlistádon" +"A csoportnév már használatban van a Messenger vagy Hotmail partnerlistádon. " +"Adj meg egy másik nevet." -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" -msgstr "Túl sok csoport van a partnerlistádon (max: 30)" +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "Túl sok csoport van a partnerlistádon, legfeljebb 30 lehet." -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "A csoport nem módosítható" -#: network/msnnotificationconnection.cpp:2260 -#, fuzzy +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" -msgstr "Túl sok csoport van a partnerlistádon (max: 30)" +msgstr "A partner nem lett felvéve ebbe a csoportba" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "A csoport nem üres" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "A csoport neve túl hosszú (max. 61 karakter)" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "A csoport neve túl hosszú, maximum 61 byte lehet." -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" -msgstr "" +msgstr "A „0” csoportot próbáltad megváltoztatni" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "KMess belső hiba: %1" -#: network/msnnotificationconnection.cpp:2277 -#, fuzzy +#: network/msnconnection.cpp:470 msgid "Invalid Group" -msgstr "Csoport át&nevezése" +msgstr "Hibás csoport" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" -msgstr "" +msgstr "Üres domain" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "Helytelen ADL parancs formátum" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "Az üzenetkezelő szerver nem érhető el" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "A küldés az üzenetkezelő szervernek nem sikerült" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Közvetlen kapcsolat (MSNSLP) hiba, a kapcsolódás sikertelen" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" -msgstr "" +msgstr "Egy kötelező mező hiányzik" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" -msgstr "" +msgstr "Nincs bejelentkezve" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Saját emotikonok e fiókhoz:" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "Ezt a fiókot eltiltották az MSN szolgáltatás használatától." -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" -msgstr "" +msgstr "Parancs letiltva" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "A fiókod tiltott." -#: network/msnnotificationconnection.cpp:2314 -#, fuzzy +#: network/msnconnection.cpp:512 msgid "Challenge response failed" -msgstr "Az átvitel nem sikerült." +msgstr "Sikertelen kihívásválasz" -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" -msgstr "" +msgstr "Rossz parancsadat" -#: network/msnnotificationconnection.cpp:2323 -#, fuzzy +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" -msgstr "Túl gyorsan nyitod meg a folyamatokat" +msgstr "Túl gyorsan nyitsz meg társalgási kapcsolatokat" -#: network/msnnotificationconnection.cpp:2327 -#, fuzzy +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" -msgstr "Túl sok nyitott folyamatod van" +msgstr "Túl sok nyitott társalgásod van" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" -msgstr "" +msgstr "Nem várt parancssorozat" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "Rossz megjelenítendő név" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" -msgstr "" +msgstr "Rossz CVR adat" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "A szerver azt jelzi, hogy a KMess túl sok adatot küld neki (flood)" -#: network/msnnotificationconnection.cpp:2357 -#, fuzzy +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" -msgstr "Azonosítás sikertelen" +msgstr "Az autentikációs jegy hibás" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "Nem kezdeményezhetsz társalgást, amíg láthatatlan vagy." -#: network/msnnotificationconnection.cpp:2364 -#, fuzzy +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" -msgstr "Nem fogad új megbízásokat" +msgstr "Nem fogad új partnereket" -#: network/msnnotificationconnection.cpp:2368 -#, fuzzy +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." -msgstr "Korlátozott passportod van, szülői beleegyezés kell a csevegéshez." +"You have a Kids Passport account, you need parental consent to chat online." +msgstr "Gyermek-Passportod van, szülői beleegyezés kell a csevegéshez." -#: network/msnnotificationconnection.cpp:2371 -#, fuzzy -msgid "Your passport account needs to be verified first." -msgstr "Először meg kell erősítened a passportodat." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." +msgstr "Először meg kell erősítened a Passportodat." -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" -msgstr "" +msgstr "Rossz USR jegy" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "Hiba a kapcsolatlista lekérdezésénél, próbáld meg később" -#: network/msnnotificationconnection.cpp:2399 -#, fuzzy +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." -msgstr "Belső szerverhiba" +msgstr "" +"Az MSN szolgáltatás ideiglenesen nem elérhető, belső szerverhiba lépett fel." -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" +"Az MSN szolgáltatás ideiglenesen nem elérhető, a szerver le van terhelve" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "A kapcsolatjelző szerver nem működik" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "A szerver leáll" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "A szerver hamarosan leáll" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" -msgstr "Írás tiltva" +msgstr "Blokkoló írás" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "A folyamat túlterhelt" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "A szerver nem érhető el" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Azonosítás sikertelen" -#: network/msnnotificationconnection.cpp:2449 -#, fuzzy -msgid "Unknown error code received from the server: %1" -msgstr "A KMess ismeretlen parancsot kapott a szervertől: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "" +"A KMess ismeretlen hibakódot kapott a szervertől: %1
Technikai " +"részletek: %2" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 #, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" -msgstr "KMess - MSN hiba" +msgid "MSN Error" +msgstr "MSN hiba" -#: network/msnnotificationconnection.cpp:2596 -#, fuzzy +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "Megpróbáljuk inkább HTTP-n…" + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Azonosítás…" + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Azonosítva" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Váltás egy másik szerverre…" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Kapcsolódás..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "A KMess ismeretlen parancsot kapott a szervertől: %1" + +# NOTE -- No translation for "minute" (=perc) due to: see tag +# TAG -- maintenance_minutes +#: network/msnnotificationconnection.cpp:2109 msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" -msgstr[0] "perc" -msgstr[1] "perc" +msgstr[0] "1" +msgstr[1] "%1" -#: network/msnnotificationconnection.cpp:2599 -#, fuzzy +# TAG -- maintenance_minutes +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" -msgstr "Figyelmeztetés: a szerver le fog állni karbantartásra %1 perc múlva!" +msgstr "A szerver le fog állni karbantartásra %1 perc múlva!" -#: network/msnnotificationconnection.cpp:2604 -#, fuzzy +# TAG -- maintenance_minutes +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" -"Az MSN szerver jelezte, hogy egy percen belül le fog állni karbantartásra." +"Az MSN szerver jelezte, hogy %1 percen belül le fog állni karbantartásra." -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "A SOAP kliens elvesztette érvényességét." + +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" +"A KMess nem tudja feldolgozni a kijelentkezett állapotban kapott üzeneteket." +"
Részletek: %1" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -#, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" -msgstr "" -"A KMess nem tudja feldolgozni a kijelentkezett állapotban kapott " -"üzeneteket.\n" -"\n" -"Részletek: %1" - -#: network/msnnotificationconnection.cpp:3172 -#, fuzzy +#: network/msnnotificationconnection.cpp:2589 msgid "Authentication time limit exceeded" -msgstr "Azonosítás sikertelen" +msgstr "Azonosításra használható időkeret lejárt" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Várakozás a partnerlistára…" + +#: network/msnnotificationconnection.cpp:2805 #, fuzzy +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

MSN üzenet

%1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" -msgstr "KMess belső hiba: %1" +msgstr "
KMess belső hiba: %1" -#: network/msnnotificationconnection.cpp:3242 +#: network/msnnotificationconnection.cpp:2916 #, fuzzy -msgctxt "Login error message, with more details for developer versions" +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -"A KMess nem tud kapcsolódni az MSN Messenger szerverekhez. Lehet, hogy az " -"MSN Messenger szerverek átmenetileg nem elérhetőek, vagy hiba van az " -"internetkapcsolatodban." +"

Az azonosítás nem sikerült, ellenőrizd a felhasználóneved és a jelszavad." +"

" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -#, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "A szerverkapcsolat elveszett." - -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:2932 #, fuzzy +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" -"Az azonosítás nem sikerült, a KMess nem tudta feldolgozni a passport " -"logint.\n" -"\n" -"Részletek: %1" +"

A kapcsolatot megszakították!

Más klienssel vagy más helyről " +"jelentkeztél be erre a fiókra.

" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Szerverhiba" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnnotificationconnection.cpp:2947 #, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

A KMess nem tud kapcsolódni az MSN Messenger szerverekhez.
Lehet, hogy " +"az MSN Messenger szerverek átmenetileg nem elérhetőek, vagy hiba van az " +"internetkapcsolatodban.%1

Nézzük meg a MSN Messenger szolgáltatás " +"állapotát mutató weblapot?

" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

A KMess nem tud kapcsolódni az MSN Messenger szerverekhez.
Lehet, hogy " +"az MSN Messenger szerverek átmenetileg nem elérhetőek, vagy hiba van az " +"internetkapcsolatodban.%1

Nézzük meg a MSN Messenger szolgáltatás " +"állapotát mutató weblapot?

" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +#, fuzzy +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

MSN üzenet

%1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

A szerverkapcsolat elveszett.%1

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Belső hiba kódja: %2)" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" msgstr "Kapcsolódási időtúllépés" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "1 ping elveszett" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "%1 ping elveszett" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." -msgstr "A szerverkapcsolat elveszett." +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "A szerverkapcsolat elveszett" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "A partner nincs bejelentkezve, vagy láthatatlan." +#: network/soap/addressbookservice.cpp:777 +#, fuzzy +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "A megadott e-mail cím nincs regisztrálva az MSN Messengerhez" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" -"A partner egy MSN7 lehetőséget kezdeményezett, amit a KMess nem támogat." +#: network/soap/addressbookservice.cpp:787 +#, fuzzy +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "A megadott e-mail cím nincs regisztrálva az MSN Messengerhez" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "Nem fogadott üzenet: \"%1\"" - -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "Nem hozható létre kapcsolat: %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "A szerver nem érhető el" + +#: network/soap/httpsoapconnection.cpp:471 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Túl sok átirányítás a bejelentkeztető szolgáltatástól." + +#: network/soap/httpsoapconnection.cpp:521 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "A szerver nem érhető el" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" msgstr "" -"Szerverprobléma: Túl sok átirányítás a bejelentkeztető szolgáltatástól." -#: notification/chatnotification.cpp:163 -#, fuzzy -msgid "In %1's chat: %2" -msgstr "%1 társalgásában: %2" +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" -#: notification/chatnotification.cpp:167 -#, fuzzy -msgid "%1 says:
'%2'" -msgstr "%1 üzenete:
'%2'" +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" -#: notification/chatnotification.cpp:171 +#: network/soap/passportloginservice.cpp:191 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 kapcsolat nélküli üzenetet küldött:
'%2'" +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Nem várt választípus" -#: notification/chatnotification.cpp:178 -#, fuzzy +#: notification/chatnotification.cpp:154 +msgid "In %1's chat:
%2" +msgstr "%1 társalgásában:
%2" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "%1 üzenete:
„%2”" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 kapcsolat nélküli üzenetet küldött:
„%2”" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" -msgstr "%1 társalgása figyelmet kér!" +msgstr "%1 társalgása figyelmet kér!" -#: notification/chatnotification.cpp:183 -#, fuzzy -msgid "%1:
%2" -msgstr "%1:
%2" +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr "%1 rezgő figyelmeztetést küldött!" +msgstr "%1 kézírásos üzenetet küldött!" -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr "%1 rezgő figyelmeztetést küldött!" +msgstr "%1 rezgő figyelmeztetést küldött!" -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr "%1 animációt küldött!" +msgstr "%1 animációt küldött!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 webkamerát szeretne használni." + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 fájlt küld!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 meghívást küldött!" #: notification/chatnotification.cpp:204 -#, fuzzy -msgid "%1 wants to use the webcam!" -msgstr "%1 webkamerát szeretne használni." +msgid "%1 has canceled the webcam session!" +msgstr "%1 visszavonta a webkamera kapcsolatot!" #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 fájlt küld!" +msgid "%1 has canceled the file transfer!" +msgstr "%1 visszavonta a fájlátvitelt!" #: notification/chatnotification.cpp:206 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "%1 meghívást küldött!" +msgid "%1's activity has been canceled!" +msgstr "%1 művelete törölve." #: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "%1 törölte a webkamera kapcsolatot!" +msgid "%1 has accepted to use the webcam!" +msgstr "%1 elfogadta a webkamera használatát." #: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "%1 törölte a fájlátvitelt!" +msgid "%1 has accepted the file transfer!" +msgstr "%1 elfogadta a fájlátvitelt." #: notification/chatnotification.cpp:215 -#, fuzzy -msgid "%1's activity has been canceled!" -msgstr "%1 aktivitása törölve." +msgid "%1 has accepted your invitation!" +msgstr "%1 elfogadta a meghívást." #: notification/chatnotification.cpp:222 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1 elfogadta a webkamera használatát." +msgid "%1 has ended the webcam session!" +msgstr "%1 bezárta a webkamera kapcsolatot." #: notification/chatnotification.cpp:223 -#, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "%1 elfogadta a fájlátvitelt." +msgid "The file transfer with %1 is done!" +msgstr "A fájl átvitele %1 felhasználóval befejeződött." #: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1 elfogadta a meghívást." +msgid "%1's activity has ended!" +msgstr "%1 művelete befejeződött." #: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "%1 bezárta a webkamera folyamatot." +msgid "%1's webcam session has failed!" +msgstr "%1 webkamera folyamata sikertelen." #: notification/chatnotification.cpp:232 -#, fuzzy -msgid "The file transfer with %1 is done!" -msgstr "A fájl átvitele kész: %1" +msgid "The file transfer with %1 has failed!" +msgstr "A fájlátvitel %1 felhasználóval sikertelen!" #: notification/chatnotification.cpp:233 -#, fuzzy -msgid "%1's activity has ended!" -msgstr "%1 aktivitása befejeződött." - -#: notification/chatnotification.cpp:240 -#, fuzzy -msgid "%1's webcam session has failed!" -msgstr "%1 webkamera folyamata sikertelen." - -#: notification/chatnotification.cpp:241 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "A fájlátvitel sikertelen: %1 !" - -#: notification/chatnotification.cpp:242 -#, fuzzy msgid "%1's activity has ended with an error!" -msgstr "%1 aktivitása hibával befejeződött." +msgstr "%1 művelete hibával végződött." -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
most elérhető" + +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
elment" + +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
rögtön jön" + +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
most elfoglalt" + +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
láthatatlanná vált" + +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
inaktív lett" + +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
kijelentkezett" + +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
most telefonál" + +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
most ebédel" + +#: notification/newemailnotification.cpp:90 #, fuzzy -msgid "%1 is now online" -msgstr "%1 elérhető" +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Új e-mail:
„%1”
feladó: %2" -#: notification/contactstatusnotification.cpp:71 +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "&Társalgás kezdése" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Ü&zenet írása" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Üz&enet megtekintése" + +#: notification/notificationmanager.cpp:126 #, fuzzy -msgid "%1 has gone away" -msgstr "%1 új státusza: távol" +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Ördög" -#: notification/contactstatusnotification.cpp:72 +#: notification/notificationmanager.cpp:130 #, fuzzy -msgid "%1 will be right back" -msgstr "%1 új státusza: rögtön jövök" +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&E-mail küldése" -#: notification/contactstatusnotification.cpp:73 +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Elrejtés" + +#: notification/systemtraywidget.cpp:78 #, fuzzy -msgid "%1 is now busy" -msgstr "%1 új státusza: elfoglalt" +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"A főablak bezárása után a KMess még tovább fog futni a tálcán ikonként. A " +"program bezárásához használd a Kilépést a Fájl menüben." -#: notification/contactstatusnotification.cpp:74 +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Dokkolás a tálcán" + +#: notification/systemtraywidget.cpp:240 #, fuzzy -msgid "%1 has become invisible" -msgstr "%1 láthatatlan" +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" -#: notification/contactstatusnotification.cpp:75 +#: notification/systemtraywidget.cpp:246 #, fuzzy -msgid "%1 has gone idle" -msgstr "%1 új státusza: nincs a gépnél" +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1 kijelentkezett" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 új státusza: telefonál" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 új státusza: ebédel" - -#: notification/newemailnotification.cpp:78 -#, fuzzy -msgid "New email:
'%1'
by '%2'" -msgstr "Új e-mail:
'%1'
feladó: '%2'" - -#: settings/accountpage.cpp:69 +#: settings/accountpage.cpp:80 msgid "Browse..." -msgstr "" +msgstr "Tallózás…" -#: settings/accountpage.cpp:70 -#, fuzzy -msgid "Browse and crop picture..." -msgstr "Kép keresése és vágása..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Kép keresése és méretre vágása…" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." -msgstr "" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Korábbi kép használata…" -#: settings/accountpage.cpp:448 -#, fuzzy +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" msgstr "A megjelenítendő kép letöltése nem sikerült" -#: settings/accountpage.cpp:507 -#, fuzzy +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" "Hiba történt a megjelenítendő kép cseréje közben.\n" -"Győződj meg róla, hogy jó képfájlt választottál-e." +"Győződj meg róla, hogy meglévő képfájlt választottál-e." -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "Partner &törlése" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Beállítások" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "Fiók" -#: settings/accountsettingsdialog.cpp:76 -#, fuzzy +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" -msgstr "Fiók" +msgstr "Az én fiókom" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Jelzések" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "KMess értesítés" +msgid "Contact List" +msgstr "Partnerek" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Társalgás" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Társalgás naplózása" -#: settings/accountsettingsdialog.cpp:193 -#, fuzzy +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" -msgstr "A megadott partnercím érvénytelen: '%1'" +msgstr "" +"A megadott e-mail cím (%1) érvénytelen és nem használható fiókazonosítóként." -#: settings/accountsettingsdialog.cpp:201 -#, fuzzy +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" -msgstr "A megadott partnercím érvénytelen: '%1'" +msgstr "A megadott e-mail cím (%1) már használatban van." -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Biztosan törölni akarod ezt a fiókot?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." -msgstr "Biztosan törölni akarod ezt a fiókot?" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Biztosan törölni akarod a „%1” fiókot?
Minden, a fiókhoz tartozó " +"beállítás elvész." -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "Hello, milyen a kedved most? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "Manó" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "Nagyon jó!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "/Most/ értem haza egy *remek* buliból!" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 #, fuzzy -msgid "KMess Settings" -msgstr "Beállítások" +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "Helytelen parancs paraméter" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Meglévő emotikon lecserélése" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Biztosan törölni akarod ezt a fiókot?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Emotikon szerkesztése" + +#: settings/globalsettingsdialog.cpp:46 +msgid "KMess Settings" +msgstr "KMess beállítások" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Fiókok" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 -#, fuzzy -msgid "Notification" -msgstr "E-mail értesítés" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Értesítések" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." -msgstr "" +msgstr "Nem találtunk böngészőt." -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." -msgstr "" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Nem találtunk e-mail klienst." -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" -msgstr "" +# FIXME -- saját helyett valami más? +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" +msgstr "Meg kell adnod egy konzolparancsot a saját böngésző indításához!" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" +"A konzolparancs amit megadtál a böngésző indításához nem tartalmaz %u " +"paramétert. Ennek hiányában nem lehet weblapokat megnyitni.
Szeretnéd, " +"hogy a KMess hozzáfűzze a parancshoz?" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" -msgstr "" +# FIXME -- saját helyett valami más? +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" +msgstr "Meg kell adnod egy konzolparancsot a saját levelezőkliens indításához!" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" +"A konzolparancs amit megadtál a levelező indításához nem tartalmaz %u " +"paramétert. Ennek hiányában nem lehet e-maileket küldeni.
Szeretnéd, " +"hogy a KMess hozzáfűzze a parancshoz?" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" -msgstr "" +msgstr "Ki kell választanod egy könyvtárat a fogadott fájloknak!" -#: settings/miscellaneouspage.cpp:404 -#, fuzzy +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" -msgstr "Társalgások mentése e könyvtárba:" +msgstr "Fogadott fájlok könyvtára" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"A főablak bezárása után a KMess még tovább fog futni a rendszertálcán " -"ikonként. A program bezárásához használd a 'Kilépés'-t a Fájl menüben." -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Dokkolás a rendszertálcában" +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "Vélemény &küldése a fejlesztőknek" -#: systemtraywidget.cpp:245 -#, fuzzy -msgid "- %1 (%2)" -msgstr "%1 %2" +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Üdvözlünk a %1 tesztverziójában!" -#~ msgid "Click to send an email to this contact." -#~ msgstr "E-mail küldéséhez a partnerednek kattints ide." +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "Üdvözlünk a %1 programban!" -#~ msgid "Picture:" -#~ msgstr "Kép:" +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" +"Minden alkalommal, amikor jó vagy rossz élményed van a programmal, kattints " +"a megfelelő arcra a fejléc alatt, írd le a problémát vagy ami tetszett és " +"küldd el nekünk véleményedet." + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" +"Minden alkalommal, amikor jó élményed van a programmal, kattints a mosolygó " +"arcra a fejléc alatt, írd le ami tetszett és küldd el nekünk véleményedet." + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" +"Minden alkalommal, amikor a program frusztrál téged, kattints a szomorú " +"arcra a fejléc alatt, írd le a problémát és küldd el nekünk véleményedet." + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" +"Ha valami helytelen működést tapasztalsz a programban, kattints a törött " +"tárgy ikonra az ablak jobb felső sarkában, írd le, mi történt, majd kattints " +"az elküldés gombra." + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "Tetszik az új grafika. Igazán üdítő." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" +"Nem tetszik annak a segédprogramnak az üdvözlőképernyője. Túl sok " +"időt vesz el." + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"A program helytelenül működik amikor megnyomon a Hozzáadás gombot. " +"Semmi sem történik." + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" +"Szeretném, ha lehetővé tennétek a munkám e-mailben való elküldését a " +"programban." + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "A fejlesztéshez fontosak visszajelzéseid." + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Példa" +msgstr[1] "Példa" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Segíts jobbá tenni a programot" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Vélemény küldése a fejlesztőknek" + +# REPORT -- where is %2? Does gettext like this? +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Lehetőség szerint írd %1 nyelven (megpróbálhatsz használni egy online fordítóeszközt)" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Lehetőség szerint írd %1 vagy %2 nyelven (megpróbálhatsz használni egy online fordítóeszközt).
" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" +"Hasznosabb, ha megpróbálsz hasonló mennyiségű pozitív és negatív " +"visszajelzést küldeni.
" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" +"Ne kérj új képességeket, az ilyen visszajelzéseket figyelmen kívül hagyjuk." +"
" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "

Írhatsz egy rövid véleményt a %1 fejlesztőinek.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "A megadott e-mail cím (%1) érvénytelen és nem használható." + +# REPORT -- missing space before It +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" +"

Megjegyzésedet sikeresen továbbítottuk. Segíteni fog a program " +"továbbfejlesztésében!

Köszönjük, hogy időt szakítottál erre.

" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Vélemény elküldve" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" +"

Probléma lépett fel a vélemény elküldésekor.

Kérünk, próbáld meg " +"később újra.

" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Hiba a vélemény elküldésekor" #, fuzzy -#~ msgid "Login Information" -#~ msgstr "E-mail információ megjelenítése" +#~ msgid "Conversations Filter" +#~ msgstr "A beszélgetés %2 időpontban kezdődött" -#~ msgid "Logging in..." -#~ msgstr "Bejelentkezés..." +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Válaszd ki a módosítandó fiókot, majd kattints ide" -#~ msgid "" -#~ "Allows you to choose which e-mail program KMess should open to view e-" -#~ "mail messages." +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Nem sikerült elküldeni a megbökést %1 partnernek." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "Nem sikerült elküldeni a winket %1 partnernek." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Nem sikerült elküldeni a rajzot %1 partnernek." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Nem sikerült elküldeni a „%1” üzenetet %2 partnernek." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Kiválaszt" + +#~ msgid "&Copy..." +#~ msgstr "&Másolás…" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Új felvétele" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "E-mail cím: %1" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Kliens: %1" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Letiltott" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Utoljára láttuk: %1" + +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Utoljára üzent: %1" + +#~ msgid "Contact List Alerts" +#~ msgstr "Partnerlista-események" + +# FIXME -- hogy hívja a magyar WLM a Winkeket? +#~ msgid "&Show winks from contacts" +#~ msgstr "&Winkek megjelenítése" + +#~ msgid "Enable in the contact list" +#~ msgstr "Engedélyezés a partnerlistában" + +#~ msgid "Enable in the chat windows" +#~ msgstr "Engedélyezés a társalgásokban" + +#~ msgid "Alerts" +#~ msgstr "Jelzések" + +#~ msgid "Alerts and Notifications" +#~ msgstr "Jelzések és értesítések" + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "Megadhatod még, hogy melyik csoportba kerüljön az új partner" + +# FIXME -- bármi jobb ehelyett? +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Csoport nélkül" + +#~ msgid "Now listening to: %1" +#~ msgstr "Ezt hallgatom: %1" + +# REPORT -- more explanation please... +#~ msgid "&Listening Music" +#~ msgstr "&Hallgatott zene" + +#~ msgid "KMess could not access the remote webservice.
Details: %1" #~ msgstr "" -#~ "Kiválaszthatod, hogy a KMess melyik levelezőprogramot indítsa el az e-" -#~ "mailek elolvasásához." +#~ "A Kmess nem tudja elérni a távoli webszolgáltatást.
Részletek: %1" -#~ msgid "Use a specified command:" -#~ msgstr "Megadott parancs használata:" - -#~ msgid "This account does not have an Hotmail inbox!" -#~ msgstr "A fiókhoz nem tartozik Hotmail cím!" - -#, fuzzy -#~ msgid "Email: " -#~ msgstr "E-mail" - -#~ msgid "Remove group" -#~ msgstr "Csoport törlése" - -#, fuzzy -#~ msgid "Show &Display Pictures" -#~ msgstr "Kép megjelenítése" - -#~ msgid "You have 1 new e-mail in your inbox." -#~ msgstr "1 új leveled érkezett." - -#~ msgid "You have %1 new emails in your inbox." -#~ msgstr "%1 új leveled érkezett." - -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "&Elérhető" - -#~ msgid "The transfer of %1 failed. Couldn't open file" -#~ msgstr "%1 fájl átvitele sikertelen. A fájl nem nyitható meg." - -#, fuzzy -#~ msgid "Sidebar" -#~ msgstr "Oldalsáv" - -#, fuzzy -#~ msgid "New contact's group" -#~ msgstr "Új &partner" - -#~ msgid "Enter your login information:" -#~ msgstr "Add meg a bejelentkező adatokat:" - -#~ msgid "Your friendly name:" -#~ msgstr "Megjelenítendő neved:" - -#, fuzzy -#~ msgid "Your email address:" -#~ msgstr "E-mail cím: " - -#~ msgid "Your password:" -#~ msgstr "Jelszavad:" - -#~ msgid "Display picture:" -#~ msgstr "Megjelenítendő kép:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "Ne mutassa a megjelenítendő képet" - -#~ msgid "Status to set at login:" -#~ msgstr "Beállítandó státusz bejelentkezéskor:" - -#~ msgid "Show notifications when you recei&ve an email" -#~ msgstr "Értesítés, ha e-mail érke&zik" - -#~ msgid "Organize chat folders by:" -#~ msgstr "Társalgások mappáinak rendezési módja:" - -#~ msgid "&Show graphics in chat messages" -#~ msgstr "&Grafikák megjelenítése a társalgások üzeneteiben" - -#~ msgid "Use Hotmail" -#~ msgstr "Hotmail használata" - -#~ msgid "says:" -#~ msgstr "üzenete: " - -#~ msgid "Current name: " -#~ msgstr "Jelenlegi név:" - -#, fuzzy #~ msgid "" -#~ "KMess could not connect to the MSN Messenger service.\n" -#~ "Please, be sure to be connected to the internet.\n" -#~ "reason: %1." +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" #~ msgstr "" -#~ "A KMess nem tudott kapcsolódni az MSN Messenger szolgáltatáshoz.\n" -#~ "Győződj meg róla, hogy az internetkapcsolatod aktív.\n" -#~ "Rendszerhiba: %1 (%2 kód)" +#~ "Az azonosítás nem sikerült, a KMess nem tudta feldolgozni a passport " +#~ "bejelentkezést.
Részletek: %1" -#~ msgid "The remote server has closed the connection." -#~ msgstr "A távoli szerver lezárta a kapcsolatot." +#~ msgid "SOAP connection error: %1" +#~ msgstr "SOAP kapcsolat hiba: %1" -#~ msgid "Show MSN Messenger Service status?" -#~ msgstr "MSN Messenger Service állapotának megjelenítése?" +#~ msgid "Close all tabs" +#~ msgstr "Minden fül bezárása" -#~ msgid "Received user confirmation" -#~ msgstr "Fogadott felhasználói megerősítés" +#~ msgid "&Send email" +#~ msgstr "E-mail küldé&se" -#~ msgid "Transfer to notification server" -#~ msgstr "Adatok küldése a kapcsolatkezelő szervernek" +#~ msgid "Save complete" +#~ msgstr "A mentés megtörtént" -#~ msgid "The server is too busy" -#~ msgstr "A szerver foglalt" +#~ msgid "C&lose all tabs" +#~ msgstr "&Minden fül bezárása" -#~ msgid "The server is unavailable" -#~ msgstr "A szerver nem érhető el" +#~ msgid "Connect" +#~ msgstr "Kapcsolódás" -#~ msgid "KMess received an unknown error message from the server: %1" -#~ msgstr "A KMess ismeretlen hibaüzenetet kapott a szervertől: %1" +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: account not found." +#~ msgstr "Nem lehet újracsatlakozni, mert nem található a fiók." -#~ msgid "Warning: Server closes for maintenance in 1 minute!" -#~ msgstr "Figyelmeztetés: a szerver le fog állni karbantartásra 1 perc múlva!" +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: no password has been entered." +#~ msgstr "" +#~ "Nem lehet újracsatlakozni, mert a fióknak nincs elmentve a jelszava." -#~ msgid "Add contact" -#~ msgstr "Partner felvétele" +#~ msgid "Rename group" +#~ msgstr "Csoport átnevezése" -#, fuzzy -#~ msgid "KMess Notification" -#~ msgstr "E-mail értesítés" - -#~ msgid "" -#~ msgstr "<Írd be ide a személyes üzeneted>" +#~ msgid "Account &Settings..." +#~ msgstr "Fiók&beállítások…" #~ msgid "" -#~ "_: NAME OF TRANSLATORS\n" -#~ "Your names" -#~ msgstr "Páder Rezső (rezso)" +#~ "Basic DBus support, tab closing message, menu hiding shortcut, toolbars " +#~ "lock" +#~ msgstr "" +#~ "Alapvető DBus támogatás, fül bezárási üzenet, menü elrejtés " +#~ "gyorsbillentyűje, eszköztárak zárolása" + +#~ msgctxt "Connection error dialog box" +#~ msgid "%1" +#~ msgstr "%1" + +#~ msgctxt "Server error dialog box" +#~ msgid "

MSN server message

%1

" +#~ msgstr "

MSN szerver üzenet

%1

" + +#~ msgctxt "Server-reported client error dialog box" +#~ msgid "

Internal error in KMess

%1

" +#~ msgstr "

Belső hiba a KMessben

%1

" #~ msgid "" -#~ "_: EMAIL OF TRANSLATORS\n" -#~ "Your emails" -#~ msgstr "rezso@rezso.net" - -#~ msgid "Show/Hide &Contact Sidebar" -#~ msgstr "&Partnerek oldalsáv megjelenítése/elrejtése" - -#~ msgid "Away - Idle" -#~ msgstr "Nincs a gépnél" - -#~ msgid "chat-style-text" -#~ msgstr "Társalgás szövegének stílusa" - -#~ msgid "The e-mail address given was invalid!" -#~ msgstr "A megadott e-mail cím érvénytelen!" - -#~ msgid "(Away)" -#~ msgstr "(Távol)" - -#~ msgid "(Be Right Back)" -#~ msgstr "(Rögtön jövök)" - -#~ msgid "(Busy)" -#~ msgstr "(Elfoglalt)" - -#~ msgid "(Invisible)" -#~ msgstr "(Láthatatlan)" - -#~ msgid "(Away - Idle)" -#~ msgstr "(Nincs a gépnél)" - -#~ msgid "(Out to Lunch)" -#~ msgstr "(Ebéd)" - -#~ msgid "(On the Phone)" -#~ msgstr "(Telefon)" - -#~ msgid "The current status of your contact." -#~ msgstr "A partnered jelenlegi státusza." - -#, fuzzy -#~ msgid "The contact is listening to music" -#~ msgstr "A partner nincs rajta a listádon" +#~ "Error in the fallback Web connection. It is possible you need to " +#~ "authenticate to a proxy server or a web page." +#~ msgstr "" +#~ "Hiba a tartalék Web alapú kapcsolatban. Lehetséges, hogy egy proxy " +#~ "szervernél vagy egy weblapon azonosítanod kell magad." diff --git a/po/it.po b/po/it.po index 1a62008..46cb82e 100644 --- a/po/it.po +++ b/po/it.po @@ -1,57 +1,173 @@ # translation of it.po to Italian -# David Vignoni , 2003. -# Valerio Pilo , 2007. -# Vincenzo Reale , 2007. -# Valerio Pilo , 2008. # translation of it.po to # translation of it-new.po to +# David Vignoni , 2003. +# Valerio Pilo , 2007, 2008. +# Vincenzo Reale , 2007. +# Valerio Pilo , 2008. +# Valerio Pilo , 2009. msgid "" msgstr "" "Project-Id-Version: it\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2008-04-12 00:56+0200\n" -"Last-Translator: Valerio Pilo \n" -"Language-Team: Italian \n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-02-25 14:32+0100\n" +"Last-Translator: Valerio Pilo \n" +"Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.11.4\n" +"X-Generator: Lokalize 0.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 -msgid "Ne&w Line" -msgstr "&A capo" +#, fuzzy +msgid "Standard text mode" +msgstr "Set di emoticon Cartoon" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "" +"Clicca questo pulsante per iniziare a usare KMess, oppure per annullare 
un tentativo di connessione" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) #: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Ancora nessun messaggio" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" +"Clicca questo pulsante per iniziare a usare KMess, oppure per annullare 
un tentativo di connessione" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Set di emoticon Cartoon" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Emoti&con Personali" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Occhiolino" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "Clicca qui per ripristinare l'immagine personale di questo contatto" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "&A Capo" + +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "Inv&ia" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "Contatti" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Chat" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." -msgstr "Clicca qui per mostrare il profilo di questo contatto." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Barra degli Strumenti Principale" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" -msgstr "" +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" +msgstr "Clicca qui per mostrare il menu per questo contatto" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +#, fuzzy +msgid "Click here to open your account settings" +msgstr "Clicca qui per rinominare l'emoticon selezionata" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "&Pulisci area" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "&Colore Penna " + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "Dimensione Penna" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "&Gomma" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "Gruppi iniziali" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" @@ -59,395 +175,588 @@ msgstr "" "Inserisci l'indirizzo email della persona che vorresti aggiungere ai tuoi " "contatti" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "Indirizzo email" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "Indirizzo email:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" -"Opzionalmente, puoi scegliere in quale gruppo posizionare il nuovo contatto" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Inserisci una scorciatoia per l'emoticon:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -#, fuzzy -msgid "Initial group" -msgstr "Gruppo non valido" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "Inserisci un collegamento per questa emoticon:" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "Seleziona un file immagine:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "" "Inserisci un messaggio che sarà inviato automaticamente a chi cercherà di " "contattarti." -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 -msgid "&Automatic away message" -msgstr "Messaggio di assenza &Automatico" +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "&Specifica un messaggio di assenza automatico:" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +msgid "Search through contacts..." +msgstr "Cerca tra i Contatti..." + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Registrazione conversazioni" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "&Non filtrare" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "Filtra per &data" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "da" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "a" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Filtra per &data" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Che cosa vorresti fare?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" +msgstr "&Aggiungi il contatto alla mia lista contatti" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person; only allow them to see my status" +msgstr "&Non aggiungere il contatto, ma consentigli di vedere il mio stato" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting me or seeing my status" msgstr "" +"Blocca il contatto e impediscigli di contattarti o di vedere il tuo stato" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 -#, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "&Aggiungi il contatto alla mia lista di \"Amici\"" - -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 -#, fuzzy -msgid "Do not add this person; only allow them to see my online state" -msgstr "&Non aggiungere il contatto, ma consentigli di vedere il tuo stato" - -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 -#, fuzzy -msgid "&Block this person from contacting me or seeing my online state" -msgstr "&Blocca il contatto e impedisci di vedere il tuo stato" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "Proprietà del contatto %1" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" +msgstr "&Informazioni" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "Clicca qui per ripristinare l'immagine personale di questo contatto" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Ripristina" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Gruppi:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "Usa un nome &alternativo per questo contatto" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" msgstr "" +"Mostra un messaggio di avviso quando il contatto va in &linea o non in linea" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 -#, fuzzy -msgid "Restore" -msgstr "Rimuovi" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Suono:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -#, fuzzy -msgid "Use alternative name for this person" -msgstr "Usa un nome alternativo per questo contatto" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "" -"Mostra un messaggio di avviso quando questo contatto va in linea o non in " -"linea" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "Suono:" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" -msgstr "" +msgstr "I&mmagini" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 #, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Clicca qui per eliminare l'emoticon selezionata" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Immagine personale" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 msgid "&Clear Cache" -msgstr "Pu&lisci scheda" +msgstr "Pu&lisci Cache" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -#, fuzzy -msgid "Notes" -msgstr "Nota" +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "&Note" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "&Emoticons" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" +"Puoi scegliere di nascondere qualunque emoticon ricevuta da questo contatto. " +"Semplicemente, clicca col tasto destro su una emoticon ricevuta e scegli " +"\"Ignora questa Emoticon\".\n" +"Da questa pagina, puoi ripristinare le emoticon nascoste." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "Clicca qui per eliminare l'emoticon selezionata" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Rimuo&vi" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "Contatti Disponibili" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "Invita un contatto non nella tua lista:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "Inserisci l'email di un contatto da invitare" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "Contatti Invitati" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Elementi da esportare:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Formato" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Contatti:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "Seleziona Tutto" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Deseleziona Tutto" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Esporta..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Chiudi" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Finestra di rete" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" -msgstr "" +msgstr "Comando al Tab Corrente" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "Comando:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" -msgstr "" +msgstr "Tipo:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "Stella" +msgstr "Normale" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" -msgstr "" +msgstr "MIME " -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" -msgstr "Inv&ia" +msgstr "Invia" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" -msgstr "" +msgstr "Carico del messaggio (può essere vuoto):" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "Apri" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "Annulla" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "&Scaricamenti" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "&Invii" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "P&ulisci" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "&Chiudi" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" msgstr "" +"Clicca qui per mostrare le opzioni per l'account attualmente " +"selezionato, 
oppure scorri con la rotella del mouse per spostarti tra gli account " +"salvati" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "Indirizzo email: " +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Inserisci qui l'indirizzo email del tuo account Passport o Live" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 -#, fuzzy +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" -msgstr "Password" +msgstr "Password:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" -msgstr "Stato all'accesso" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "Inserisci qui la password del tuo account" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "Altre opzioni..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Stato all'accesso:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -msgid " Account options " -msgstr "Impostazioni account" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +#, fuzzy +msgid "Choose a status to set when successfully connected." +msgstr "Seleziona uno stato MSN da utilizzare alla connessione." -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" -msgstr "&Ricorda questo profilo" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "Se abilitata, KMess si ricorderà di questo account" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" -msgstr "Ricorda anche la password" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" +msgstr "&Ricorda profilo" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" +"Se scegli di far ricordare un account a KMess, puoi anche salvarne la " +"password" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "&Ricorda password" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Clicca questo pulsante per iniziare a usare KMess, oppure per annullare 
un tentativo di connessione" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Connetti" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Inserisci un tuo messaggio personale qui" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Nuovo Account" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" +"Clicca qui per registrare un nuovo account Live, che puoi utilizzare 
per connetterti a MSN.
Puoi anche usare il tuo indirizzo email attuale" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "Password dimenticata?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 #, fuzzy -msgid "Your Account Information" -msgstr "Impostazioni account" +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "Clicca qui per andare sul sito web Live, alla pagina da cui 
reimpostare la password del tuo account" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Connetti" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Visualizza" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Azioni" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "Formato" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Account" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "Informazioni del Tuo Account" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." msgstr "Inserisci il nome che gli altri contatti vedranno quando sei in linea." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 -#, fuzzy +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 msgid "&Friendly name:" -msgstr "&Nome Personale" +msgstr "&Nome Personale:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" "Inserisci l'indirizzo email del tuo account MSN Passport. Puoi registrare un " "nuovo account su http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 -#, fuzzy +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 msgid "&Email address:" -msgstr "Indirizzo email: " +msgstr "&Indirizzo email: " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -455,45 +764,44 @@ msgstr "" "Inserisci la password del tuo account MSN Passport. Puoi registrare un nuovo " "account su http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" -msgstr "Password" +msgstr "&Password:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -#, fuzzy -msgid "&Remember Password" -msgstr "Ricorda Password" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "&Ricorda Password" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "Immagine personale" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." msgstr "C&ambia..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" -msgstr "" +msgstr "&Non usare" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." @@ -507,340 +815,688 @@ msgstr "" "stai utilizzando una macchina accessibile pubblicamente (ad es. un Internet " "café)." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 -#, fuzzy +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "Ricorda le impostazioni di questo account" +msgstr "R&icorda le impostazioni di questo account" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "Se abilitata, KMess accederà automaticamente con questo account." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" -msgstr "&Accesso automatico con questo account all'avvio" +msgid "Log in &with this account automatically" +msgstr "&Accesso automatico con questo account" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "Registr&a tutte le conversazioni" +msgstr "Accesso &come" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -"Hai bisogno di un account di MSN Passport per connetterti a MSN Messenger. " -"Puoi registrare il tuo attuale indirizzo email come account di Passport " -"oppure usare un account di Hotmail per accedere." +"È necessario connettersi al sito di Passport per confermare che il tuo " +"indirizzo 
e-mail esista." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" "Non puoi cambiare il tuo nome perché il tuo indirizzo e-mail non è stato " -"verificato su MSN Passport." +"verificato su Passport." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "Richiedi email di verifica" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "Vai a accountservices.passport.net" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"Hai bisogno di un account di Passport per connetterti alla rete MSN " +"Messenger. Puoi registrare il tuo attuale indirizzo email presso register." +"passport.com oppure usare un account di Hotmail per accedere." + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" "Per accedere al servizio MSN Messenger, devi registrare un indirizzo email " "come account Passport." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "Registra un nuovo account" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "Vai su register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 -msgid "Saved accounts:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "Clicca" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "" -"Clicca qui per aggiungere nuove emoticon personalizzate da inviare ai tuoi " -"contatti." - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 #, fuzzy -msgid "&Add account..." -msgstr "Account" +msgid "&Status Options" +msgstr "Stato all'accesso:" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "Seleziona una emoticon e clicca qui per eliminarla." +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Se abilitato, il tuo stato sarà cambiato automaticamente a \"Assente - " +"Inattivo\" quando non starai usando il computer per qualche minuto. Se " +"questa opzione non è disponibile, KMess è stato compilato senza il supporto " +"a questa caratteristica." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Cambia lo s&tato a \"Inattivo\" quando non sei al computer" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"Controlla il numero di minuti dopo i quali KMess cambierà il tuo stato a " +"\"Assente - Inattivo\"." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Diventa inattivo dopo" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minuti" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +#, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "&Nascondi notifiche quando il mio stato è impostato su Occupato" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 +msgid "Saved accounts:" +msgstr "Account salvati:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" +msgstr "" +"Clicca qui per creare un nuovo account di KMess per la tua email già " +"associataad un account MSN" + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +msgid "&Add Account..." +msgstr "&Aggiungi Account..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" +msgstr "Seleziona un account e clicca qui per eliminarlo" + +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "&Modifica" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 -#, fuzzy +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "Seleziona un account e clicca qui per eliminarlo" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" -msgstr "Rimuovi" +msgstr "&Rimuovi" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Notifiche a comparsa" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" +"Abilita questa spunta per salvare le tue chat per poterle rileggere " +"successivamente" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" +"

Se abiliti la registrazione delle chat, ogni conversazione fatta " +"verrà salvata in un certo posto (che può essere specificato sotto).

\n" +"

Le chat salvate consentiranno di trovare qualcosa nelle tue vecchie " +"discussioni, come un link, o puoi usarle per ricordare cosa hai detto a " +"qualcunoin una certa occasione.

\n" +"

Queste possono però anche porre qualche problema di privacy, perchè " +"persone non autorizzate che usino il tuo account potrebbero leggerle.

\n" +"

Assicurati di tenere questa opzione disabilitata su computer " +"pubblicamente accessibili!

" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "Abilita registrazione chat" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" +"KMess può anche salvare le tue chat come file HTML, e mantenerle organizzate" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "Salva conversazioni su file" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" +"Con questa opzione, puoi scegliere in che modo KMess salverà le tue chat" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "Formato di file utilizzato per il salvataggio:" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" +"\n" +"

Il formato di file che utilizzi è importante.

\n" +"

Chat salvate come HTML possono essere aperte con tutti i browser Web,ma " +"di solito non possono essere visualizzate correttamente su altri computer.\n" +"

I file di testo, invece, possono essere perfettamente letti dovunque; ma " +"non conterranno nessuna formattazione del testo, immagini personali, o " +"emoticon.

\n" +"" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "Pagine Web (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "Testo Semplice" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" +"Queste opzioni ti consentono di scegliere in che modo KMess organizzerà le " +"tue chat salvate all'interno della cartella specificata sotto." + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" +"Dipendentemente da quale opzione scegli qui, KMess creerà alcune directory " +"per aiutarti a mantenere i tuoi registri delle chat organizzati. Usa la " +"caratteristica \"Aiuto\" o \"Cos'è questo?\" su una opzione specifica per " +"ulteriori dettagli." + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" +msgstr "Separa le chat salvate per:" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "Crea una directory per organizzare le chat per anno" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" +"Questa opzione dice a KMess di dividere le tue chat solo per anno. \n" +"Troverai una directory per ogni anno di chat salvate; quelle conterranno " +"tutte le chat di quell'anno raggruppate assieme.\n" +"Una chat fatta il 29 Novembre 2008 sarà salvata nella tua directory dei " +"registri come:\n" +"/2008/data-e-nome-contatto.html" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Anno" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "Crea directory per organizzare le chat per anno e poi per mese" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" +"Questa opzione dice a KMess di dividere le tue chat per anno, e poi per " +"mese. \n" +"Troverai una directory per ogni anno di chat salvate; ognuna conterrà una " +"directory per ogni mese in cui delle chat saranno state salvate; e quelle " +"conterranno tutte le chat di quel mese raggruppate assieme.\n" +"\n" +"Una chat fatta il 29 Novembre 2008 sarà salvata nella tua directory dei " +"registri come:\n" +"/2008/11/data-e-nome-contatto.html" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "Anno poi Mese" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" +"Crea directory per organizzare le chat salvate per anno, per mese, e infine " +"per giorno" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" +"Questa opzione dice a KMess di dividere le tue chat per anno, e poi per " +"mese, e poi ancora per giorno. \n" +"Troverai una directory per ogni anno di chat salvate. Ognuna conterrà una " +"directory per ogni mese in cui delle chat saranno state salvate; e quelle " +"conterranno una directory per ogni giorno.\n" +"\n" +"Una chat fatta il 29 Novembre 2008 sarà salvata nella tua directory dei " +"registri come:\n" +"/2008/11/29/data-e-nome-contatto.html" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "Anno, Mese poi Giorno" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" +msgstr "" +"Posiziona tutte le chat salvate direttamente nella cartella specificata sotto" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" +"Questa opzione dice a KMess di salvare tutti i tuoi registri di chat nella " +"stessa directory, senza nessuna organizzazione." + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "Non organizzare i file" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "Clicca qui per selezionare una directory" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "La directory dove tutti i tuoi registri di chat verranno salvati" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" +"Scegli la cartella sul tuo sistema dove vuoi salvare le registrazioni delle " +"conversazioni." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "Salva le registrazioni delle chat in questa cartella:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "&Stile" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"Consente di cambiare il tema che KMess usa per visualizzare i messaggi delle " +"chat." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "Stile &chat:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "Ottieni &Nuovi Stili..." + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Impostazioni Conversazioni" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 #, fuzzy -msgid "Contact Events" +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Abilita la visualizzazione delle emoticon nelle finestre di chat." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "Mostra &emoticon" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Mostra &emoticon" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Questa opzione consente di raggruppare assieme i messaggi da un unico " +"contatto. Quando un contatto scrive più messaggi di seguito, KMess li " +"raggruppa in un unico messaggio. L'aspetto esatto dipende dallo stile di " +"chat selezionato." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "Ra&ggruppa messaggi consecutivi dallo stesso contatto" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Mostra l'ora di invio di ogni messaggio nelle conversazioni." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Mostra &ora dei messaggi" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "Contatti" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "Mostra notifiche quando i tuoi contatti:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 -msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." -msgstr "" -"Se abilitato, sarà mostrato un pop-up quando i tuoi contatti si connettono " -"aMSN." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -msgid "&Go online" -msgstr "Si &connettono" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "" -"Se abilitato, sarà mostrato un pop-up quando un contatto inizia una " -"conversazione con te." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "Iniziano una &conversazione con te" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" -"Se abilitato, sarà mostrato un pop-up ogni volta che ricevi un messaggio da " -"un contatto." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "&Ti inviano un messaggio" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" -"Se abilitato, sarà mostrato un pop-up anche quando i tuoi contatti cambiano " -"il lorostato su MSN." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "Cambiano il loro &stato" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" -"Se abilitato, sarà mostrato un pop-up anche quando i tuoi contatti si " -"disconnettono." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "Si &disconnettono" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Email Events" -msgstr "Indirizzo email" +msgid "Show s&econds" +msgstr "Mostra &emoticon" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "Mostra una notifica quando ricevi un'email in altre cartelle" +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Testo" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Questo stile e colore sarà usato nei tuoi messaggi." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "Carattere per i tuoi &messaggi:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -"Se abilitato, un pop-up viene mostrato quando una email viene ricevuta in " -"un'altra cartella. Il numero di email non lette viene mostrato sopra la " -"lista contatti. Questa opzione è attiva solamente per gli account di Hotmail." +"Consente di non vedere lo stile usato nei messaggi dai tuoi contatti, e " +"invece di usare quelli scelti qui sotto." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" -msgstr "" +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "&Forza i messaggi dei contatti ad usare questo carattere:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "" -"Controlla il numero di secondi per i quali i pop-up resteranno visibili." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Nascondi pop-up dopo" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "secondi" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 #, fuzzy -msgid "Other Alerts" -msgstr "Segnalazioni" +msgid "Chat Window Formatting" +msgstr "Avvisi Finestra di Chat" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Abilita l'uso di effetti di formattazione. Scrivere *grassetto*, /corsivo/, " +"e _sottolineato_ farà apparire il testo in grassetto, corsivo, e " +"sottolineato, rispettivamente." + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"&Usa effetti del carattere nei messaggi per *grassetto*, /corsivo/, e " +"_sottolineato_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 #, fuzzy -msgid "&Show winks from contacts" -msgstr "Mostra contatti n&on in linea" +msgid "Enable MSN Plus formatting" +msgstr "Formattazione MSN Plus" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -857,1118 +1513,1388 @@ msgstr "" "scuotimento. I contatti possono inviare più di un trillo alla volta, ma " "KMess scuoterà la finestra solo dopo il primo trillo ricevuto.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "Scuoti la finestra della conversazione quando ricevi o invii un trillo" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." -msgstr "" -"Se abilitato, un pop-up viene mostrato quando una email viene ricevuta nella " -"casella Posta in arrivo. Il numero di email non lette viene mostrato sopra " -"la lista contatti. Questa opzione è attiva solamente per gli account di " -"Hotmail." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Non mos&trare un'immagine personale" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "&Raggruppa conversazioni nella stessa finestra:" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Sempre" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "Per contatti dello stesso gruppo" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Mai" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Immagine personale:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." +msgstr "" +"Se abilitato, un pop-up viene mostrato quando una email viene ricevuta " +"nellacartella Posta in Arrivo. Il numero di email non lette viene mostrato " +"sopra la lista contatti. Questa opzione è disponibile solamente per gli " +"accountdi Hotmail/Live Mail." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Mostra il numero di email non lette" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" -"Se abilitata, KMess controlla dal lettore di musica attualmente aperto quale " -"canzone è in riproduzione, e informa i tuoi contatti mettendo il titolo " -"vicino al tuo nome." +"Se abilitata, KMess informa i contatti su cosa stai ascoltando. Questa " +"informazione viene ottenuta dal lettore musicale correntemente attivo." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" +msgstr "Mostra ai contatti quale &canzone sto ascoltando" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" -msgstr "In&forma i contatti su quale canzone sto ascoltando." +msgid "List Formatting" +msgstr "Formattazione MSN Plus" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 #, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Se abilitato, il tuo stato sarà cambiato automaticamente a \"Assente - " -"Inattivo\" quando non starai usando il computer per qualche minuto." +msgid "Enable MSN &Plus formatting" +msgstr "Formattazione MSN Plus" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Cambia s&tato a \"Assente - Inattivo\" quando non sei al computer" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"Controlla il numero di minuti dopo i quali KMess cambierà il tuo stato a " -"\"Assente - Inattivo\"." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Diventa inattivo dopo" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minuti" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" -"Se abilitata, le conversazioni verranno automaticamente salvate nella " -"cartella selezionata." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "Registr&a tutte le conversazioni" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" -"Scegli la cartella sul tuo sistema dove vuoi salvare le registrazioni delle " -"conversazioni." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Salva i file di chat nella cartella selezionata:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" -"KMess crea automaticamente delle cartelle per organizzare le registrazioni, " -"ordinandole per anno, mese o giorno." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Anno" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Mese" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Giorno" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Salva tutte le conversaione nella cartella principale" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" -"Consente di cambiare il tema che KMess usa per visualizzare i messaggi delle " -"chat." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Stile della chat:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Impostazioni" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Mostra le emoticon nelle conversazioni." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Mostra &emoticon" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Mostra l'ora di invio di ogni messaggio nelle conversazioni." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Mostra &ora nei messaggi di conversazione" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Questa opzione consente di raggruppare assieme i messaggi da un unico " -"contatto. Quando un contatto scrive in più messaggi di seguito, KMess li " -"raggruppa in un unico messaggi. L'aspetto esatto dipende dallo stile di chat " -"selezionato." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "Ra&ggruppa messaggi consecutivi dallo stesso contatto" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Assente" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "La tua lista dei contatti ha troppi gruppi" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Secchione" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "Questo stile e colore sarà usato nei tuoi messaggi." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "Carattere per i tuoi messaggi:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"Consente di non vedere lo stile usato nei messaggi dai tuoi contatti, e " -"invece di usare quelli scelti qui sotto." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Forza i messaggi dei contatti ad usare questo carattere:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Abilita l'uso di effetti di formattazione. Scrivere *grassetto*, /corsivo/, " -"e _sottolineato_ farà apparire il testo in grassetto, corsivo, " -"e sottolineato, rispettivamente." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"&Usa effetti dei caratteri nei messaggi per *grassetto*, /corsivo/, e " -"_sottolineato_ " - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "In attesa della lista contatti..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" msgstr "Temi di &Emoticon" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" msgstr "Stili di emoticon disponibili:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" msgstr "Emoti&con Personali" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" msgstr "Emoticon personali per questo account:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "Aggiungi nuo&va..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "Clicca qui per aggiungere una nuova emoticon personalizzata" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "Clicca qui per rinominare l'emoticon selezionata." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." +msgstr "Aggiungi Nuo&va..." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Clicca qui per rinominare l'emoticon selezionata" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" msgstr "Ri&nomina" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "Rimuo&vi" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" -msgstr "Rosa appassita" +msgstr "Browser Web" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" +"Seleziona questa opzione per usare il browser utilizzato dal resto di KDE." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "&Usa il browser predefinito di KDE" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" +"Seleziona questa opzione per scegliere da una lista di browser installati." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "&Usa un browser installato:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" +"Seleziona questa opzione per inserire il percorso al tuo browser preferito." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "&Specifica un comando personalizzato:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" +"Specifica il percorso di un programma da usare per aprire i collegamenti; un " +"'%u' qui verrà rimpiazzato con l'URL del collegamento." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." -msgstr "" +msgstr "Usa '%u' per inserire l'URL nella riga di comando." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" msgstr "Client di posta" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" +"Spunta questa casella per usare la webmail Live Mail quando ti connetti con " +"account che sono compatibili con Live Mail." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "Usa &Live Mail se l'account la supporta" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" +"Seleziona questa opzione per usare il client di posta usato dal resto di KDE." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "Usa il client di posta predefinito di &KDE" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "Usa un client di posta &installato:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." -msgstr "" +msgstr "Usa '%u' per inserire l'indirizzo di posta nella riga di comando." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "Trasferimenti File" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" -msgstr "Salva i file di chat nella cartella selezionata:" +msgstr "&Salva tutto i file ricevuti in una cartella:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" +msgstr "&Usa porte comprese tra" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "e" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "per i trasferimenti di file" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "Il tuo commento:" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 -#, fuzzy -msgid "and" -msgstr "Triste" +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "Il tuo commento riguarda:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 -#, fuzzy -msgid "for file transfers" -msgstr "Trasferimenti File" +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "Qualcosa che ti piace" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "Qualcosa che non ti piace" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "Un comportamento errato dell'applicazione" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "Una nuova caratteristica che non ti piace" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "Specifica un indirizzo email per essere ricontattato" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "Mostra la barra di pulsanti dei commenti sulle finestre" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Non sono al computer" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Nome" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "utente@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" +"Sono state trovate alcune password non sicure di account.
" +"Desideri importare le password nel Portafogli KDE chiamato '%1', mantenere " +"le password non sicure, o eliminarle permanentemente?

Nota: " +"non è raccomandato l'uso di password non sicure, perchè esse " +"saranno facilmente leggibili dai file di configurazione di KMess." + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Salvataggio Sicuro Password" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importa" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Elimina" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Mantieni" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "Non puoi inviare questo invito a una chat con più di una persona." -#: chat/chat.cpp:158 -#, fuzzy +#: chat/chat.cpp:142 msgid "%1 has joined the chat." -msgstr "%1 si è unito alla conversazione." +msgstr "%1 si è unito alla conversazione." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "" -"La conversazione è diventata inattiva, %1 ha lasciato la conversazione." +"La conversazione è diventata inattiva, %1 ha lasciato la " +"conversazione." -#: chat/chat.cpp:215 -#, fuzzy +#: chat/chat.cpp:202 +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." -msgstr "%1 ha lasciato la conversazione." +msgstr "%1 ha lasciato la conversazione." -#: chat/chat.cpp:364 -#, fuzzy +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr "%1 e %2 - Chat" +msgstr "%1 e %2" -#: chat/chat.cpp:371 -#, fuzzy +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." -msgstr "%1 e altri - Chat" +msgstr "%1 e altri" -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr " (Questo messaggio è stato spedito automaticamente)" +msgstr "%1 (Questo messaggio è stato spedito automaticamente)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 #, fuzzy -msgid "You received a wink from %1." -msgstr "Hai ricevuto una animoticon da %1" - -#: chat/chat.cpp:971 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -"Non è stato possibile mostrare l'animoticon. Assicurati di avere installato " -"'cabextract'." +"KMess non ha potuto salvare il registro di questa chat.
La " +"directory dei registri, '%1', non esiste." -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:941 +#, fuzzy +msgid "You have sent a wink" +msgstr "Hai ricevuto una animoticon da %1" + +#: chat/chat.cpp:966 +#, fuzzy +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." msgstr "" -"Non è stato possibile mostrare l'animoticon. I dati non erano leggibili." +"La conversazione è stata disabilitata perchè non sei più connesso al server " +"MSN. 
Puoi provare a riconnetterti per riprendere la conversazione." -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Si è verificato un problema di connessione." + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 #, fuzzy -msgid "You have received a wink from %1" -msgstr "Hai ricevuto una animoticon da %1" +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" +"%1 ti ha inviato un messaggio vocale, ancora non supportato da KMess." -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1153 #, fuzzy -msgid "You received a nudge from %1!" -msgstr "Hai ricevuto un trillo da %1!" +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" +"%1 ti ha inviato un messaggio di azione, ancora non supportato da " +"KMess." -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "" +"%1 ti ha inviato una caratteristica di MSN ancora non supportata da " +"KMess." + +#: chat/chat.cpp:1194 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "Il messaggio '%1' non è stato inviato." +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" +"Hai ricevuto una animoticon da %1, ma l'opzione per mostrarle è stata " +"disabilitata nelle opzioni dell'account." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" +"Hai ricevuto una animoticon da %1, ma non è stato possibile mostrarla. " +"Assicurati di avere installato 'cabextract'." + +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Hai ricevuto una animoticon da %1, ma non è stato possibile mostrarla. " +"L'estrazione del pacchetto dell'animoticon con 'cabextract' è fallita." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" +"Hai ricevuto una animoticon da %1, ma non è stato possibile mostrarla. I " +"dati non erano leggibili." + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 ti ha inviato una animoticon!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 si è unito alla conversazione." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 si è unito alla conversazione." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 ti ha inviato un trillo!" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "tutti i contatti" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Hai ricevuto un trillo da %1!" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Hai ricevuto una animoticon da %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 si è unito alla conversazione." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "" +"%1 ti ha inviato un messaggio non in linea:
'%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "" +"Il file '%1' non ha potuto essere trovato sul computer né " +"scaricato." + +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "Hai inviato un trillo a %1!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "Hai inviato un trillo!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 sta inviando una animoticon: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 dice:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +#, fuzzy +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "Conversazione con %1
Iniziata il: %2" + +#: chat/chatmessageview.cpp:364 +#, fuzzy +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "Conversazione iniziata il: %2" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Conversazioni salvate da KMess con %1." + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "Aggiungi questa emoticon: %1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Invita" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Riconnetti" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -"Impossibile salvare la conversazione. Assicurati di avere i permessi per " -"scrivere nella cartella dove le conversazioni vengono salvate." +"Impossibile salvare il registro della chat nella directory '%1'.\n" +"Assicurati di avere i permessi per scrivere nella cartella dove le chat " +"vengono salvate." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +#, fuzzy +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" +"*.html *.htm|Pagina Web (*.html)\n" +"*.txt|Documento di Testo Semplice (*.txt)\n" +"*.xml|Documento XML (*.xml)" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" "Il file '%1' esiste già.\n" "Vuoi sovrascriverlo?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Sovrascrivi File" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "So&vrascrivi" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." msgstr "Aggiungi questa &Emoticon..." -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +msgid "Ignore this &Emoticon" +msgstr "Ignora questa &Emoticon" + +#: chat/chatview.cpp:833 msgid "Send &Email" msgstr "Invia &Email" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "Copia E&mail" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "&Aggiungi Contatto" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +msgid "Copy E&mail Address" +msgstr "Copia Indirizzo &Email" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "Visita Co&llegamento" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "Copia Colleg&amento" -#: chat/chatview.cpp:1312 -msgid "&Copy text" -msgstr "&Copia testo" +#: chat/chatview.cpp:867 +msgid "&Copy Text" +msgstr "&Copia Testo" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "Selezion&a Tutto" -#: chat/chatview.cpp:1314 -msgid "Find &Text" -msgstr "" +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "Trova &Testo..." -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" -msgstr "Salva conversazione su &file" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +msgid "C&lear Chat" +msgstr "Pu&lisci Chat" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Chat" +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Salva Chat su &File..." -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "Invia un &file" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Contatti" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "Avvia una con&ferenza" - -#: chat/chatwindow.cpp:494 -msgid "Send a &Nudge!" -msgstr "I&nvia un trillo" - -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "Salva chat" - -#: chat/chatwindow.cpp:496 -msgid "&Emoticons" -msgstr "&Emoticons" - -#: chat/chatwindow.cpp:498 -#, fuzzy -msgid "Close &All Tabs" -msgstr "&Chiudi scheda" - -#: chat/chatwindow.cpp:504 -msgid "Meeting" -msgstr "Meeting" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "Trillo" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "Avvia o termina una &conversazione" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Cambia &carattere" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Cambia c&olore del carattere" - -#: chat/chatwindow.cpp:576 -msgid "&Font" -msgstr "&Carattere" - -#: chat/chatwindow.cpp:577 -msgid "Font &Color" -msgstr "&Colore del carattere" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "&Aiuto" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emoticon" -#: chat/chatwindow.cpp:658 -msgid "My emoticons" -msgstr "Mie emoticon" +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" +msgstr "Mie Emoticon" -#: chat/chatwindow.cpp:738 -msgid "&Settings" -msgstr "&Impostazioni" +#: chat/chatwindow.cpp:328 +#, fuzzy +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." +msgstr "" +"Ci sono più schede aperte in questa finestra di chat. Vuoi chiudere " +"solo la scheda corrente, o tutte le schede?

Nota: Puoi anche " +"chiudere tutte le schede contemporaneamente premendo Shift+Esc." -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "Usa &Controllo Ortografico" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Chiusura di una Scheda di Conversazione" -#: chat/chatwindow.cpp:742 +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" +msgstr "&Chiudi Tutte le Schede" + +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" +msgstr "Chiudi scheda corrente" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "&Invita..." + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." +msgstr "Invia un &File..." + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "Conversazione Webcam" + +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Avvia una con&ferenza" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "I&nvia un trillo" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "Salva Chat..." + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "&Chiudi Tutte le Schede" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Cambia &carattere" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Cambia c&olore del carattere" + +#: chat/chatwindow.cpp:428 msgid "Show &Emoticons" msgstr "Mostra &emoticon" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -msgid "Hide Side&bar" -msgstr "Nascondi la &Barra laterale" - -#: chat/chatwindow.cpp:744 +#: chat/chatwindow.cpp:429 #, fuzzy -msgid "Hide &Toolbar" -msgstr "Nascondi la &Barra laterale" +msgid "Show S&tatus Messages" +msgstr "Mostra &ora dei messaggi" -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -msgid "Hide the contact sidebar" -msgstr "Nascondi il pannello laterale dei contatti" +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "&Panels" -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "Usa &Controllo Ortografico" + +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Meeting" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Trillo" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Invia un &file" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "Tab P&recedente" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "Tab S&uccessivo" + +#: chat/chatwindow.cpp:465 +msgid "Enable or disable the contacts panel" +msgstr "Abilita o disabilita il pannello contatti" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contatti" + +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "Abilita o disabilita il pannello Emoticon Predefinite" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticon" + +#: chat/chatwindow.cpp:477 +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Abilita o disabilita il pannello Emoticon Personalizzate" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mie Emoticon" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Carattere" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "&Colore del carattere" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "Pu&lisci Finestra di Chat" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Avvia o termina una &Conversazione" + +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" +"Hai usato una sintassi non corretta per il comando /status. La " +"sintassi corretta è: /status online|away|idle|brb|busy|lunch|phone|" +"invisible.
Altrimenti puoi usare le scorciatoie /online, /" +"phone, eccetera." -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "Sintassi di /status non corretta" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +#, fuzzy +msgid "You can't block anyone in a group chat." +msgstr "Non puoi bloccare nessuno in conversazione di gruppo." + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +#, fuzzy +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "Impossibile bloccare in questo momento!" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." msgstr "" +"Comando sconosciuto: %1. Se non volevi che questo messaggio " +"fosse un comando, preponi al tuo messaggio un'altra /." -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "&Chiudi scheda" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Comando Sconosciuto" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "&Chiudi scheda" - -#: chat/chatwindow.cpp:1467 -msgid "Show Side&bar" -msgstr "Mostra la &Barra laterale" - -#: chat/chatwindow.cpp:1468 -msgid "Show the contact sidebar" -msgstr "Mostra il pannello laterale dei contatti" - -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 sta scrivendo." - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 e %2 stanno scrivendo." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 e altri %3 stanno scrivendo." - -#: chat/chatwindow.cpp:1611 -#, fuzzy +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Chat" -#: chat/chatwindow.cpp:1615 -#, fuzzy +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - Chat" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "Invia &email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" +"Sei sicuro di voler nascondere la barra dei menu? Potrai mostrarla " +"nuovamente utilizzando questa scorciatoia da tastiera: %1" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Nascondere la barra dei menu" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1 sta scrivendo..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 e %2 stanno scrivendo..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 e altri %3 stanno scrivendo..." + +#: chat/chatwindow.cpp:2296 +#, fuzzy +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" +"

Informazioni Chat

Contatti:
  • %1
Chat iniziata il:
%2
" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "&Avvia una Chat Privata" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +msgid "&Send Email" +msgstr "Invia &Email" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "&Visualizza profilo" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" -msgstr "" +msgstr "Modifica &Note" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Aggiungi contatto" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "A&utorizza contatto" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "Eli&mina contatto" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Blocca contatto" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "Sbl&occa contatto" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" msgstr "&Nome Personale" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "Messaggio &Personale" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" msgstr "Indirizzo &Email" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "&Copia..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" +msgstr "&Copia" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Bloccato" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "Il contatto è %1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" +"

Non hai ancora aggiunto nessuna emoticon personalizzata.

Per aggiungere nuove emoticon, clicca qui!

" -#: chat/emoticonsidebar.cpp:212 -#, fuzzy +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" -msgstr "Aggiungi un Contatto" +msgstr "Aggiungi alla Conversazione" -#: chat/emoticonsidebar.cpp:213 -msgid "Insert new" -msgstr "" - -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Edit" -msgstr "&Modifica" +msgid "Add New" +msgstr "Aggiungi Nuo&va..." -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:451 +msgid "Edit" +msgstr "Modifica" + +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" msgstr "Rimuovi" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +#, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

Non hai ancora aggiunto nessuna emoticon personalizzata.

Per aggiungere nuove emoticon, clicca qui!

" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "Windows Mobile" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 msgid "Web Messenger" msgstr "Web Messenger" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "Offica Communicator" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "Messenger Bot" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "MSN Messenger %1 o compatibile" -#: contact/contactbase.cpp:312 -#, fuzzy +#: contact/contactbase.cpp:349 msgid "Windows Live Messenger %1" -msgstr "Windows Live Messenger" +msgstr "Windows Live Messenger %1" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "Windows Live Messenger %1 o compatibile" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 o compatibile" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 o compatibile" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "In linea" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Non in linea" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Autorizzato" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Rimosso" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 (%2/%3)" - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 (%2/%3)" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Assente" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Torno subito" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Occupato" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Invisibile" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Assente" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "Assente con Risposta Automatica" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "Inattivo" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Torno subito" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Al telefono" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "A pranzo" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Invisibile" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Non in linea" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "Il mio &stato" + +#: contact/msnstatus.cpp:215 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Disconnetti" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" msgstr "Aggiungi un Contatto" -#: dialogs/addcontactdialog.cpp:73 -msgid "No group" -msgstr "Nessun gruppo" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" msgstr "Aggiungi Nuova Emoticon" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "Emoticon" +msgstr "Modifica Emoticon" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "L'emoticon \"%1\" esiste già, vuoi sostituirla?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "L'emoticon \"%1\" esiste già. Vuoi sostituirla?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "Specifica un messaggio di assenza" +#: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "Messaggio di &Assenza Automatico" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Registro Conversazioni" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" +"Si è verificato un errore durante l'apertura dei tuoi registri. " +"Comunementeciò indica un problema di permessi, verifica di avere " +"accesso in lettura e scrittura alla directory \"%1\". Altrimenti, i " +"tuoi registri potrebbero essere corrotti." + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Impossibile aprire il registro delle chat" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "Sei stato aggiunto da qualcuno" -#: dialogs/contactaddeduserdialog.cpp:85 -#, fuzzy +#: dialogs/contactaddeduserdialog.cpp:58 msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " -msgstr "%1\tn ti ha aggiunto alla sua lista contatti. Vuoi:" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"ti ha aggiunto alla sua lista contatti." -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Proprietà del contatto %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Connesso" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" -msgstr "" +msgstr "Mai visto" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "Mostra &ora nei messaggi di conversazione" +msgstr "Ancora nessun messaggio" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" -msgstr "" +msgstr "Visto l'ultima volta: %1" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" -msgstr "" +msgstr "Ultimo messaggio: %1" -#: dialogs/contactpropertiesdialog.cpp:383 -#, fuzzy -msgid "Email: %1" -msgstr "Email: %1" +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Indirizzo email: %1" -#: dialogs/contactpropertiesdialog.cpp:384 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "Client: %1" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Clicca qui per ripristinare l'immagine personale di questo contatto" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Contatti" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Invita Contatti" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "Esporta la Lista Contatti di %1" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Nulla da esportare" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "Il file esiste" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "Il file %1 esiste già, vuoi sovrascriverlo?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "Esportazione Completata" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "L'esportazione della lista contatti è completa" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "S&alva Scheda" + #: dialogs/networkwindow.cpp:79 -msgid "S&ave tab" -msgstr "S&alva scheda" +msgid "C&lear Tab" +msgstr "Pu&lisci Scheda" #: dialogs/networkwindow.cpp:80 -msgid "C&lear tab" -msgstr "Pu&lisci scheda" +msgid "C&lose All Tabs" +msgstr "&Chiudi Tutte le Schede" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." @@ -1976,7 +2902,7 @@ msgstr "" "Nessuna connessione è presente.\n" "Impossibile aprire la Finestra di Rete." -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." @@ -1984,86 +2910,101 @@ msgstr "" "Impossibile salvare il registro della Finestra di Rete. Assicurati di avere " "i permessi di scrivere nella cartella dove il registro deve essere salvato." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "Impossibile chiudere la scheda della connessione principale." -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" +"Inviare comandi al server è una operazione rischiosa.
Se non sai " +"esattamente come farlo, potresti essere fortunato e essere solamente " +"disconnesso, oppure potresti incorrere in conseguenze più serie.
Sei stato avvertito!
Vuoi continuare e inviare questo messaggio?" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" +"Il carico che stai cercando di inviare non termina con l'a capo richiesto " +"('\\r\\n')!
Vuoi che KMess lo aggiunga per te?" -#: dialogs/networkwindow.cpp:1321 -#, fuzzy +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" -msgstr "Impossibile chiudere la scheda della connessione principale." +msgstr "Impossibile inviare comandi a questo tipo di connessione!" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "Annullato" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "Fallito!" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 msgid "Completed" msgstr "Completato" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 byte" -#: dialogs/transferentry.cpp:335 -#, fuzzy +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." -msgstr "Ricevuti %1 di %2" +msgstr "Ricevuti %1 di %2." -#: dialogs/transferentry.cpp:339 -#, fuzzy +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." -msgstr "Inviati %1 di %2" +msgstr "Inviati %1 di %2." -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "infinito" -#: dialogs/transferwindow.cpp:54 -msgid "Cl&ean Up" -msgstr "P&ulisci" +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Usa" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "Eli&mina" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Seleziona o Rimuovi la tua Immagine Personale" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Rimuovi Immagine Personale" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete the picture?" +msgstr "Sei sicuro di voler eliminare questa immagine?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -2071,703 +3012,846 @@ msgstr "" "Impossibile salvare il tema delle emoticon. Assicurati di avere i permessi " "di scrittura per la cartella del tema '%1'." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Sorriso" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "Occhiolino" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Linguaccia" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "Sorrisone" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Triste" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "Pianto" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "Rabbia" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Confuso" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "Imbarazzato" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "Disappunto" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "Caldo" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "Denti scoperti" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "Secchione" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "Disgustato" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Sorpreso" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Festa" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "Sonno" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "Pensieroso" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Segreto" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "Racconto un segreto" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "Stufo" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "Sarcastico" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "Non saprei" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Torno subito" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Angelico" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Abbraccio (sinistra)" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Ragazzo" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Cuore" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Rosa rossa" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "Pollice in su" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Cane" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Sole" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Demone" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Abbraccio (destra)" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Ragazza" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Cuore spezzato" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "Rosa appassita" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Pollice verso" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Gatto" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "Mezza luna" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Bacio" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Applauso" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "Dita incrociate" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Auto" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Aereo" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Tartaruga" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "Lumaca" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Pecora nera" +#: emoticontheme.cpp:869 +msgid "Sheep" +msgstr "Pecora" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Capra" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "Pipistrello" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Birra" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "Cocktail" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "Caffè" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Torta di compleanno" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Piatto" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Ciotola" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Stella" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Arcobaleno " -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Nuvoloso" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Fulmine" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Ombrello" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Palme" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "Cornetta" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Cellulare" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "Email" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Orologio" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "Fotocamera" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "Film" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Nota" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Manette" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Soldi" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "Lampadina" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" msgstr "Sigaretta" -#: emoticontheme.cpp:883 -msgid "Soccer ball" +#: emoticontheme.cpp:896 +msgid "Football ball" msgstr "Pallone da calcio" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Regalo" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Computer" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "KMess" -#: initialview.cpp:226 -#, fuzzy -msgid "Internet connection not available." -msgstr "Il server non è disponibile" +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "Impossibile riconnettere: account non trovato." -#: initialview.cpp:377 -#, fuzzy -msgid "Connect" +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "Impossibile riconnettere: questo account non ha una password salvata." + +#: initialview.cpp:280 initialview.cpp:379 +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" +"Attesa di una connessione a Internet per riconnettersi...
Riconnetti ora!" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" +msgid "Internet connection not available." +msgstr "La connessione a Internet non è disponibile." + +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +"Attesa di %1 secondo prima della riconnessione...
Riconnetti ora!" +msgstr[1] "" +"Attesa di %1 seconds prima della riconnessione...
Riconnetti ora!" + +#: initialview.cpp:581 +msgctxt "Button label" +msgid "&Connect" msgstr "&Connetti" -#: initialview.cpp:382 -#, fuzzy -msgid "Disconnect" -msgstr "&Disconnetti" +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" +msgstr "&Annulla" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "Meno opzioni..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "Per favore, inserisci sia la tua email che la password." -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "Alre opzioni..." +#: initialview.cpp:657 +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Per favore, inserisci un indirizzo email valido." -#: kmess.cpp:223 -#, fuzzy +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "Informazioni Contatto" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "Il contatto %1 è già presente nella tua lista contatti." + +#: kmess.cpp:250 msgid "New Group" -msgstr "Nuovo &gruppo" +msgstr "Nuovo Gruppo" -#: kmess.cpp:226 -msgid "Add a group" -msgstr "Aggiungi un gruppo" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Aggiungi un Gruppo" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" -msgstr "Inserisci un nuovo nome per questo gruppo:" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" +msgstr "Inserisci un nome per il nuovo gruppo:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "" "Sei sicuro di voler rimuovere il contatto %1 dalla tua lista?" -#: kmess.cpp:571 -msgid "Remove contact" -msgstr "Rimuovi un contatto" +#: kmess.cpp:579 +msgid "Remove Contact" +msgstr "Rimuovi Contatto" -#: kmess.cpp:573 -msgid "Remove and block" -msgstr "Rimuovi e blocca" +#: kmess.cpp:581 +msgid "Remove and Block" +msgstr "Rimuovi e Blocca" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" +"Il gruppo \"%1\" non è vuoto: rimuovi tutti i contatti da esso, e " +"riprova!" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" -msgstr "" +msgid "Group Removal" +msgstr "Rimozione Gruppo" -#: kmess.cpp:628 -#, fuzzy +#: kmess.cpp:634 msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" -"Sei sicuro di voler rimuovere il gruppo %1 dalla tua lista?" +"Sei sicuro di voler rimuovere il gruppo %1 dalla tua lista " +"contatti?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" msgstr "Rimuovi" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Questo è un gruppo speciale e non può essere modificato." -#: kmess.cpp:671 -msgid "Rename group" -msgstr "Rinomina un gruppo" +#: kmess.cpp:677 +msgid "Rename Group" +msgstr "Rinomina Gruppo" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Inserisci un nuovo nome per questo gruppo:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" +"

Impossibile effettuare l'accesso automatico con l'account \"%1\":" +"
prima devi salvare la password dell'account!

" -#: kmess.cpp:746 -#, fuzzy +#: kmess.cpp:757 msgctxt "dialog title" -msgid "Autologin failed" -msgstr "Autenticazione non riuscita" +msgid "Autologin Failed" +msgstr "Accesso Automatico Fallito" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Connessione in corso..." + +#: kmess.cpp:1123 +msgctxt "Status bar message" msgid "Disconnected" msgstr "Disconnesso" -#: kmess.cpp:1408 -#, fuzzy +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "

KMess lo ha cercato nelle seguenti cartelle:
%1

" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" -"

KMess non sarà in grado di riprodurre suoni né notifiche.

Il " -"file 'kmess.eventsrc' non è stato trovato in una delle seguenti cartelle: %" -"1

Verifica la tua installazione di KMess, e copia il file mancante in " -"una delle cartelle elencate.

" +"

KMess non sarà in grado di riprodurre suoni né mostrare notifiche.

Il file richiesto 'kmess.notifyrc' non è stato trovato in nessuna " +"delle cartelle dell'applicazione.

%1

Per favore, verifica la tua " +"installazione di KMess.

" -#: kmess.cpp:1412 -msgid "Error with notifications" -msgstr "Errore delle notifiche" +#: kmess.cpp:1481 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Errore con le Notifiche" -#: kmess.cpp:1589 -#, fuzzy -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Azioni" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Nuovo &contatto" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Nuovo &gruppo" - -#: kmessinterface.cpp:156 -msgid "Search for Contact" -msgstr "C&erca un Contatto" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Cerca per &interessi" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "C&erca un Contatto" +msgstr "KMess - %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Nuovo &account" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Impo&stazioni account" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "Co&nnetti" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&Disconnetti" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "Mostra il mio &profilo" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "Il mio &stato" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Assente con risposta automatica" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "&Visualizza" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "Mostra cont&atti autorizzati" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Mostra contatti n&on in linea" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "Mostra contatti &rimossi" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 #, fuzzy +msgid "Show &History Box" +msgstr "Mostra &Registro Chat" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "Mostra la Barra di &Ricerca" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" -msgstr "Mostra &emoticon" +msgstr "Mostra Gruppi &Vuoti" -#: kmessinterface.cpp:321 -#, fuzzy -msgid "Display Pictures Size" -msgstr "Immagine personale" +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "&Dimensione Immagini Personali" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -#, fuzzy -msgid "Small" -msgstr "Sorriso" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" msgstr "&Ordina contatti per" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Mostra finestra dei &trasferimenti" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "Nuovo &Contatto..." + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "Nuovo &gruppo..." + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "&Esporta Lista Contatti..." + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "C&erca un Contatto" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Cerca per &interessi" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Mostra &Registro Chat" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "Nuovo &account..." + +#: kmessinterface.cpp:189 +msgid "Configure Account..." +msgstr "Configura Account..." + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "Configura &KMess..." + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "Mostra &Menu Selezione..." + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "Non Mostrare" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "Piccole" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "Medie" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "Grandi" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "Gruppo" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "In linea/Non in linea" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "Mista" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "Mostra finestra dei &trasferimenti" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "Mostra fi&nestra di rete" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "Sto ascoltando %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "[%1] Accesso effettuato come %2" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr "" +msgstr "[%1] %2 si è connesso" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr "" +msgstr "[%1] %2 si è disconnesso" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "Cha&t" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Proprietà" -#: kmessview.cpp:569 -msgid "&Remove from group" -msgstr "&Rimuovi dal gruppo" +#: kmessview.cpp:600 +msgid "&Remove From Group" +msgstr "&Rimuovi dal Gruppo" -#: kmessview.cpp:574 -msgid "&Listening Music" -msgstr "" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "Nome &Canzone" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "&Copia al gruppo" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "&Sposta al gruppo" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "Sposta &gruppo in basso" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Sposta gr&uppo in alto" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "Ri&muovi gruppo" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Ri&nomina gruppo" -#: kmessview.cpp:1053 -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "Email: %1" +#: kmessview.cpp:1124 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "&Aggiungi il contatto alla mia lista contatti" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Indirizzo email" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" msgstr "Client: %1" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "Si" -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" +#: kmessview.cpp:1156 +msgid "No" +msgstr "No" -#: kmessview.cpp:1085 +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Bloccato" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Visto l'ultima volta: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Ultimo messaggio: %1" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "Gruppo %1" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "%1 contatti" - -#: kmessview.cpp:1095 -#, fuzzy +#: kmessview.cpp:1212 msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Questo contatto non è in linea" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 contatto, %2 in linea" +msgstr[1] "%1 contatti, %2 in linea" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contatto" +msgstr[1] "%1 contatti" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "<Inserisci un tuo messaggio personale qui>" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" +"Inserisci qui un messaggio da mostrare ai tuoi contatti: essi lo vedranno " +"assieme al tuo nome personale" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1 nuovo messaggio di posta" +msgstr[1] "%1 nuovi messaggi di posta" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "Un client per KDE di MSN Messenger" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "Sviluppatore e fondatore del progetto" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:61 msgid "Developer" msgstr "Sviluppatore" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 msgid "Project support" msgstr "Supporto al progetto" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" msgstr "Attuale sviluppatore" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastasi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." @@ -2775,258 +3859,603 @@ msgstr "" "Traduzione tedesca, test, documentazione, gestione sito web, responsabile " "del progetto, ecc..." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:70 msgid "Web design" msgstr "Web design" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "Set di emoticon gialle/blu/viola e traduzione italiana" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "Set di emoticon gialle/blu/viola, traduzione italiana" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Set di emoticon Cartoon" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Tema sonoro predefinito" -#: main.cpp:83 -msgid "KMess icon in Oxygen style" -msgstr "" +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "Michael Anderton" -#: main.cpp:87 +#: main.cpp:74 +msgid "KMess icon in Oxygen style" +msgstr "Icona di KMess in stile Oxygen" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "Manutentore Traduzioni" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "" "Traduzione araba, internazionalizzazione del correzioni per il salvataggio " "dei file." -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "Ulteriore traduzione araba" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Traduzione portoghese/brasiliano" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "Ulteriore traduzione Portoghese Brasiliano" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Traduzione catalana" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" "Traduzione in cinese semplificato, correzione del bug di invio file, codice " "di connessione a proxy" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "Ulteriore traduzione in cinese semplificato" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "Traduzione cinese tradizionale" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinese" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "Ulteriore traduzione Cinese Tradizionale" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:92 msgid "Danish translation" msgstr "Traduzione danese" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:93 msgid "More Danish translation" msgstr "Ulteriore traduzione danese" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:94 msgid "Dutch translation" msgstr "Traduzione olandese" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "Ulteriore traduzione tedesca" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:97 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "Ulteriore traduzione Tedesca, traduzione Greca" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:101 +msgid "More Greek translation" +msgstr "Ulteriore traduzione Greca" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:103 msgid "Estonian translation" msgstr "Traduzione estone" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:104 msgid "Finnish translation" msgstr "Traduzione finlandese" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "Ulteriore traduzione danese" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:108 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:108 msgid "French translation" msgstr "Traduzione francese" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" + +#: main.cpp:109 msgid "More French translation, MSN6 emoticon definitions" msgstr "Ulteriore traduzione francese, definizioni emoticon MSN6" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" msgstr "Ulteriore traduzione francese" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "Traduzione ungherese" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "Henrik Pauli" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "Ulteriore traduzione ungherese" + +#: main.cpp:115 main.cpp:116 msgid "More Italian translation" msgstr "Ulteriore traduzione italiana" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:117 msgid "Korean translation" msgstr "Traduzione coreana" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:118 msgid "Norsk Bokmål translation" msgstr "Traduzione norvegese Bokmål" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:120 +msgid "Serbian translation" +msgstr "Traduzione Serba" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "Traduzione slovacca" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "Matjaž kaše" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "Traduzione slovena" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Traduzione spagnola" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 msgid "More Spanish translation" msgstr "Ulteriore traduzione spagnola" -#: main.cpp:123 +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:132 msgid "Swedish translation" msgstr "Traduzione svedese" -#: main.cpp:125 +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:133 +msgid "More Swedish translation" +msgstr "Ulteriore traduzione Svedese" + +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:135 msgid "Thai translation" msgstr "Traduzione thailandese" -#: main.cpp:126 +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:136 msgid "Turkish translation" msgstr "Traduzione turca" -#: main.cpp:127 main.cpp:128 +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:137 main.cpp:138 msgid "More Turkish translation" msgstr "Ulteriori traduzioni in turco" -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" -#: main.cpp:132 +#: main.cpp:141 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" +msgstr "Supporto a MSNP12, patch varie" + +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:142 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" "Codice per le immagini nella lista contatti, informazioni client usato dai " "contatti, zoom delle font di chat" -#: main.cpp:133 -#, fuzzy -msgid "File transfer thumbnails" -msgstr "Trasferimenti File" +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" -#: main.cpp:134 +#: main.cpp:143 +msgid "File transfer thumbnails" +msgstr "Anteprime nei trasferimenti file" + +#: main.cpp:144 msgid "P4-Context field support" msgstr "Supporto campo P4-Context" -#: main.cpp:135 +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:145 msgid "Xinerama fixes" msgstr "Correzioni di Xinerama" -#: main.cpp:136 +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:146 msgid "Original file receive code" msgstr "Codice originale per la ricezione di file" -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" -msgstr "" +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" -#: main.cpp:138 -#, fuzzy +#: main.cpp:147 msgid "KWallet support" -msgstr "Supporto al progetto" +msgstr "Supporto a KWallet" -#: main.cpp:139 +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:148 msgid "" -"Notifications blocking option,winks disabling option,last message date " +"Notifications blocking option, winks disabling option, last message date " "feature" msgstr "" +"Opzione di blocco notifiche, opzione di disabilitazione animoticon, date " +"ultimi messaggi" -#: main.cpp:142 +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "Comandi stile IRC nella finestra di conversazione" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 #, fuzzy -msgid "Various internationalization fixes" -msgstr "Varie correzioni sull'internazionalizzazione." +msgid "Chat history dialog" +msgstr "Registro Conversazioni" -#: main.cpp:143 +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "Varie correzioni all'internazionalizzazione" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Varie correzioni sull'internazionalizzazione." -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "Sviluppatore GnomeMeeting" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Ragazzo con un sacchetto in testa" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Ispirazione e parti di codice" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:162 msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "" "Vecchio codice fumetti di notifica, codice P2P iniziale, gestore " "autenticazioni" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Codice tempo di inattività" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "Codice per l'immagine alla chiusura in tray" -#: main.cpp:153 -msgid "Custom crash handler implementation" -msgstr "" +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" -#: main.cpp:156 +#: main.cpp:165 +msgid "Custom crash handler implementation" +msgstr "Implementazione del gestore dei crash personalizzato" + +#: main.cpp:168 msgid "Your name here?" msgstr "Il tuo nome qui?" -#: main.cpp:156 -#, fuzzy +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" "Sei invitato a inviare le tue correzioni di bug e patch ai forum di KMess!\n" -"Se pensi che il tuo nome manchi in questa lista, contattaci!" +"E se pensi che il tuo nome manchi in questa lista, contattaci!" -#: main.cpp:159 +#: main.cpp:171 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "I vostri nomi" -#: main.cpp:160 +#: main.cpp:172 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "I vostri indirizzi email" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "Non mostrare la Lista Contatti inizialmente" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Accesso automatico con questo indirizzo email" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "Esegue una prova di debugging (solo build per sviluppatori)" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "Altri Contatti" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Autorizzato" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Rimosso" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "Il contatto ha chiuso la sessione." @@ -3043,62 +4472,107 @@ msgid "You have rejected the invitation." msgstr "Hai rifiutato l'invito." #: network/applications/application.cpp:540 -#, fuzzy -msgid "Do you want to accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "Desideri accettare o rifiutare?" #: network/applications/application.cpp:581 -#, fuzzy -msgid "Click to cancel." -msgstr "Fai clic per rifiutare." +msgid "Click to cancel." +msgstr "Fai clic per annullare." -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Vuoi accettare il file: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "Il contatto vuole inviarti un file: "%1" (%2)." -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "Il trasferimento di %1 non è riuscito. Impossibile aprire il file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Il file "%1" esiste già.\n" +"Vuoi sovrascriverlo?" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "" +"Il trasferimento del file "%1" non è riuscito. Impossibile salvare " +"il file." + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "" +"Il trasferimento di "%1" non è riuscito. Impossibile aprire il " +"file." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Trasferimento accettato." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "Connessione a %1, sulla porta %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "Il trasferimento è stato annullato" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Il contatto ha annullato il trasferimento del file "%1"." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "Hai chiuso il trasferimento del file "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "Hai rifiutato il trasferimento del file "%1"." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Connessione stabilita" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" -msgstr "Trasferimento completato del file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "Il file "%1" è stato inviato." -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Il trasferimento di %1 non è riuscito. Il file non esiste." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "Il file "%1" è stato ricevuto." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "Il trasferimento di %1 non è riuscito. Il file non può essere letto." +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." +msgstr "" +"Il trasferimento del file "%1" non è riuscito. Il file non esiste." -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "Invio del file %1" +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "" +"Il trasferimento di "%1" non è riuscito. Il file non può essere " +"letto." -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Invio del file "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Il contatto ha accettato il trasferimento del file "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "Negoziazione modalità di connessione" @@ -3111,72 +4585,14 @@ msgstr "" "L'invito a trasferire il file è stato annullato, sono state ricevutidati non " "validi." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"Il file '%1' esiste già.\n" -"Vuoi sovrascriverlo?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "Il trasferimento di %1 non è riuscito. Impossibile aprire il file." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." -msgstr "" +msgstr "Hai accettato il trasferimento del file "%1"." -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Il contatto ha annullato il trasferimento." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Hai chiuso la sessione." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "Impossibile scrivere sul file." -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Trasferimento completato del file: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Trasferimento completato del file: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "Il trasferimento di %1 non è riuscito. Il file non esiste." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "Il trasferimento di %1 non è riuscito. Il file non può essere letto." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Invio del file %1 (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Il contatto ha annullato il trasferimento." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "" @@ -3190,29 +4606,29 @@ msgstr "Avvio di GnomeMeeting. Connessione a %1." msgid "Inviting the contact to a meeting." msgstr "Invio di un invito a partecipare a una conferenza." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "L'invito è stato rifiutato, il programma del contatto non lo supporta." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "Invio dell'invito annullato a causa di un errore interno." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "Invio dell'invito annullato per mancata risposta." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "Invio dell'invito annullato a causa di un errore di timeout." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" "Invio dell'invito annullato a causa della chiusura forzata della connessione." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Invito annullato." @@ -3224,25 +4640,19 @@ msgstr "Sei stato invitato a condividere il desktop del contatto." msgid "Starting KRDC. Connecting to %1." msgstr "Avvio di KRDC. Connessione a %1." -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Il contatto ha rifiutato l'invito, a causa di un errore interno." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" +"Il contatto ha richiesto una caratteristica di MSN non ancora supportata da " +"KMess." -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "Il trasferimento non è riuscito." - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." @@ -3250,72 +4660,52 @@ msgstr "" "Invito rifiutato a causa di un errore di trasferimento, o di una " "caratteristica non supportata da KMess." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"Il trasferimento non è riuscito. Sono state ricevute informazioni non " -"valide, oppure KMess non lo supporta." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Il trasferimento non è riuscito, a causa di una mancata risposta." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "Il trasferimento non è riuscito, a causa di un errore interno." - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "" -"Il trasferimento non è riuscito, a causa di un errore nell'apertura della " -"sorgente dati." - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" -"Il contatto ha richiesto una caratteristica di MSN non ancora supportata da " -"KMess." - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "Il trasferimento non è riuscito, a causa di un errore interno." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." msgstr "L'invito è stato annullato. Il messaggio non era per noi." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" "Il trasferimento non è riuscito. Sono state ricevuti dati non validi, oppure " "KMess non lo supporta." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Il contatto ha rifiutato l'invito, a causa di un errore interno." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "Attesa di una connessione a %1, sulla porta %2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" "Utilizzo del trasferimento indiretto (tramite i server di MSN). La velocità " "di trasferimento sarà molto ridotta." -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "In attesa di connessione" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "L'invito è stato annullato, a causa di una mancata risposta." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." @@ -3323,13 +4713,39 @@ msgstr "" "L'invito è stato annullato, a causa di una mancata risposta dalla " "connessione." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" "L'invito è stato annullato, a causa di una mancata risposta all'attesa di " "dati." +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Il trasferimento non è riuscito." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Il trasferimento non è riuscito. Sono state ricevute informazioni non " +"valide, oppure KMess non lo supporta." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Il trasferimento non è riuscito, a causa di una mancata risposta." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Il trasferimento non è riuscito, a causa di un errore interno." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "" +"Il trasferimento non è riuscito, a causa di un errore nell'apertura della " +"sorgente dati." + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "Sei stato invitato a partecipare a una conversazione vocale." @@ -3364,842 +4780,1672 @@ msgstr "Inizio conversazione vocale. In attesa da %1." msgid "Inviting the contact to a voice conversation." msgstr "Invio dell'invito a partecipare a una conversazione vocale." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" "Il contatto ti sta invitando ad iniziare '%1', ma questa funzione non è " "ancora presente in KMess." -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "" +"L'invito per la webcam è stato annullato. Sono stati ricevuti dati non " +"validi." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Ti è stato chiesto di mostrarti in webcam." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "Sei stato invitato a vedere in webcam il contatto." + +#: network/applications/webcamtransferp2p.cpp:147 msgid "webcam" msgstr "webcam" -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "Il trasferimento di %1 è stato annullato." - #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "Fallito" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "" -"Il trasferimento di %1 non è riuscito, a causa della mancata apertura di una " -"porta locale." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Invio del file %1" -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "" +"Il trasferimento di %1 non è riuscito. Impossibile aprire una porta locale." + +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." msgstr "Impossibile aprire una porta locale." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Avvio del trasferimento" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." msgstr "" -"Il trasferimento di %1 non è riuscito. Non è possibile effettuare una " +"Il trasferimento di %1 non è riuscito. Non è stato possibile effettuare una " "connessione." -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "Impossibile effettuare la connessione." -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "Ricezione del file %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"Impossibile accedere al servizio web remoto.\n" -"Dettagli: %1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Sei stato disconnesso perché \n" -"ti sei connesso con un altro client MSN Messenger\n" -"o da un'altra postazione" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Sincronizzazione avvenuta" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Autenticazione" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "In attesa della lista contatti..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "" -"Autenticazione non riuscita, controlla il nome dell'account e la password" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Connessione in corso..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "" -"KMess ha ricevuto un messaggio di errore sconosciuto dal server: \"%1\"" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "Sintassi non valida del comando" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "Parametro non valido del comando" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" "L'email che hai provato ad aggiungere non è un account di MSN Messenger" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "Nome del dominio mancante" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "Già connesso" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" msgstr "Questo nome di account non è valido" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -"Questo nome di account non è valido, oppure il tuo indirizzo email non è " -"stato verificato su MSN Passport." +"Questo nome di account non è valido, oppure il tuo account Passport non è " +"stato ancora verificato" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "La tua lista dei contatti è piena" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "Parametro SBP non valido" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "Questo contatto è già presente nella tua lista" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "Questo contatto non è presente nella tua lista" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "Questo contatto non è in linea" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "Già in questa modalità" -#: network/msnnotificationconnection.cpp:2243 -msgid "Contact is in the opposite list" -msgstr "Il contatto è nella lista opposta" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" +"Questo contatto non può essere aggiunto sia alla lista di consenso sia a " +"quella di blocco." -#: network/msnnotificationconnection.cpp:2247 -#, fuzzy +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" "Questo nome di gruppo è già usato nella tua lista di contatti di Messenger o " -"di Hotmail" +"di Hotmail. Per favore usa un nome diverso." -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" -msgstr "La tua lista dei contatti ha troppi gruppi" +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "" +"La tua lista dei contatti ha troppi gruppi; ti è permesso averne al massimo " +"30." -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "Questo è un gruppo speciale e non può essere modificato" -#: network/msnnotificationconnection.cpp:2260 -#, fuzzy +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" -msgstr "La tua lista dei contatti ha troppi gruppi" +msgstr "Il contatto non fa parte di questo gruppo" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "Questo gruppo non è vuoto" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "Il nome del gruppo è troppo lungo" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" +"Il nome del gruppo è troppo lungo; non può essere più lungo di 61 byte." -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "Tentativo di cambiare il gruppo \"0\"" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "Errore interno di KMess: %1" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 msgid "Invalid Group" msgstr "Gruppo non valido" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" -msgstr "" +msgstr "Dominio vuoto" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "Formato del comando ADL errato" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "Connessione al server di scambio non riuscita" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "Trasferimento al server di notifica non riuscito" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Errore nella connessione diretta (MSNSLP), connessione non riuscita" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "Campo richiesto mancante" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "Non connesso" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Emoticon personali per questo account:" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "A questo account è stato negato l'accesso al servizio MSN." -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "Comando disabilitato" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "Il tuo account è stato bandito." -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 msgid "Challenge response failed" msgstr "Risposta alla sfida fallita" -#: network/msnnotificationconnection.cpp:2319 -#, fuzzy +#: network/msnconnection.cpp:517 msgid "Bad command data" -msgstr "Sintassi non valida del comando" +msgstr "Dati non validi nel comando" -#: network/msnnotificationconnection.cpp:2323 -#, fuzzy +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" -msgstr "Stai aprendo sessioni troppo rapidamente" +msgstr "Stai aprendo sessioni di conversazione troppo rapidamente" -#: network/msnnotificationconnection.cpp:2327 -#, fuzzy +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" -msgstr "Hai troppe sessioni aperte" +msgstr "Hai troppe sessioni di conversazione aperte" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "Sequenza non attesa di comandi" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "Nome personale non valido" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "Dati CVR non validi" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "Il server riporta un sovraccarico di dati da parte di KMess" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" msgstr "Il biglietto di autenticazione non era valido" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "Non puoi avviare una chat quando sei invisibile." -#: network/msnnotificationconnection.cpp:2364 -#, fuzzy +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" -msgstr "Non accettiamo nuovi principali" +msgstr "Non accettiamo nuovi contatti" -#: network/msnnotificationconnection.cpp:2368 -#, fuzzy +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" "Hai un Passport per bambini, devi chiedere il permesso dei tuoi genitori per " -"conversare in linea." +"poter conversare in linea." -#: network/msnnotificationconnection.cpp:2371 -#, fuzzy -msgid "Your passport account needs to be verified first." -msgstr "Il tuo account deve essere prima verificato su MSN Passport." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." +msgstr "Il tuo account Passport deve essere prima verificato." -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "Biglietto USR non valido" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "Errore nell'accesso alla lista contatti, riprova più tardi" -#: network/msnnotificationconnection.cpp:2399 -#, fuzzy +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." -msgstr "È avvenuto un errore interno nel server" +msgstr "" +"Il servizio MSN è temporaneamente non disponibile, è avvenuto un errore " +"interno nel server." -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" +"Il servizio MSN è temporaneamente non disponibile, il server è troppo " +"occupato" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Connessione al server di scambio notifiche utenti persa" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "La connessione al server sta per cadere" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "La connessione al server cadrà presto" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "Scrittura non permessa" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "Sessione troppo carica" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "Il server non è disponibile" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Autenticazione non riuscita" -#: network/msnnotificationconnection.cpp:2449 -#, fuzzy -msgid "Unknown error code received from the server: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -"KMess ha ricevuto un messaggio di errore sconosciuto dal server: \"%1\"" +"Ricevuto dal server un codice di errore sconosciuto: %1
Dettagli " +"tecnici: %2" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 -#, fuzzy +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 msgctxt "Error dialog box title" -msgid "MSN error" -msgstr "KMess - Errore MSN" +msgid "MSN Error" +msgstr "Errore MSN" -#: network/msnnotificationconnection.cpp:2596 -#, fuzzy +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "Tentativo di passaggio ad HTTP..." + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Autenticazione..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Autenticato" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Passaggio ad un altro server..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Connessione in corso..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "Ricevuto un messaggio di errore sconosciuto dal server: %1" + +#: network/msnnotificationconnection.cpp:2109 msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" -msgstr[0] "minuti" -msgstr[1] "minuti" +msgstr[0] "%1 minuto" +msgstr[1] "%1 minuti" -#: network/msnnotificationconnection.cpp:2599 -#, fuzzy +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" -msgstr "Attenzione: Il server chiude per manutenzione tra %1 minuti!" +msgstr "Il server chiude per manutenzione tra %1!" -#: network/msnnotificationconnection.cpp:2604 -#, fuzzy +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." -msgstr "Il server MSN ha indicato che chiuderà per manutenzione tra un minuto." +msgstr "Il server MSN chiuderà per manutenzione tra %1." -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" -msgstr "Perso riferimento al client SOAP" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "Il client SOAP non è più valido." -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -#, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" -msgstr "" -"Impossibile gestire i messaggi non in linea.\n" -"Dettagli: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess non ha potuto gestire i messaggi non in linea.
Dettagli: %1" -#: network/msnnotificationconnection.cpp:3172 -#, fuzzy +#: network/msnnotificationconnection.cpp:2589 msgid "Authentication time limit exceeded" -msgstr "Autenticazione non riuscita" +msgstr "Limite al tempo di autenticazione superato" -#: network/msnnotificationconnection.cpp:3218 -#, fuzzy +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "In attesa della lista contatti..." + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Avviso: %1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "Avviso MSN" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" -msgstr "Errore interno di KMess: %1" +msgstr "
Causa dell'errore interno: %1" -#: network/msnnotificationconnection.cpp:3242 -#, fuzzy -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -"KMess non è riuscito a effettuare la connessione al servizio MSN Messenger. " -"I server MSN potrebbero essere temporaneamente non funzionanti, oppure " -"potrebbe esserci un problema con la tua connessione a Internet." +"

Autenticazione non riuscita, per favore verifica il nome dell'account e " +"la password.

" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

L'account %1 si è connesso da un'altra postazione.

" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -#, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "La connessione al server è stata persa." - -#: network/msnnotificationconnection.cpp:3302 -#, fuzzy +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" -"Autenticazione non riuscita, KMess non è riuscito a elaborare l'accesso a " -"Passport.\n" -"Dettagli: %1" +"

Sei stato disconnesso: ti sei connesso con l'account %1 da un " +"altro client Messenger, o da un'altra postazione.

" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Errore del server" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" +"

Impossibile connettersi al servizio Live Messenger.
Forse devi " +"autenticartiprima di poter accedere alla rete?

" -#: network/msnsockettcp.cpp:352 -#, fuzzy +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

KMess non è riuscito a effettuare la connessione ai server MSN Messenger." +"
Potrebbe esserci un problema con la tua connessione a Internet, oppure " +"i server MSN potrebbero essere temporaneamente non funzionanti.
È " +"anche possibile che per accedere alla rete sia richiesta l'autenticazione " +"presso una pagina web o un proxy.

Clicca qui per " +"visitare la pagina di stato del servizio Messenger.

" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

Impossibile connettersi al servizio Live Messenger.

" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

KMess non è riuscito a effettuare la connessione ai server Live Messenger." +"
Potrebbe esserci un problema con la tua connessione a Internet, oppure " +"i server MSN potrebbero essere temporaneamente non funzionanti.

Clicca qui per visitare la pagina di stato del servizio " +"Messenger.

" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Errore: %1

" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Il server Live Messenger ha riportato un errore:

%1

" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Errore Servizio Messenger: %1

" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Il server Live Messenger ha riportato un errore:

%1

" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Errore di KMess: %1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

KMess ha individuato un errore interno:

%1

" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Connessione di rete persa.

" + +#: network/msnnotificationconnection.cpp:3017 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

La connessione al server Live Messenger è stata persa.

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" +"

Informazioni sviluppatore:
Numero errore: %1
" +"Stringa d'errore: %2

" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Codice interno dell'errore: %2)" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" +"%1 (Codice errore interno: %2)
Risposta: %3 %4
Obiettivo " +"redirezione: %5" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" -msgstr "Connessione stabilita" +msgstr "Limite di tempo per la connessione superato" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "1 ping perduto" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "%1 ping perduti" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." -msgstr "La connessione al server è stata persa." +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "La connessione al server è stata persa" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Questa persona non è in linea o è invisibile." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "L'email specificata, \"%1\", non è un indirizzo email valido!" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" msgstr "" -"Questo contatto ti ha invitato a usare una caratteristica che KMess ancora " -"non supporta." +"L'email specificata, \"%1\", non appartiene ad un account di Live Messenger!" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "Il messaggio \"%1\" non è stato ricevuto!" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Richiesta al servizio web non valida (%1)" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "Impossibile effettuare la connessione a %1" +#: network/soap/httpsoapconnection.cpp:402 +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Il servizio web non è accessible (%1)" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "Impossibile analizzare la risposta SOAP" - -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" +#: network/soap/httpsoapconnection.cpp:471 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "Troppe redirezioni da parte del servizio di accesso" -#: notification/chatnotification.cpp:163 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "In %1's chat: %2" -msgstr "Nella chat di %1: %2" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Il server non è disponibile" -#: notification/chatnotification.cpp:167 -#, fuzzy -msgid "%1 says:
'%2'" -msgstr "%1 scrive:
'%2'" +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" -#: notification/chatnotification.cpp:171 -#, fuzzy -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 ti ha inviato un messaggio non in linea:
'%2'" +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Risposta non valida dal servizio web %1 (%2)" -#: notification/chatnotification.cpp:178 -#, fuzzy +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Nessuna risposta dal servizio web" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Risposta inattesa dal server (%1)" + +#: notification/chatnotification.cpp:154 +msgid "In %1's chat:
%2" +msgstr "Nella chat di %1:
%2" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "%1 scrive:
'%2'" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"%1 ti ha inviato un messaggio non in linea:
'%2'" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" -msgstr "La chat di %1 richiede attenzione!" +msgstr "La chat di %1 richiede attenzione!" -#: notification/chatnotification.cpp:183 -#, fuzzy -msgid "%1:
%2" -msgstr "%1:
%2" +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr "%1 ti ha inviato un messaggio scritto a mano!" +msgstr "%1 ti ha inviato un messaggio scritto a mano!" -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr "%1 ti ha inviato un trillo!" +msgstr "%1 ti ha inviato un trillo!" -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr "%1 ti ha inviato una animoticon!" +msgstr "%1 ti ha inviato una animoticon!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 vuole usare la webcam!" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 ti sta inviando un file!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 ti ha mandato un invito!" #: notification/chatnotification.cpp:204 -#, fuzzy -msgid "%1 wants to use the webcam!" -msgstr "%1 vuole usare la webcam!" +msgid "%1 has canceled the webcam session!" +msgstr "%1 ha annullato la sessione webcam!" #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 ti sta inviando un file!" +msgid "%1 has canceled the file transfer!" +msgstr "%1 ha annullato il trasferimento file!" #: notification/chatnotification.cpp:206 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "%1 ti ha mandato un invito!" +msgid "%1's activity has been canceled!" +msgstr "L'attività con %1 è stata annullata!" #: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "%1 ha annullato la sessione webcam!" +msgid "%1 has accepted to use the webcam!" +msgstr "%1 ha accettato di usare la webcam!" #: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "%1 ha annullato il trasferimento file!" +msgid "%1 has accepted the file transfer!" +msgstr "%1 ha accettato il trasferimento file!" #: notification/chatnotification.cpp:215 -#, fuzzy -msgid "%1's activity has been canceled!" -msgstr "L'attività con %1 è stata annullata!" +msgid "%1 has accepted your invitation!" +msgstr "%1 ha accettato il tuo invito!" #: notification/chatnotification.cpp:222 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1 ha accettato di usare la webcam!" +msgid "%1 has ended the webcam session!" +msgstr "%1 ha concluso la sessione webcam!" #: notification/chatnotification.cpp:223 -#, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "%1 ha accettato il trasferimento file!" +msgid "The file transfer with %1 is done!" +msgstr "Il trasferimento file con %1 è stato completato!" #: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1 ha accettato il tuo invito!" +msgid "%1's activity has ended!" +msgstr "L'attività con %1 è conclusa!" #: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "%1 ha concluso la sessione webcam!" +msgid "%1's webcam session has failed!" +msgstr "La sessione webcam con %1 non è riuscita!" #: notification/chatnotification.cpp:232 -#, fuzzy -msgid "The file transfer with %1 is done!" -msgstr "Il trasferimento file con %1 è stato completato!" +msgid "The file transfer with %1 has failed!" +msgstr "Il trasferimento di file con %1 non è riuscito!" #: notification/chatnotification.cpp:233 -#, fuzzy -msgid "%1's activity has ended!" -msgstr "L'attività con %1 è conclusa!" - -#: notification/chatnotification.cpp:240 -#, fuzzy -msgid "%1's webcam session has failed!" -msgstr "La sessione webcam con %1 non è riuscita!" - -#: notification/chatnotification.cpp:241 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "Il trasferimento di file con %1 non è riuscito!" - -#: notification/chatnotification.cpp:242 -#, fuzzy msgid "%1's activity has ended with an error!" -msgstr "L'attività con %1 è conclusa con un errore!" +msgstr "L'attività con %1 si è conclusa con un errore!" -#: notification/contactstatusnotification.cpp:70 -#, fuzzy -msgid "%1 is now online" -msgstr "%1 è ora connesso" +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
è ora connesso" -#: notification/contactstatusnotification.cpp:71 -#, fuzzy -msgid "%1 has gone away" -msgstr "%1 non è più al computer" +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
non è più al computer" -#: notification/contactstatusnotification.cpp:72 -#, fuzzy -msgid "%1 will be right back" -msgstr "%1 torna subito" +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
tornerà subito" -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1 è occupato" +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
è ora occupato" -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1 è diventato invisibile" +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
è diventato invisibile" -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1 è inattivo" +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
è ora inattivo" -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1 si è disconnesso" +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
si è disconnesso" -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 è al telefono" +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
è al telefono" -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 è andato a pranzo" +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
è andato a pranzo" -#: notification/newemailnotification.cpp:78 -#, fuzzy -msgid "New email:
'%1'
by '%2'" -msgstr "Nuova email:
'%1'
da '%2'" +#: notification/newemailnotification.cpp:90 +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Nuova email:
'%1'
da '%2'" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Apri una Chat" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Lascia un Messaggio" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Visualizza Messaggio" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Dettagli" + +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Leggi Email" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Nascondi" + +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Chiudere la finestra principale manterrà KMess aperto nella barra " +"applicazioni. Usa 'Esci' dal menu 'Connetti' per uscire dall'applicazione." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Riduzione nella vassoio di sistema" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "Sfoglia..." -#: settings/accountpage.cpp:70 -#, fuzzy -msgid "Browse and crop picture..." -msgstr "Sfoglia e ritaglia immagine..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Sfoglia e Ritaglia Immagine..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." -msgstr "" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Usa Immagine Precedente..." -#: settings/accountpage.cpp:448 -#, fuzzy +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" msgstr "Ricezione dell'immagine personale non riuscita" -#: settings/accountpage.cpp:507 -#, fuzzy +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" "Si è verificato un errore nel tentativo di cambiare l'immagine personale.\n" -"Verifica di aver selezionato un file immagine corretto." +"Controlla di aver selezionato un file immagine esistente." -#: settings/accountsettingsdialog.cpp:56 -msgid "&Delete" -msgstr "Eli&mina" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Impostazioni" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "Account" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" msgstr "Il Mio Account" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Segnalazioni" +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Contatti" -#: settings/accountsettingsdialog.cpp:81 -msgid "Alerts and Notifications" -msgstr "Avvisi e Notifiche" - -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Chat" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Registrazione conversazioni" -#: settings/accountsettingsdialog.cpp:193 -#, fuzzy +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" -msgstr "L'indirizzo del contatto che hai inserito non è valido: '%1'" +msgstr "" +"L'indirizzo di posta che hai inserito non è valido, e non può essere usato " +"per un account: '%1'" -#: settings/accountsettingsdialog.cpp:201 -#, fuzzy +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" -msgstr "L'indirizzo del contatto che hai inserito non è valido: '%1'" +msgstr "L'indirizzo di posta che hai inserito è già in uso: '%1'" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Sei sicuro di voler eliminare questo profilo?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." -msgstr "Sei sicuro di voler eliminare questo profilo?" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Sei sicuro di voler eliminare l'account '%1' ?
Tutte le impostazioni di " +"questo account verranno perse." -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "Ciao, come va? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "Stacy" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "Bene!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "Sono /appena/ tornata dalle mie vacanze in Italia!" -#: settings/emoticonspage.cpp:122 +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "" +"Puoi utilizzare solamente 7 caratteri per le scorciatoie delle emoticon." + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "Nome emoticon non valido" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" msgid "Replace Existing Emoticon" msgstr "Rimpiazza Emoticon Esistente" -#: settings/globalsettingsdialog.cpp:45 -#, fuzzy -msgid "KMess Settings" -msgstr "Impostazioni" +#: settings/emoticonspage.cpp:233 +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Sei sicuro di voler eliminare l'emoticon \"%1\" ?" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 -#, fuzzy +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Elimina Emoticon" + +#: settings/globalsettingsdialog.cpp:46 +msgid "KMess Settings" +msgstr "Impostazioni di KMess" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Account" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 -#, fuzzy -msgid "Notification" -msgstr "Notifica email" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notifiche" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." -msgstr "" +msgstr "Nessun browser selezionabile è stato rilevato." -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." -msgstr "" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Nessun programma di posta selezionabile è stato rilevato." -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" +"Devi selezionare un comando da terminale da eseguire per lanciare un browser " +"personalizzato!" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" +"Il comando da terminale che hai scelto di eseguire per lanciare un " +"browser personalizzato non contiene il parametro '%u'. Senza di esso, aprire " +"siti Web non sarà possibile.
Vuoi che KMess lo aggiunga per te?" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" +"Devi selezionare un comando da terminale da eseguire per lanciare un " +"programma di posta personalizzato!" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" +"Il comando che hai scelto di eseguire per lanciare un programma di " +"posta personalizzato non contiene il parametro '%u'. Senza di esso, accedere " +"all'email non sarà possibile.
Vuoi che KMess lo aggiunga per te?" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" -msgstr "" +msgstr "Devi selezionare una cartella per i file ricevuti!" -#: settings/miscellaneouspage.cpp:404 -#, fuzzy +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" -msgstr "Salva i file di chat nella cartella selezionata:" +msgstr "Seleziona la Cartella per i File" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"Chiudere la finestra principale manterrà KMess aperto, ma nella barra " -"applicazioni. Usa 'Esci' dal menu 'File' per uscire da KMess." -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Riduzione nella vassoio di sistema" +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" +"

KMess non è riuscito ad accedere ai suoi file di configurazione!

" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "&Invia un Commento agli Sviluppatori" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Benvenuto in questa versione di test di %1." + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "Benvenuto a %1." + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" +"Ogni volta che hai una bella o frustrante esperienza con questo programma, " +"per favore clicca la faccina appropriata sotto la barra del titolo della " +"finestra, descrivi brevemente cosa ti è piaciuto o no, e premi Invia." + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" +"Ogni volta che hai una bella esperienza con questo programma, per favore " +"clicca la faccina sorridente sotto la barra del titolo della finestra, " +"descrivi brevemente cosa ti è piaciuto, e premi Invia." + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" +"Ogni volta che hai una frustrante esperienza con questo programma, per " +"favore clicca la faccina triste sotto la barra del titolo della finestra, " +"descrivi brevemente cosa non ti è piaciuto, e premi Invia." + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" +"Se riscontri un comportamento non corretto nel programma, clicca " +"semplicemente l'icona con l'oggetto rotto sotto la barra del titolo della " +"finestra, descrivilo brevemente,e premi Invia." + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "Mi piacciono le nuove icone. Molto simpatiche." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" +"Non mi piace la pagina di benvenuto di quell'assistente. Spreca " +"troppo tempo." + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"L'applicazione ha un comportamento non corretto quando clicchi il " +"pulsante Aggiungi. Non accade nulla." + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" +"Desidero una nuova caratteristica che mi consenta di inviare il " +"lavoro per email." + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "Per aiutarci a migliorare, i tuoi commenti sono importanti." + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Esempio" +msgstr[1] "Esempi" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Aiuta a Migliorare l'Applicazione" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Invia un Commento agli Sviluppatori" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Per favore, scrivilo in %1 (potresti voler usare uno strumentoonline di traduzione per questo).
" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Per favore, scrivilo in %1 o %2 (potresti voler usare uno strumentoonline di traduzione per questo).
" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" +"Per rendere più utili al miglioramento dell'applicazione i commenti che " +"invii, cerca di mandare lo stesso quantitativo di commenti positivi e " +"negativi.
" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" +"Per favore, non chiedere nuove caratteristiche: questo genere di richiesta " +"verrà ignorata.
" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" +"

Puoi fornire agli sviluppatori una breve descrizione delle tue opinioni " +"su %1.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"L'indirizzo email che hai inserito non è valido, e non può essere usato: '%1'" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" +"

Il tuo commento è stato inviato con successo. Ci aiuterà a migliorare " +"l'applicazione!

Grazie per il tuo tempo.

" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Commento Inviato" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" +"

Si è verificato un errore durante l'invio del commento.

Per " +"favore, riprova più tardi.

" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Errore Invio Commento" + +#~ msgid "Conversations Filter" +#~ msgstr "Filtro Conversazioni" + +#~ msgid "Filter by &conversation" +#~ msgstr "Filtra per &conversazione" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Seleziona un account da modificare, quindi clicca qui" + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Il trillo per %1 non ha potuto essere inviato." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "L'animoticon per %1 non ha potuto essere inviata." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Il disegno per %1 non ha potuto essere inviato." + +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Il messaggio '%1' per %2 non ha potuto essere inviato." -#: systemtraywidget.cpp:245 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 (%2/%3)" +#~ msgid "Use" +#~ msgstr "&Usa" + +#~ msgid "&Copy..." +#~ msgstr "&Copia..." + +#~ msgid "Insert New" +#~ msgstr "Inserisci Nuovo" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "Indirizzo email: %1" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Client: %1" + +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Bloccato: %1" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Visto l'ultima volta: %1" + +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Ultimo messaggio: %1" + +#~ msgctxt "Message in list tooltip" +#~ msgid "Has you: %1" +#~ msgstr "Ti ha aggiunto: %1" + +#~ msgid "Contact List Alerts" +#~ msgstr "Avvisi Lista Contatti" + +#~ msgid "&Show winks from contacts" +#~ msgstr "&Mostra le animoticon dei contatti" + +#~ msgid "Enable in the contact list" +#~ msgstr "Abilita nella lista contatti" + +#~ msgid "Enable in the chat windows" +#~ msgstr "Abilita nelle finestre di conversazione" + +#~ msgid "Alerts" +#~ msgstr "Segnalazioni" + +#~ msgid "Alerts and Notifications" +#~ msgstr "Avvisi e Notifiche" + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "" +#~ "Opzionalmente, puoi scegliere in quale gruppo posizionare il nuovo " +#~ "contatto" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Nessun gruppo" + +#~ msgid "Now listening to: %1" +#~ msgstr "Sto ascoltando: %1" + +#~ msgid "&Listening Music" +#~ msgstr "&Musica in Ascolto" + +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "Impossibile accedere al servizio web remoto.
Dettagli: %1" + +#, fuzzy +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "Autenticazione non riuscita, KMess non è riuscito a elaborare l'accesso a " +#~ "Passport.
Dettagli: %1" + +#~ msgid "SOAP connection error: %1" +#~ msgstr "Errore di connessione SOAP: %1" + +#~ msgid "Close all tabs" +#~ msgstr "Chiudi tutte le schede" + +#~ msgid "&Send email" +#~ msgstr "Invia &email" + +#~ msgid "Save complete" +#~ msgstr "Salvataggio completato" + +#~ msgid "C&lose all tabs" +#~ msgstr "C&hiudi tutte le schede" + +#~ msgid "Connect" +#~ msgstr "Connetti" + +#, fuzzy +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: account not found." +#~ msgstr "Impossibile riconnettere: account non trovato." + +#, fuzzy +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: no password has been entered." +#~ msgstr "" +#~ "Impossibile riconnettere: questo account non ha una password salvata." + +#~ msgid "Rename group" +#~ msgstr "Rinomina un gruppo" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "Impo&stazioni account" + +#~ msgid "" +#~ "Basic DBus support, tab closing message, menu hiding shortcut, toolbars " +#~ "lock" +#~ msgstr "" +#~ "Supporto di base a DBus, messaggio di chiusura schede, collegamento per " +#~ "nascondere il menu, blocco barre degli strumenti" + +#~ msgctxt "Connection error dialog box" +#~ msgid "%1" +#~ msgstr "%1" + +#~ msgctxt "Server error dialog box" +#~ msgid "

MSN server message

%1

" +#~ msgstr "

Messaggio del server MSN

%1

" + +#~ msgctxt "Server-reported client error dialog box" +#~ msgid "

Internal error in KMess

%1

" +#~ msgstr "

Errore interno in KMess

%1

" + +#~ msgid "" +#~ "Error in the fallback Web connection. It is possible you need to " +#~ "authenticate to a proxy server or a web page." +#~ msgstr "" +#~ "Errore nel passaggio alla connessione Web di ripiego. È possibile che sia " +#~ "necessario autenticarsi presso un server proxy o una pagina Web." + +#~ msgid "Select an emoticon and click here to delete it" +#~ msgstr "Seleziona una emoticon e clicca qui per eliminarla" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 è ora connesso" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 non è più al computer" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 è ora occupato" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 è diventato inattivo" + +#~ msgid "Popup Notifications" +#~ msgstr "Notifiche a comparsa" + +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Mostra notifiche quando i tuoi contatti:" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "" +#~ "Se abilitato, sarà mostrato un pop-up quando i tuoi contatti si " +#~ "connettono aMSN." + +#~ msgid "&Go online" +#~ msgstr "Si &connettono" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "" +#~ "Se abilitato, sarà mostrato un pop-up quando un contatto inizia una " +#~ "conversazione con te." + +#~ msgid "Start a &chat with you" +#~ msgstr "Iniziano una &conversazione con te" + +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "" +#~ "Se abilitato, sarà mostrato un pop-up ogni volta che ricevi un messaggio " +#~ "da un contatto." + +#~ msgid "S&end you a message" +#~ msgstr "&Ti inviano un messaggio" + +#~ msgid "" +#~ "If enabled, a popup message is shown when your contacts change their MSN " +#~ "status." +#~ msgstr "" +#~ "Se abilitato, un pop-up anche quando i tuoi contatti cambiano il " +#~ "lorostato su MSN." + +#~ msgid "Change their &status" +#~ msgstr "Cambiano il loro &stato" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts goes " +#~ "offline." +#~ msgstr "" +#~ "Se abilitato, sarà mostrato un pop-up quando i tuoi contatti si " +#~ "disconnettono." + +#~ msgid "Go o&ffline" +#~ msgstr "Si &disconnettono" + +#~ msgid "Email Events" +#~ msgstr "Eventi Email" + +#~ msgid "Show notifications when email is received:" +#~ msgstr "Mostra una notifica quando ricevi un'email:" + +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in the Inbox. " +#~ "This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Se abilitato, un pop-up viene mostrato quando una email viene ricevuta " +#~ "nellacartella Posta in Arrivo. Questa opzione è disponibile solamente per " +#~ "gli accountdi Hotmail/Live Mail." + +#~ msgid "In the Inbox" +#~ msgstr "Nella Posta in Arrivo" + +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in other " +#~ "folders. This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Se abilitato, un pop-up viene mostrato quando una email viene ricevuta " +#~ "inaltre cartelle. Questa opzione è disponibile solamente per gli account " +#~ "di Hotmail/Live Mail." + +#~ msgid "In other folders" +#~ msgstr "In altre cartelle" + +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "" +#~ "Controlla il numero di secondi per i quali i pop-up resteranno visibili." + +#~ msgid "Hide popups after" +#~ msgstr "Nascondi pop-up dopo" + +#~ msgid "seconds" +#~ msgstr "secondi" + +#~ msgid "Other Alerts" +#~ msgstr "Altri Avvisi" + +#, fuzzy +#~ msgid "Save logged chats as:" +#~ msgstr "Salva chat" + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "" +#~ "Questo contatto ti ha invitato a usare una caratteristica che KMess " +#~ "ancora non supporta." + +#~ msgid "" +#~ "You can disable this checkbox to make KMess to delete this account when " +#~ "you quit" +#~ msgstr "" +#~ "Puoi disabilitare questa casella per far eliminare questo account " +#~ "all'uscita da KMess" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Contatti" + +#~ msgid "Also r&emember the password" +#~ msgstr "Ricorda anche la password" + +#, fuzzy +#~ msgid "" +#~ "If enabled, all chat conversations will be saved in the specified " +#~ "directory." +#~ msgstr "" +#~ "Se abilitata, le conversazioni verranno automaticamente salvate nella " +#~ "cartella selezionata." + +#~ msgid "Log &all chats" +#~ msgstr "Registr&a tutte le conversazioni" + +#~ msgid "Log Structure" +#~ msgstr "Struttura Registri" + +#~ msgid "Month" +#~ msgstr "Mese" + +#~ msgid "Day" +#~ msgstr "Giorno" + +#~ msgid "Invite contacts" +#~ msgstr "Invita contatti" + +#~ msgctxt "Status message on login screen" +#~ msgid "Reconnecting in %1 seconds..." +#~ msgstr "Riconnessione in %1 secondi..." + +#~ msgid "&Search in Contact List" +#~ msgstr "C&erca nella Lista Contatti" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Questa persona non è in linea o è invisibile." + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "Il messaggio \"%1\" non è stato ricevuto!" + +#~ msgid "Hide Side&bar" +#~ msgstr "Nascondi la &Barra laterale" + +#~ msgid "Hide the contact sidebar" +#~ msgstr "Nascondi il pannello laterale dei contatti" + +#~ msgid "Show the contact sidebar" +#~ msgstr "Mostra il pannello laterale dei contatti" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Il contatto è %1" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "&Invita" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "Impossibile effettuare la connessione a %1" + +#~ msgid "Unable to parse SOAP response" +#~ msgstr "Impossibile analizzare la risposta SOAP" + +#, fuzzy +#~ msgid "" +#~ "Click here to add a new custom emoticon which can be sent to your contacts" +#~ msgstr "" +#~ "Clicca qui per aggiungere una nuova emoticon personalizzata da inviare ai " +#~ "tuoi contatti" + +#~ msgid "Black sheep" +#~ msgstr "Pecora nera" + +#~ msgid "Copy E&mail" +#~ msgstr "Copia E&mail" + +#~ msgid "Specify an Away message" +#~ msgstr "Specifica un messaggio di assenza" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "Email: %1" + +#~ msgid "Soccer ball" +#~ msgstr "Pallone da calcio" + +#~ msgid "Contact %1 already exists." +#~ msgstr "Il contatto %1 esiste già." + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "Email: %1" + +#~ msgid "Contact is in the opposite list" +#~ msgstr "Il contatto è nella lista opposta" + +#~ msgid "The group name is too long" +#~ msgstr "Il nome del gruppo è troppo lungo" + +#~ msgid "No permissions given for this account" +#~ msgstr "Permessi non concessi per questo account" + +#~ msgid "Lost reference to SOAP client" +#~ msgstr "Perso riferimento al client SOAP" + +#~ msgid "Enter your personal message here" +#~ msgstr "Inserisci un tuo messaggio personale qui" + +#~ msgid "Click" +#~ msgstr "Clicca" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "Finestra di rete" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Windows Live Messenger %1 o compatibile" + +#~ msgid "Co&nnect" +#~ msgstr "Co&nnetti" + +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "In attesa della lista contatti (%1%)..." + +#~ msgid "SSL Error" +#~ msgstr "Errore SSL" + +#~ msgid "Erase Drawing" +#~ msgstr "Elimina Disegno" + +#~ msgid "More options..." +#~ msgstr "Altre opzioni..." + +#~ msgid " Account options " +#~ msgstr "Impostazioni account" + +#~ msgid "You received a wink from %1." +#~ msgstr "Hai ricevuto una animoticon da %1." + +#~ msgctxt "Clickable label on login screen" +#~ msgid "Less options..." +#~ msgstr "Meno opzioni..." + +#~ msgctxt "Clickable label on login screen" +#~ msgid "More options..." +#~ msgstr "Alre opzioni..." + +#~ msgid "Got synchronization" +#~ msgstr "Sincronizzazione avvenuta" + +#~ msgid "&Help" +#~ msgstr "&Aiuto" + +#~ msgid "&Settings" +#~ msgstr "&Impostazioni" + +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Vuoi accettare il file: %1 (%2)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "Il trasferimento è stato annullato" + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Trasferimento completato del file: %1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "Il trasferimento di %1 non è riuscito. Il file non esiste." + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "" +#~ "Il trasferimento di %1 non è riuscito. Il file non può essere letto." + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "Il trasferimento di %1 è stato annullato." #~ msgid "Click to send an email to this contact." #~ msgstr "Clicca per inviare una email a questo contatto." @@ -4207,10 +6453,6 @@ msgstr "%1 (%2/%3)" #~ msgid "Picture:" #~ msgstr "Immagine:" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Mostra l'email nella lista dei contatti" - #~ msgid "Logging in..." #~ msgstr "Mi connetto..." @@ -4231,10 +6473,6 @@ msgstr "%1 (%2/%3)" #~ msgid "Email: " #~ msgstr "Email: %1" -#, fuzzy -#~ msgid "Client: " -#~ msgstr "Client: %1" - #~ msgid "Remove group" #~ msgstr "Rimuovi un gruppo" @@ -4250,178 +6488,6 @@ msgstr "%1 (%2/%3)" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "Hai %1 nuovi messaggi di posta." -#~ msgid "" -#~ "(c) 2002-2008, Mike K. Bennett\n" -#~ "(c) 2005-2008, Diederik van der Boor\n" -#~ "(c) 2007-2008, Valerio Pilo\n" -#~ msgstr "" -#~ "(c) 2002-2008, Mike K. Bennett\n" -#~ "(c) 2005-2008, Diederik van der Boor\n" -#~ "(c) 2007-2008, Valerio Pilo\n" - -#~ msgid "Mike K. Bennett" -#~ msgstr "Mike K. Bennett" - -#~ msgid "Michael Curtis" -#~ msgstr "Michael Curtis" - -#~ msgid "Jan Tönjes" -#~ msgstr "Jan Tönjes" - -#~ msgid "Diederik van der Boor" -#~ msgstr "Diederik van der Boor" - -#~ msgid "Richard Conway" -#~ msgstr "Richard Conway" - -#~ msgid "Valerio Pilo" -#~ msgstr "Valerio Pilo" - -#~ msgid "Dane Harnett" -#~ msgstr "Dane Harnett" - -#~ msgid "David Vignoni" -#~ msgstr "David Vignoni" - -#~ msgid "Julien Joubin" -#~ msgstr "Julien Joubin" - -#~ msgid "Christian Müller" -#~ msgstr "Christian Müller" - -#, fuzzy -#~ msgid "Michael Anderton" -#~ msgstr "Michael Curtis" - -#~ msgid "Mohamed Aser" -#~ msgstr "Mohamed Aser" - -#~ msgid "Youssef Chahibi" -#~ msgstr "Youssef Chahibi" - -#~ msgid "Mauricio Rother" -#~ msgstr "Mauricio Rother" - -#~ msgid "Jaume Cornadó" -#~ msgstr "Jaume Cornadó" - -#~ msgid "Lin Haoxiang" -#~ msgstr "Lin Haoxiang" - -#~ msgid "Liu Sizhuang" -#~ msgstr "Liu Sizhuang" - -#~ msgid "Yen-chou Chen" -#~ msgstr "Yen-chou Chen" - -#~ msgid "Lars Sommer" -#~ msgstr "Lars Sommer" - -#~ msgid "Pascal d'Hermilly" -#~ msgstr "Pascal d'Hermilly" - -#~ msgid "Arend van Beelen Jr." -#~ msgstr "Arend van Beelen Jr." - -#~ msgid "Jaap Woldringh" -#~ msgstr "Jaap Woldringh" - -#~ msgid "Jyri Toomessoo" -#~ msgstr "Jyri Toomessoo" - -#~ msgid "Markus Vuori" -#~ msgstr "Markus Vuori" - -#~ msgid "Joonas Niilola" -#~ msgstr "Joonas Niilola" - -#~ msgid "Jussi Timperi" -#~ msgstr "Jussi Timperi" - -#~ msgid "Choplair" -#~ msgstr "Choplair" - -#~ msgid "Vincent Fretin" -#~ msgstr "Vincent Fretin" - -#~ msgid "Andrea Blankenstijn" -#~ msgstr "Andrea Blankenstijn" - -#~ msgid "Páder Rezsõ" -#~ msgstr "Páder Rezsõ" - -#~ msgid "Vincenzo Reale" -#~ msgstr "Vincenzo Reale" - -#~ msgid "Park Dong Cheon" -#~ msgstr "Park Dong Cheon" - -#~ msgid "Øyvind Sæther" -#~ msgstr "Øyvind Sæther" - -#~ msgid "Matjaž kaše" -#~ msgstr "Matjaž kaše" - -#~ msgid "Johanna Gersch" -#~ msgstr "Johanna Gersch" - -#~ msgid "J.C.A. Javi" -#~ msgstr "J.C.A. Javi" - -#~ msgid "Alejandro Araiza Alvarado" -#~ msgstr "Alejandro Araiza Alvarado" - -#~ msgid "Jaume Corbí" -#~ msgstr "Jaume Corbí" - -#~ msgid "Christian Kaiser" -#~ msgstr "Christian Kaiser" - -#~ msgid "Christian Lundgren" -#~ msgstr "Christian Lundgren" - -#~ msgid "Rachan Hongpairote" -#~ msgstr "Rachan Hongpairote" - -#~ msgid "Gorkem Cetin" -#~ msgstr "Gorkem Cetin" - -#~ msgid "Barbaros Ulutas" -#~ msgstr "Barbaros Ulutas" - -#~ msgid "Uğur Çetin" -#~ msgstr "Uğur Çetin" - -#~ msgid "Guido Solinas" -#~ msgstr "Guido Solinas" - -#~ msgid "Scott Morgan" -#~ msgstr "Scott Morgan" - -#~ msgid "Laurence Anderson" -#~ msgstr "Laurence Anderson" - -#~ msgid "Choe Hwanjin" -#~ msgstr "Choe Hwanjin" - -#~ msgid "Damien Sandras" -#~ msgstr "Damien Sandras" - -#~ msgid "Tobias Tönjes" -#~ msgstr "Tobias Tönjes" - -#~ msgid "KMerlin (kmerlin.olsd.de)" -#~ msgstr "KMerlin (kmerlin.olsd.de)" - -#~ msgid "Kopete (kopete.kde.org)" -#~ msgstr "Kopete (kopete.kde.org)" - -#~ msgid "KScreensaver" -#~ msgstr "KScreensaver" - -#~ msgid "BasKet" -#~ msgstr "BasKet" - #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "Il trasferimento di %1 non è riuscito. Impossibile aprire il file." @@ -4443,12 +6509,6 @@ msgstr "%1 (%2/%3)" #~ msgid "Your password:" #~ msgstr "La tua password:" -#~ msgid "Display picture:" -#~ msgstr "Immagine personale:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "Non mos&trare un'immagine personale" - #~ msgid "Status to set at login:" #~ msgstr "Stato da impostare all'accesso:" diff --git a/po/kmess.pot b/po/kmess.pot index 620c884..d6d2495 100644 --- a/po/kmess.pot +++ b/po/kmess.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,757 +17,1328 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 +msgid "Standard text mode" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Ink message" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -msgid "Initial group" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 -msgid "&Automatic away message" +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +msgid "Search through contacts..." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 -msgid "&Add this person to my \"Friends\" list" +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +msgid "Chat Log Filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 -msgid "Do not add this person; only allow them to see my online state" +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 -msgid "&Block this person from contacting me or seeing my online state" +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +msgid "Filter by &chat" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +msgid "&Add this person to these groups of my contact list:" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +msgid "&Do not add this person; only allow them to see my status" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +msgid "&Block this person from contacting me or seeing my status" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 -msgid "Restore" +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -msgid "Use alternative name for this person" +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -msgid "Show a popup when the contact goes online/offline" +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +msgid "Use As Display Picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 msgid "&Clear Cache" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -msgid "Notes" +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -msgid "Email address:" +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -msgid " Account options " +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +msgid "Account &Info" +msgstr "" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 msgid "Your Account Information" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +msgid "Enter the name other contacts should see when you are online." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 msgid "&Friendly name:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 msgid "&Email address:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -msgid "&Remember Password" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 -msgid "Login &with this account automatically" +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 +msgid "Log in &with this account automatically" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +msgid "Change status to \"&Idle\" when inactive" +msgstr "" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 msgid "Saved accounts:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +msgid "&Add Account..." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 -msgid "&Add account..." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -msgid "Popup Notifications" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 -msgid "Contact Events" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -msgid "&Go online" +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -msgid "Email Events" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -msgid "Show notifications when email is received:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -msgid "Other Alerts" +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -msgid "&Show winks from contacts" +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +msgid "Enables the appearance of emoticons in the chat window." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +msgid "Show &winks" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +msgid "S&how timestamp" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +msgid "Show &date" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +msgid "Show s&econds" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +msgid "Chat Window Formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -777,2047 +1348,2774 @@ msgid "" "window with the first nudge.

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 -msgid "Inform contacts w&hich song I am listening to" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -msgid "Save chat files in this directory:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -msgid "Save directly in the specified directory" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -msgid "&Chat style:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -msgid "Chat Settings" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -msgid "&Show emoticons" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -msgid "S&how messages time" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 msgid "G&roup chats in the same window:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 msgid "Always" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 msgid "For contacts in the same group" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 msgid "Never" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +msgid "Display Options" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -msgid "Your &message font:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -msgid "&Force contacts' messages to use this font:" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -msgid "Enable in the contact list" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 msgid "and" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 msgid "for file transfers" msgstr "" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:119 +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" + +#: chat/chat.cpp:142 msgid "%1 has joined the chat." msgstr "" -#: chat/chat.cpp:211 -msgid "The conversation went idle, %1 has left the chat." +#: chat/chat.cpp:196 +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "" -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "" -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr "" -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." msgstr "" -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr "" -#: chat/chat.cpp:934 -msgid "You received a wink from %1." -msgstr "" - -#: chat/chat.cpp:971 +#: chat/chat.cpp:830 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:941 +msgid "You have sent a wink" msgstr "" -#: chat/chat.cpp:1080 -msgid "You have received a wink from %1" +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." msgstr "" -#: chat/chat.cpp:1100 -msgid "You received a nudge from %1!" +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." msgstr "" -#: chat/chat.cpp:1119 -msgid "The message '%1' could not be sent." +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." msgstr "" -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1139 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" + +#: chat/chat.cpp:1153 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" + +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "" + +#: chat/chat.cpp:1194 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" + +#: chat/chat.cpp:1220 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" + +#: chat/chat.cpp:1230 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" + +#: chat/chat.cpp:1241 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" + +#: chat/chat.cpp:1252 +msgid "%1 has sent you a wink!" +msgstr "" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +msgid "%1 has gone offline." +msgstr "" + +#: chat/chat.cpp:1299 +msgid "%1 has changed his or her status to \"%2\"" +msgstr "" + +#: chat/chat.cpp:1330 +msgid "%1 has sent you a nudge!" +msgstr "" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "" + +#: chat/chat.cpp:1376 +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "" + +#: chat/chat.cpp:1381 +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "" + +#: chat/chat.cpp:1391 +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "" + +#: chat/chat.cpp:1406 +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "" + +#: chat/chat.cpp:1489 +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "" + +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" msgstr "" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." msgstr "" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +msgid "Ignore this &Emoticon" +msgstr "" + +#: chat/chatview.cpp:833 msgid "Send &Email" msgstr "" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" +#: chat/chatview.cpp:837 +msgid "Add &Contact" msgstr "" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +msgid "Copy E&mail Address" +msgstr "" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +msgid "C&lear Chat" msgstr "" -#: chat/chatwindow.cpp:489 -msgid "&Chat" +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." msgstr "" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatwindow.cpp:108 +msgid "Contacts" msgstr "" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "" - -#: chat/chatwindow.cpp:494 -msgid "Send a &Nudge!" -msgstr "" - -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "" - -#: chat/chatwindow.cpp:496 -msgid "&Emoticons" -msgstr "" - -#: chat/chatwindow.cpp:498 -msgid "Close &All Tabs" -msgstr "" - -#: chat/chatwindow.cpp:504 -msgid "Meeting" -msgstr "" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "" - -#: chat/chatwindow.cpp:576 -msgid "&Font" -msgstr "" - -#: chat/chatwindow.cpp:577 -msgid "Font &Color" -msgstr "" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "" -#: chat/chatwindow.cpp:658 -msgid "My emoticons" +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" msgstr "" -#: chat/chatwindow.cpp:738 -msgid "&Settings" -msgstr "" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -msgid "Hide Side&bar" -msgstr "" - -#: chat/chatwindow.cpp:744 -msgid "Hide &Toolbar" -msgstr "" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -msgid "Hide the contact sidebar" -msgstr "" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:328 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:855 -msgid "Close all tabs" +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:856 -msgid "Close current tab" +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" msgstr "" -#: chat/chatwindow.cpp:1467 -msgid "Show Side&bar" +#: chat/chatwindow.cpp:409 +msgid "&Invite..." msgstr "" -#: chat/chatwindow.cpp:1468 -msgid "Show the contact sidebar" +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." msgstr "" -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" msgstr "" -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" msgstr "" -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" msgstr "" -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "" + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "" + +#: chat/chatwindow.cpp:429 +msgid "Show S&tatus Messages" +msgstr "" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +msgid "Enable or disable the contacts panel" +msgstr "" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "" + +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "" + +#: chat/chatwindow.cpp:477 +msgid "Enable or disable the Custom Emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" msgstr "" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "" + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "" + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "" + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +msgid "&Send Email" +msgstr "" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" msgstr "" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" msgstr "" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" msgstr "" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" msgstr "" -#: chat/emoticonsidebar.cpp:213 -msgid "Insert new" +#: chat/emoticonswidget.cpp:450 +msgid "Add New" msgstr "" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" msgstr "" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 msgid "Web Messenger" msgstr "" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 msgid "Windows Live Messenger %1" msgstr "" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +msgid "Windows Live Messenger compatible" +msgstr "" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "" - -#: contactlistviewdelegate.cpp:143 -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "" - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" msgstr "" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "" + +#: contact/msnstatus.cpp:215 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" msgstr "" -#: dialogs/addcontactdialog.cpp:73 -msgid "No group" -msgstr "" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" msgstr "" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" msgstr "" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:383 -msgid "Email: %1" +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "" +#: dialogs/contactpropertiesdialog.cpp:659 +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "" + +#: dialogs/contactpropertiesdialog.cpp:661 +msgid "Copy Contact Picture" +msgstr "" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "" + #: dialogs/networkwindow.cpp:79 -msgid "S&ave tab" +msgid "C&lear Tab" msgstr "" #: dialogs/networkwindow.cpp:80 -msgid "C&lear tab" +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" msgstr "" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 msgid "Completed" msgstr "" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 -msgid "Cl&ean Up" +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" msgstr "" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" msgstr "" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" +#: dialogs/userpicturesdialog.cpp:46 +msgid "Choose or Remove Your Display Picture" msgstr "" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete the picture?" +msgstr "" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "" -#: emoticontheme.cpp:838 -msgid "Thumby up" -msgstr "" - -#: emoticontheme.cpp:839 -msgid "Dog face" -msgstr "" - -#: emoticontheme.cpp:840 -msgid "Sun" -msgstr "" - -#: emoticontheme.cpp:841 -msgid "Devil" -msgstr "" - -#: emoticontheme.cpp:842 -msgid "Right hug" -msgstr "" - -#: emoticontheme.cpp:843 -msgid "Girl" -msgstr "" - -#: emoticontheme.cpp:844 -msgid "Broken heart" -msgstr "" - -#: emoticontheme.cpp:845 -msgid "Wilted rose" -msgstr "" - -#: emoticontheme.cpp:846 -msgid "Thumbs down" -msgstr "" - -#: emoticontheme.cpp:847 -msgid "Cat face" -msgstr "" - -#: emoticontheme.cpp:848 -msgid "Sleeping half-moon" -msgstr "" - -#: emoticontheme.cpp:849 -msgid "Red lips" -msgstr "" - -#: emoticontheme.cpp:850 -msgid "Clapping" -msgstr "" - #: emoticontheme.cpp:851 -msgid "Crossed fingers" +msgid "Thumbs up" msgstr "" #: emoticontheme.cpp:852 -msgid "Auto" +msgid "Dog face" msgstr "" #: emoticontheme.cpp:853 -msgid "Airplane" +msgid "Sun" msgstr "" #: emoticontheme.cpp:854 -msgid "Turtle" +msgid "Devil" msgstr "" #: emoticontheme.cpp:855 -msgid "Snail" +msgid "Right hug" msgstr "" #: emoticontheme.cpp:856 -msgid "Black sheep" +msgid "Girl" msgstr "" #: emoticontheme.cpp:857 -msgid "Goat" +msgid "Broken heart" msgstr "" #: emoticontheme.cpp:858 -msgid "Vampire bat" +msgid "Wilted rose" msgstr "" #: emoticontheme.cpp:859 -msgid "Pizza" +msgid "Thumbs down" msgstr "" #: emoticontheme.cpp:860 -msgid "Beer mug" +msgid "Cat face" msgstr "" #: emoticontheme.cpp:861 -msgid "Martini glass" +msgid "Sleeping half-moon" msgstr "" #: emoticontheme.cpp:862 -msgid "Coffee cup" +msgid "Red lips" msgstr "" #: emoticontheme.cpp:863 -msgid "Birthday cake" +msgid "Clapping" msgstr "" #: emoticontheme.cpp:864 -msgid "Plate" +msgid "Crossed fingers" msgstr "" #: emoticontheme.cpp:865 -msgid "Bowl" +msgid "Auto" msgstr "" #: emoticontheme.cpp:866 -msgid "Star" +msgid "Airplane" msgstr "" #: emoticontheme.cpp:867 -msgid "Rainbow" +msgid "Turtle" msgstr "" #: emoticontheme.cpp:868 -msgid "Stormy cloud" +msgid "Snail" msgstr "" #: emoticontheme.cpp:869 -msgid "Lightning" +msgid "Sheep" msgstr "" #: emoticontheme.cpp:870 -msgid "Umbrella" +msgid "Goat" msgstr "" #: emoticontheme.cpp:871 -msgid "Island with a palm tree" +msgid "Vampire bat" msgstr "" #: emoticontheme.cpp:872 -msgid "Telephone receiver" +msgid "Pizza" msgstr "" #: emoticontheme.cpp:873 -msgid "Mobile Phone" +msgid "Beer mug" msgstr "" #: emoticontheme.cpp:874 -msgid "Email" +msgid "Martini glass" msgstr "" #: emoticontheme.cpp:875 -msgid "Clock" +msgid "Coffee cup" msgstr "" #: emoticontheme.cpp:876 -msgid "Camera" +msgid "Birthday cake" msgstr "" #: emoticontheme.cpp:877 -msgid "Filmstrip" +msgid "Plate" msgstr "" #: emoticontheme.cpp:878 -msgid "Note" +msgid "Bowl" msgstr "" #: emoticontheme.cpp:879 -msgid "Handcuffs" +msgid "Star" msgstr "" #: emoticontheme.cpp:880 -msgid "Money" +msgid "Rainbow" msgstr "" #: emoticontheme.cpp:881 -msgid "Light bulb" +msgid "Stormy cloud" msgstr "" #: emoticontheme.cpp:882 -msgid "Cigarrette" +msgid "Lightning" msgstr "" #: emoticontheme.cpp:883 -msgid "Soccer ball" +msgid "Umbrella" msgstr "" #: emoticontheme.cpp:884 -msgid "Gift with a bow" +msgid "Island with a palm tree" msgstr "" #: emoticontheme.cpp:885 -msgid "X-Box" +msgid "Telephone receiver" msgstr "" #: emoticontheme.cpp:886 -msgid "Computer" +msgid "Mobile Phone" msgstr "" #: emoticontheme.cpp:887 +msgid "Email" +msgstr "" + +#: emoticontheme.cpp:888 +msgid "Clock" +msgstr "" + +#: emoticontheme.cpp:889 +msgid "Camera" +msgstr "" + +#: emoticontheme.cpp:890 +msgid "Filmstrip" +msgstr "" + +#: emoticontheme.cpp:891 +msgid "Note" +msgstr "" + +#: emoticontheme.cpp:892 +msgid "Handcuffs" +msgstr "" + +#: emoticontheme.cpp:893 +msgid "Money" +msgstr "" + +#: emoticontheme.cpp:894 +msgid "Light bulb" +msgstr "" + +#: emoticontheme.cpp:895 +msgid "Cigarette" +msgstr "" + +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" + +#: emoticontheme.cpp:897 +msgid "Gift with a bow" +msgstr "" + +#: emoticontheme.cpp:898 +msgid "X-Box" +msgstr "" + +#: emoticontheme.cpp:899 +msgid "Computer" +msgstr "" + +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "" -#: initialview.cpp:377 -msgid "Connect" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" + +#: initialview.cpp:581 +msgctxt "Button label" +msgid "&Connect" msgstr "" -#: initialview.cpp:382 -msgid "Disconnect" +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:657 +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." msgstr "" -#: kmess.cpp:223 +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "" + +#: kmess.cpp:250 msgid "New Group" msgstr "" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" msgstr "" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +msgid "Remove Contact" msgstr "" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +msgid "Remove and Block" msgstr "" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" -#: kmess.cpp:631 +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" msgstr "" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "" -#: kmess.cpp:671 -msgid "Rename group" +#: kmess.cpp:677 +msgid "Rename Group" msgstr "" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +msgid "Connection could be down..." +msgstr "" + +#: kmess.cpp:1123 +msgctxt "Status bar message" msgid "Disconnected" msgstr "" -#: kmess.cpp:1408 +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" -#: kmess.cpp:1412 -msgid "Error with notifications" +#: kmess.cpp:1481 +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "" -#: kmess.cpp:1589 -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "" - -#: kmessinterface.cpp:156 -msgid "Search for Contact" -msgstr "" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "" - -#: kmessinterface.cpp:159 -msgid "Search in Contact List" -msgstr "" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +msgid "Show &History Box" +msgstr "" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" msgstr "" -#: kmessinterface.cpp:321 -msgid "Display Pictures Size" +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" msgstr "" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -msgid "Small" -msgstr "" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" msgstr "" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +msgid "Show &Transfer Window..." +msgstr "" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "" + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "" + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "" + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "" + +#: kmessinterface.cpp:187 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "" + +#: kmessinterface.cpp:189 +msgid "Configure Account..." +msgstr "" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" +#: kmessinterface.cpp:299 +msgid "Show &Network Window..." msgstr "" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" msgstr "" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" msgstr "" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +msgid "&Remove From Group" msgstr "" -#: kmessview.cpp:574 -msgid "&Listening Music" +#: kmessview.cpp:605 +msgid "Song &Name" msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "" -#: kmessview.cpp:1053 -msgctxt "Contact email in list tooltip" -msgid "Email: %1" +#: kmessview.cpp:1124 +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." msgstr "" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +msgctxt "Contact email label in list tooltip" +msgid "Email address" msgstr "" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +#: kmessview.cpp:1140 +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" msgstr "" -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1085 +#: kmessview.cpp:1156 +msgid "No" +msgstr "" + +#: kmessview.cpp:1159 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "" + +#: kmessview.cpp:1179 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "" + +#: kmessview.cpp:1194 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "" -#: kmessview.cpp:1090 -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "" +msgstr[1] "" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "" +msgstr[1] "" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 msgid "Project support" msgstr "" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" msgstr "" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "" -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" msgstr "" -#: main.cpp:81 +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 msgid "Catalan translation" msgstr "" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 msgid "Danish translation" msgstr "" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 msgid "More Danish translation" msgstr "" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "" -#: main.cpp:102 -msgid "Estonian translation" +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +msgid "More Greek translation" msgstr "" #: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 +msgid "Estonian translation" +msgstr "" + +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 msgid "Finnish translation" msgstr "" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "" -#: main.cpp:107 -msgid "French translation" +#: main.cpp:106 +msgid "Jussi Timperi" msgstr "" #: main.cpp:108 -msgid "More French translation, MSN6 emoticon definitions" +msgid "Choplair" +msgstr "" + +#: main.cpp:108 +msgid "French translation" msgstr "" #: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" msgstr "" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "" -#: main.cpp:112 main.cpp:113 -msgid "More Italian translation" +#: main.cpp:114 +msgid "Pauli Henrik" msgstr "" #: main.cpp:114 -msgid "Korean translation" +msgid "More Hungarian translation" msgstr "" -#: main.cpp:115 -msgid "Norsk Bokmål translation" +#: main.cpp:115 main.cpp:116 +msgid "More Italian translation" +msgstr "" + +#: main.cpp:116 +msgid "Vincenzo Reale" msgstr "" #: main.cpp:117 -msgid "Slovenian translation" +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 +msgid "Korean translation" msgstr "" #: main.cpp:118 -msgid "Spanish translation" +msgid "Øyvind Sæther" msgstr "" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 -msgid "More Spanish translation" +#: main.cpp:118 +msgid "Norsk Bokmål translation" +msgstr "" + +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +msgid "Serbian translation" +msgstr "" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +msgid "Slovak translation" msgstr "" #: main.cpp:123 -msgid "Swedish translation" +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 +msgid "Slovenian translation" +msgstr "" + +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 +msgid "Spanish translation" msgstr "" #: main.cpp:125 -msgid "Thai translation" +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 +msgid "More Spanish translation" msgstr "" #: main.cpp:126 -msgid "Turkish translation" +msgid "Alejandro Araiza Alvarado" msgstr "" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" +#: main.cpp:127 +msgid "Jaume Corbí" msgstr "" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" msgstr "" #: main.cpp:133 -msgid "File transfer thumbnails" +msgid "Mattias Newzella" msgstr "" -#: main.cpp:134 -msgid "P4-Context field support" +#: main.cpp:133 +msgid "More Swedish translation" msgstr "" #: main.cpp:135 -msgid "Xinerama fixes" +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:135 +msgid "Thai translation" msgstr "" #: main.cpp:136 -msgid "Original file receive code" +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" msgstr "" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" msgstr "" #: main.cpp:138 -msgid "KWallet support" +msgid "Uğur Çetin" msgstr "" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 -msgid "Various internationalization fixes" +msgid "Guido Solinas" +msgstr "" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" #: main.cpp:143 -msgid "Various internationalization fixes." +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +msgid "File transfer thumbnails" +msgstr "" + +#: main.cpp:144 +msgid "P4-Context field support" msgstr "" #: main.cpp:145 -msgid "GnomeMeeting developer" +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" msgstr "" #: main.cpp:146 -msgid "Guy with a bag over his head" +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" msgstr "" #: main.cpp:149 -msgid "Inspiration and assorted code" +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" msgstr "" #: main.cpp:150 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" msgstr "" #: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 +msgid "Various internationalization fixes." +msgstr "" + +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 +msgid "GnomeMeeting developer" +msgstr "" + +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 +msgid "Guy with a bag over his head" +msgstr "" + +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 +msgid "Inspiration and assorted code" +msgstr "" + +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 +msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgstr "" + +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" msgstr "" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -#: main.cpp:159 +#: main.cpp:171 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "" -#: main.cpp:160 +#: main.cpp:172 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "" @@ -2834,60 +4132,98 @@ msgid "You have rejected the invitation." msgstr "" #: network/applications/application.cpp:540 -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "" #: network/applications/application.cpp:581 -msgid "Click to cancel." +msgid "Click to cancel." msgstr "" -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." msgstr "" -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" msgstr "" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 -msgid "Transfer accepted." +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "" + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." msgstr "" #: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +msgid "Transfer accepted." +msgstr "" + +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." msgstr "" -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." msgstr "" -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." msgstr "" -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "" -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "" -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -2898,60 +4234,14 @@ msgstr "" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "" -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" - -#: network/applications/filetransferp2p.cpp:378 -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "" - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "" - -#: network/applications/filetransferp2p.cpp:572 -msgid "You have cancelled the transfer of file "%1"." -msgstr "" - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -msgid "Successfully sent file "%1"." -msgstr "" - -#: network/applications/filetransferp2p.cpp:680 -msgid "Successfully received file "%1"." -msgstr "" - -#: network/applications/filetransferp2p.cpp:813 -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "" - -#: network/applications/filetransferp2p.cpp:818 -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "" - -#: network/applications/filetransferp2p.cpp:855 -msgid "Sending file "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:893 -msgid "The contact has accepted the transfer of file "%1"." -msgstr "" - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "" @@ -2964,28 +4254,28 @@ msgstr "" msgid "Inviting the contact to a meeting." msgstr "" -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "" -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "" -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "" -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "" @@ -2997,96 +4287,96 @@ msgstr "" msgid "Starting KRDC. Connecting to %1." msgstr "" -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." msgstr "" -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "" - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "" -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "" - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "" - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "" -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." msgstr "" -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "" + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "" + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "" @@ -3117,732 +4407,1082 @@ msgstr "" msgid "Inviting the contact to a voice conversation." msgstr "" -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." msgstr "" -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" msgstr "" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" msgstr "" -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "" + +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." msgstr "" -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." msgstr "" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "" -#: network/msnconnection.cpp:589 -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:1317 -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "" - -#: network/msnnotificationconnection.cpp:1670 -msgid "Authenticating..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -msgid "Authentication failed, please verify your account name and password." -msgstr "" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "" - -#: network/msnnotificationconnection.cpp:2167 -msgid "Unknown command received from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" msgstr "" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -msgid "Contact is in the opposite list" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "" -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" msgstr "" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 msgid "Invalid Group" msgstr "" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -msgid "No permissions given for this account" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 msgid "Challenge response failed" msgstr "" -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" msgstr "" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" msgstr "" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" msgstr "" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "" -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" msgstr "" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -#: network/msnnotificationconnection.cpp:2371 -msgid "Your passport account needs to be verified first." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." msgstr "" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "" -#: network/msnnotificationconnection.cpp:2449 -msgid "Unknown error code received from the server: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" msgstr "" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2109 msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "" msgstr[1] "" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" msgstr "" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -msgid "KMess could not process Offline-IM messages.
Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 msgid "Authentication time limit exceeded" msgstr "" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" msgstr "" -#: network/msnnotificationconnection.cpp:3242 -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" -#: network/msnsockethttp.cpp:765 -msgid "SSL Error" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" msgstr "" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" msgstr "" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" msgstr "" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" +#: network/soap/httpsoapconnection.cpp:402 +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" msgstr "" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" +#: network/soap/httpsoapconnection.cpp:521 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" msgstr "" -#: notification/chatnotification.cpp:163 -msgid "In %1's chat: %2" +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" msgstr "" -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" msgstr "" -#: notification/chatnotification.cpp:171 -msgid "%1 has sent you an offline message:
'%2'" +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" msgstr "" -#: notification/chatnotification.cpp:178 +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +msgid "In %1's chat:
%2" +msgstr "" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" msgstr "" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" msgstr "" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" msgstr "" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" msgstr "" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" msgstr "" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 msgid "%1 wants to use the webcam!" msgstr "" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 msgid "%1 is sending you a file!" msgstr "" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 msgid "%1 has sent you an invitation!" msgstr "" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 msgid "%1 has canceled the webcam session!" msgstr "" -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 msgid "%1 has canceled the file transfer!" msgstr "" -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 msgid "%1's activity has been canceled!" msgstr "" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 msgid "%1 has accepted to use the webcam!" msgstr "" -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 msgid "%1 has accepted the file transfer!" msgstr "" -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 msgid "%1 has accepted your invitation!" msgstr "" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 msgid "%1 has ended the webcam session!" msgstr "" -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 msgid "The file transfer with %1 is done!" msgstr "" -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 msgid "%1's activity has ended!" msgstr "" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" msgstr "" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 msgid "The file transfer with %1 has failed!" msgstr "" -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 msgid "%1's activity has ended with an error!" msgstr "" -#: notification/contactstatusnotification.cpp:70 -msgid "%1 is now online" +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" msgstr "" -#: notification/contactstatusnotification.cpp:71 -msgid "%1 has gone away" +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" msgstr "" -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" msgstr "" -#: notification/contactstatusnotification.cpp:73 -msgid "%1 is now busy" +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" msgstr "" -#: notification/contactstatusnotification.cpp:74 -msgid "%1 has become invisible" +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" msgstr "" -#: notification/contactstatusnotification.cpp:75 -msgid "%1 has gone idle" +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" msgstr "" -#: notification/contactstatusnotification.cpp:76 -msgid "%1 has logged out" +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" msgstr "" -#: notification/contactstatusnotification.cpp:77 -msgid "%1 is on the phone" +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" msgstr "" -#: notification/contactstatusnotification.cpp:78 -msgid "%1 is out for lunch" +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" msgstr "" -#: notification/newemailnotification.cpp:78 -msgid "New email:
'%1'
by '%2'" +#: notification/newemailnotification.cpp:90 +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" msgstr "" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "" + +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "" + +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "" + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "" -#: settings/accountpage.cpp:70 -msgid "Browse and crop picture..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." msgstr "" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" msgstr "" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -#: settings/accountsettingsdialog.cpp:56 -msgid "&Delete" -msgstr "" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" msgstr "" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" msgstr "" -#: settings/accountsettingsdialog.cpp:81 -msgid "Alerts and Notifications" -msgstr "" - -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "" -#: settings/emoticonspage.cpp:122 +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "" + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" msgid "Replace Existing Emoticon" msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:233 +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "" + +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "" + +#: settings/globalsettingsdialog.cpp:46 msgid "KMess Settings" msgstr "" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 -msgid "Notification" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" msgstr "" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, possible-c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, possible-c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" msgstr "" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 -msgid "- %1 (%2)" +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" msgstr "" diff --git a/po/ko.po b/po/ko.po index 2c9fcd5..44d95db 100644 --- a/po/ko.po +++ b/po/ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: KMess 1.3\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2003-10-18 16:22+0900\n" "Last-Translator: DongCheon Park \n" "Language-Team: Korean \n" @@ -15,83 +15,185 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 #, fuzzy +msgid "Standard text mode" +msgstr "카툰 이모티콘" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "메시지에 이모티콘 표시" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "카툰 이모티콘" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "카툰 이모티콘" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +#, fuzzy msgid "Ne&w Line" msgstr "새 줄" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 #, fuzzy msgid "S&end" msgstr "보내기" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 #, fuzzy -msgid "Contacts" -msgstr "대화 상대 추가(&A)" +msgctxt "@title:menu" +msgid "&Chat" +msgstr "대화(&C)" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "대화 상대 도구함(&C)" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "대화(&C)" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "글자색 바꾸기(&C)" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "그룹 이름 바꾸기(&N)" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 #, fuzzy msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "추가할 대화 상대의 이메일 주소 입력:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Email address" +msgid "Email address:" msgstr "이메일 주소:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 #, fuzzy -msgid "Initial group" -msgstr "그룹 이름 바꾸기(&N)" +msgid "Enter a shortcut for the emoticon:" +msgstr "새 그룹의 이름 입력:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -99,718 +201,1225 @@ msgstr "" "대화를 요청하는 사람에게\n" "자동으로 보낼 메시지 입력:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 #, fuzzy -msgid "&Automatic away message" +msgid "&Specify an automatic away message:" msgstr "자리 비움 메시지 지정" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "대화 상대 찾기(&E)" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "대화 기록" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +msgid "Filter by &chat" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "&Add this person to these groups of my contact list:" msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "목록에 추가하지 않지만, 내 온라인 상태는 볼 수 있게 합니다." -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "내 상태를 보거나 나와 대화할 수 없도록 차단합니다." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, fuzzy, no-c-format -msgid "Contact Properties for %1" -msgstr "대화 상대의 속성: " - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +#, fuzzy msgid "&Information" +msgstr "이메일 정보 표시" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 #, fuzzy -msgid "Restore" +msgid "&Restore" msgstr "삭제된 대화 상대" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Use alternative name for this person" +msgid "&Groups:" +msgstr "그룹" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" msgstr "이 대화 상대의 대화명 대신에 별칭 사용" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 #, fuzzy -msgid "Show a popup when the contact goes online/offline" +msgid "Show a &popup when the contact goes online/offline" msgstr "이 대화 상대가 로그인 또는 로그아웃할 때 팝업 풍선 표시" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "소리파일:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "그림파일:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +#, fuzzy msgid "&Clear Cache" +msgstr "대화(&C)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -msgid "Notes" +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "이모티콘 표시(&E)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +#, fuzzy +msgid "Remo&ve" +msgstr "삭제된 대화 상대" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "대화 상대 허용(&A)" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "대화 상대 추가(&A)" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "연결 시간 초과" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "대화 상대 추가(&A)" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "(차단됨)" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "형식:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 #, fuzzy msgid "Standard" msgstr "동쪽하늘" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "보내기" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "이메일 주소:" +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "대화(&C)" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "(차단됨)" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "추가할 대화 상대의 이메일 주소 입력:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "암호:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -#, fuzzy -msgid " Account options " -msgstr "계정 설정(&S)" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 #, fuzzy -msgid "Remem&ber this profile" +msgid "Remem&ber account" msgstr "이 프로필 저장" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "암호:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "로그인(&C)" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +#, fuzzy +msgid "New Account" +msgstr "계정 추가(&A)" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "로그인(&C)" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "동작(&A)" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "계정" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr "계정 설정(&S)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +msgid "Enter the name other contacts should see when you are online." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "대화명:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "이메일 주소:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "암호:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "암호:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 #, fuzzy msgid "Display Picture" msgstr "그림파일:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 +#, fuzzy msgid "C&hange..." -msgstr "" +msgstr "초대하기(&I)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, fuzzy msgid "Re&member the settings of this account" -msgstr "" +msgstr "이 프로필 저장" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "시작할 때 이 계정으로 자동 로그인" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "모든 대화를 기록" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "이 프로필 저장" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "입력이 없을 때 \"자리 비움-시간초과\" 상태로 전환" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "대기할 시간" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "분" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 #, fuzzy msgid "Saved accounts:" msgstr "계정" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -#, fuzzy -msgid "Click" -msgstr "(차단됨)" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." +msgid "&Add Account..." msgstr "계정" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "삭제된 대화 상대" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "이메일 알림" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "대화 기록" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "파일 보내기(&F)" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "대화를 저장할 폴더 지정:" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "년도 별" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "모든 대화를 한 폴더에 저장" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "모든 대화를 한 폴더에 저장" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "대화를 저장할 폴더 지정:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "환경 설정" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "대화 상대 찾기(&E)" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "이모티콘 표시(&E)" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "이모티콘 표시(&E)" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "메시지에 이모티콘 표시" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "대화 상대 추가(&A)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Show notifications when your contacts:" -msgstr "대화 상대가 로그아웃하면 알림" +msgid "Show s&econds" +msgstr "이모티콘 표시(&E)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "내 메시지의 글꼴:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 #, fuzzy -msgid "&Go online" -msgstr "오프라인" +msgid "&Force messages from your contacts to use this font:" +msgstr "상대방 메시지의 글꼴 지정:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "대화(&C)" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 #, fuzzy -msgid "S&end you a message" -msgstr "자리 비움 메시지 지정" +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "메시지에 글꼴 효과 사용 (*굵게*, /기울임/, _밑줄_)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -#, fuzzy -msgid "Go o&ffline" -msgstr "오프라인" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "이메일 주소:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "\"다른 편지함\"에 이메일이 도착하면 알림" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -#, fuzzy -msgid "In other folders" -msgstr "다른 편지함 포함" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "표시할 시간" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "초" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "알림" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "오프라인 대화 상대(&A)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -820,2190 +1429,2984 @@ msgid "" "window with the first nudge.

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 -msgid "Inform contacts w&hich song I am listening to" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 #, fuzzy -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "입력이 없을 때 \"자리 비움-시간초과\" 상태로 전환" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "대기할 시간" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "분" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -#, fuzzy -msgid "Log &all chats" -msgstr "모든 대화를 기록" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "대화를 저장할 폴더 지정:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "년도 별" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -#, fuzzy -msgid "Month" -msgstr "월 별" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "날짜 별" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "모든 대화를 한 폴더에 저장" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -msgid "&Chat style:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "환경 설정" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "이모티콘 표시(&E)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "메시지에 이모티콘 표시" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 msgid "G&roup chats in the same window:" -msgstr "" +msgstr "대화 상대 목록이 꽉 찼습니다" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 #, fuzzy msgid "Always" msgstr "자리 비움" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 #, fuzzy msgid "For contacts in the same group" msgstr "대화 상대 목록이 꽉 찼습니다" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 #, fuzzy msgid "Never" msgstr "서버:" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 #, fuzzy -msgid "Your &message font:" -msgstr "내 메시지의 글꼴:" +msgid "Display Options" +msgstr "그림파일:" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "상대방 메시지의 글꼴 지정:" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "메시지에 글꼴 효과 사용 (*굵게*, /기울임/, _밑줄_)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "대화 상대 찾기(&E)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 #, fuzzy msgid "&Emoticon Themes" msgstr "이모티콘 표시(&E)" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 #, fuzzy msgid "Available emoticon styles:" msgstr "이모티콘 표시(&E)" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 #, fuzzy msgid "&Custom Emoticons" msgstr "카툰 이모티콘" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 +#, fuzzy msgid "Custom emoticons for this account:" +msgstr "이 프로필 저장" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "계정" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 #, fuzzy msgid "Re&name" msgstr "대화명" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -#, fuzzy -msgid "Remo&ve" -msgstr "삭제된 대화 상대" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "자리 비움 메시지 지정" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "메일 클라이언트" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 #, fuzzy msgid "File Transfers" msgstr "파일 전송을 완료했습니다." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "대화를 저장할 폴더 지정:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 msgid "and" msgstr "그리고" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "파일 전송을 완료했습니다." -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "대화명" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "대화명" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "컴퓨터 자리를 비운 상태입니다." -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "대화명" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "you@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "대화 상대 삭제(&R)" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:119 +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" + +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "%1님이 대화에 참가했습니다." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "%1님이 대화를 떠났습니다." -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "%1님이 대화를 떠났습니다." -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr "%1님이 메시지를 입력하고 있습니다." -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr "%1 등등." -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr " (이 메시지는 자동응답으로 보내진 것입니다.)" -#: chat/chat.cpp:934 -msgid "You received a wink from %1." -msgstr "" - -#: chat/chat.cpp:971 +#: chat/chat.cpp:830 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" - -#: chat/chat.cpp:1080 -msgid "You have received a wink from %1" -msgstr "" - -#: chat/chat.cpp:1100 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chat.cpp:1119 +#: chat/chat.cpp:941 #, fuzzy -msgid "The message '%1' could not be sent." +msgid "You have sent a wink" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1194 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" + +#: chat/chat.cpp:1220 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" + +#: chat/chat.cpp:1230 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" + +#: chat/chat.cpp:1241 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1님이 대화에 참가했습니다." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1님이 대화에 참가했습니다." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "대화 상대 허용(&A)" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "%1님이 대화에 참가했습니다." + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1님이 대화에 참가했습니다." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1님이 로그인했습니다." + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "메시지 \"%1\"의 전달을 실패했습니다." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 #, fuzzy msgid "%1 says:" msgstr "님의 말: " -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "GnomeMeeting을 시작합니다. %1에 연결하는 중..." + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "초대하기(&I)" +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "로그인" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 #, fuzzy msgid "Add this &Emoticon..." msgstr "이모티콘 표시(&E)" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "이모티콘 표시(&E)" + +#: chat/chatview.cpp:833 #, fuzzy msgid "Send &Email" msgstr "편지 보내기(&S)" -#: chat/chatview.cpp:1286 +#: chat/chatview.cpp:837 #, fuzzy -msgid "Copy E&mail" -msgstr "이메일" +msgid "Add &Contact" +msgstr "대화 상대 추가(&A)" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "이메일 주소:" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "Save chat to &File" -msgstr "파일 보내기(&F)" - -#: chat/chatwindow.cpp:489 -msgid "&Chat" +msgid "C&lear Chat" msgstr "대화(&C)" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "파일 보내기(&F)" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "화상회의 시작(&M)" - -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:108 #, fuzzy -msgid "Send a &Nudge!" -msgstr "파일 보내기(&F)" +msgid "Contacts" +msgstr "대화 상대 추가(&A)" -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "이모티콘 표시(&E)" - -#: chat/chatwindow.cpp:498 -msgid "Close &All Tabs" -msgstr "" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "환경 설정" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "글꼴 바꾸기(&F)" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "글자색 바꾸기(&C)" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "로그인(&C)" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "글자색 바꾸기(&C)" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "이모티콘 표시(&E)" -#: chat/chatwindow.cpp:658 +#: chat/chatwindow.cpp:121 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "이모티콘 표시(&E)" -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "환경 설정" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "이모티콘 표시(&E)" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "대화 상대 도구함(&C)" - -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "대화 상대 도구함(&C)" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "대화 상대 도구함" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:328 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:855 -msgid "Close all tabs" +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:856 -msgid "Close current tab" +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" msgstr "" -#: chat/chatwindow.cpp:1467 +#: chat/chatwindow.cpp:409 #, fuzzy -msgid "Show Side&bar" -msgstr "대화 상대 도구함(&C)" +msgid "&Invite..." +msgstr "초대하기(&I)" -#: chat/chatwindow.cpp:1468 +#: chat/chatwindow.cpp:410 #, fuzzy -msgid "Show the contact sidebar" -msgstr "대화 상대 도구함" +msgid "Send a &File..." +msgstr "파일 보내기(&F)" -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1님이 메시지를 입력하고 있습니다." - -#: chat/chatwindow.cpp:1575 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1님이 메시지를 입력하고 있습니다." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" msgstr "" -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "화상회의 시작(&M)" + +#: chat/chatwindow.cpp:413 +#, fuzzy +msgid "Send a &Nudge!" +msgstr "파일 보내기(&F)" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "" + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "글꼴 바꾸기(&F)" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "글자색 바꾸기(&C)" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "이모티콘 표시(&E)" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "메시지에 이모티콘 표시" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 +#, fuzzy +msgid "Meeting" +msgstr "환경 설정" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "파일 보내기(&F)" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "대화 상대 찾기(&E)" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "대화 상대 추가(&A)" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "대화 상대 찾기(&E)" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "이모티콘 표시(&E)" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "대화 상대 찾기(&E)" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "이모티콘 표시(&E)" + +#: chat/chatwindow.cpp:491 +#, fuzzy +msgid "&Font" +msgstr "로그인(&C)" + +#: chat/chatwindow.cpp:492 +#, fuzzy +msgid "Font &Color" +msgstr "글자색 바꾸기(&C)" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "대화(&C)" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "대화" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "대화" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "화상회의 시작(&M)" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" msgstr "편지 보내기(&S)" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 #, fuzzy msgid "&View Profile" msgstr "프로필 보기(&S)" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "대화 상대 추가(&A)" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 #, fuzzy msgid "A&llow Contact" msgstr "대화 상대 허용(&A)" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 #, fuzzy msgid "&Delete Contact" msgstr "대화 상대 삭제(&R)" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "차단(&B)" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "차단 해제(&U)" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 #, fuzzy msgid "&Friendly Name" msgstr "대화명:" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 #, fuzzy msgid "&Email Address" msgstr "이메일 주소:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" msgstr "" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "(차단됨)" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "대화 상대 추가" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "이모티콘 삽입" +msgid "Add New" +msgstr "계정" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 #, fuzzy msgid "Remove" msgstr "삭제된 대화 상대" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 #, fuzzy msgid "Web Messenger" msgstr "웹 디자인" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "웹 디자인" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 #, fuzzy msgid "Windows Live Messenger %1" msgstr "웹 디자인" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "웹 디자인" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "온라인" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "오프라인" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "허용된 대화 상대" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "삭제된 대화 상대" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1님이 메시지를 입력하고 있습니다." - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "자리 비움" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "곧 돌아오겠음" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "다른 용무 중" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "오프라인으로 표시" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "자리 비움" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "자리 비움 -자동응답" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "곧 돌아오겠음" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "통화 중" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "식사 중" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "오프라인으로 표시" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "오프라인" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "내 상태(&M)" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "로그아웃(&D)" + +#: dialogs/addcontactdialog.cpp:49 #, fuzzy msgid "Add a Contact" msgstr "대화 상대 추가" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "그룹 삭제(&M)" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 #, fuzzy msgid "Add New Emoticon" msgstr "이모티콘 표시(&E)" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "이모티콘 표시(&E)" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "자리 비움 메시지 지정" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "실패. 파일을 열 수 없습니다" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "님이 당신을 대화 상대 목록에 추가하였습니다. 어떻게 할까요?:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +#, fuzzy +msgid "Contact Properties for %1" +msgstr "대화 상대의 속성: " + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "로그인되어 있음" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "메시지에 이모티콘 표시" -#: dialogs/contactpropertiesdialog.cpp:381 -msgid "Last seen: %1" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:419 #, fuzzy +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "내 메시지의 글꼴:" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "내 메시지의 글꼴:" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "이메일" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "이메일 주소:" -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "메일 클라이언트" -#: dialogs/networkwindow.cpp:79 -msgid "S&ave tab" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "이 계정을 정말로 삭제하시겠습니까?" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "대화 상대 추가(&A)" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "대화 상대 추가(&A)" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "대화 상대의 속성: " + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "연결 시간 초과" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" msgstr "" +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "대화 상대 찾기(&E)" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "" + +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "대화(&C)" + #: dialogs/networkwindow.cpp:80 -msgid "C&lear tab" +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" msgstr "" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "로그인되어 있음" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 -msgid "Cl&ean Up" -msgstr "" +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "(차단됨)" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "대화 상대 삭제(&R)" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "그림파일:" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "그림파일:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "이 계정을 정말로 삭제하시겠습니까?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 #, fuzzy msgid "Smile" msgstr "이메일" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 #, fuzzy msgid "Sad" msgstr "그리고" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 #, fuzzy msgid "Disappointed" msgstr "로그인되어 있지 않음" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 #, fuzzy msgid "Party" msgstr "프록시" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 #, fuzzy msgid "Secret telling" msgstr "환경 설정" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 #, fuzzy msgid "Be right back" msgstr "곧 돌아오겠음" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 #, fuzzy msgid "Sun" msgstr "소리파일:" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 #, fuzzy msgid "Clapping" msgstr "대화" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 #, fuzzy msgid "Snail" msgstr "편지 보내기(&S)" -#: emoticontheme.cpp:856 -msgid "Black sheep" +#: emoticontheme.cpp:869 +msgid "Sheep" msgstr "" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 #, fuzzy msgid "Star" msgstr "동쪽하늘" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "이메일" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 #, fuzzy msgid "Clock" msgstr "(차단됨)" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 #, fuzzy msgid "Camera" msgstr "대화명" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 #, fuzzy msgid "Money" msgstr "월 별" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" msgstr "" -#: emoticontheme.cpp:883 -msgid "Soccer ball" +#: emoticontheme.cpp:896 +msgid "Football ball" msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 #, fuzzy msgid "KMess Icon" msgstr "KMess" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "서버로부터 연결이 끊어졌습니다." + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "서버로부터 연결이 끊어졌습니다." -#: initialview.cpp:377 -msgid "Connect" -msgstr "로그인" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "로그아웃(&D)" +msgctxt "Button label" +msgid "&Connect" +msgstr "로그인(&C)" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: kmess.cpp:223 +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "이메일 주소:" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "이메일 정보 표시" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "그룹 추가(&G)" -#: kmess.cpp:226 +#: kmess.cpp:253 #, fuzzy -msgid "Add a group" +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "그룹 추가(&A)" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "새 그룹의 이름 입력:" -#: kmess.cpp:569 +#: kmess.cpp:577 #, fuzzy msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "이 그룹을 정말로 삭제하시겠습니까?" -#: kmess.cpp:571 +#: kmess.cpp:579 #, fuzzy -msgid "Remove contact" +msgid "Remove Contact" msgstr "대화 상대 삭제(&R)" -#: kmess.cpp:573 +#: kmess.cpp:581 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "삭제된 대화 상대" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "이 그룹을 정말로 삭제하시겠습니까?" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "삭제된 대화 상대" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "이 그룹은 기본 그룹이므로 수정할 수 없습니다." -#: kmess.cpp:671 +#: kmess.cpp:677 #, fuzzy -msgid "Rename group" +msgid "Rename Group" msgstr "그룹 이름 바꾸기(&N)" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "새 그룹의 이름 입력:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "인증을 실패했습니다" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "연결상태 좋음" + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "로그인되어 있지 않음" -#: kmess.cpp:1408 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" msgstr "" -#: kmess.cpp:1412 +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" + +#: kmess.cpp:1481 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "이메일 알림" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "동작(&A)" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "대화 상대 추가(&C)" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "그룹 추가(&G)" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "대화 상대 찾기(&E)" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "관심분야로 검색(&I)" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "대화 상대 찾기(&E)" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "계정 추가(&A)" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "계정 설정(&S)" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "로그인(&N)" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "로그아웃(&D)" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "내 프로필 보기(&P)" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "내 상태(&M)" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "자리 비움 -자동응답" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "허용된 대화 상대(&A)" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "오프라인 대화 상대(&A)" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "삭제된 대화 상대(&R)" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +msgid "Show &History Box" +msgstr "" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "대화 상대 도구함(&C)" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "이모티콘 표시(&E)" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "그림파일:" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "대화 상대 정렬(&S)" + +#: kmessinterface.cpp:177 +msgid "Show &Transfer Window..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "대화 상대 추가(&C)" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "그룹 추가(&G)" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "대화 상대 찾기(&E)" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "대화 상대 찾기(&E)" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "관심분야로 검색(&I)" + +#: kmessinterface.cpp:187 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "계정 추가(&A)" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "계정 추가(&A)" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "이메일" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "대화 상대 정렬(&S)" - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "그룹" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "온라인/오프라인" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" +#: kmessinterface.cpp:299 +msgid "Show &Network Window..." msgstr "" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 #, fuzzy msgid "[%1] %2 goes online" msgstr "%1님이 로그아웃했습니다." -#: kmessview.cpp:363 +#: kmessview.cpp:357 #, fuzzy msgid "[%1] %2 goes offline" msgstr "%1님이 로그아웃했습니다." -#: kmessview.cpp:559 +#: kmessview.cpp:590 #, fuzzy msgid "Cha&t" msgstr "대화" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "속성(&P)" -#: kmessview.cpp:569 +#: kmessview.cpp:600 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "그룹 삭제(&M)" -#: kmessview.cpp:574 +#: kmessview.cpp:605 #, fuzzy -msgid "&Listening Music" -msgstr "보내는 파일 %1" +msgid "Song &Name" +msgstr "대화명" -#: kmessview.cpp:601 +#: kmessview.cpp:632 #, fuzzy msgid "&Copy to Group" msgstr "그룹으로 이동(&M)" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "그룹으로 이동(&M)" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "그룹을 아래로 이동(&D)" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "그룹을 위로 이동(&U)" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "그룹 삭제(&M)" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "그룹 이름 바꾸기(&N)" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "이메일" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "이메일 주소:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "메일 클라이언트" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +#: kmessview.cpp:1156 +msgid "No" msgstr "" -#: kmessview.cpp:1076 +#: kmessview.cpp:1159 #, fuzzy -msgctxt "Last time a message was received" -msgid "Last message: %1" +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "(차단됨)" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "내 메시지의 글꼴:" -#: kmessview.cpp:1085 +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "내 메시지의 글꼴:" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "대화 상대 추가(&A)" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "대화 상대 추가(&A)" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "대화 상대 추가(&A)" +msgstr[1] "대화 상대 추가(&A)" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "대화 상대 추가(&A)" +msgstr[1] "대화 상대 추가(&A)" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 msgid "Project support" msgstr "" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "그놈미팅 개발자" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "독일어 번역, 테스트, 문서화, 웹마스터, 프로젝트 관리 및 그 외" -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "웹 디자인" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "기본 이모티콘과 노랑/파랑/보라 이모티콘 세트 및 이탈리아어 번역" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "카툰 이모티콘" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "기본 효과음" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "아랍어 번역, 파일 저장의 국제화 문제 고침" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 #, fuzzy msgid "More Arabic translation" msgstr "터키어 추가 번역" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "브라질어 포르투갈어 번역" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "브라질어 포르투갈어 번역" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 #, fuzzy msgid "Catalan translation" msgstr "카탈로니아어 번역" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "중국어 간체 번역, 파일 전송 버그 고침" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 #, fuzzy msgid "More Simplified Chinese translation" msgstr "중국어 간체 번역, 파일 전송 버그 고침" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 #, fuzzy msgid "Traditional Chinese translation" msgstr "카탈로니아어 번역" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "카탈로니아어 번역" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 #, fuzzy msgid "Danish translation" msgstr "덴마크어 번역" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "More Danish translation" msgstr "덴마크어 번역" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "네덜란드어 번역" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 #, fuzzy msgid "More Dutch translation" msgstr "네덜란드어 번역" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "터키어 추가 번역" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "프랑스어 번역" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 #, fuzzy msgid "Estonian translation" msgstr "에스토니아어 번역" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 #, fuzzy msgid "Finnish translation" msgstr "덴마크어 번역" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 #, fuzzy msgid "More Finnish translation" msgstr "덴마크어 번역" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "프랑스어 번역" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 msgid "More French translation, MSN6 emoticon definitions" msgstr "프랑스어 추가 번역, MSN6 이모티콘 정의" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 #, fuzzy msgid "More French translation" msgstr "프랑스어 번역" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 #, fuzzy msgid "Hungarian translation" msgstr "에스토니아어 번역" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "에스토니아어 번역" + +#: main.cpp:115 main.cpp:116 #, fuzzy msgid "More Italian translation" msgstr "한국어 번역" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "한국어 번역" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 #, fuzzy msgid "Norsk Bokmål translation" msgstr "북 노르웨이어 번역" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "한국어 번역" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "한국어 번역" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 #, fuzzy msgid "Slovenian translation" msgstr "한국어 번역" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "스페인어 번역" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 #, fuzzy msgid "More Spanish translation" msgstr "스페인어 추가 번역" -#: main.cpp:123 +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 #, fuzzy msgid "Swedish translation" msgstr "스페인어 번역" -#: main.cpp:125 -#, fuzzy -msgid "Thai translation" -msgstr "타이어 번역" - -#: main.cpp:126 -msgid "Turkish translation" -msgstr "터키어 번역" - -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "터키어 추가 번역" - -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" - -#: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "파일 전송을 완료했습니다." +msgid "More Swedish translation" +msgstr "스페인어 번역" -#: main.cpp:134 -msgid "P4-Context field support" +#: main.cpp:135 +msgid "Rachan Hongpairote" msgstr "" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Xinerama 고침" +#, fuzzy +msgid "Thai translation" +msgstr "타이어 번역" #: main.cpp:136 -msgid "Original file receive code" -msgstr "원본 파일 전송 코드" +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "터키어 번역" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" msgstr "" +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "터키어 추가 번역" + #: main.cpp:138 -msgid "KWallet support" +msgid "Uğur Çetin" msgstr "" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "온라인" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "파일 전송을 완료했습니다." + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Xinerama 고침" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "원본 파일 전송 코드" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "여러가지 국제화 문제 고침" -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "여러가지 국제화 문제 고침" -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "그놈미팅 개발자" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "많은 아이디어 제공" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "착상 및 코드의 구성" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 #, fuzzy msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "팝업 풍선 코드" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "자리 비움 타이머 코드" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "Your name here?" msgstr "대화명" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "대화명" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "이메일 주소:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "이 이메일 주소로 자동 로그인" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "허용된 대화 상대" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "삭제된 대화 상대" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 #, fuzzy msgid "The contact cancelled the session." msgstr "대화 상대가 초대를 취소했습니다." @@ -3024,68 +4427,112 @@ msgstr "초대를 거절하였습니다." #: network/applications/application.cpp:540 #, fuzzy -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "수락하거나 취소할 수 있습니다." #: network/applications/application.cpp:581 #, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "클릭하여 취소할 수 있습니다." -#: network/applications/filetransfer.cpp:134 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "이 파일을 수락하시겠습니까?: %1 (%2 bytes)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "실패. 파일을 열 수 없습니다" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "실패. 파일을 열 수 없습니다" + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "전송을 수락했습니다." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 #, fuzzy msgid "Connecting to %1, port %2" msgstr "연결 시간 초과" -#: network/applications/filetransfer.cpp:339 +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 #, fuzzy -msgid "The transfer was cancelled" -msgstr "전송을 수락했습니다." +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "초대를 취소하였습니다." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "초대를 취소하였습니다." + +#: network/applications/filetransfer.cpp:490 #, fuzzy msgid "Connection established" msgstr "연결 시간 초과" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy +msgid "Successfully sent file "%1"." msgstr "성공적으로 전송된 파일: %1" -#: network/applications/filetransfer.cpp:620 +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 #, fuzzy -msgid "The transfer of %1 failed. The file does not exist." +msgid "Successfully received file "%1"." +msgstr "성공적으로 전송된 파일: %1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "실패. 파일이 존재하지 않습니다" -#: network/applications/filetransfer.cpp:624 +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 #, fuzzy -msgid "The transfer of %1 failed. The file could not be read." +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "실패. 연결할 수 없습니다" -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy +msgid "Sending file "%1" (%2)." msgstr "보내는 파일 %1" -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "대화 상대가 초대를 취소했습니다." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3097,69 +4544,14 @@ msgstr "" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "실패. 파일을 열 수 없습니다" - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "대화 상대가 초대를 취소했습니다." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "초대를 취소하였습니다." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "성공적으로 전송된 파일: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "성공적으로 전송된 파일: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "실패. 파일이 존재하지 않습니다" - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "실패. 연결할 수 없습니다" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "보내는 파일 %1" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "대화 상대가 초대를 취소했습니다." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "화상회의에 초대를 받았습니다. (GnomeMeeting 사용)" @@ -3173,31 +4565,31 @@ msgstr "GnomeMeeting을 시작합니다. %1에 연결하는 중..." msgid "Inviting the contact to a meeting." msgstr "대화 상대를 화상회의에 초대합니다." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 #, fuzzy msgid "The invitation was aborted. An internal error occured." msgstr "대화 상대가 초대를 거절했습니다." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 #, fuzzy msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "실패. 소켓을 생성할 수 없습니다" -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 #, fuzzy msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 #, fuzzy msgid "The invitation was aborted." msgstr "대화 상대가 초대를 취소했습니다." @@ -3211,107 +4603,107 @@ msgstr "이 대화 상대의 데스크탑을 공유하도록 초대받았습니 msgid "Starting KRDC. Connecting to %1." msgstr "KRDC를 시작합니다. %1에 연결하는 중... " -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -#, fuzzy -msgid "The contact rejected the invitation. An internal error occured." -msgstr "대화 상대가 초대를 거절했습니다." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" -#: network/applications/p2papplicationbase.cpp:609 -#, fuzzy -msgid "The transfer failed." -msgstr "%1 파일의 전송 " - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "" -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -#, fuzzy -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "실패. 파일이 존재하지 않습니다" - -#: network/applications/p2papplicationbase.cpp:996 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "실패. 소켓을 생성할 수 없습니다" - -#: network/applications/p2papplicationbase.cpp:1015 -#, fuzzy -msgid "The transfer failed. An internal error occured." -msgstr "대화 상대가 초대를 거절했습니다." - -#: network/applications/p2papplicationbase.cpp:1176 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "실패. 소켓을 생성할 수 없습니다" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 #, fuzzy msgid "The transfer failed. Data preparation failed." msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "대화 상대가 초대를 취소했습니다." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 #, fuzzy msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "실패. 파일이 존재하지 않습니다" -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "대화 상대가 초대를 거절했습니다." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "실패. 소켓을 생성할 수 없습니다" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "실패. 소켓을 생성할 수 없습니다" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" +#: network/applications/p2papplicationbase.cpp:769 +#, fuzzy +msgid "The transfer failed." +msgstr "%1 파일의 전송 " + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +#, fuzzy +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "실패. 파일이 존재하지 않습니다" + +#: network/applications/p2papplicationbase.cpp:1170 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "실패. 소켓을 생성할 수 없습니다" + +#: network/applications/p2papplicationbase.cpp:1189 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "대화 상대가 초대를 거절했습니다." + +#: network/applications/p2papplicationbase.cpp:1350 +#, fuzzy +msgid "The transfer failed. Couldn't open data source." +msgstr "실패. 소켓을 생성할 수 없습니다" + #: network/applications/voiceconversation.cpp:71 #, fuzzy msgid "You are invited to start a voice conversation." @@ -3349,806 +4741,1445 @@ msgstr "GnomeMeeting을 시작합니다. %1에 연결하는 중..." msgid "Inviting the contact to a voice conversation." msgstr "대화 상대를 화상회의에 초대합니다." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 #, fuzzy msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" "상대방이 %1 응용프로그램으로 당신을 초대합니다. 하지만 이 기능은 아직 구현되" "지 않았습니다." -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "대화 상대가 초대를 취소했습니다." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:119 +#: network/applications/webcamtransferp2p.cpp:138 #, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "%1 파일의 전송 " +msgid "You are invited to view this person's webcam." +msgstr "이 대화 상대의 데스크탑을 공유하도록 초대받았습니다." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "보내는 파일 %1" + +#: network/extra/msnftpconnection.cpp:398 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "실패. 파일을 열 수 없습니다" -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy msgid "Couldn't open a local port." msgstr "실패. 파일을 열 수 없습니다" -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:478 +#: network/extra/msnftpconnection.cpp:469 #, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +msgid "The transfer of %1 failed. A connection could not be made." msgstr "실패. 연결할 수 없습니다" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 #, fuzzy msgid "Receiving file %1" msgstr "받는 파일 " -#: network/msnconnection.cpp:589 -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"다른 MSN 메신저 클라이언트나 다른 곳에서 \n" -"로그인했으므로 접속이 끊어졌습니다." - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "동기화 완료" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "인증 처리중" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -msgid "Authentication failed, please verify your account name and password." -msgstr "" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "연결하는 중..." - -#: network/msnnotificationconnection.cpp:2167 -msgid "Unknown command received from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 +#: network/msnconnection.cpp:404 #, fuzzy -msgid "The account name given is invalid" +msgid "The given account name is invalid" msgstr "사용자명을 잘못 입력하였습니다" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "대화 상대 목록이 꽉 찼습니다" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 #, fuzzy msgid "This contact is already on your list" msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 #, fuzzy msgid "This contact is not on your list" msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -#: network/msnnotificationconnection.cpp:2251 +#: network/msnconnection.cpp:444 #, fuzzy -msgid "Your contact list has too many groups" +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "대화 상대 목록이 꽉 찼습니다" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 #, fuzzy msgid "This group can't be changed" msgstr "이 그룹은 기본 그룹이므로 수정할 수 없습니다." -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "대화 상대 목록이 꽉 찼습니다" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 #, fuzzy msgid "There was an internal error in KMess: %1" msgstr "내부적인 서버 에러가 발생했습니다" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "그룹 이름 바꾸기(&N)" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 #, fuzzy msgid "Transfer to switchboard server failed" msgstr "알림 서버로 보냄" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -msgid "No permissions given for this account" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "%1 파일의 전송 " -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" msgstr "" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "초대를 취소하였습니다." -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 #, fuzzy msgid "Bad friend name" msgstr "대화명:" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "인증을 실패했습니다" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "'오프라인으로 표시' 상태에서는 다른 사람과 대화할 수 없습니다." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" msgstr "" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -#: network/msnnotificationconnection.cpp:2371 -msgid "Your passport account needs to be verified first." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." msgstr "" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "내부적인 서버 에러가 발생했습니다" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "대화 상대 알림 서버가 다운되었습니다" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 #, fuzzy msgid "The server is going down" msgstr "서버가 곧 다운됩니다" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "서버가 곧 다운됩니다" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 #, fuzzy msgid "The server is not available" msgstr "서버가 사용 불가 상태입니다" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "인증을 실패했습니다" -#: network/msnnotificationconnection.cpp:2449 -msgid "Unknown error code received from the server: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +#, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" +msgstr "서버 에러" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "인증 처리중" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "인증을 실패했습니다" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "연결하는 중..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "분" msgstr[1] "분" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" msgstr "" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -msgid "KMess could not process Offline-IM messages.
Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "인증을 실패했습니다" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "내부적인 서버 에러가 발생했습니다" -#: network/msnnotificationconnection.cpp:3242 -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2932 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"다른 MSN 메신저 클라이언트나 다른 곳에서 \n" +"로그인했으므로 접속이 끊어졌습니다." + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "서버로부터 연결이 끊어졌습니다." -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "서버 에러" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:681 +#, fuzzy +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "내부적인 서버 에러가 발생했습니다" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "연결 시간 초과" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 #, fuzzy msgid "1 ping lost" msgstr "개의 핑이 손실됨" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 #, fuzzy msgid "%1 pings lost" msgstr "개의 핑이 손실됨" -#: network/msnsockettcp.cpp:387 +#: network/msnsockettcp.cpp:395 #, fuzzy -msgid "The connection to the server was lost." +msgid "The connection to the server was lost" msgstr "서버로부터 연결이 끊어졌습니다." -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "이 대화 상대는 오프라인이거나 오프라인으로 표시 상태입니다." - -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "메시지 \"%1\"의 전달을 실패했습니다." +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "서버가 사용 불가 상태입니다" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "" - -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "" - -#: notification/chatnotification.cpp:163 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/chatnotification.cpp:171 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "서버가 사용 불가 상태입니다" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" msgstr "%1님이 로그인했습니다." -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:158 +#, fuzzy +msgid "%1 says:
'%2'" +msgstr "%1님이 로그인했습니다." + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1님이 로그인했습니다." + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" msgstr "" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" -msgstr "" +#: notification/chatnotification.cpp:174 +#, fuzzy +msgid "%1:
%2" +msgstr "%1님이 로그인했습니다." -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr "%1님이 로그인했습니다." -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr "%1님이 로그인했습니다." -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr "%1님이 로그인했습니다." -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 msgid "%1 wants to use the webcam!" msgstr "" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr "%1님이 로그인했습니다." -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr "%1님이 로그인했습니다." -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "초대를 취소하였습니다." -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "대화 상대가 초대를 취소했습니다." -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 msgid "%1's activity has been canceled!" msgstr "" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "초대를 취소하였습니다." -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "대화 상대가 초대를 취소했습니다." -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr "%1님이 로그인했습니다." -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "초대를 취소하였습니다." -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "%1 파일의 전송 " -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 msgid "%1's activity has ended!" msgstr "" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" msgstr "" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "%1 파일의 전송 " -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 msgid "%1's activity has ended with an error!" msgstr "" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" +msgid "%1
is now online" msgstr "%1님이 로그인했습니다." -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" +msgid "%1
has gone away" msgstr "%1님이 로그인했습니다." -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" +#: notification/contactstatusnotification.cpp:93 +#, fuzzy +msgid "%1
will be right back" +msgstr "%1님이 로그인했습니다." + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy +msgid "%1
is now busy" +msgstr "%1님이 로그인했습니다." + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy +msgid "%1
has become invisible" +msgstr "%1님이 로그인했습니다." + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy +msgid "%1
has gone idle" +msgstr "%1님이 로그인했습니다." + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy +msgid "%1
has logged out" +msgstr "%1님이 로그인했습니다." + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy +msgid "%1
is on the phone" +msgstr "%1님이 로그인했습니다." + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy +msgid "%1
is out for lunch" +msgstr "%1님이 로그인했습니다." + +#: notification/newemailnotification.cpp:90 +#, fuzzy +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "%1님이 로그인했습니다." + +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "화상회의 시작(&M)" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "시스템 메시지" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "자리 비움 메시지 지정" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" msgstr "" -#: notification/contactstatusnotification.cpp:73 +#: notification/notificationmanager.cpp:130 #, fuzzy -msgid "%1 is now busy" -msgstr "%1님이 로그인했습니다." +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "편지 보내기(&S)" -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1님이 로그인했습니다." - -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1님이 로그인했습니다." - -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1님이 로그인했습니다." - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1님이 로그인했습니다." - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1님이 로그인했습니다." - -#: notification/newemailnotification.cpp:78 -msgid "New email:
'%1'
by '%2'" +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -#: settings/accountpage.cpp:69 +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1님이 메시지를 입력하고 있습니다." + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "" -#: settings/accountpage.cpp:70 -msgid "Browse and crop picture..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." msgstr "" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "프록시 사용" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "대화 상대 삭제(&R)" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "환경 설정" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 #, fuzzy msgid "Account" msgstr "계정" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "계정" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "알림" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "이메일 알림" +msgid "Contact List" +msgstr "대화 상대 추가(&A)" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "대화" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "대화 기록" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "이 계정을 정말로 삭제하시겠습니까?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "이 계정을 정말로 삭제하시겠습니까?" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "동쪽하늘" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "이모티콘 표시(&E)" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "이 계정을 정말로 삭제하시겠습니까?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "이모티콘 표시(&E)" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "환경 설정" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "계정" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "이메일 알림" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "대화를 저장할 폴더 지정:" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 -msgid "- %1 (%2)" +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." msgstr "" +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "대화 상대 추가(&A)" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "메시지 \"%1\"의 전달을 실패했습니다." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "메시지 \"%1\"의 전달을 실패했습니다." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "메시지 \"%1\"의 전달을 실패했습니다." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "메시지 \"%1\"의 전달을 실패했습니다." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "(차단됨)" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "이모티콘 삽입" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "이메일 주소:" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "(차단됨)" + +#, fuzzy +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "내 메시지의 글꼴:" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "대화 상대 추가(&A)" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "오프라인 대화 상대(&A)" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "대화 상대 찾기(&E)" + +#~ msgid "Alerts" +#~ msgstr "알림" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "이메일 알림" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "그룹 삭제(&M)" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "보내는 파일 %1" + +#~ msgid "&Send email" +#~ msgstr "편지 보내기(&S)" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "로그인되어 있음" + +#~ msgid "Connect" +#~ msgstr "로그인" + +#, fuzzy +#~ msgid "Rename group" +#~ msgstr "그룹 이름 바꾸기(&N)" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "계정 설정(&S)" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1님이 로그인했습니다." + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1님이 로그인했습니다." + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1님이 로그인했습니다." + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1님이 로그인했습니다." + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "이메일 알림" + +#, fuzzy +#~ msgid "Show notifications when your contacts:" +#~ msgstr "대화 상대가 로그아웃하면 알림" + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "오프라인" + +#, fuzzy +#~ msgid "S&end you a message" +#~ msgstr "자리 비움 메시지 지정" + +#, fuzzy +#~ msgid "Go o&ffline" +#~ msgstr "오프라인" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "이메일 주소:" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "\"다른 편지함\"에 이메일이 도착하면 알림" + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "다른 편지함 포함" + +#~ msgid "Hide popups after" +#~ msgstr "표시할 시간" + +#~ msgid "seconds" +#~ msgstr "초" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "알림" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "대화 상대 추가(&A)" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "암호:" + +#, fuzzy +#~ msgid "Log &all chats" +#~ msgstr "모든 대화를 기록" + +#, fuzzy +#~ msgid "Month" +#~ msgstr "월 별" + +#~ msgid "Day" +#~ msgstr "날짜 별" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "대화 상대 추가(&A)" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "대화 상대 찾기(&E)" + +#~ msgid "This person is offline or invisible." +#~ msgstr "이 대화 상대는 오프라인이거나 오프라인으로 표시 상태입니다." + +#, fuzzy +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "메시지 \"%1\"의 전달을 실패했습니다." + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "대화 상대 도구함(&C)" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "대화 상대 도구함" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "대화 상대 도구함" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "초대하기(&I)" + +#, fuzzy +#~ msgid "Copy E&mail" +#~ msgstr "이메일" + +#~ msgid "Specify an Away message" +#~ msgstr "자리 비움 메시지 지정" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "이메일" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "이메일" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "이 대화 상대를 내 \"친구\" 목록에 추가합니다." + +#, fuzzy +#~ msgid "Click" +#~ msgstr "(차단됨)" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "웹 디자인" + +#~ msgid "Co&nnect" +#~ msgstr "로그인(&N)" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "계정 설정(&S)" + +#~ msgid "Got synchronization" +#~ msgstr "동기화 완료" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "환경 설정" + +#, fuzzy +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "이 파일을 수락하시겠습니까?: %1 (%2 bytes)" + +#, fuzzy +#~ msgid "The transfer was cancelled" +#~ msgstr "전송을 수락했습니다." + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "성공적으로 전송된 파일: %1" + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "실패. 파일이 존재하지 않습니다" + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "실패. 연결할 수 없습니다" + +#, fuzzy +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "%1 파일의 전송 " + #~ msgid "Picture:" #~ msgstr "그림파일:" @@ -4156,10 +6187,6 @@ msgstr "" #~ msgid "Speed:" #~ msgstr "서버:" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "이메일 정보 표시" - #~ msgid "Logging in..." #~ msgstr "로그인하는 중..." @@ -4186,10 +6213,6 @@ msgstr "" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "개의 새로운 편지가 있습니다." -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "온라인" - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "실패. 파일을 열 수 없습니다" @@ -4217,10 +6240,6 @@ msgstr "" #~ msgid "Your password:" #~ msgstr "암호:" -#, fuzzy -#~ msgid "Display picture:" -#~ msgstr "그림파일:" - #, fuzzy #~ msgid "Show notifications when you recei&ve an email" #~ msgstr "\"다른 편지함\"에 이메일이 도착하면 알림" @@ -4402,9 +6421,6 @@ msgstr "" #~ msgid "I'll be /really/ upset" #~ msgstr "잘린 목이 들어 있으면, /대략/ 정신이 멍 해질거야." -#~ msgid "Connection good" -#~ msgstr "연결상태 좋음" - #, fuzzy #~ msgid "Server too busy" #~ msgstr "서버가 폭주 상태입니다" @@ -4445,13 +6461,6 @@ msgstr "" #~ msgid "time" #~ msgstr "시각" -#~ msgid "System Message" -#~ msgstr "시스템 메시지" - -#, fuzzy -#~ msgid "Show incoming server messages" -#~ msgstr "메시지에 이모티콘 표시" - #, fuzzy #~ msgid "Show outgoing server messages" #~ msgstr "메시지에 이모티콘 표시" @@ -4480,10 +6489,6 @@ msgstr "" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "이모티콘/효과음 받기(&T)" -#, fuzzy -#~ msgid "n&ame" -#~ msgstr "대화명" - #~ msgid "Update preview" #~ msgstr "미리보기 갱신" diff --git a/po/mergetrans b/po/mergetrans index abebe2f..cdeb64e 100755 --- a/po/mergetrans +++ b/po/mergetrans @@ -3,13 +3,13 @@ # List all the languages #langs="`find . -name '*.po' -printf '%P ' `" langs="`find . -name '*.po' | sort | xargs `" -langs="${langs//.po/}" # Merge kmess.pot messages for each language # (same as "cd po; make merge" if you have the Makefiles # generated in the same folder Makefile.in lives) for lang in $langs do + lang=`basename $lang .po` echo $lang mv "$lang.po" "$lang.po.bak" msgmerge -o "$lang.po" "$lang.po.bak" "kmess.pot" && rm "$lang.po.bak" diff --git a/po/nb.po b/po/nb.po index bdfb184..7376775 100644 --- a/po/nb.po +++ b/po/nb.po @@ -3,99 +3,202 @@ # translation of kmess.po to Norsk Bokmål # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# Øyvind Sæther , 2002 -# Oyvind Sather , 2003 # +# Øyvind Sæther , 2002. +# Oyvind Sather , 2003. +# Øyvind Sæther , 2009. msgid "" msgstr "" "Project-Id-Version: kmess\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2003-04-28 20:18+0200\n" -"Last-Translator: Oyvind Sather \n" -"Language-Team: Norsk bokmål \n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-02-26 21:34+0100\n" +"Last-Translator: Øyvind Sæther \n" +"Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.0.1\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 #, fuzzy -msgid "Ne&w Line" -msgstr "Ny Linje" +msgid "Standard text mode" +msgstr "Tegneserie humørikoner" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "" +"Klikk denne knappen for å gjenopprette profilbildet til denne kontakten" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) #: rc.cpp:9 #, fuzzy -msgid "S&end" -msgstr "Send" +msgid "Ink message" +msgstr "Vis tidspunkt for beskjeder" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) #: rc.cpp:15 #, fuzzy -msgid "Contacts" -msgstr "&Legg til Kontakt" +msgid "Standard emoticons" +msgstr "Tegneserie humørikoner" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) #: rc.cpp:18 -msgid "Click here to display this contact's profile." +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." msgstr "" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) #: rc.cpp:21 -msgid "Size pen" +#, fuzzy +msgid "Custom emoticons" +msgstr "Tegneserie humørikoner" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 #, fuzzy +msgid "Click this button to view the available winks." +msgstr "" +"Klikk denne knappen for å gjenopprette profilbildet til denne kontakten" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "N&y Linje" + +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "S&end" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Prat " + +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Hovedverktøylinje" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" +msgstr "Trykk her for å vise en menu for denne kontakten" + +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "&Tøm område" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "Skrift&farge" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "Skriftstørrelse" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "&Slett pensel" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "Basisgrupper" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" -msgstr "Skriv inn epostadressen til den du vil legge til:" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -#, fuzzy -msgid "Email address" -msgstr "E-postadresse:" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" msgstr "" +"Skriv inn epostadressen til den personen som du du vil legge til på " +"kontaktlisten:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Initial group" -msgstr "E&ndre navn på gruppe" +msgid "Email address:" +msgstr "E-postadresse: " -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +#, fuzzy +msgid "Enter a shortcut for the emoticon:" +msgstr "Skriv inn nytt navn på gruppen:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" -msgstr "" +msgstr "Velg en bildefil:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -103,717 +206,1220 @@ msgstr "" "Skriv inn beskjed som automatisk blir\n" "hvis noen prøver å gi deg en beskjed:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 -#, fuzzy -msgid "&Automatic away message" -msgstr "Skriv inn Borte-beskjed" +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "Velg en beskjed som vises når du automatisk settes som borte:" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +msgid "Search through contacts..." +msgstr "Søk igjennom kontakter..." + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Loggføring" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "&Ikke filtrer" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "Filtrer etter &dato" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "fra" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "til" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Filtrer etter &dato" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Hva vil du gjøre? " + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" +msgstr "&Legg denne kontakten til på min kontaktliste" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person; only allow them to see my status" msgstr "" +"&Ikke legg til denne kontakten på min kontaktliste, men la dem se din status" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "Legg denne kontakten til din \"Friends\"-liste" +msgid "&Block this person from contacting me or seeing my status" +msgstr "&Nekt denne personen å kontakte deg eller se din status." -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 -#, fuzzy -msgid "Do not add this person; only allow them to see my online state" -msgstr "Ikke legg til denne kontakten, men la dem se din status" - -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 -#, fuzzy -msgid "&Block this person from contacting me or seeing my online state" -msgstr "Nekt denne personen å kontakte deg eller se din status." - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, fuzzy, no-c-format -msgid "Contact Properties for %1" -msgstr "Kontaktegenskaper for " - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" +msgstr "&Informasjon" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" +"Klikk denne knappen for å gjenopprette profilbildet til denne kontakten" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 -#, fuzzy -msgid "Restore" -msgstr "Fjernet" +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Gjenopprett" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Grupper:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "Bruk ett &alternativt navn på denne personen" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -#, fuzzy -msgid "Use alternative name for this person" -msgstr "Bruk kallenavn for denne personen" +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "Vis ett o&ppsprettsbindu når denne kontakten logger seg av/på" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "Vis en oppsprettsballong når personen koblers til/fra" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Lyd:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "Lyd:" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Bilde:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +#, fuzzy msgid "&Clear Cache" +msgstr "&Prat " + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -msgid "Notes" +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "Vis &Humørikoner" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +#, fuzzy +msgid "Remo&ve" +msgstr "Fjernet" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "&Tillat Kontakt" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "Legg denne kontakten til din \"Friends\"-liste" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "&Legg til Kontakt" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "Tidsavbrudd på forbindelse" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "&Legg til Kontakt" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "Blokkert" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "Send" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "E-postadresse: " +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "&Prat " + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "Blokkert" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Skriv inn epostadressen til den du vil legge til:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "Passord:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -#, fuzzy -msgid " Account options " -msgstr "Brukerkonto I&nnstillinger" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 #, fuzzy -msgid "Remem&ber this profile" +msgid "Remem&ber account" msgstr "Husk denne profilen " -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "Passord:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "Kobl &til" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +#, fuzzy +msgid "New Account" +msgstr "Ny &Brukerkonto" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "Kobl &til" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Handlinger" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Kontoer " + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr "Brukerkonto I&nnstillinger" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +msgid "Enter the name other contacts should see when you are online." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "Ditt vennskapsnavn:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "E-postadresse: " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "Passord:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "Passord:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 #, fuzzy msgid "Display Picture" msgstr "Bilde:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 +#, fuzzy msgid "C&hange..." -msgstr "" +msgstr "&Inviter " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, fuzzy msgid "Re&member the settings of this account" -msgstr "" +msgstr "Husk denne profilen " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "Tilknytt automatisk med denne kontoen ved oppstart" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "Logg all prat" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "Husk denne profilen " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Endre status til \"Borte - Inaktiv\" når inaktiv" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Bli inaktiv etter " + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minutter " + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 #, fuzzy msgid "Saved accounts:" msgstr "Kontoer " -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -#, fuzzy -msgid "Click" -msgstr "Blokkert" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." +msgid "&Add Account..." msgstr "Kontoer " -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "Fjernet" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "E-Post varsling" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "Loggføring" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "Send en &Fil" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Lagre logger i denne mappen:" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "År" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Lagre alle logger i samme mappe" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Lagre alle logger i samme mappe" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "Lagre logger i denne mappen:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "Innstillinger" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Søk etter &Kontakt" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "Vis &Humørikoner" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Vis &Humørikoner" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Vis grafikk i pratebeskjeder" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "&Legg til Kontakt" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Show notifications when your contacts:" -msgstr "Gi beskjed når kontakter logger av" +msgid "Show s&econds" +msgstr "Vis &Humørikoner" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "Din meldingsskrifttype:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 #, fuzzy -msgid "&Go online" -msgstr "Frakoblet" +msgid "&Force messages from your contacts to use this font:" +msgstr "Tving kontakters beskjeder til å bruke skrifttypen" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "&Prat " + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 #, fuzzy -msgid "S&end you a message" -msgstr "Skriv inn Borte-beskjed" +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "Bruk skrifttypeeffekter som *fet* og _understreket_ i beskjeder" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -#, fuzzy -msgid "Go o&ffline" -msgstr "Frakoblet" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "E-postadresse:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "Vis en beskjed når epost mottas i \"andre mapper\"" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -#, fuzzy -msgid "In other folders" -msgstr "i en annen mappe" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Skjul oppspretter etter" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "sekunder" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "Varsler" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Vis &Frakoblede Kontakter" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -823,2190 +1429,2984 @@ msgid "" "window with the first nudge.

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 -msgid "Inform contacts w&hich song I am listening to" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 #, fuzzy -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Endre status til \"Borte - Inaktiv\" når inaktiv" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Bli inaktiv etter " - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minutter " - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -#, fuzzy -msgid "Log &all chats" -msgstr "Logg all prat" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Lagre logger i denne mappen:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "År" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -#, fuzzy -msgid "Month" -msgstr "Måned" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Dag" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Lagre alle logger i samme mappe" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -msgid "&Chat style:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Innstillinger" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Vis &Humørikoner" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Vis tidspunkt for beskjeder" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 msgid "G&roup chats in the same window:" -msgstr "" +msgstr "Din kontaktliste er full." -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 #, fuzzy msgid "Always" msgstr "Borte" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 #, fuzzy msgid "For contacts in the same group" msgstr "Din kontaktliste er full." -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 #, fuzzy msgid "Never" msgstr "Tjener Feil" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 #, fuzzy -msgid "Your &message font:" -msgstr "Din meldingsskrifttype:" +msgid "Display Options" +msgstr "Bilde:" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Tving kontakters beskjeder til å bruke skrifttypen" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "Bruk skrifttypeeffekter som *fet* og _understreket_ i beskjeder" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Søk etter &Kontakt" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 #, fuzzy msgid "&Emoticon Themes" msgstr "Vis &Humørikoner" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 #, fuzzy msgid "Available emoticon styles:" msgstr "Vis &Humørikoner" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 #, fuzzy msgid "&Custom Emoticons" msgstr "Tegneserie humørikoner" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 +#, fuzzy msgid "Custom emoticons for this account:" +msgstr "Husk denne profilen " + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Kontoer " + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 #, fuzzy msgid "Re&name" msgstr "Ditt navn" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -#, fuzzy -msgid "Remo&ve" -msgstr "Fjernet" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "Skriv inn Borte-beskjed" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "Epost program" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 #, fuzzy msgid "File Transfers" msgstr "Filoverføring fullført." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "Lagre logger i denne mappen:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 msgid "and" msgstr "og" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "Filoverføring fullført." -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "Ditt navn" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "Ditt navn" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Jeg er borte fra datamaskinen" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Ditt navn" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "deg@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Fjern K&ontakt" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "" + +#: chat/chat.cpp:119 +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" + +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "er med på praten." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr " forlot praten." -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr " forlot praten." -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr " skriver." -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr " et al." -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr " (This message was sent automatically)" -#: chat/chat.cpp:934 -msgid "You received a wink from %1." -msgstr "" - -#: chat/chat.cpp:971 +#: chat/chat.cpp:830 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" - -#: chat/chat.cpp:1080 -msgid "You have received a wink from %1" -msgstr "" - -#: chat/chat.cpp:1100 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chat.cpp:1119 +#: chat/chat.cpp:941 #, fuzzy -msgid "The message '%1' could not be sent." +msgid "You have sent a wink" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1194 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" + +#: chat/chat.cpp:1220 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" + +#: chat/chat.cpp:1230 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" + +#: chat/chat.cpp:1241 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "er med på praten." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "er med på praten." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "&Tillat Kontakt" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "er med på praten." + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "er med på praten." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "er tilgjengelig" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "ble ikke mottatt." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 #, fuzzy msgid "%1 says:" msgstr " sier: " -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Starter GnomeMetting. Tilknytter " + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Inviter " +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Koble til" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 #, fuzzy msgid "Add this &Emoticon..." msgstr "Vis &Humørikoner" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Vis &Humørikoner" + +#: chat/chatview.cpp:833 #, fuzzy msgid "Send &Email" msgstr "&Send epost" -#: chat/chatview.cpp:1286 +#: chat/chatview.cpp:837 #, fuzzy -msgid "Copy E&mail" -msgstr "EPost" +msgid "Add &Contact" +msgstr "&Legg til Kontakt" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-postadresse:" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "Save chat to &File" -msgstr "Send en &Fil" - -#: chat/chatwindow.cpp:489 -msgid "&Chat" +msgid "C&lear Chat" msgstr "&Prat " -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Send en &Fil" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "Start et &Møte" - -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:108 #, fuzzy -msgid "Send a &Nudge!" -msgstr "Send en &Fil" +msgid "Contacts" +msgstr "&Legg til Kontakt" -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Vis &Humørikoner" - -#: chat/chatwindow.cpp:498 -msgid "Close &All Tabs" -msgstr "" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "Innstillinger" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Endre &Skriftype" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Endre Skrift&Farge" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "Kobl &til" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Endre Skrift&Farge" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "Vis &Humørikoner" -#: chat/chatwindow.cpp:658 +#: chat/chatwindow.cpp:121 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "Vis &Humørikoner" -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "Innstillinger" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "Vis &Humørikoner" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "Vis/skjul &Kontaktpanel" - -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Vis/skjul &Kontaktpanel" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Viser eller skjuler kontaktpanelet" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:328 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:855 -msgid "Close all tabs" +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:856 -msgid "Close current tab" +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" msgstr "" -#: chat/chatwindow.cpp:1467 +#: chat/chatwindow.cpp:409 #, fuzzy -msgid "Show Side&bar" -msgstr "Vis/skjul &Kontaktpanel" +msgid "&Invite..." +msgstr "&Inviter " -#: chat/chatwindow.cpp:1468 +#: chat/chatwindow.cpp:410 #, fuzzy -msgid "Show the contact sidebar" -msgstr "Viser eller skjuler kontaktpanelet" +msgid "Send a &File..." +msgstr "Send en &Fil" -#: chat/chatwindow.cpp:1565 -#, fuzzy -msgid "%1 is typing." -msgstr " skriver." - -#: chat/chatwindow.cpp:1575 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr " skriver." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" msgstr "" -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Start et &Møte" + +#: chat/chatwindow.cpp:413 +#, fuzzy +msgid "Send a &Nudge!" +msgstr "Send en &Fil" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "" + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Endre &Skriftype" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Endre Skrift&Farge" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Vis &Humørikoner" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Vis tidspunkt for beskjeder" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 +#, fuzzy +msgid "Meeting" +msgstr "Innstillinger" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Send en &Fil" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Søk etter &Kontakt" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "&Legg til Kontakt" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Søk etter &Kontakt" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Vis &Humørikoner" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Søk etter &Kontakt" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Vis &Humørikoner" + +#: chat/chatwindow.cpp:491 +#, fuzzy +msgid "&Font" +msgstr "Kobl &til" + +#: chat/chatwindow.cpp:492 +#, fuzzy +msgid "Font &Color" +msgstr "Endre Skrift&Farge" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "&Prat " + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Prat" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "Prat" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr " skriver." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr " skriver." + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr " skriver." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Start et &Møte" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" msgstr "&Send epost" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 #, fuzzy msgid "&View Profile" msgstr "&Vis profil" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Legg til Kontakt" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 #, fuzzy msgid "A&llow Contact" msgstr "&Tillat Kontakt" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 #, fuzzy msgid "&Delete Contact" msgstr "Fjern K&ontakt" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Blokker Kontakt" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "&Fjern blokkering av Kontakt" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 #, fuzzy msgid "&Friendly Name" msgstr "Ditt vennskapsnavn:" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 #, fuzzy msgid "&Email Address" msgstr "E-postadresse:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" msgstr "" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Blokkert" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "Legg denne kontakten til din \"Friends\"-liste" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "Legg til kontakt" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Sett inn humørikon" +msgid "Add New" +msgstr "Kontoer " -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 #, fuzzy msgid "Remove" msgstr "Fjernet" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 #, fuzzy msgid "Web Messenger" msgstr "Web design" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "Web design" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 #, fuzzy msgid "Windows Live Messenger %1" msgstr "Web design" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Web design" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Tilgjengelig" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Frakoblet" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Tillatt" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Fjernet" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr " skriver." - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Borte" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Snart tilbake" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Opptatt" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Usynlig" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Borte" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Borte med auto-svar" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Snart tilbake" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Prater i telefonen" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Ut til lunsj" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Usynlig" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Frakoblet" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Min Status" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Kobl &fra" + +#: dialogs/addcontactdialog.cpp:49 #, fuzzy msgid "Add a Contact" msgstr "Legg til kontakt" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "&Fjern Gruppe" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 #, fuzzy msgid "Add New Emoticon" msgstr "Vis &Humørikoner" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "Vis &Humørikoner" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "Skriv inn Borte-beskjed" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "feilet. Kunne ikke åpne fil" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "har lagt deg til på hans/hennes kontaktliste. Ønsker du å:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +#, fuzzy +msgid "Contact Properties for %1" +msgstr "Kontaktegenskaper for " + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Tilkoblet" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "Vis tidspunkt for beskjeder" -#: dialogs/contactpropertiesdialog.cpp:381 -msgid "Last seen: %1" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:419 #, fuzzy +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Din meldingsskrifttype:" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "Din meldingsskrifttype:" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "EPost" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-postadresse: " -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "Epost program" -#: dialogs/networkwindow.cpp:79 -msgid "S&ave tab" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" msgstr "" +"Klikk denne knappen for å gjenopprette profilbildet til denne kontakten" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "&Legg til Kontakt" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "&Legg til Kontakt" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "Kontaktegenskaper for " + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "Tidsavbrudd på forbindelse" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "Søk etter &Kontakt" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "" + +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "&Prat " #: dialogs/networkwindow.cpp:80 -msgid "C&lear tab" +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" msgstr "" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Tilkoblet" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 -msgid "Cl&ean Up" -msgstr "" +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Blokkert" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "Fjern K&ontakt" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Bilde:" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Bilde:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Er du sikker på at du vil slette denne profilen?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 #, fuzzy msgid "Smile" msgstr "EPost" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 #, fuzzy msgid "Sad" msgstr "og" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 #, fuzzy msgid "Disappointed" msgstr "Frakoblet" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 #, fuzzy msgid "Secret telling" msgstr "Innstillinger" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 #, fuzzy msgid "Be right back" msgstr "Snart tilbake" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 #, fuzzy msgid "Sun" msgstr "Lyd:" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 #, fuzzy msgid "Clapping" msgstr "Prat" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 #, fuzzy msgid "Snail" msgstr "&Send epost" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "" - -#: emoticontheme.cpp:857 -msgid "Goat" -msgstr "" - -#: emoticontheme.cpp:858 -msgid "Vampire bat" -msgstr "" - -#: emoticontheme.cpp:859 -msgid "Pizza" -msgstr "" - -#: emoticontheme.cpp:860 -msgid "Beer mug" -msgstr "" - -#: emoticontheme.cpp:861 -msgid "Martini glass" -msgstr "" - -#: emoticontheme.cpp:862 -msgid "Coffee cup" -msgstr "" - -#: emoticontheme.cpp:863 -msgid "Birthday cake" -msgstr "" - -#: emoticontheme.cpp:864 -msgid "Plate" -msgstr "" - -#: emoticontheme.cpp:865 -msgid "Bowl" -msgstr "" - -#: emoticontheme.cpp:866 -msgid "Star" -msgstr "" - -#: emoticontheme.cpp:867 -msgid "Rainbow" -msgstr "" - -#: emoticontheme.cpp:868 -msgid "Stormy cloud" -msgstr "" - #: emoticontheme.cpp:869 -msgid "Lightning" +msgid "Sheep" msgstr "" #: emoticontheme.cpp:870 -msgid "Umbrella" +msgid "Goat" msgstr "" #: emoticontheme.cpp:871 -msgid "Island with a palm tree" +msgid "Vampire bat" msgstr "" #: emoticontheme.cpp:872 -msgid "Telephone receiver" +msgid "Pizza" msgstr "" #: emoticontheme.cpp:873 -msgid "Mobile Phone" +msgid "Beer mug" msgstr "" #: emoticontheme.cpp:874 +msgid "Martini glass" +msgstr "" + +#: emoticontheme.cpp:875 +msgid "Coffee cup" +msgstr "" + +#: emoticontheme.cpp:876 +msgid "Birthday cake" +msgstr "" + +#: emoticontheme.cpp:877 +msgid "Plate" +msgstr "" + +#: emoticontheme.cpp:878 +msgid "Bowl" +msgstr "" + +#: emoticontheme.cpp:879 +msgid "Star" +msgstr "" + +#: emoticontheme.cpp:880 +msgid "Rainbow" +msgstr "" + +#: emoticontheme.cpp:881 +msgid "Stormy cloud" +msgstr "" + +#: emoticontheme.cpp:882 +msgid "Lightning" +msgstr "" + +#: emoticontheme.cpp:883 +msgid "Umbrella" +msgstr "" + +#: emoticontheme.cpp:884 +msgid "Island with a palm tree" +msgstr "" + +#: emoticontheme.cpp:885 +msgid "Telephone receiver" +msgstr "" + +#: emoticontheme.cpp:886 +msgid "Mobile Phone" +msgstr "" + +#: emoticontheme.cpp:887 msgid "Email" msgstr "EPost" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 #, fuzzy msgid "Clock" msgstr "Blokkert" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 #, fuzzy msgid "Camera" msgstr "Ditt navn" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 #, fuzzy msgid "Money" msgstr "Måned" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" msgstr "" -#: emoticontheme.cpp:883 -msgid "Soccer ball" +#: emoticontheme.cpp:896 +msgid "Football ball" msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 #, fuzzy msgid "KMess Icon" msgstr "KMess" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Kunne ikke koble til tjener." + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "Kunne ikke koble til tjener." -#: initialview.cpp:377 -msgid "Connect" -msgstr "Koble til" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "Kobl &fra" +msgctxt "Button label" +msgid "&Connect" +msgstr "Kobl &til" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: kmess.cpp:223 +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "E-postadresse:" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "Vis epost informasjon i kontaktlisten" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Legg denne kontakten til din \"Friends\"-liste" + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "Ny &Gruppe" -#: kmess.cpp:226 +#: kmess.cpp:253 #, fuzzy -msgid "Add a group" +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "&Legg til Gruppe" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Skriv inn nytt navn på gruppen:" -#: kmess.cpp:569 +#: kmess.cpp:577 #, fuzzy msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "Er du sikker på at du vil fjerne denne gruppen?" -#: kmess.cpp:571 +#: kmess.cpp:579 #, fuzzy -msgid "Remove contact" +msgid "Remove Contact" msgstr "Fjern K&ontakt" -#: kmess.cpp:573 +#: kmess.cpp:581 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "Fjernet" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "Er du sikker på at du vil fjerne denne gruppen?" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "Fjernet" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Dette er en spesiell gruppe som ikke kan endres." -#: kmess.cpp:671 +#: kmess.cpp:677 #, fuzzy -msgid "Rename group" +msgid "Rename Group" msgstr "E&ndre navn på gruppe" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Skriv inn nytt navn på gruppen:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "Autentisering feilet" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Tidsavbrudd på forbindelse" + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Frakoblet" -#: kmess.cpp:1408 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" msgstr "" -#: kmess.cpp:1412 +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" + +#: kmess.cpp:1481 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "E-Post varsling" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Handlinger" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "&Ny Kontakt" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Ny &Gruppe" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "Søk etter &Kontakt" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Søk etter &Interesser" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "Søk etter &Kontakt" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Ny &Brukerkonto" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Brukerkonto I&nnstillinger" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "&Tilkoble" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "Kobl &fra" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "Vis min &Profil" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Min Status" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Borte med auto-svar" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "Vis &Tillate Kontakter" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Vis &Frakoblede Kontakter" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "Vis &Fjernede Kontakter" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +msgid "Show &History Box" +msgstr "" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Vis/skjul &Kontaktpanel" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "Vis &Humørikoner" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "Bilde:" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "&Sorter Kontakter etter" + +#: kmessinterface.cpp:177 +msgid "Show &Transfer Window..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "&Ny Kontakt" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "Ny &Gruppe" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "Søk etter &Kontakt" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "Søk etter &Kontakt" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Søk etter &Interesser" + +#: kmessinterface.cpp:187 +msgid "Show Chat &History..." +msgstr "" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "Ny &Brukerkonto" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Ny &Brukerkonto" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "EPost" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "&Sorter Kontakter etter" - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "Grupper" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Tilkoblet/Frakoblet" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" +#: kmessinterface.cpp:299 +msgid "Show &Network Window..." msgstr "" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 #, fuzzy msgid "[%1] %2 goes online" msgstr "er frakoblet" -#: kmessview.cpp:363 +#: kmessview.cpp:357 #, fuzzy msgid "[%1] %2 goes offline" msgstr "er frakoblet" -#: kmessview.cpp:559 +#: kmessview.cpp:590 #, fuzzy msgid "Cha&t" msgstr "Prat" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Egenskaper" -#: kmessview.cpp:569 +#: kmessview.cpp:600 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "&Fjern Gruppe" -#: kmessview.cpp:574 +#: kmessview.cpp:605 #, fuzzy -msgid "&Listening Music" -msgstr "Sender fil " +msgid "Song &Name" +msgstr "Ditt navn" -#: kmessview.cpp:601 +#: kmessview.cpp:632 #, fuzzy msgid "&Copy to Group" msgstr "&Fytt til gruppe" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "&Fytt til gruppe" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "Flytt gryppe &Ned" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Flytt gryppe &Opp" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "&Fjern Gruppe" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "E&ndre navn på gruppe" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "EPost" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "&Legg denne kontakten til på min kontaktliste" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-postadresse:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Epost program" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +#: kmessview.cpp:1156 +msgid "No" msgstr "" -#: kmessview.cpp:1076 +#: kmessview.cpp:1159 #, fuzzy -msgctxt "Last time a message was received" -msgid "Last message: %1" +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokkert" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "Din meldingsskrifttype:" -#: kmessview.cpp:1085 +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Din meldingsskrifttype:" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "&Legg til Kontakt" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "&Legg til Kontakt" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "&Legg til Kontakt" +msgstr[1] "&Legg til Kontakt" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "&Legg til Kontakt" +msgstr[1] "&Legg til Kontakt" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr " skriver." + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 msgid "Project support" msgstr "" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "GnomeMetting utvikler" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "Tysk oversettelse, testing, dokumentajson og webside" -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "Web design" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "Hoved- og gul/blå/fiolett humørikoner og Italiensk oversettelse" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Tegneserie humørikoner" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Standard lyd-tema" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arabisk oversettelse, Fiks for internasjonalisering av fillagring." -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 #, fuzzy msgid "More Arabic translation" msgstr "Mer Tyrkisk oversettelse" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Brasiliansk Portugisisk oversettelse" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Brasiliansk Portugisisk oversettelse" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 #, fuzzy msgid "Catalan translation" msgstr "Catalan oversettelse" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "Enkel Kinesisk oversettelse, fiks for filoverføringsfeil" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 #, fuzzy msgid "More Simplified Chinese translation" msgstr "Enkel Kinesisk oversettelse, fiks for filoverføringsfeil" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 #, fuzzy msgid "Traditional Chinese translation" msgstr "Catalan oversettelse" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Catalan oversettelse" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 #, fuzzy msgid "Danish translation" msgstr "Dansk oversettelse" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "More Danish translation" msgstr "Dansk oversettelse" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "Nederlandsk oversettelse" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 #, fuzzy msgid "More Dutch translation" msgstr "Nederlandsk oversettelse" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Mer Tyrkisk oversettelse" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Fransk oversettelse" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 #, fuzzy msgid "Estonian translation" msgstr "Oversettelse for Estonia" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 #, fuzzy msgid "Finnish translation" msgstr "Dansk oversettelse" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 #, fuzzy msgid "More Finnish translation" msgstr "Dansk oversettelse" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "Fransk oversettelse" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 #, fuzzy msgid "More French translation, MSN6 emoticon definitions" msgstr "Fransk oversettelse" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 #, fuzzy msgid "More French translation" msgstr "Fransk oversettelse" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 #, fuzzy msgid "Hungarian translation" msgstr "Oversettelse for Estonia" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Oversettelse for Estonia" + +#: main.cpp:115 main.cpp:116 #, fuzzy msgid "More Italian translation" msgstr "Koreansk oversettelse" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "Koreansk oversettelse" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 #, fuzzy msgid "Norsk Bokmål translation" msgstr "Norsk (bokmål) oversettelse" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Koreansk oversettelse" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "Koreansk oversettelse" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 #, fuzzy msgid "Slovenian translation" msgstr "Koreansk oversettelse" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Spansk oversettelse" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 #, fuzzy msgid "More Spanish translation" msgstr "Mer Spansk oversettelse" -#: main.cpp:123 +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 #, fuzzy msgid "Swedish translation" msgstr "Spansk oversettelse" -#: main.cpp:125 -#, fuzzy -msgid "Thai translation" -msgstr "Thailands oversettelse" - -#: main.cpp:126 -msgid "Turkish translation" -msgstr "Tyrkisk oversettelse" - -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "Mer Tyrkisk oversettelse" - -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" - -#: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Filoverføring fullført." +msgid "More Swedish translation" +msgstr "Spansk oversettelse" -#: main.cpp:134 -msgid "P4-Context field support" +#: main.cpp:135 +msgid "Rachan Hongpairote" msgstr "" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Xinerama fikser" +#, fuzzy +msgid "Thai translation" +msgstr "Thailands oversettelse" #: main.cpp:136 -msgid "Original file receive code" -msgstr "Original fil mottatt kode " +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Tyrkisk oversettelse" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" msgstr "" +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "Mer Tyrkisk oversettelse" + #: main.cpp:138 -msgid "KWallet support" +msgid "Uğur Çetin" msgstr "" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "Tilgjengelig" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Filoverføring fullført." + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Xinerama fikser" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "Original fil mottatt kode " + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "Varierende internasjonaliseringsfikser." -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Varierende internasjonaliseringsfikser." -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "GnomeMetting utvikler" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Person med en pose over hodet hans" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspirasjon og diverse kode" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 #, fuzzy msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "Oppspretts Ballong kode" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Inaktiv tid kode" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "Your name here?" msgstr "Ditt navn" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Ditt navn" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "Din E-postadresse:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Tilknytt automatisk med gitt epostadresse" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Tillatt" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Fjernet" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 #, fuzzy msgid "The contact cancelled the session." msgstr "Kontakten har kansellert invitasjonen" @@ -3026,69 +4426,111 @@ msgid "You have rejected the invitation." msgstr "Du har nektet å godta invitasjonen." #: network/applications/application.cpp:540 -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "" #: network/applications/application.cpp:581 -msgid "Click to cancel." +msgid "Click to cancel." msgstr "" -#: network/applications/filetransfer.cpp:134 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Vil du goddta filen: " +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "feilet. Kunne ikke åpne fil" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "feilet. Kunne ikke åpne fil" + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Overføring akseptert." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 #, fuzzy msgid "Connecting to %1, port %2" msgstr "Tidsavbrudd på forbindelse" -#: network/applications/filetransfer.cpp:339 +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 #, fuzzy -msgid "The transfer was cancelled" -msgstr "Overføring akseptert." +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "Du har kansellert invitasjonen." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "Du har kansellert invitasjonen." + +#: network/applications/filetransfer.cpp:490 #, fuzzy msgid "Connection established" msgstr "Tidsavbrudd på forbindelse" -#: network/applications/filetransfer.cpp:456 +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 #, fuzzy -msgid "Successfully transferred file: %1" +msgid "Successfully sent file "%1"." msgstr "Korrekt fullført overføring av filen: " -#: network/applications/filetransfer.cpp:620 +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 #, fuzzy -msgid "The transfer of %1 failed. The file does not exist." +msgid "Successfully received file "%1"." +msgstr "Korrekt fullført overføring av filen: " + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "feilet. Filen finnes ikke" -#: network/applications/filetransfer.cpp:624 +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 #, fuzzy -msgid "The transfer of %1 failed. The file could not be read." +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "feilet. Kunne ikke opprette forbindelse" -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 #, fuzzy -msgid "Sending file %1" +msgid "Sending file "%1" (%2)." msgstr "Sender fil " -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Kontakten har kansellert invitasjonen" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3100,69 +4542,14 @@ msgstr "" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "feilet. Kunne ikke åpne fil" - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Kontakten har kansellert invitasjonen" - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Du har kansellert invitasjonen." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Korrekt fullført overføring av filen: " - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Korrekt fullført overføring av filen: " - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "feilet. Filen finnes ikke" - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "feilet. Kunne ikke opprette forbindelse" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Sender fil " - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Kontakten har kansellert invitasjonen" - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Du er invitert til et møte (bruker GnomeMeeting)." @@ -3176,31 +4563,31 @@ msgstr "Starter GnomeMetting. Tilknytter " msgid "Inviting the contact to a meeting." msgstr "Inviterer kontakten til et møte." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 #, fuzzy msgid "The invitation was aborted. An internal error occured." msgstr "Kontakten har nektet invitasjonen" -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 #, fuzzy msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "feilet. Kunne ikke opprette støpsel" -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 #, fuzzy msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 #, fuzzy msgid "The invitation was aborted." msgstr "Kontakten har kansellert invitasjonen" @@ -3214,107 +4601,107 @@ msgstr "Du er invitert til å dele denne personens skrivebord." msgid "Starting KRDC. Connecting to %1." msgstr "Starter KRDC. Tilknytter " -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -#, fuzzy -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kontakten har nektet invitasjonen" +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" -#: network/applications/p2papplicationbase.cpp:609 -#, fuzzy -msgid "The transfer failed." -msgstr "Oversetteren av " - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "" -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -#, fuzzy -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "feilet. Filen finnes ikke" - -#: network/applications/p2papplicationbase.cpp:996 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "feilet. Kunne ikke opprette støpsel" - -#: network/applications/p2papplicationbase.cpp:1015 -#, fuzzy -msgid "The transfer failed. An internal error occured." -msgstr "Kontakten har nektet invitasjonen" - -#: network/applications/p2papplicationbase.cpp:1176 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "feilet. Kunne ikke opprette støpsel" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 #, fuzzy msgid "The transfer failed. Data preparation failed." msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "Kontakten har kansellert invitasjonen" -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 #, fuzzy msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "feilet. Filen finnes ikke" -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +#, fuzzy +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakten har nektet invitasjonen" + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "feilet. Kunne ikke opprette støpsel" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "feilet. Kunne ikke opprette støpsel" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" +#: network/applications/p2papplicationbase.cpp:769 +#, fuzzy +msgid "The transfer failed." +msgstr "Oversetteren av " + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +#, fuzzy +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "feilet. Filen finnes ikke" + +#: network/applications/p2papplicationbase.cpp:1170 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "feilet. Kunne ikke opprette støpsel" + +#: network/applications/p2papplicationbase.cpp:1189 +#, fuzzy +msgid "The transfer failed. An internal error occured." +msgstr "Kontakten har nektet invitasjonen" + +#: network/applications/p2papplicationbase.cpp:1350 +#, fuzzy +msgid "The transfer failed. Couldn't open data source." +msgstr "feilet. Kunne ikke opprette støpsel" + #: network/applications/voiceconversation.cpp:71 #, fuzzy msgid "You are invited to start a voice conversation." @@ -3352,806 +4739,1453 @@ msgstr "Starter GnomeMetting. Tilknytter " msgid "Inviting the contact to a voice conversation." msgstr "Inviterer kontakten til et møte." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 #, fuzzy msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "Kontakten inviterer deg til å begynne " -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Kontakten har kansellert invitasjonen" + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:119 +#: network/applications/webcamtransferp2p.cpp:138 #, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "Oversetteren av " +msgid "You are invited to view this person's webcam." +msgstr "Du er invitert til å dele denne personens skrivebord." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 +#: network/extra/msnftpconnection.cpp:204 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +msgid "Sending file %1" +msgstr "Sender fil " + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "feilet. Kunne ikke åpne fil" -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy msgid "Couldn't open a local port." msgstr "feilet. Kunne ikke åpne fil" -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:478 +#: network/extra/msnftpconnection.cpp:469 #, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +msgid "The transfer of %1 failed. A connection could not be made." msgstr "feilet. Kunne ikke opprette forbindelse" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 #, fuzzy msgid "Receiving file %1" msgstr "Mottar fil " -#: network/msnconnection.cpp:589 -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Forbindelsen ble brutt fordi du \n" -"er tilknyttet fra en annen MSN klient\n" -"eller tilknyttet fra et annet sted," - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Synkronisert" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Autentisering feilet" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -msgid "Authentication failed, please verify your account name and password." -msgstr "" - -#: network/msnnotificationconnection.cpp:1993 -#, fuzzy -msgid "Connecting..." -msgstr "Koble til" - -#: network/msnnotificationconnection.cpp:2167 -msgid "Unknown command received from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 +#: network/msnconnection.cpp:404 #, fuzzy -msgid "The account name given is invalid" +msgid "The given account name is invalid" msgstr "Det brukernavnet er ugyldig" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "Din kontaktliste er full." -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 #, fuzzy msgid "This contact is already on your list" msgstr "Legg denne kontakten til din \"Friends\"-liste" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 #, fuzzy msgid "This contact is not on your list" msgstr "Legg denne kontakten til din \"Friends\"-liste" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Legg denne kontakten til din \"Friends\"-liste" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -#: network/msnnotificationconnection.cpp:2251 +#: network/msnconnection.cpp:444 #, fuzzy -msgid "Your contact list has too many groups" +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "Din kontaktliste er full." -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 #, fuzzy msgid "This group can't be changed" msgstr "Dette er en spesiell gruppe som ikke kan endres." -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "Din kontaktliste er full." -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 #, fuzzy msgid "There was an internal error in KMess: %1" msgstr "Intern tjenerfeil" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "E&ndre navn på gruppe" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 #, fuzzy msgid "Transfer to switchboard server failed" msgstr "Overfør til meldingstjener" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -msgid "No permissions given for this account" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "Oversetteren av " -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" msgstr "" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "Du har kansellert invitasjonen." -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 #, fuzzy msgid "Bad friend name" msgstr "Ditt vennskapsnavn:" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "Autentisering feilet" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "Du kan ikke starte en prat med noen med egen status Usynelig." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" msgstr "" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -#: network/msnnotificationconnection.cpp:2371 -msgid "Your passport account needs to be verified first." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." msgstr "" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "Intern tjenerfeil" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Brukers kunngjøringstjener er nede" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 #, fuzzy msgid "The server is going down" msgstr "Tjeneren kobles snart ned." -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "Tjeneren kobles snart ned." -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 #, fuzzy msgid "The server is not available" msgstr "Tjeneren er utilgjengelig" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Autentisering feilet" -#: network/msnnotificationconnection.cpp:2449 -msgid "Unknown error code received from the server: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +#, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" +msgstr "Tjener Feil" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "Autentisering feilet" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "Autentisering feilet" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +#, fuzzy +msgid "Connecting..." +msgstr "Koble til" + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "minutter " msgstr[1] "minutter " -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" msgstr "" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -msgid "KMess could not process Offline-IM messages.
Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "Autentisering feilet" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "Intern tjenerfeil" -#: network/msnnotificationconnection.cpp:3242 -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2932 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"Forbindelsen ble brutt fordi du \n" +"er tilknyttet fra en annen MSN klient\n" +"eller tilknyttet fra et annet sted," + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "Kunne ikke koble til tjener." -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Tjener Feil" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:681 +#, fuzzy +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "Intern tjenerfeil" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "Tidsavbrudd på forbindelse" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 #, fuzzy msgid "1 ping lost" msgstr "Henter lister" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 #, fuzzy msgid "%1 pings lost" msgstr "Henter lister" -#: network/msnsockettcp.cpp:387 +#: network/msnsockettcp.cpp:395 #, fuzzy -msgid "The connection to the server was lost." +msgid "The connection to the server was lost" msgstr "Kunne ikke koble til tjener." -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Personen er frakoblet eller usynlig" - -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "ble ikke mottatt." +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Tjeneren er utilgjengelig" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "" - -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "" - -#: notification/chatnotification.cpp:163 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/chatnotification.cpp:171 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Tjeneren er utilgjengelig" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" msgstr "er tilgjengelig" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:158 +#, fuzzy +msgid "%1 says:
'%2'" +msgstr "er tilgjengelig" + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" +msgstr "er tilgjengelig" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" msgstr "" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" -msgstr "" +#: notification/chatnotification.cpp:174 +#, fuzzy +msgid "%1:
%2" +msgstr "er tilgjengelig" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr "er tilgjengelig" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr "er tilgjengelig" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr "er tilgjengelig" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 msgid "%1 wants to use the webcam!" msgstr "" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr "er tilgjengelig" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr "er tilgjengelig" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "Du har kansellert invitasjonen." -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "Kontakten har kansellert invitasjonen" -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 msgid "%1's activity has been canceled!" msgstr "" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "Du har kansellert invitasjonen." -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "Kontakten har kansellert invitasjonen" -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr "er tilgjengelig" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "Du har kansellert invitasjonen." -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "Oversetteren av " -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 msgid "%1's activity has ended!" msgstr "" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" msgstr "" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "Oversetteren av " -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 msgid "%1's activity has ended with an error!" msgstr "" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" +msgid "%1
is now online" msgstr "er tilgjengelig" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" +msgid "%1
has gone away" msgstr "er tilgjengelig" -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" +#: notification/contactstatusnotification.cpp:93 +#, fuzzy +msgid "%1
will be right back" +msgstr "er tilgjengelig" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy +msgid "%1
is now busy" +msgstr "er tilgjengelig" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy +msgid "%1
has become invisible" +msgstr "er tilgjengelig" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy +msgid "%1
has gone idle" +msgstr "er tilgjengelig" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy +msgid "%1
has logged out" +msgstr "er tilgjengelig" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy +msgid "%1
is on the phone" +msgstr "er tilgjengelig" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy +msgid "%1
is out for lunch" +msgstr "er tilgjengelig" + +#: notification/newemailnotification.cpp:90 +#, fuzzy +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "er tilgjengelig" + +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Start et &Møte" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Systembeskjed" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Skriv inn Borte-beskjed" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" msgstr "" -#: notification/contactstatusnotification.cpp:73 +#: notification/notificationmanager.cpp:130 #, fuzzy -msgid "%1 is now busy" -msgstr "er tilgjengelig" +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&Send epost" -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "er tilgjengelig" - -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "er tilgjengelig" - -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "er tilgjengelig" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "er tilgjengelig" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "er tilgjengelig" - -#: notification/newemailnotification.cpp:78 -msgid "New email:
'%1'
by '%2'" +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -#: settings/accountpage.cpp:69 +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " skriver." + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "" -#: settings/accountpage.cpp:70 -msgid "Browse and crop picture..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." msgstr "" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "Bilde:" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "Fjern K&ontakt" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Innstillinger" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 #, fuzzy msgid "Account" msgstr "Kontoer " -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "Kontoer " -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Varsler" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "E-Post varsling" +msgid "Contact List" +msgstr "&Legg til Kontakt" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Prat" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Loggføring" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Er du sikker på at du vil slette denne profilen?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "Er du sikker på at du vil slette denne profilen?" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Vis &Humørikoner" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Er du sikker på at du vil slette denne profilen?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Vis &Humørikoner" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "Innstillinger" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Kontoer " -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "E-Post varsling" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "Lagre logger i denne mappen:" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 -msgid "- %1 (%2)" +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." msgstr "" +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "&Legg til Kontakt" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#~ msgid "Conversations Filter" +#~ msgstr "Samtalefilter" + +#~ msgid "Filter by &conversation" +#~ msgstr "Filtrer &etter samtale" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "ble ikke mottatt." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "ble ikke mottatt." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "ble ikke mottatt." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "ble ikke mottatt." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Blokkert" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Sett inn humørikon" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "E-postadresse: " + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Blokkert" + +#, fuzzy +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Din meldingsskrifttype:" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "&Legg til Kontakt" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "Vis &Frakoblede Kontakter" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "Søk etter &Kontakt" + +#~ msgid "Alerts" +#~ msgstr "Varsler" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "E-Post varsling" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "&Fjern Gruppe" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "Sender fil " + +#~ msgid "&Send email" +#~ msgstr "&Send epost" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "Tilkoblet" + +#~ msgid "Connect" +#~ msgstr "Koble til" + +#, fuzzy +#~ msgid "Rename group" +#~ msgstr "E&ndre navn på gruppe" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "Brukerkonto I&nnstillinger" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "er tilgjengelig" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "er tilgjengelig" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "er tilgjengelig" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "er tilgjengelig" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "E-Post varsling" + +#, fuzzy +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Gi beskjed når kontakter logger av" + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "Frakoblet" + +#, fuzzy +#~ msgid "S&end you a message" +#~ msgstr "Skriv inn Borte-beskjed" + +#, fuzzy +#~ msgid "Go o&ffline" +#~ msgstr "Frakoblet" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "E-postadresse:" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "Vis en beskjed når epost mottas i \"andre mapper\"" + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "i en annen mappe" + +#~ msgid "Hide popups after" +#~ msgstr "Skjul oppspretter etter" + +#~ msgid "seconds" +#~ msgstr "sekunder" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "Varsler" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "&Legg til Kontakt" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "Passord:" + +#, fuzzy +#~ msgid "Log &all chats" +#~ msgstr "Logg all prat" + +#, fuzzy +#~ msgid "Month" +#~ msgstr "Måned" + +#~ msgid "Day" +#~ msgstr "Dag" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "&Legg til Kontakt" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "Søk etter &Kontakt" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Personen er frakoblet eller usynlig" + +#, fuzzy +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "ble ikke mottatt." + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "Vis/skjul &Kontaktpanel" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "Viser eller skjuler kontaktpanelet" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "Viser eller skjuler kontaktpanelet" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Legg denne kontakten til din \"Friends\"-liste" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "&Inviter " + +#, fuzzy +#~ msgid "Copy E&mail" +#~ msgstr "EPost" + +#~ msgid "Specify an Away message" +#~ msgstr "Skriv inn Borte-beskjed" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "EPost" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "Legg denne kontakten til din \"Friends\"-liste" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "EPost" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "Legg denne kontakten til din \"Friends\"-liste" + +#, fuzzy +#~ msgid "Click" +#~ msgstr "Blokkert" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Web design" + +#~ msgid "Co&nnect" +#~ msgstr "&Tilkoble" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "Brukerkonto I&nnstillinger" + +#~ msgid "Got synchronization" +#~ msgstr "Synkronisert" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Innstillinger" + +#, fuzzy +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Vil du goddta filen: " + +#, fuzzy +#~ msgid "The transfer was cancelled" +#~ msgstr "Overføring akseptert." + +#, fuzzy +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Korrekt fullført overføring av filen: " + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "feilet. Filen finnes ikke" + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "feilet. Kunne ikke opprette forbindelse" + +#, fuzzy +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "Oversetteren av " + #~ msgid "Picture:" #~ msgstr "Bilde:" @@ -4159,10 +6193,6 @@ msgstr "" #~ msgid "Speed:" #~ msgstr "Tjener Feil" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Vis epost informasjon i kontaktlisten" - #~ msgid "Logging in..." #~ msgstr "Logger på..." @@ -4189,10 +6219,6 @@ msgstr "" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "nye epost i innboksen." -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "Tilgjengelig" - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "feilet. Kunne ikke åpne fil" @@ -4220,10 +6246,6 @@ msgstr "" #~ msgid "Your password:" #~ msgstr "Ditt Passord:" -#, fuzzy -#~ msgid "Display picture:" -#~ msgstr "Bilde:" - #, fuzzy #~ msgid "Show notifications when you recei&ve an email" #~ msgstr "Vis en beskjed når epost mottas i \"andre mapper\"" @@ -4367,10 +6389,6 @@ msgstr "" #~ msgid "Show popup notifications for program events" #~ msgstr "Vis oppsprettsbeskjeder for programhendelser" -#, fuzzy -#~ msgid "Connection good" -#~ msgstr "Tidsavbrudd på forbindelse" - #, fuzzy #~ msgid "Server too busy" #~ msgstr "Tjeneren er opptatt" @@ -4404,13 +6422,6 @@ msgstr "" #~ msgid "There may be a problem with the servers" #~ msgstr "Det kan være et problem med tjenerene" -#~ msgid "System Message" -#~ msgstr "Systembeskjed" - -#, fuzzy -#~ msgid "Show incoming server messages" -#~ msgstr "Vis grafikk i pratebeskjeder" - #, fuzzy #~ msgid "Show outgoing server messages" #~ msgstr "Vis grafikk i pratebeskjeder" @@ -4431,7 +6442,3 @@ msgstr "" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "Hent nye Humørikoner eller lyd &Temaer" - -#, fuzzy -#~ msgid "n&ame" -#~ msgstr "Ditt navn" diff --git a/po/nl.po b/po/nl.po index d91912e..15d4629 100644 --- a/po/nl.po +++ b/po/nl.po @@ -1,851 +1,1490 @@ -# translation of kmess.po to Nederlands -# translation of nl.po to -# Copyright (C) 2003, 2005, 2006, 2007 Free Software Foundation, Inc. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. # -# Arend van Beelen jr. , 2003. -# Diederik van der Boor , 2005, 2006. -# Jaap Woldringh , 2006, 2007. +# Sander Pientka , 2009. msgid "" msgstr "" -"Project-Id-Version: kmess\n" +"Project-Id-Version: KMess\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2007-11-04 16:17+0100\n" -"Last-Translator: Jaap Woldringh \n" -"Language-Team: Nederlands \n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-03-15 12:34+0100\n" +"Last-Translator: Sander Pientka \n" +"Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.11.4\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Standaard" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Nog geen berichten" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" +"Klik op deze knop om te beginnen met KMess, of om een loginpoging te " +"annuleren" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Cartoonachtige emoticons" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "&Eigen emoticons" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Knipoog" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "" +"Klik op deze knop om de schermafbeelding van deze contactpersoon te " +"herstellen" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" msgstr "Nieu&we regel" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" -msgstr "Verz&enden" +msgstr "V&erzenden" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "Contactpersonen" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Chatten" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." -msgstr "Klik hier om het profiel te tonen van deze contactpersoon." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Hoofdwerkbalk" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" -msgstr "" +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" +msgstr "Klik hier om het menu van deze contactpersoon te weergeven" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 #, fuzzy +msgid "Click here to open your account settings" +msgstr "Klik hier om de geselecteerde emoticon te hernoemen" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "Veld &wissen" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "&Penkleur" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "Pendikte" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "&Gum" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "Hoofdgroep:" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" -msgstr "Geef het emailadres van de persoon die u wilt toevoegen:" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "Emailadres" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" msgstr "" +"Voer hiet het e-mailadres in van het contactpersoon die u aan de " +"contactenlijst wilt toevoegen" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -#, fuzzy -msgid "Initial group" -msgstr "Groep &hernoemen" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "E-mailadres:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "Voer een sneltoets in voor deze emoticon:" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Voer een sneltoets in voor de emoticon:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" -msgstr "Selecteer een afbeeldingsbestand:" +msgstr "Kies een afbeelding:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 -#, fuzzy +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "" -"Stel het bericht op dat automatisch wordt verzonden\n" -"aan mensen die u een bericht proberen te sturen:" +"Voer een bericht in dat automatisch wordt verzonden naar mensen die u " +"proberen te bereiken." -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "&Geef een 'automatisch weg'-bericht op:" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +msgid "Search through contacts..." +msgstr "Contacten doorzoeken..." + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 #, fuzzy -msgid "&Automatic away message" -msgstr "Stel een Afwezig-bericht op" +msgid "Chat Log Filter" +msgstr "Chatloggen" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "&Niet &filteren" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "Op &datum sorteren" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "van" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "naar" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Op &datum sorteren" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Wat wilt u doen?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" +msgstr "&Voeg deze persoon aan mijn contactenlijst toe" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person; only allow them to see my status" msgstr "" +"Voeg deze persoon &niet toe; sta hem alleen toe om mijn online status te zen" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "Deze contactpersoon &toevoegen aan uw lijst van \"Vrienden\"" - -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 -#, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "" -"Deze contactpersoon &niet toevoegen, maar hem/haar uw online-status tonen" +"&Blokkeer deze persoon, zodat deze mij niet kan bereiken of mijn online " +"status kan zien" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 -#, fuzzy -msgid "&Block this person from contacting me or seeing my online state" -msgstr "" -"&Blokkeren dat deze persoon contact met u maakt of uw online-status ziet" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "Eigenschappen van contactpersoon %1" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" +msgstr "&Informatie" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" +"Klik op deze knop om de schermafbeelding van deze contactpersoon te " +"herstellen" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 -#, fuzzy -msgid "Restore" -msgstr "Verwijderd" +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Herstellen" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Groepen:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "Gebruik een &alternatieve naam voor deze persoon" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" msgstr "" +"Toon een &pop-upbericht wanneer deze contactpersoon online/offline gaat" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Geluid:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -#, fuzzy -msgid "Use alternative name for this person" -msgstr "Gebruik een alternatieve naam voor deze persoon" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "Toon aankondiging wanneer deze persoon online of offline gaat" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "Geluid:" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" -msgstr "" +msgstr "A&fbeeldingen" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 #, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Klik hier om de geselecteerde emoticon te verwijderen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Schermafbeelding" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 msgid "&Clear Cache" -msgstr "Tabblad wissen" +msgstr "&Cache legen" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -#, fuzzy -msgid "Notes" -msgstr "Notitie" +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "&Aantekeningen" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "&Emoticons" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" +"U kunt instellen dat alle door deze contactpersoon ontvangen emoticons " +"verborgen moeten worden. Klik met de rechtermuisknop op een ontvangen " +"emoticon, en kies \"Deze emoticon negeren\".\n" +"Met dit venster kunt u verborgen emoticons herstellen." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "Klik hier om de geselecteerde emoticon te verwijderen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Verwijde&ren" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "Beschikbare contactpersonen" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "Nodig een contactpersoon uit die niet in uw lijst staat:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "Voer het e-mailadres in van het contactpersoon dat u wilt uitnodigen" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "Uitgenodigde contactpersonen" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Te exporteren items:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Formaat" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Contactpersonen:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "Alles selecteren" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Alles deselecteren" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Exporteren..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Sluiten" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Netwerkvenster" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" -msgstr "" +msgstr "Commando naar huidig tabblad " -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "Commando:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" -msgstr "" +msgstr "Type:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "Ster" +msgstr "Standaard" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" -msgstr "" +msgstr "MIME" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" -msgstr "Verz&enden" +msgstr "Verzenden" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" -msgstr "" +msgstr "Commandopayload (kan leeg gelaten worden):" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" -msgstr "" +msgstr "Openen" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" +msgstr "Annuleren" + +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "&Download" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "&Upload" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "O&pschonen" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "&Sluiten" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" msgstr "" +"Klik hier om de voorkeuren van de geselecteerde account te bekijken, " +"of scroll met de muis om tussen de opgeslagen accounts te wisselen" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" msgstr "" +"Voer hier het e-mailadres in van uw geregistreerde Passport of Live-account" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "Emailadres: " - -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 -#, fuzzy +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" -msgstr "Wachtwoord" +msgstr "Wachtwoord:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" -msgstr "Status bij inloggen" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "Voer hier het wachtwoord van uw account in" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "" +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Status bij login:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 #, fuzzy -msgid " Account options " -msgstr "Accounti&nstellingen" +msgid "Choose a status to set when successfully connected." +msgstr "Kies een MSN-status die wordt ingesteld wanneer u bent aangemeld." -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" -msgstr "&Onthoud dit profiel" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "KMess zal uw account bewaren, wanneer dit is ingeschakeld" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" +msgstr "Account onthou&den" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" +"U kunt ook uw wachtwoord bewaren wanneer u KMess uw account laat onthouden" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "Wachtwoord o&nthouden" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Klik op deze knop om te beginnen met KMess, of om een loginpoging te " +"annuleren" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Verbinden" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Type hier uw persoonlijke bericht in" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Nieuw account" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 -#, fuzzy -msgid "Your Account Information" -msgstr "Accounti&nstellingen" +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." -msgstr "Vul de naam in die contactpersonen zullen zien als u online bent." - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 -#, fuzzy -msgid "&Friendly name:" -msgstr "&Uw roepnaam" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" msgstr "" -"Vul het emailadres in van uw MSN-paspoort. U kunt een nieuw paspoort " -"verkrijgen op http://register.passport.com/" +"Klik hier om een nieuwe Live-account te registreren, waarmee u op MSN " +"kunt inloggen.
U kunt ook een bestaand e-mailadres gebruiken." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "Wachtwoord vergeten?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 #, fuzzy -msgid "&Email address:" -msgstr "Emailadres: " +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Klik hier om naar de website van Live te gaan, om uw wachtwoord te " +"herstellen" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Verbinden" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Beeld" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Acties" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "Formaat" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Account" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "Uw accountinformatie" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." +msgstr "Voer een naam in die contactpersonen zien wanneer u online bent." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 +msgid "&Friendly name:" +msgstr "&Schermnaam:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Voer het e-mailadres in van uw MSN Passport-account. U kunt een nieuw " +"account registreren op http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 +msgid "&Email address:" +msgstr "&E-mailadres:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -"Vul het wachtwoord in van uw MSN-paspoort. U kunt een nieuw paspoort " -"verkrijgen op http://register.passport.com/" +"Voer het wachtwoord in van uw MSN Passport-account. U kunt een nieuw account " +"registreren op http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" -msgstr "Wachtwoord" +msgstr "&Wachtwoord:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -#, fuzzy -msgid "&Remember Password" -msgstr "Wachtwoord" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "Wachtwoord &onthouden" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" -msgstr "Afbeelding tonen" +msgstr "Schermafbeelding" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." -msgstr "&Wijzigen..." +msgstr "&Veranderen..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" -msgstr "" +msgstr "&Niet gebruiken" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -"De optie \"Onthoudt dit profiel\" heeft u uit laten staan tijdens het " -"inloggen. Hierdoor worden uw instellingen standaard niet opgeslagen. Zet " -"deze optie aan als u de instellingen voor deze account permanent wilt " -"bewaren.\n" +"De optie \"Dit profiel onthouden\" is tijdens het inloggen niet " +"ingeschakeld, dus uw instellingen worden nu niet bewaard. Schakel deze optie " +"in als u uw accountinstellingen permanent op deze computer wilt bewaren.\n" "\n" -"Het is aan te raden deze optie aan te zetten tenzij u KMess gebruikt als " -"gast of met een publiek systeem werkt (bijvoorbeeld in een Internetcafé)." +"Het is aanbevolen om deze optie in te schakelen, behalve als u een gast " +"bent, of als u een publieke computer gebruikt (een internetcafe, " +"bijvoorbeeld)." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 -#, fuzzy +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "Onthoud de instellingen van deze account" +msgstr "On&thoud de instellingen van dit account" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." -msgstr "" -"Als deze optie aanstaat wordt bij het opstarten van Kmess automatisch " -"ingelogd met deze account." +msgstr "Wanneer ingeschakeld, logt KMess automatisch in met dit account." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" -msgstr "&Automatisch aanmelden met deze account tijdens het starten van KMess" +msgid "Log in &with this account automatically" +msgstr "Log automatisch &in met dit account" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "&Alle chats opslaan" +msgstr "Log in &als" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -"U heeft een passport account nodig om verbinding te kunnen maken met het " -"netwerk van MSN Messenger. U kunt om verbinding te kunnen maken uw bestaande " -"emailadres registreren op register.passport.com, of een Hotmail-account " -"gebruiken." +"U dient te verbinden met de Passport-site om te bevestigen dat uw e-" +"mailadres bestaat." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -"U kunt uw bijnaam niet veranderen omdat het emailadres van uw \"paspoort\" " -"niet bevestigd kan worden." +"U kunt uw schermnaam niet wijzigen, omdat uw Passport-e-mailadres niet " +"geldig is." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" -msgstr "Verzoek om een email ter bevestiging" +msgstr "Controle-e-mail aanvragen" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "Ga naar accountservices.passport.net" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"U hebt een Passport-account nodig om te verbinden met het MSN Messenger-" +"netwerk. U kunt uw huidige e-mailadres hiervoor registreren op register." +"passport.com, of u kunt een Hotmailadres gebruiken." + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -"Om verbinding te maken met de MSN Messenger service moet u een emailadres " -"verkrijgen voor een Passport account." +"U hebt een e-mailadres als Passport-account nodig om met de MSN Messenger-" +"service te verbinden." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" -msgstr "Registreer nieuwe account" +msgstr "Nieuw account registreren" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "Ga naar register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 #, fuzzy +msgid "&Status Options" +msgstr "Status bij login:" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Wanneer ingeschakeld, wordt uw status automatisch gewijzigd naar \"Afwezig-" +"Inactief\" wanneer u de computer voor een paar minuten niet gebruikt. " +"Wanneer deze optie niet aanwezig is, werd KMess zonder deze optie " +"gecompileerd (broncode omzetten naar een uitvoerbaar programma)." + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Verander status naar \"&Inactief\" wanneer inactief" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"Beheert het aantal minuten voordat KMess de status verandert naar \"Afwezig-" +"Inactief\"." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Word inactief na" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minuten" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +#, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "&Verberg meldingen wanneer mijn status is ingesteld op Bezig" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 msgid "Saved accounts:" -msgstr "Accounts" +msgstr "Opgeslagen accounts:" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "Klik" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -"Klik hier om nieuwe aangepaste emoticons toe te voegen die u naar uw " -"contactpersonen wilt kunnen sturen." +"Klik hier om een KMess-account te maken voor een e-mailadres dat reeds is " +"gekoppeld aan een MSN-account" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +msgid "&Add Account..." +msgstr "Account &toevoegen..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 #, fuzzy -msgid "&Add account..." -msgstr "Account" +msgid "Select an account and click here to modify it" +msgstr "Kies een account, en klik daarna hier om deze te verwijderen" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "Selecteer een emoticon en klik hier om die te verwijderen." - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" -msgstr "" +msgstr "&Bewerken" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 -#, fuzzy +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "Kies een account, en klik daarna hier om deze te verwijderen" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" -msgstr "Verwijderd" +msgstr "&Verwijderen" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Meldingen" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" +"Schakel deze optie in om uw chatgesprekken op een later moment terug te lezen" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 -#, fuzzy -msgid "Contact Events" -msgstr "Contactpersonen" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "Toon een melding wanneer uw contactpersoon:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" msgstr "" -"Als deze optie aan staat wordt een melding getoond indien een van uw " -"contactpersonen verbinding maakt met MSN." +"

Wanneer u chatloggen ingschakelt, wordt elk chatgesprek opgeslagen " +"in een gekozen locatie (die hieronder opgegeven kan worden).

\n" +"

De opgeslagen gesprekken maken het mogelijk om iets op te zoeken in " +"verleden discussies, zoals een link, of een uitspraak van u in een gesprek " +"met iemand.

\n" +"

Dit brengt ook privacyproblemen met zich mee, omdat andere mensen die uw " +"account gebruiken deze logboeken ook kunnen lezen.

\n" +"

Zet deze optie uit op openbare computers!

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -#, fuzzy -msgid "&Go online" -msgstr "O&ffline gaat" +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "Schakel chatloggen in" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" +"KMess kan uw chatgesprekken ook opslaan in HTML-formaat, en ze organiseren" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "Chatgesprekken in bestand bewaren" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" +"Met deze optie kunt u kiezen op welke manier KMess uw chatgesprekken bewaart." + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "Gebruikt bestandsformaat voor bewaren:" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" msgstr "" -"Als deze optie aan staat wordt een melding getoond indien een van uw " -"contactpersonen een conversatie met u begint." +"\n" +"

Het is belangrijk welk bestandsformaat u kiest.

\n" +"

HTML-bestanden kunnen in elke webbrowser geopend worden, maar kunnen " +"meestal niet weergeven worden op andere computers.

\n" +"

Tekstbestanden kunnen daarentegen overal goed worden gelezen; ze bevatten " +"echter geen tekstopmaak, schermafbeeldingen of emoticons.

\n" +"" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "Een &chat met u begint" +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "Webpagina's (HTML)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "Platte tekst" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." msgstr "" -"Als deze optie aan staat wordt elke keer een melding getoond indien een van " -"uw contactpersonen u een bericht stuurt." +"Met deze opties kunt u kiezen hoe KMess uw gelogde chatgesprakken " +"organiseert in de hieronder opgegeven locatie." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "U &een bericht stuurt" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." msgstr "" -"Als deze optie aan staat wordt een melding getoond indien een van uw " -"contactpersonen zijn MSN-status wijzigt." +"Afhankelijk van welke optie u hier kiest, maakt KMess enkele mappen aan om " +"uw chatlogboeken geordend te houden. Gebruik de \"Wat is dit?\"-mogelijkheid " +"op een specifieke optie voor meer details." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "Zijn/haar &status wijzigt" +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" +msgstr "Scheid gelogde chats met:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "Maak een map om de chats te sorteren op jaar" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" msgstr "" -"Als deze optie aan staat wordt een melding getoond indien een van uw " -"contactpersonen offline gaat." +"Met deze optie scheidt KMess uw gelogde chats alleen op jaar.\n" +"U zult dan mappen voor elk jaar gelode chatgesprekken vinden; deze bevatten " +"alle chatgesprekken van het betreffende jaar, samen in één map. \n" +"\n" +"Een chatgesprek van 29 November 2008 zal dan opgeslagen worden als:\n" +"/2008/datum-en-contactpersoon.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "O&ffline gaat" +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Jaar" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "Maak een map om de chats te sorteren op jaar en maand" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "Emailadres" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "" -"Toon een melding als een emailbericht in een \"andere map\" wordt ontvangen" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" msgstr "" -"Als deze optie aanstaat wordt er ook een aankondiging getoond als er email " -"in een andere map wordt ontvangen. Deze optie is alleen beschikbaar voor " -"Hotmail-accounts." +"Met deze optie scheidt KMess uw gelogde chats op jaar en maand.\n" +"U zult dan mappen voor elk jaar gelode chatgesprekken vinden; deze bevatten " +"alle maanden van het betreffende jaar. In deze laatste mappen vindt u alle " +"chatgesprekken van de betreffende maand, samen in één map. \n" +"\n" +"Een chatgesprek van 29 November 2008 zal dan opgeslagen worden als:\n" +"/2008/11/datum-en-contactpersoon.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "Jaar en maand" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "Maak een map om de chats te sorteren op jaar, maand en dag" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" +"Met deze optie scheidt KMess uw gelogde chats op jaar, maand en dag.\n" +"U zult dan mappen voor elk jaar gelode chatgesprekken vinden; deze bevatten " +"alle maanden van het betreffende jaar. Deze mappen bevatten weer alle dagen " +"van de maand. In deze laatste mappen vindt u alle chatgesprekken van de " +"betreffende dag, samen in één map. \n" +"\n" +"Een chatgesprek van 29 November 2008 zal dan opgeslagen worden als:\n" +"/2008/11/29/datum-en-contactpersoon.html" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "Jaar, maand en dag" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" +msgstr "Plaats alle bewaarde chatgesprekken direct in de onderstaande locatie" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" +"Met deze optie bewaart KMess al uw gelogde chatgesprekken in dezelfde map, " +"zonder deze te ordenen." + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "Bestanden niet ordenen" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "Klik hier om een map te kiezen" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "De map waarin al uw chatlogs worden opgeslagen" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "Kies de map op uw computer waarin u de chatlogs wilt bewaren." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "Bewaar gelogde chats in deze map:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "St&ijl" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"Hiermee kunt u het thema veranderen dat KMess gebruikt om chatberichten te " +"weergeven." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "&Chatstijl:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "&Nieuwe stijlen ophalen..." + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Chatinstellingen" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Schakelt emoticons in chatgesprekken in." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "Emoticons &weergeven" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "&Emoticons weergeven" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Met deze optie kunt u berichten van dezelfde contactpersoon groeperen. " +"Wanneer een contact u meerdere berichten verzendt, groepeert KMess deze tot " +"één bericht. Het uiterlijk varieert per chatstijl." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "Opvolgende berichten van dezelfde contact &groeperen" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Schakelt een tijdsstempel bij elk chatbericht in." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Berichttijden w&eergeven" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" +msgstr "&Nummer" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +#, fuzzy +msgid "Show s&econds" +msgstr "Emoticons &weergeven" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Tekst" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Dit is zijn de gebruikte lettertype- en kleur in uw chatberichten." + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "Uw &berichtenlettertype:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"Hiermee forceert u de kleur en lettertype van een ontvangen bericht met de " +"gekozen lettertype- en kleur." + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "&Ontvangen berichten forceren om dit lettertype te gebruiken:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Chatvenstermeldingen" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Schakelt lettertype-effecten in. Het typen van *vet*, /schuin/ en " +"_onderstreept_ maakt de tekst resp. vet,schuin of onderstreept." + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Gebruik &effecten in berichten, zoals *vet*, /schuin/ en _onderstreept_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +#, fuzzy +msgid "Enable MSN Plus formatting" +msgstr "MSN Plus-indeling" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "Bepaalt na hoeveel seconden aankondigingen weer weggaan." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Verberg aankondigingen na" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "seconden" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "Waarschuwingen" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Toon &offline contactpersonen" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -854,2213 +1493,2958 @@ msgid "" "Contacts may send multiple nudges at once, but KMess only shakes the chat " "window with the first nudge.

" msgstr "" -"

Wanneer contactpersonen uw aandacht willen vragen kunnen zij een " -"buzzer sturen. Standaard schudt het chatvenster wanneer een buzzer wordt " -"ontvangen of verzonden. U kunt deze optie uitschakelen indien u dit te " -"opdringerig vindt.

\n" -"

Wanneer deze optie wordt ingeschakeld zal Kmess het schudeffect toch " -"beperkt houden. Contactpersonen kunnen meerdere buzzers tegelijk versturen, " -"maar alleen de eerste buzzer heeft effect.

" +"

Wanneer contacten u de aandacht willen trekken, kunnen ze een buzzer " +"verzenden. Standaard schudt het chatvenster wanneer er een buzzer wordt " +"ontvangen of verzonden.

\n" +"

Ook wanneer deze optie ingeschakeld is, limiteert KMess de buzzers. " +"Contactpersonen kunnen meerdere buzzers per keer verzenden, maar KMess staat " +"alleen de eerste buzzer toe om het venster te schudden.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" -msgstr "&Schud het chatvenster bij zenden of ontvangen van een buzzer" +msgstr "Schud het chat&venster wanneer een buzzer wordt ontvangen of verzonden" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." -msgstr "" -"Als deze optie actief is ziet u een aankondiging als nieuwe email wordt " -"ontvangen. Het aantal ongelezen berichten wordt ook getoond, boven de lijst " -"van contactpersonen. Deze optie is alleen beschikbaar voor Hotmail-accounts." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "Chatgesprekken in één venster g&roeperen" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Altijd" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "Voor contacten in dezelfde groep" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Nooit" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Schermafbeelding" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." +msgstr "" +"Wanneer ingeschakeld, wordt er een pop-upbericht weergeven wanneer u nieuwe " +"mail hebt ontvangen. Het aantal ongelezen berichten wordt boven de " +"contactenlijst weergeven. Deze optie is enkel beschikbaar voor " +"Hotmailaccounts." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Toon het aantal ongelezen mail" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" -"Indien ingeschakeld krijgen contactpersonen informatie over waar u naar " -"luistert. Deze informatie wordt verkregen van de thans actieve toepassingen " -"voor audio." +"Wanneer ingeschakeld, kunnen contacten zien naar wat voor muziek u aan het " +"luisteren bent. Deze informatie komt van een geopende muziekspeler." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" +msgstr "Laat contacten zien naar &wat voor muziek ik luister" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" -msgstr "Contactpersonen informeren naar &welk liedje ik nu luister." +msgid "List Formatting" +msgstr "MSN Plus-indeling" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 #, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Als deze optie aan staat wordt uw status automatisch veranderd in \"Afwezig " -"- niet actief\" wanneer u de computer enkele minuten niet heeft gebruikt." +msgid "Enable MSN &Plus formatting" +msgstr "MSN Plus-indeling" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Verander de status in \"&Afwezig-niet actief\" indien niet actief" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"Bepaalt na hoeveel minuten dat de computer niet wordt gebruikt, de status in " -"\"Afwezig - niet actief\" wordt veranderd." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Word \"Niet actief\" na" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minuten" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" -"Als deze optie aanstaat worden chatgesprekken opgeslagen in een opgegeven " -"map." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "&Alle chats opslaan" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "Kies de map waarin chatgesprekken bewaard moeten worden." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Bewaar chat-bestanden in deze hoofdmap:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" -"KMess maakt automatisch de nodige submappen aan als de optie \"deel de chat-" -"mappen in naar jaar, maand of dag\" aan staat." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Jaar" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Maand" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Dag" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Bewaar alle chats in de hoofdmap" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" -"Dit geeft de mogelijkheid om de stijl te veranderen die KMess voor alle " -"chatberichten gebruikt." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Chatstijl:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Instellingen" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Dit zorgt ervoor dat emoticons in chatberichten getoond worden." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "&Emoticons weergeven" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" -"Dit zorgt ervoor dat in chatberichten de tijd van ontvangst wordt getoond." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Toon &tijd in chatberichten" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Deze optie geeft de mogelijkheid om berichten van dezelfde contactpersoon " -"samen te voegen. Indien een contactpersoon meerdere berichten nodig heeft om " -"iets uit te leggen, worden die berichten samengevoegd tot één enkel bericht. " -"De uiteindelijke weergave is afhankelijk van de gekozen chatstijl." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "&Voeg op elkaar volgende berichten van dezelfde contactpersoon samen" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Afwezig" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Er zijn teveel groepen in uw lijst van contactpersonen" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Watje" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "Dit is het lettertype en de kleur ervan, gebruikt in uw chatberichten." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "Het lettertype voor uw berichten:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"Deze optie geeft de mogelijkheid om een ander lettertype en -kleur in te " -"stellen voor de berichten van contactpersonen." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Gebruik dit lettertype voor de berichten van uw contactpersonen:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Dit geeft de mogelijkheid om een effect aan lettertypen mee te geven. Door " -"*vet*, /schuin/ of _onderstreept_ te typen worden die woorden vet, schuin of " -"onderstreept weergegeven." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"&Gebruik effecten van lettertypen in berichten, zoals *vet*, /cursief/ en " -"_onderstreept_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Wachten op lijst met contactpersonen..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" -msgstr "Thema's voor &Emoticons" +msgstr "&Emoticonthema's" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" -msgstr "Beschibare emoticontypen:" +msgstr "Beschikbare emoticonstijlen:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" -msgstr "&Aangepaste emoticons" +msgstr "&Eigen emoticons" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" -msgstr "Aangepaste emoticons voor deze account:" +msgstr "Eigen emoticons voor dit account:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "Klik hier om een nieuwe eigen emoticon toe te voegen" + +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." msgstr "Nieu&we toevoegen..." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "Klik hier om de geselecteerde emoticon een andere naam te geven." +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Klik hier om de geselecteerde emoticon te hernoemen" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" -msgstr "Her&noemen" +msgstr "He&rnoemen" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "&Verwijderen" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" -msgstr "Verlepte roos" +msgstr "Webbrowser" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" +"Kies deze optie om de browser te gebruiken die door KDE gebruikt wordt." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "&Gebruik de standaard KDE-browser" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." -msgstr "" +msgstr "Kies deze optie om te kiezen uit een lijst van beschikbare browsers." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "G&ebruik een beschikbare browser:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" +"Kies deze optie om het commando voor uw favoriete browser in te voeren." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "Een eigen &commando invoeren:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" +"Geef het commando op van een programma om links te openen; een '%u' wordt " +"hier vervangen door de URL van de link." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." -msgstr "" +msgstr "Gebruik '%u' om de URL in de opdrachtregel in te voeren." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" -msgstr "Emailprogramma" +msgstr "E-mailprogramma" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" +"Schakel deze optie in om de Live Mail-website te gebruiken wanneer de " +"ingelogde account daar ondersteuning voor biedt." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "Gebruik &Live Mail als de account dat ondersteunt" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" +"Kies deze optie om het e-mailprogramma te gebruiken dat door KDE gebruikt " +"wordt." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "&Gebruik het standaard KDE-mailprogramma" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "Gebruik een beschikbaar &e-mailprogramma" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." -msgstr "" +msgstr "Gebruik '%u' om de URL in de opdrachtregel in te voeren." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "Bestandsoverdrachten" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" -msgstr "Bewaar chat-bestanden in deze hoofdmap:" +msgstr "&Bewaar alle ontvangen bestanden in één map:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" +msgstr "&Gebruik de poorten" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "t/m" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "voor bestandsoverdrachten" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "Uw opmerking:" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 -#, fuzzy -msgid "and" -msgstr "Verdrietig" +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "Betreft:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 -#, fuzzy -msgid "for file transfers" -msgstr "Bestandsoverdrachten" +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "Iets dat u leuk vindt" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "Iets dat u niet leuk vindt" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "Incorrect gedrag van het programma" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "Een gewenste mogelijkheid" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "Geef een e-mailadres op waarnaar geantwoord dient te worden" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "Toon balk met feedbackknoppen op vensters" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" -msgstr "Ik ben even weg van mijn computer" +msgstr "Ik ben weg van mijn computer" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Uw naam" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" -msgstr "uw_naam@hotmail.com" +msgstr "u@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" -"U kunt deze uitnodiging niet sturen omdat er meerdere personen actief zijn " -"in deze chat." +"Er zijn onveilig bewaarde accountwachtwoorden gevonden.
Wilt u " +"deze wachtwoorden toevoegen aan de KDE-wachtwoordportefeuille

Note: it is not recommended to use insecure passwords if the KDE Wallet " +"is available, because your passwords will be easily readable in the KMess " +"configuration files." -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Veilige wachtwoordopslag" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importeren" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Verwijderen" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Behouden" + +#: chat/chat.cpp:119 #, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" +"U kunt geen uitnodigingen verzenden wanneer een meerdere mensen aanwezig " +"zijn in een chat." + +#: chat/chat.cpp:142 msgid "%1 has joined the chat." -msgstr "%1 neemt nu ook deel aan deze chat." +msgstr "%1 is de chat binnengekomen" -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "Het gesprek valt stil, %1 heeft de chat verlaten." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "het gesprek is afgelopen, %1 heeft de chat verlaten." -#: chat/chat.cpp:215 -#, fuzzy +#: chat/chat.cpp:202 +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." -msgstr "%1 heeft de chat verlaten." +msgstr "%1 heeft de chat verlaten." -#: chat/chat.cpp:364 -#, fuzzy +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr "%1 en %2 - Chat" +msgstr "%1 en %2" -#: chat/chat.cpp:371 -#, fuzzy +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." -msgstr "%1 en anderen - Chat" +msgstr "%1 en anderen" -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr " (Dit bericht werd automatisch verzonden)" +msgstr "%1 (dit bericht is automatisch verzonden)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 #, fuzzy -msgid "You received a wink from %1." -msgstr "U heeft een wink ontvangen van %1" - -#: chat/chat.cpp:971 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -"De wink kon niet worden getoond. Controleer of het programma 'cabextract' is " -"geïnstalleerd." +"KMess kon het logboek van dit chatgesprek niet opslaan.
De " +"logboeklocatie, '%1', bestaat niet." -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:941 +#, fuzzy +msgid "You have sent a wink" +msgstr "U hebt een wink ontvangen van %1" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." msgstr "" -"De wink kon niet worden getoond. De gegevens konden niet worden gelezen." -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Er is een verbindingsprobleem opgetreden." + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 #, fuzzy -msgid "You have received a wink from %1" -msgstr "U heeft een wink ontvangen van %1" +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" +"%1 heeft u een voiceclip gestuurd, maar KMess ondersteunt dit nog niet." +"" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1153 #, fuzzy -msgid "You received a nudge from %1!" -msgstr "U heeft een buzzer ontvangen van %1!" +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" +"%1 heeft u een actiebericht gestuurd, maar KMess ondersteunt dit nog " +"niet." -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "" +"%1 heeft u een MSN-mogelijkheid gestuurd, die KMess nog niet " +"ondersteunt." + +#: chat/chat.cpp:1194 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "Het bericht '%1' kon niet worden verstuurd." +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" +"U hebt een wink ontvangen van %1, maar de weergave ervan is uitgeschakeld in " +"de accountinstellingen." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" +"U hebt een wink ontvangen van %1, maar deze kan niet weergeven worden. Zorg " +"dat 'cabextract' geïnstalleerd is." + +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"U hebt een wink ontvangen van %1, maar deze kan niet weergeven worden. De " +"wink uitpakken met 'cabextract' is mislukt." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" +"U hebt een wink ontvangen van %1, maar deze kan niet weergeven worden. De " +"data kon niet gelezen worden." + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 heeft u een wink gestuurd!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 is de chat binnengekomen" + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 is de chat binnengekomen" + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 heeft u een buzzer gestuurd!" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "alle contactpersonen" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "U hebt een buzzer ontvangen van %1" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "U hebt een wink ontvangen van %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 is de chat binnengekomen" + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1 heeft u een offlinebericht gestuurd:
'%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "" +"Het bestand '%1' kon noch op de computer gevonden worden, noch " +"gedownload worden." + +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" -msgstr "U heeft een buzzer verstuurd naar %1!" +msgstr "U hebt %1 een buzzer verzonden!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" -msgstr "U heeft een buzzer verstuurd!" +msgstr "U hebt een buzzer verzonden!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" -msgstr "%1 stuurt een wink: %2" +msgstr "%1 verstuurt een wink: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 zegt:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +#, fuzzy +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "Gesprek met %1
Gestart op: %2" + +#: chat/chatmessageview.cpp:364 +#, fuzzy +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "Gesprek gestart op: %2" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "KMess opgeslagen gesprekken met %1" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" -msgstr "Voeg deze emoticon toe: %1" +msgstr "Deze emoticon toevoegen: %1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "U&itnodigen" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Opnieuw verbinden" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -"Kon de log van deze chat niet opslaan. Controleer uw permissie voor " -"schrijven in de map waar logs in worden opgeslagen." +"Kon het chatlog niet opslaan in de map '%1'.\n" +"Zorg dat u voldoende toestemming hebt om in deze map te schrijven." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +#, fuzzy +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" +"*.html *.htm|Webpagina (*.html)\n" +"*.txt|Platte tekst (*.txt)\n" +"*.xml|XML-document (*.xml)" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -"Bestand '%1' bestaat al.\n" +"Het bestand '%1' bestaat al,\n" "wilt u het overschrijven?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Bestand overschrijven" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "&Overschrijven" +msgstr "Over&schrijven" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." -msgstr "Deze &Emoticon toevoegen..." +msgstr "Deze &emoticon toevoegen" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +msgid "Ignore this &Emoticon" +msgstr "Deze &emoticon negeren" + +#: chat/chatview.cpp:833 msgid "Send &Email" -msgstr "&Email sturen" +msgstr "&E-mail verzenden" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "E&mail kopiëren" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "&Contact toevoegen" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +msgid "Copy E&mail Address" +msgstr "E-&mailadres kopiëren" + +#: chat/chatview.cpp:847 msgid "Visit &Link" -msgstr "Koppe&ling bezoeken" +msgstr "Koppeling openen" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "&Adres kopiëren" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "Tekst &kopiëren" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "&Alles selecteren" -#: chat/chatview.cpp:1314 -msgid "Find &Text" -msgstr "" +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "&Tekst zoeken..." -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" -msgstr "Chat in &bestand opslaan" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +msgid "C&lear Chat" +msgstr "Chatgesprek &legen" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Chat" +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Chatgesprek opslaan in &bestand" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "Stuur een &bestand" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Contactpersonen" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "Een &vergadering starten" - -#: chat/chatwindow.cpp:494 -msgid "Send a &Nudge!" -msgstr "Stuur een &buzzer!" - -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "Chat bewaren" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Emoticons" - -#: chat/chatwindow.cpp:498 -#, fuzzy -msgid "Close &All Tabs" -msgstr "Tabblad afsluiten" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "Instellingen" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "Start of stop een &conversatie" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Le&ttertype veranderen" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "&Kleur van de letters veranderen" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&Verbinden" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "&Kleur van de letters veranderen" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emoticons" -#: chat/chatwindow.cpp:658 -msgid "My emoticons" +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" msgstr "Mijn emoticons" -#: chat/chatwindow.cpp:738 +#: chat/chatwindow.cpp:328 #, fuzzy -msgid "&Settings" -msgstr "Instellingen" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" +"Er zijn meerdere tabbladen geopend in dit chatvenster. Wilt u alleen " +"het huidige tabblad sluiten, of ze allemaal sluiten?

Tip: u " +"kunt alle tabbladen óók sluiten met de sneltoets Shift+Esc." -#: chat/chatwindow.cpp:742 +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Een tabblad sluiten" + +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" +msgstr "Alle tabbladen sluiten" + +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" +msgstr "Het huidige tabblad sluiten" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "&Uitnodigen..." + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." +msgstr "Een &bestand verzenden..." + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "Webcamchat" + +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Een &vergadering starten" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "Een &buzzer verzenden!" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "Chat opslaan..." + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "&Alle tabbladen sluiten" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "&Lettertype wijzigen" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Letter&kleur wijzigen" + +#: chat/chatwindow.cpp:428 msgid "Show &Emoticons" msgstr "&Emoticons weergeven" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 +#: chat/chatwindow.cpp:429 #, fuzzy -msgid "Hide Side&bar" -msgstr "Zijbalk" +msgid "Show S&tatus Messages" +msgstr "Berichttijden w&eergeven" -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Zijbalk" +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "&Panelen" -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Weergeven of verbergen van de zijbalk met contactpersonen" +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "&Spellingscontrole gebruiken" -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Vergadering" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Buzzer" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Een &bestand verzenden" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "&Vorig tabblad" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "Volgen&d tabblad" + +#: chat/chatwindow.cpp:465 +msgid "Enable or disable the contacts panel" +msgstr "Het contactenpaneel inschakelen of uitschakelen" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contactpersonen" + +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "Het paneel met standaardemoticons inschakelen of uitschakelen" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticons" + +#: chat/chatwindow.cpp:477 +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Het paneel met eigen emoticons inschakelen of uitschakelen" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mijn emoticons" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Lettertype" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "Letter&kleur" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "Chatgesprek &legen" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Een &gesprek starten of beëindigen" + +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" +"U gebruikt een incorrecte syntaxis voor het /status-commando. De " +"correcte syntax is: /status online|away|idle|brb|busy|lunch|phone|" +"invisible.
U kunt ook de volgende sneltoetsen gebruiken: /online, /phone etc." -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "Incorrecte syntaxis van /status" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +#, fuzzy +msgid "You can't block anyone in a group chat." +msgstr "In een groepsgesprek kunt u niemand blokkeren." + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +#, fuzzy +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "Kan nu niet blokkeren!" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." msgstr "" +"Onbekend commando %1. Als u dit bericht niet als commando " +"bedoelt, plaats dan nog een / voor uw bericht." -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "Tabblad afsluiten" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Onbekend commando" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "Tabblad afsluiten" - -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "Zijbalk" - -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "Weergeven of verbergen van de zijbalk met contactpersonen" - -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 typt een bericht." - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 en %2 typen een bericht." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 en nog %3 anderen typen een bericht." - -#: chat/chatwindow.cpp:1611 -#, fuzzy +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" -msgstr "Chat" +msgstr "Chatgesprek" -#: chat/chatwindow.cpp:1615 -#, fuzzy +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - Chat" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "Een email &sturen" - -#: chat/contactframe.cpp:285 kmessview.cpp:561 -msgid "&View Profile" -msgstr "&Profiel tonen" - -#: chat/contactframe.cpp:286 -msgid "Ed&it Notes" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" msgstr "" +"Weet u zeker dat u de menubalk wilt verbergen? U kunt deze weer " +"zichtbaar maken met de volgende sneltoets: %1" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Het menu verbergen" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1 is aan het typen..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 en %2 zijn aan het typen..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 en %3 anderen zijn aan het typen..." + +#: chat/chatwindow.cpp:2296 +#, fuzzy +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" +"

Chatinformatie

Contacten:
  • %1
Chat gestart op:
%2
" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "Een privégesprek &starten" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +msgid "&Send Email" +msgstr "&E-mail verzenden" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 +msgid "&View Profile" +msgstr "Profiel &weergeven" + +#: chat/contactframe.cpp:307 +msgid "Ed&it Notes" +msgstr "Opmerkingen &bewerken" + +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" -msgstr "&Contactpersoon toevoegen" +msgstr "Contactpersoon &toevoegen" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" -msgstr "Cont&actpersoon toestaan" +msgstr "Contactpersoon &toestaan" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" -msgstr "Contactpersoon verwij&deren" +msgstr "Contactpersoon &verwijderen" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "Contactpersoon &blokkeren" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" -msgstr "Blokkering &opheffen" +msgstr "Contactpersoon &deblokkeren" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" -msgstr "&Uw roepnaam" +msgstr "&Schermnaam" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "&Persoonlijk bericht" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" -msgstr "&Emailadres" +msgstr "&E-mailadres" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "&Kopiëren..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" +msgstr "&Kopiëren" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Geblokkeerd" -#: chat/contactframe.cpp:652 -#, fuzzy +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" -msgstr "Deze contactpersoon is niet online" +msgstr "Het contact is %1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" +"

U hebt nog geen eigen emoticons toegevoegd.

Om nieuwe " +"emoticons toe te voegen, klik hier!

" -#: chat/emoticonsidebar.cpp:212 -#, fuzzy +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" -msgstr "Contactpersoon toevoegen" +msgstr "Aan chatgesprek toevoegen" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Emoticon invoegen" +msgid "Add New" +msgstr "Nieu&we toevoegen..." -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" -msgstr "" +msgstr "Bewerken" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 -#, fuzzy +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" -msgstr "Verwijderd" +msgstr "Verwijderen" -#: contact/contactbase.cpp:280 -msgid "Windows Mobile" -msgstr "" - -#: contact/contactbase.cpp:284 +#: chat/winkswidget.cpp:106 #, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

U hebt nog geen eigen emoticons toegevoegd.

Om nieuwe " +"emoticons toe te voegen, klik hier!

" + +#: contact/contactbase.cpp:304 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:308 msgid "Web Messenger" -msgstr "Webdesign" - -#: contact/contactbase.cpp:288 -msgid "Office Communicator" -msgstr "" - -#: contact/contactbase.cpp:292 -msgid "Messenger Bot" -msgstr "" - -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 -msgid "MSN Messenger %1 compatible" -msgstr "" +msgstr "Web Messenger" #: contact/contactbase.cpp:312 -#, fuzzy -msgid "Windows Live Messenger %1" -msgstr "Webdesign" +msgid "Office Communicator" +msgstr "Office Communicator" #: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" +msgid "Messenger Bot" +msgstr "Messenger-bot" -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1-compatibel" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" -msgstr "" +msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1-compatibel" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1-compatibel" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Online" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Offline" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Toegestaan" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Verwijderd" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 %2" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 %2" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Afwezig" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Ben zo terug" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Bezig" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Onzichtbaar" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Afwezig" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "Afwezig met auto-beantwoorden" + +#: contact/msnstatus.cpp:160 msgid "Idle" -msgstr "Niets te doen" +msgstr "Inactief" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Ben zo terug" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Aan de telefoon" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Aan het lunchen" -#: dialogs/addcontactdialog.cpp:48 -#, fuzzy +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Onzichtbaar" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Offline" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Mijn status" + +#: contact/msnstatus.cpp:215 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Verbinding verbreken" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" -msgstr "Contactpersoon toevoegen" +msgstr "Een contactpersoon toevoegen" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Groep verwijderen" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" -msgstr "Emoticon toevoegen" +msgstr "Nieuwe emoticon toevoegen" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "Emoticons" +msgstr "Emoticon bewerken" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "De emoticon \"%1\" bestaat al, wilt u die vervangen?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "De emoticon \"%1\" bestaat al, wilt u deze vervangen?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "Stel een Afwezig-bericht op" +#: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "'Automatisch afwezig'-bericht" -#: dialogs/contactaddeduserdialog.cpp:33 -msgid "You have been added by someone" -msgstr "" +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Chatgeschiedenis" -#: dialogs/contactaddeduserdialog.cpp:85 -#, fuzzy +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." msgstr "" -"%1\n" -"heeft u toegevoegd aan zijn/haar lijst van contactpersonen. Wilt u:" +"Er is een probleem opgetreden tijdens het openen van uw logs. Dit is meestal " +"een permissieprobleem, controleer of u lees/schrijftoegang heeft tot de map " +"\"%1\". Uw logbestanden kunnen ook beschadigd zijn." -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Kon chatgeschiedenis niet openen" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "U bent door iemand toegevoegd" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"heeft u aan zijn of haar contactenlijst toegevoegd." + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Contactinstellingen voor %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Verbonden" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" -msgstr "" +msgstr "Nog niet gezien" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "Toon &tijd in chatberichten" +msgstr "Nog geen berichten" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" -msgstr "" +msgstr "Laatst gezien: %1" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" -msgstr "" +msgstr "Laatste bericht: %1" -#: dialogs/contactpropertiesdialog.cpp:383 -#, fuzzy -msgid "Email: %1" -msgstr "Email" +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-mailadres: %1" -#: dialogs/contactpropertiesdialog.cpp:384 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" msgid "Client: %1" -msgstr "Emailprogramma" +msgstr "Chatprogramma: %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "" +"Klik op deze knop om de schermafbeelding van deze contactpersoon te " +"herstellen" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Contactpersonen" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Contactpersonen uitnodigen" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "Contactenlijst voor %1 exporteren" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Er is niets om te exporteren" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "Bestand bestaat" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "Het bestand %1 bestaat al, wilt u het overschrijven?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "Exporteren voltooid" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "Het exporteren van uw contactenlijst is voltooid" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "Tabblad &opslaan" #: dialogs/networkwindow.cpp:79 -#, fuzzy -msgid "S&ave tab" -msgstr "Tabblad bewaren" +msgid "C&lear Tab" +msgstr "Tabblad &legen" #: dialogs/networkwindow.cpp:80 -#, fuzzy -msgid "C&lear tab" -msgstr "Tabblad wissen" +msgid "C&lose All Tabs" +msgstr "&Alle tabbladen sluiten" -#: dialogs/networkwindow.cpp:1054 -#, fuzzy +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." -msgstr "Er zijn geen verbindingen. Kan het netwerkvenster niet openen." +msgstr "" +"Er zijn geen verbindingen aanwezig.\n" +"Kan het Netwerkvenster niet openen." -#: dialogs/networkwindow.cpp:1100 -#, fuzzy +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -"Kan de log voor het netwerkvenster niet opslaan. Controleer uw permissie " -"voor schrijven in de map waar de log moet worden opgeslagen." +"Kon het logboek van het Netwerkvenster niet opslaan. Zorg dat u toestemming " +"hebt om in de map te schrijven waarin het bewaard wordt." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." -msgstr "Kan het tabblad niet sluiten voor de voornaamste verbinding." +msgstr "Kan de hoofdconnectie niet sluiten." -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" +"Commando's naar de server sturen is een risicovolle bezigheid.
Als u " +"niet weet hoe dit werkt, kan de verbinding opeens verbroken worden, of " +"kunt u meer ernstige gevolgen oplopen.
Wees gewaarschuwd!
Wilt u doorgaan met het verzenden van dit bericht?" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" +"De payload die u probeert te verzenden eindigt niet met de gevraagde nieuwe " +"regel ('\\r\\n')!
Wilt u dat KMess deze voor u toevoegt?" -#: dialogs/networkwindow.cpp:1321 -#, fuzzy +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" -msgstr "Kan het tabblad niet sluiten voor de voornaamste verbinding." +msgstr "Kan geen commando's verzenden via deze soort verbinding!" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" -msgstr "" +msgstr "Afgebroken" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "Mislukt!" -#: dialogs/transferentry.cpp:217 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Computer" +msgstr "Voltooid" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." -msgstr "" +msgstr "%1 van %2 ontvangen." -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." -msgstr "" +msgstr "%1 van %2 verzonden" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "oneindig" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Gebruiken" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Verwijderen" + +#: dialogs/userpicturesdialog.cpp:46 #, fuzzy -msgid "Cl&ean Up" -msgstr "&Opschonen" +msgid "Choose or Remove Your Display Picture" +msgstr "Kies of verwijder uw avatar" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Afbeelding verwijderen" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete the picture?" +msgstr "Weet u zeker dat u deze schermafbeelding wilt verwijderen?" -#: emoticontheme.cpp:601 +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -"Kon het thema voor de emoticons niet opslaan. Controleer uw permissie voor " +"Kon het emoticonthema niet opslaan. Zorg dat uw toestemming hebt om te " "schrijven in de themamap '%1'." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Lach" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" -msgstr "Wink" +msgstr "Knipoog" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Tong uitsteken" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" -msgstr "Grote grijns" +msgstr "Grote lach" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Verdrietig" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "Huilen" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" -msgstr "Kwaad" +msgstr "Boos" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Verward" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" -msgstr "Beschaamd" +msgstr "Schamen" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "Teleurgesteld" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" -msgstr "Heet" +msgstr "Cool" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" -msgstr "Woest" +msgstr "Grommende tanden" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" -msgstr "Watje" +msgstr "Studiebol" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "Ziek" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Verrast" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Feest" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" -msgstr "Slaperig" +msgstr "Moe" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" -msgstr "Denk na" +msgstr "Denkend" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" -msgstr "Niet doorvertellen" +msgstr "Mond op slot" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" -msgstr "Stiekem vertellen" +msgstr "Fluisteren" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" -msgstr "Nou moe" +msgstr "Rollende ogen" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "Sarcastisch" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" -msgstr "Ik weet het niet" +msgstr "Weet niet" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Ben zo terug" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Engel" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" -msgstr "Knuffel links" +msgstr "Linkeromhelzing" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Jongen" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Rood hartje" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Rode roos" -#: emoticontheme.cpp:838 -msgid "Thumby up" -msgstr "Duim omhoog" +#: emoticontheme.cpp:851 +msgid "Thumbs up" +msgstr "Positief" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" -msgstr "Hondekop" +msgstr "Hond" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Zon" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Duivel" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" -msgstr "Knuffel rechts" +msgstr "Rechteromhelzing" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Meisje" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Gebroken hart" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" -msgstr "Verlepte roos" +msgstr "Verwelkte roos" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" -msgstr "Duim omlaag" +msgstr "Negatief" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" -msgstr "Kattekop" +msgstr "Kat" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" -msgstr "Maansikkel" +msgstr "Slapende maan" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Rode lippen" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" -msgstr "Klappen" +msgstr "Applaudiseren" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" -msgstr "Duimen" +msgstr "Gekruiste vingers" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Auto" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Vliegtuig" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Schildpad" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "Slak" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Zwart schaap" +#: emoticontheme.cpp:869 +msgid "Sheep" +msgstr "Schaap" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Geit" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" -msgstr "Vampier" +msgstr "Vleermuis" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" -msgstr "Bier" +msgstr "Biermok" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" -msgstr "Wijnglas" +msgstr "Martini-glas" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" -msgstr "Koffie" +msgstr "Koffiekopje" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" -msgstr "Taart" +msgstr "Verjaardagstaart" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Bord" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" -msgstr "Schaal" +msgstr "Kom" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Ster" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Regenboog" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" +msgstr "Regenbui" + +#: emoticontheme.cpp:882 +msgid "Lightning" msgstr "Onweer" -#: emoticontheme.cpp:869 -msgid "Lightning" -msgstr "Bliksem" - -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Paraplu" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Tropisch eiland" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "Telefoon" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Mobieltje" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" -msgstr "Email" +msgstr "E-mail" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Klok" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" -msgstr "Camera" +msgstr "Fototoestel" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" -msgstr "Filmstrook" +msgstr "Filmrol" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" -msgstr "Notitie" +msgstr "Noot" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Handboeien" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Geld" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" -msgstr "Lampje" +msgstr "Gloeilamp" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" msgstr "Sigaret" -#: emoticontheme.cpp:883 -msgid "Soccer ball" +#: emoticontheme.cpp:896 +msgid "Football ball" msgstr "Voetbal" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" -msgstr "Cadeautje" +msgstr "Pakje" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Computer" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" -msgstr "Pictogram KMess" +msgstr "KMess-pictogram" -#: initialview.cpp:226 -#, fuzzy +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "Kan niet opnieuw verbinden: account niet gevonden" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" +"Kan niet opnieuw verbinden: dit account heeft geen opgeslagen wachtwoord." + +#: initialview.cpp:280 initialview.cpp:379 +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" +"Wachten op een internetverbinding om te herverbinden...
Nu " +"herverbinden!" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" msgid "Internet connection not available." -msgstr "De server is niet bereikbaar" +msgstr "Geen internetverbinding beschikbaar" -#: initialview.cpp:377 -msgid "Connect" -msgstr "Verbinden" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +"%1 seconde wachten voor herverbinden...
Nu herverbinden!" +msgstr[1] "" +"%1 seconden wachten voor herverbinden...
Nu herverbinden!" -#: initialview.cpp:382 -#, fuzzy -msgid "Disconnect" -msgstr "Verbin&ding verbreken" +#: initialview.cpp:581 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Verbinden" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "" +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" +msgstr "&Annuleren" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "" +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "Vul zowel uw e-mailadres als uw wachtwoord in, alstublieft." -#: kmess.cpp:223 -#, fuzzy +#: initialview.cpp:657 +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Voer een geldig e-mailadres in." + +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "Contactinformatie" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "Contactpersoon %1 staat al in uw contactenlijst." + +#: kmess.cpp:250 msgid "New Group" -msgstr "Nieuwe &groep" +msgstr "Nieuwe groep" -#: kmess.cpp:226 -msgid "Add a group" -msgstr "Groep toevoegen" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Een groep toevoegen" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" -msgstr "Geef de naam voor deze groep:" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" +msgstr "Voer de naam in voor de nieuwe groep:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "" -"Weet u zeker dat u contactpersoon %1 wilt verwijderen uit de " -"lijst?" +"Weet u zeker dat u het contactpersoon %1 uit uw contactenlijst " +"wilt verwijderen?" -#: kmess.cpp:571 -msgid "Remove contact" -msgstr "Contactpersoon verwijderen" +#: kmess.cpp:579 +msgid "Remove Contact" +msgstr "Contact verwijderen" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +msgid "Remove and Block" msgstr "Verwijderen en blokkeren" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" +"De groep \"%1\" is niet leeg. Verwijder alle contacten in deze groep, " +"en probeer opnieuw." -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" -msgstr "" +msgid "Group Removal" +msgstr "Groep verwijderen" -#: kmess.cpp:628 -#, fuzzy +#: kmess.cpp:634 msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" -"Weet u zeker dat u groep %1 wilt verwijderen uit de lijst met " -"contactpersonen?" +"Weet u zeker dat u de groep %1 uit uw contactenlijst wilt " +"verwijderen?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" -msgstr "Verwijderd" +msgstr "Verwijderen" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." -msgstr "Dit is een speciale groep die niet kan worden gewijzigd." +msgstr "Dit is een speciale groep, die niet gewijzigd kan worden." -#: kmess.cpp:671 -msgid "Rename group" +#: kmess.cpp:677 +msgid "Rename Group" msgstr "Groep hernoemen" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Voer de nieuwe naam in voor deze groep:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" +"

Kan niet automatisch inloggen met account\"%1\":
U moet eerst " +"het accountwachtwoord opslaan.

" -#: kmess.cpp:746 -#, fuzzy +#: kmess.cpp:757 msgctxt "dialog title" -msgid "Autologin failed" -msgstr "Aanmelden is mislukt" +msgid "Autologin Failed" +msgstr "Automatisch inloggen mislukt" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Verbinden..." + +#: kmess.cpp:1123 +msgctxt "Status bar message" msgid "Disconnected" -msgstr "Niet verbonden" +msgstr "Verbinding verbroken" -#: kmess.cpp:1408 -#, fuzzy +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "

KMess heeft in de volgende mappen gezocht:
%1

" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" -"

Geluid afspelen en meldingen zijn niet mogelijk.

Het KMess-" -"bestand 'eventsrc' is niet aanwezig in een van de volgende mappen: %1

" -"Controleer uw installatie en kopieer het ontbrekende bestand in een van de " -"genoemde mappen.

" +"

KMess kan geen geluiden afspelen, of meldingen weergeven.

" +"Het vereiste bestand 'kmess.notifyrc' kon niet gevonden worden in de " +"programmamap.

%1

Controleer uw installatie.

" -#: kmess.cpp:1412 -msgid "Error with notifications" -msgstr "Fout met meldingen" +#: kmess.cpp:1481 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Probleem met meldingen" -#: kmess.cpp:1589 -#, fuzzy -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Acties" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "&Nieuwe contactpersoon" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Nieuwe &groep" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "Zoeken naar &contactpersoon" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Zoeken volgens &interesse" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "Zoeken naar &contactpersoon" +msgstr "KMess - %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Nieuwe &account" +msgid "&Disconnect" +msgstr "Verbinding &verbreken" #: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" +msgid "Show My &Profile" +msgstr "Mijn &profiel weergeven" + +#: kmessinterface.cpp:169 +msgid "Show &Allowed Contacts" +msgstr "&Toegestane contacten weergeven" + +#: kmessinterface.cpp:170 +msgid "Show &Offline Contacts" +msgstr "&Offline contacten weergeven" + +#: kmessinterface.cpp:171 +msgid "Show &Removed Contacts" +msgstr "&Verwijderde contacten weergeven" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &History Box" +msgstr "Chatgesc&hiedenis weergeven" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "&Zoekbalk weergeven" + +#: kmessinterface.cpp:174 +msgid "Show &Empty Groups" +msgstr "&Lege groepen weergeven" + +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "&Afbeeldingsgrootte weergeven" + +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "&Contacten sorteren op" + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "&Bestandsoverdrachten weergeven" #: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Accounti&nstellingen" +msgid "New &Contact..." +msgstr "Nieuw &contactpersoon..." -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "&Verbinden" +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "Nieuwe &groep..." -#: kmessinterface.cpp:214 -msgid "&Disconnect" -msgstr "Verbin&ding verbreken" +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "Contactenlijst &exporteren..." -#: kmessinterface.cpp:215 -msgid "Show My &Profile" -msgstr "Mijn &profiel tonen" +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "C&ontacten zoeken" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Mijn status" +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Op &interesse zoeken" -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Afwezig met auto-antwoord" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 -msgid "Show &Allowed Contacts" -msgstr "Toon toegest&ane contactpersonen" - -#: kmessinterface.cpp:316 -msgid "Show &Offline Contacts" -msgstr "Toon &offline contactpersonen" - -#: kmessinterface.cpp:317 -msgid "Show &Removed Contacts" -msgstr "Toon verwijde&rde contactpersonen" - -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:187 #, fuzzy -msgid "Show &Empty Groups" -msgstr "&Emoticons weergeven" +msgid "Show Chat &History..." +msgstr "Chatgesc&hiedenis weergeven" -#: kmessinterface.cpp:321 -#, fuzzy -msgid "Display Pictures Size" -msgstr "Afbeelding tonen" +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "Nieuw &account..." -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" +#: kmessinterface.cpp:189 +msgid "Configure Account..." +msgstr "Account instellen..." -#: kmessinterface.cpp:323 -#, fuzzy +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "&KMess instellen..." + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "Keuze&menu tonen" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "Niet weergeven" + +#: kmessinterface.cpp:195 msgid "Small" -msgstr "Lach" +msgstr "Klein" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" -msgstr "" +msgstr "Gemiddeld" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" -msgstr "" +msgstr "Groot" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "&Contactpersonen sorteren op" - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "Groep" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Online/Offline" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "Gemengd" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "Venster voor &bestandsoverdrachten" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." +msgstr "&Netwerkvenster weergeven" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "Toon &netwerkvenster" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "Luistert nu naar %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "[%1] ingelogd met %2" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr "" +msgstr "[%1] %2 gaat online" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr "" +msgstr "[%1] %2 gaat offline" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" -msgstr "Cha&t" +msgstr "Cha&tten" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Eigenschappen" -#: kmessview.cpp:569 -msgid "&Remove from group" -msgstr "Verwij&deren uit groep" +#: kmessview.cpp:600 +msgid "&Remove From Group" +msgstr "Uit groep &verwijderen" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "Luistert naar %1" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "&Nummer" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" -msgstr "Naar &groep kopiëren" +msgstr "Naar groep &kopiëren" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" -msgstr "Naar &groep verplaatsen" +msgstr "Naar groep &verplaatsen" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" -msgstr "Groep om&laag verplaatsen" +msgstr "Groep naar &beneden verplaatsen" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" -msgstr "Groep &omhoog verplaatsen" +msgstr "Groep naar b&oven verplaatsen" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" -msgstr "Groep verwij&deren" +msgstr "Groep &verwijderen" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Groep &hernoemen" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "Email" - -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." msgstr "" +"%1 (%2)\n" +"heeft u aan zijn of haar contactenlijst toegevoegd." -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" - -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" - -#: kmessview.cpp:1085 +#: kmessview.cpp:1133 #, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-mailadres:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Chatprogramma: %1" + +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "Ja" + +#: kmessview.cpp:1156 +msgid "No" +msgstr "Nee" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Geblokkeerd" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Laatst gezien: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Laatste bericht: %1" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" -msgstr "
%1 (%2)" +msgstr "Groep %1" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "Contactpersonen" - -#: kmessview.cpp:1095 -#, fuzzy +#: kmessview.cpp:1212 msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Deze contactpersoon is niet online" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 contactpersoon, %2 online" +msgstr[1] "%1 contactpersonen, %2 online" -#: kmessview.cpp:1504 -#, fuzzy +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contactpersoon" +msgstr[1] "%1 contactpersonen" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" -msgstr "Type hier uw persoonlijke bericht in" +msgstr "<Voer hier uw persoonlijk bericht in>" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" +"Voer hier een bericht in om aan uw contacten te tonen. Het wordt samen met " +"uw schermnaam weergeven." + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1 nieuwe e-mail" +msgstr[1] "%1 nieuwe e-mails" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" -msgstr "" +msgstr "Een MSN-programma voor KDE" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:60 msgid "Developer and project founder" -msgstr "" +msgstr "Ontwikkelaar en projectstichter" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:61 msgid "Developer" -msgstr "" +msgstr "Ontwikkelaar" -#: main.cpp:72 -#, fuzzy +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 msgid "Project support" -msgstr "Ondersteuning voor 'P4-context'veld" +msgstr "Projectondersteuning" -#: main.cpp:73 main.cpp:74 main.cpp:75 -#, fuzzy +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" -msgstr "Ontwikkelaar van GnomeMeeting" +msgstr "Huidige ontwikkelaar" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastasi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "" -"Duitse vertaling, testen, documentatie, webmaster, projectbeheer, etc..." +"Duitse vertaling, testen, documentatie, webmaster, projectmanagement, enz..." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:70 msgid "Web design" -msgstr "Webdesign" +msgstr "Webontwerp" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "David Vignoni" + +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "" -"De verzamelingen van belangrijkste en geel/blauw/paarse emoticons, en de " -"Italiaanse vertaling" +"De emoticonthema's geel,blauw en violet, en het hoofdthema, Italiaanse " +"vertaling" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:72 msgid "Cartoon emoticons" -msgstr "Cartoonemoticons" +msgstr "Cartoonachtige emoticons" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Standaard geluidsthema" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" -msgstr "" +msgstr "KMess-pictogram in de Oxygenstijl" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "Vertalingsonderhouder" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." -msgstr "" -"Arabische vertaling, internationalisatie van verbetering opslaan bestanden." +msgstr "Arabische vertaling, internationalisatie van patch voor bestandsopslag" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "Verdere Arabische vertaling" -#: main.cpp:89 -msgid "Brazilian Portuguese translation" -msgstr "Braziliaans-Portugese vertaling" +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" -#: main.cpp:90 +#: main.cpp:81 +msgid "Brazilian Portuguese translation" +msgstr "Braziliaanse/Portugese vertaling" + +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "Verdere Braziliaanse/Portugese vertaling" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Catalaanse vertaling" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" -"Eenvoudig-Chinese vertaling, verbetering fout bestandsoverdracht, " -"programmacode voor verbinden met proxy" +"Vereenvoudigde Chinese vertaling, bugfix voor bestand verzenden, code voor " +"proxy verbinden" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" -msgstr "Verdere Eenvoudig-Chinese vertaling" +msgstr "Verdere Vereenvoudigde Chinese vertaling" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:89 msgid "Traditional Chinese translation" -msgstr "Traditioneel-Chinese vertaling" +msgstr "Traditionele Chinese vertaling" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinees" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "Verdere Traditionele Chinese vertaling" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:92 msgid "Danish translation" msgstr "Deense vertaling" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:93 msgid "More Danish translation" msgstr "Verdere Deense vertaling" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:94 msgid "Dutch translation" msgstr "Nederlandse vertaling" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "Verdere Nederlandse vertaling" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:97 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "Verdere Duitse vertaling, Griekse vertaling" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:101 +msgid "More Greek translation" +msgstr "Verdere Griekse vertaling" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:103 msgid "Estonian translation" msgstr "Estse vertaling" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:104 msgid "Finnish translation" msgstr "Finse vertaling" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "Verdere Finse vertaling" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:108 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:108 msgid "French translation" msgstr "Franse vertaling" -#: main.cpp:108 -msgid "More French translation, MSN6 emoticon definitions" -msgstr "Verdere Franse vertaling, definities MSN6-emoticons" +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" #: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "Verdere Franse vertaling, emoticondefenities van MSN 6" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" msgstr "Verdere Franse vertaling" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "Hongaarse vertaling" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "Verdere Hongaarse vertaling" + +#: main.cpp:115 main.cpp:116 msgid "More Italian translation" msgstr "Verdere Italiaanse vertaling" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:117 msgid "Korean translation" msgstr "Koreaanse vertaling" -#: main.cpp:115 -msgid "Norsk Bokmål translation" -msgstr "Vertaling naar Noors Bokmål" +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" -#: main.cpp:117 +#: main.cpp:118 +msgid "Norsk Bokmål translation" +msgstr "Noorse vertaling" + +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:120 +msgid "Serbian translation" +msgstr "Servische vertaling" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "Slowaakse vertaling" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "Matjaž kaše" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "Sloveense vertaling" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Spaanse vertaling" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 msgid "More Spanish translation" msgstr "Verdere Spaanse vertaling" -#: main.cpp:123 +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "Christian Lundgren " + +#: main.cpp:132 msgid "Swedish translation" msgstr "Zweedse vertaling" -#: main.cpp:125 -msgid "Thai translation" -msgstr "Siamese vertaling" +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" -#: main.cpp:126 +#: main.cpp:133 +msgid "More Swedish translation" +msgstr "Verdere Zweedse vertaling" + +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:135 +msgid "Thai translation" +msgstr "Thaise vertaling" + +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:136 msgid "Turkish translation" msgstr "Turkse vertaling" -#: main.cpp:127 main.cpp:128 +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:137 main.cpp:138 msgid "More Turkish translation" msgstr "Verdere Turkse vertaling" -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" - -#: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" -msgstr "" - -#: main.cpp:133 -#, fuzzy -msgid "File transfer thumbnails" -msgstr "Bestandsoverdrachten" - -#: main.cpp:134 -msgid "P4-Context field support" -msgstr "Ondersteuning voor 'P4-context'veld" - -#: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Verbeterde ondersteuning van Xinerama" - -#: main.cpp:136 -msgid "Original file receive code" -msgstr "Originele programmacode voor de ontvangst van bestanden" - -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" -msgstr "" - #: main.cpp:138 -#, fuzzy -msgid "KWallet support" -msgstr "Ondersteuning voor 'P4-context'veld" +msgid "Uğur Çetin" +msgstr "Uğur Çetin" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" -msgstr "" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" +msgstr "Ondersteuning voor MSN P 12, verschillende patches" #: main.cpp:142 -#, fuzzy -msgid "Various internationalization fixes" -msgstr "Verscheidene verbeteringen van internationalisatie." +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" +"Afbeeldingen in de code van de contactenlijst, informatie over chatprogramma " +"van contact, vergroten van lettertypen in chat" #: main.cpp:143 -msgid "Various internationalization fixes." -msgstr "Verscheidene verbeteringen van internationalisatie." +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:143 +msgid "File transfer thumbnails" +msgstr "Voorvertoningen tijdens bestandsoverdracht" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "P4-context-ondersteuning in tekstvelden" #: main.cpp:145 -msgid "GnomeMeeting developer" -msgstr "Ontwikkelaar van GnomeMeeting" +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Fixes betreft Xinerama" #: main.cpp:146 -msgid "Guy with a bag over his head" -msgstr "Jongen met zak over zijn hoofd" +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "Oorspronkelijke code voor ontvangen van bestanden" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "Ondersteuning voor KWallet" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" +"Optie voor blokkeren van meldingen, optie voor uitzetten van winks, datum " +"van laatste bericht-mogelijkheid" #: main.cpp:149 -msgid "Inspiration and assorted code" -msgstr "Inspiratie en wat programmeerwerk" +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "IRC-achtige commando's in het chatvenster" #: main.cpp:150 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" msgstr "" -"Oude programmacode voor aankondigingen, basis van de p2p-code, \"msn " -"challenge handler\"" #: main.cpp:151 -msgid "Idle timer code" -msgstr "Programmacode voor \"Niet actief\"-tijdsduur" +msgid "Dario Freddi" +msgstr "" -#: main.cpp:152 +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "Chatgeschiedenis" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "Verschillende internationalisatiefixes" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:155 +msgid "Various internationalization fixes." +msgstr "Verschillende internationalisatiefixes." + +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:157 +msgid "GnomeMeeting developer" +msgstr "GnomeMeeting-ontwikkelaar" + +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:158 +msgid "Guy with a bag over his head" +msgstr "Gast met een zak over z'n hoofd" + +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 +msgid "Inspiration and assorted code" +msgstr "Inspiratie en code" + +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:162 +msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgstr "" +"Oude code voor popup-meldingen, oorspronkelijke p2p-code, msn " +"challengehandler" + +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 +msgid "Idle timer code" +msgstr "Code voor inactiviteitsteller" + +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" +"Code voor screenshot met instructies betreft het sluiten naar het systeemvak" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:165 msgid "Custom crash handler implementation" -msgstr "" +msgstr "Implementatie van eigen crash-handler" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" msgstr "Uw naam hier?" -#: main.cpp:156 -#, fuzzy +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -"Wij zien gaarne uw verbeteringen en bijbehorende programmacode tegemoet in " -"de helpforums van KMess!\n" -"Als u meent dat uw naam hier ontbreekt, neemt u dan contact met ons op!" - -#: main.cpp:159 -#, fuzzy -msgctxt "NAME OF TRANSLATORS" -msgid "Your names" -msgstr "Uw naam" - -#: main.cpp:160 -#, fuzzy -msgctxt "EMAIL OF TRANSLATORS" -msgid "Your emails" -msgstr "Uw emailadres:" - -#: main.cpp:166 -msgid "Autologin with the given email address" -msgstr "Automatisch inloggen met opgegeven emailadres" +"U bent van harte welkom om bugfixes and patches te versturen naar de " +"ondersteuningfora van KMess!\n" +"Neem alstublieft contact met ons op wanneer u denkt dat uw naam hier niet " +"bij staat!" #: main.cpp:171 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Uw namen" + +#: main.cpp:172 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your emails" +msgstr "Uw e-mails" + +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "Het contactenvenster niet weergeven tijdens opstarten" + +#: main.cpp:179 +msgid "Autologin with the given email address" +msgstr "Automatisch inloggen met het opgegeven e-mailadres" + +#: main.cpp:184 msgid "Run a debug test (developer build only)" -msgstr "" +msgstr "Een debugtest starten (alleen voor ontwikkelaars!)" + +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "Individuelen" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Toegestaan" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Verwijderd" #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." -msgstr "De contactpersoon heeft de sessie afgebroken." +msgstr "De contactpersoon heeft de sessie beëindigd." #: network/applications/application.cpp:306 msgid "The contact rejected the invitation." @@ -3068,1447 +4452,1654 @@ msgstr "De contactpersoon heeft de uitnodiging geweigerd." #: network/applications/application.cpp:378 msgid "You have cancelled the session." -msgstr "U heeft de sessie afgebroken." +msgstr "U hebt de sessie beëindigd." #: network/applications/application.cpp:390 msgid "You have rejected the invitation." -msgstr "U heeft de uitnodiging geweigerd." +msgstr "U hebt de uitnodiging geweigerd." #: network/applications/application.cpp:540 -#, fuzzy -msgid "Do you want to
accept or cancel?" -msgstr "Wilt u aanvaarden of weigeren?" +msgid "Do you want to accept or cancel?" +msgstr "Wilt u dit accepteren of weigeren?" #: network/applications/application.cpp:581 -#, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "Klik om te weigeren." -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Wilt u dit bestand accepteren: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "De contactpersoon wilt u een bestand verzenden: "%1" (%2)." -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "De overdracht van %1 is mislukt. Kon het bestand niet openen." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Het bestand "%1" bestaat al.\n" +"Wilt u het overschrijven?" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "" +"De bestandsoverdracht van bestand "%1" is mislukt. Kon het bestand " +"niet opslaan." + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "" +"De bestandsoverdracht van %1 is mislukt. Kon het bronbestand niet openen." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Overdracht geaccepteerd." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" -msgstr "Wordt verbonden met %1, poort %2" +msgstr "Verbinden met %1, poort %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "De overdracht werd afgebroken" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "" +"De contactpersoon heeft de bestandsoverdracht van "%1" geannuleerd." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "U hebt de bestandsoverdracht van "%1" geannuleerd." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "U hebt de bestandsoverdracht van "%1" geweigerd." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Verbinding gemaakt" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" -msgstr "Bestand met succes verzonden: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "Bestand "%1" succesvol verzonden." -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "De overdracht van %1 is mislukt. Het bestand bestaat niet." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "Bestand "%1" succesvol ontvangen." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "De overdracht van %1 is mislukt. Het bestand kon niet worden gelezen." - -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "%1 wordt nu verzonden" - -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 -msgid "Negotiating options to connect" +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "" +"Bestandsoverdracht van "%1" is mislukt. Het bestand bestaat niet." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "" +"Bestandsoverdracht van "%1" is mislukt. Het bestand kan niet " +"gelezen worden." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Verzenden van bestand "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "" +"De contactpersoon heeft de bestandsoverdracht van "%1" " +"geaccepteerd." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 +msgid "Negotiating options to connect" +msgstr "Onderhandelingsopties om te verbinden" #: network/applications/filetransferp2p.cpp:129 #: network/applications/filetransferp2p.cpp:143 #: network/applications/filetransferp2p.cpp:160 #: network/extra/msnftpconnection.cpp:132 msgid "The file transfer invitation was cancelled. Bad data was received." -msgstr "De bestandsoverdracht werd afgebroken. Verkeerde gegevens ontvangen." - -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." msgstr "" +"De uitnodiging voor de bestadsoverdracht is geannuleerd. Er is corrupte data " +"ontvangen." -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"Bestand '%1' bestaat al.\n" -"wilt u het overschrijven?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "De overdracht van %1 is mislukt. Kon het bestand niet openen." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." -msgstr "" +msgstr "U hebt de bestandsovderdracht van "%1" geaccepteerd." -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "De contactpersoon heeft de overdracht afgebroken." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "U heeft de sessie afgebroken." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" -msgstr "" - -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Bestand met succes verzonden: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Bestand met succes verzonden: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "De overdracht van %1 is mislukt. Het bestand bestaat niet." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "De overdracht van %1 is mislukt. Het bestand kon niet worden gelezen." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Bestand %1 (%2) wordt nu verzonden" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "De contactpersoon heeft de overdracht afgebroken." +msgstr "Bestand kon niet geschreven worden" #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "U wordt uitgenodigd een vergadering te starten (met GnomeMeeting)." +msgstr "U bent uitgenodigd voor een meeting (gebruikmakend van GnomeMeeting)." #: network/applications/gnomemeeting.cpp:118 msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "GnomeMeeting wordt gestart. Wordt verbonden met %1." +msgstr "GnomeMeeting starten. Verbinden met %1." #: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." -msgstr "De contactpersoon uitnodigen voor een vergadering." +msgstr "Nodig deze contact uit voor een meeting." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" -"De uitnodiging werd geweigerd. Het programma dat de contactpersoon gebruikt " -"ondersteunt deze functie niet." +"De uitnodiging is afgewezen. Ze wordt niet ondersteund door het " +"chatprogramma van deze contactpersoon." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." -msgstr "De uitnodiging is afgebroken. Er is een interne fout is opgetreden." +msgstr "De uitnodiging is afgebroken. Er is een interne fout opgetreden." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "" -"De uitnodiging is afgebroken. Er is niet tijdig gereageerd op de " -"uitnodiging." +"De uitnodiging is afgebroken. Er deed zich een time-out voor terwijl er werd " +"gewacht op de gebruiker." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "" -"De uitnodiging is afgebroken. Het wachten op bestandsgegevens duurde te " -"lang." +"De uitnodiging is afgebroken. Er deed zich een time-out voor terwijl er werd " +"gewacht op data." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" -"De uitnodiging is afgebroken. De chatverbinding werd afgesloten door de " -"schakelserver." +"De uitnodiging is afgebroken. Het schakelbord heeft de chatverbinding " +"gesloten." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." -msgstr "De uitnodiging werd afgebroken." +msgstr "De uitnodiging is afgebroken." #: network/applications/msnremotedesktop.cpp:52 msgid "You are invited to share this person's desktop." -msgstr "U wordt uitgenodigd het bureaublad van deze persoon te delen." +msgstr "U bent uitgenodigd om het bureaublad van deze persoon te bekijken." #: network/applications/msnremotedesktop.cpp:159 msgid "Starting KRDC. Connecting to %1." -msgstr "KRDC wordt gestart. Wordt verbonden met %1." - -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "" -"De contactpersoon heeft de uitnodiging afgewezen. Er is een interne fout " -"opgestreden." - -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "De overdracht is mislukt." - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 -msgid "" -"The invitation was cancelled. The contact sent bad data, or KMess doesn't " -"support it." -msgstr "" -"De uitnodiging is afgebroken. De contactpersoon stuurde onjuiste gegevens, " -"of KMess ondersteunt die niet." - -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"De overdracht is mislukt. De contactpersoon stuurde onjuiste gegevens, of " -"KMess ondersteunt die niet." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "" -"De overdracht is mislukt. Het wachten op acceptatie door contactpersoon " -"duurde te lang." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "De overdracht is mislukt. Er is een interne fout is opgetreden." - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "De overdracht is mislukt. Kon gegevensbron niet openen." +msgstr "KRDC starten. Verbinden met %1." #: network/applications/p2papplication.cpp:215 msgid "The contact initiated a MSN6 feature KMess can't handle yet." msgstr "" -"De contactpersoon heeft een MSN6-functie gestart die KMess nog niet " -"ondersteunt." +"De contactpersoon heeft een MSN 6-handeling gestart, die KMess nog niet kan " +"uitvoeren." -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"support it." +msgstr "" +"De uitnodiging is afgebroken. De contactpersoon heeft corrupte data " +"verzonden, of KMess ondersteunt dit niet." + +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." -msgstr "De overdracht is mislukt. Gereed maken van gegevens niet gelukt." +msgstr "De overdracht is mislukt. De datavoorbereiding is mislukt." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." -msgstr "De uitnodiging is afgebroken. Het bericht was niet voor ons." +msgstr "" +"De uitnodiging is geannuleerd. Het bericht werd niet naar ons verstuurd." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" -"De overdracht is mislukt. De contactpersoon stuurde onjuiste gegevens, of " -"KMess ondersteunt die niet." +"De overdracht is afgebroken. De contactpersoon heeft corrupte data " +"verzonden, of KMess ondersteunt dit niet." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "" +"De contactpersoon heeft de uitnodiging geweigerd. Er is een interne fout " +"opgetreden." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" -msgstr "Wacht op verbinding op %1, poort %2" +msgstr "Wachten op verbinding op %1, poort %2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." -msgstr "Terug naar indirecte bestandsoverdracht (mogelijk langzamer)." +msgstr "" +"Terugschakelen naar indirecte bestandsoverdracht (is mogelijk langzaam)" -#: network/applications/p2papplication.cpp:3113 -#, fuzzy +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" -msgstr "Wachten op lijst met contactpersonen..." +msgstr "Wachten op verbinding" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "" -"De uitnodiging is afgebroken. Er werd door contactpersoon niet tijdig " -"gereageerd op de uitnodiging." +"De uitnodiging is afgebroken. Er deed zich een time-out voor terwijl er werd " +"gewacht op de contactpersoon." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "" -"De uitnodiging is geannuleerd. Het wachten op het slagen of mislukken van de " -"verbinding duurde te lang." +"De uitnodiging is afgebroken. Er deed zich een time-out voor terwijl er werd " +"gewacht op een succesvolle of mislukte verbindingspoging." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "De uitnodiging is geannuleerd. Het wachten op gegevens duurde te lang." +msgstr "" +"De uitnodiging is afgebroken. Er deed zich een time-out voor terwijl er werd " +"gewacht op data." + +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "De overdracht is mislukt." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"De overdracht is afgebroken. De contactpersoon heeft corrupte data " +"verzonden, of KMess ondersteunt dit niet." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" +"De overdracht is mislukt. Er deed zich een time-out voor terwijl er werd " +"gewacht op de contactpersoon." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "De overdracht is mislukt. Er deed zich een interne fout voor." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "De overdracht is mislukt. Kon de databron niet openen." #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." -msgstr "U wordt uitgenodigd voor een gesprek (microfoon)." +msgstr "U bent uitgenodigd voor een audiogesprek." #: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" msgstr "" -"U wordt uitgenodigd voor een gesprek (microfoon), maar deze mogelijkheid is " -"niet geïnstalleerd" +"U bent uitgenodigd voor een audiogesprek, maar de ondersteuning hiervoor is " +"niet aanwezig" #: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." -msgstr "U heeft de uitnodiging voor een gesprek (microfoon) geannuleerd." +msgstr "U hebt het audiogesprek beëindigd." #: network/applications/voiceconversation.cpp:205 msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "De uitnodiging werd geannuleerd. Er is geen microfoon beschikbaar." +msgstr "" +"De uitnodiging is geannuleerd. Het audioapparaat kon niet geopend worden." #: network/applications/voiceconversation.cpp:218 msgid "Start voice conversation. Connecting to %1." -msgstr "Start gesprek (microfoon). Verbinden met %1." +msgstr "Audiogesprek starten. Verbinden met %1." #: network/applications/voiceconversation.cpp:224 msgid "Start voice conversation. Listening on %1." -msgstr "Start gesprek (microfoon). Luisteren op %1." +msgstr "Audiogesprek starten. Luisteren op %1." #: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." -msgstr "De contactpersoon wordt uitgenodigd voor een gesprek (microfoon)." +msgstr "Contactpersoon uitnodigen voor een audiogesprek." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" -"De contactpersoon nodigt u uit voor '%1', maar deze functie wordt in KMess " -"nog niet ondersteund." +"De contactpersoon nodigt u uit voor '%1', maar dit is nog niet mogelijk in " +"KMess." -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "De webcamuitnodiging is geannuleerd. Er werd corrupte data ontvangen." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "U bent gevraagd om uw webcambeeld uit te zenden." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "U bent uitgenodigd om het webcambeeld van deze persoon te kijken." + +#: network/applications/webcamtransferp2p.cpp:147 msgid "webcam" -msgstr "" - -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "Het verzenden van %1 is.geannuleerd." +msgstr "webcam" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" -msgstr "" +msgstr "Mislukt" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "" -"De overdracht van %1 is mislukt. Kon geen poort openen op deze computer." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Bestand verzenden naar %1" -#: network/extra/msnftpconnection.cpp:408 -#, fuzzy +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "De bestandsoverdracht van %1 is mislukt. Kon geen lokale poort openen." + +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." -msgstr "" -"De overdracht van %1 is mislukt. Kon geen poort openen op deze computer." +msgstr "Kon geen lokale poort openen." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" -msgstr "Beginnen met de bestandsoverdracht" +msgstr "Bestandsoverdracht beginnen" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." msgstr "" -"De overdracht van %1 is mislukt. Er kon geen verbinding worden gemaakt" +"De overdracht van %1 is mislukt. Er kon geen verbinding worden gemaakt." -#: network/extra/msnftpconnection.cpp:479 -#, fuzzy +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." -msgstr "Er kon geen verbinding worden gemaakt: %1" +msgstr "Kon geen verbinding maken." -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" -msgstr "Bestand %1 wordt ontvangen" +msgstr "Ontvangen van bestand %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"KMess heeft geen toegang tot de andere webservice.\n" -"\n" -"Details: %1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Uw verbinding is verbroken omdat u reeds een\n" -"verbinding heeft via een ander MSN Messenger-\n" -"programma of vanaf een andere locatie" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Synchronisatie verkregen" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Aanmelden" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "Wachten op lijst met contactpersonen..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "Aanmelden is mislukt, controleer uw gebruikersnaam en wachtwoord" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Verbinden..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess ontving een onbekende opdracht van de server: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" -msgstr "" +msgstr "Ongeldige commandosyntaxis" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" -msgstr "" +msgstr "Ongeldige commandoparameter" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" -"Het emailadres dat u probeert toe te voegen is geen account van MSN Messenger" +"Het e-mailadres dat u probeert toe te voegen is geen geldig MSN Messenger-" +"account" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" -msgstr "" +msgstr "Ontbrekende domeinnaam" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" -msgstr "" +msgstr "Al ingelogd" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" -msgstr "De opgegeven gebruikersnaam is ongeldig" +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" +msgstr "De opgegeven accountnaam is ongeldig" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -"De opgegeven gebruikersnaam is ongeldig, of uw \"paspoort\" is nog niet " -"bevestigd" +"Deze accountnaam is ongeldig, of uw Passport-account is nog niet bevestigd" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" -msgstr "Uw lijst met contactpersonen is vol" +msgstr "Uw contactenlijst is vol" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" -msgstr "" +msgstr "Ongeldige SBP-parameter" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" -msgstr "Deze contactpersoon is al in uw lijst opgenomen" +msgstr "Deze contactpersoon staat al in uw lijst" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" -msgstr "Deze contactpersoon is niet in uw lijst opgenomen" +msgstr "Deze contactpersoon staat niet in uw lijst" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "Deze contactpersoon is niet online" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" +msgstr "Al reeds in deze modus" + +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." msgstr "" +"Deze contactpersoon kan niet tegelijkertijd aan de lijst voor toegestane en " +"geblokkerde contacten toegevoegd worden." -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Deze contactpersoon is niet in uw lijst opgenomen" - -#: network/msnnotificationconnection.cpp:2247 -#, fuzzy +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -"Deze naam voor een groep komt reeds voor in uw lijst van contactpersonen " -"voor Messenger of Hotmail" +"Deze groepnaam is al in gebruik in uw contactenlijst. Gebruik een andere " +"naam." -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" -msgstr "Er zijn teveel groepen in uw lijst van contactpersonen" +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "" +"Uw contactenlijst heeft te veel groepen; u mag maximaal 30 groepen hebben." -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "Deze groep kan niet gewijzigd worden" -#: network/msnnotificationconnection.cpp:2260 -#, fuzzy +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" -msgstr "Er zijn teveel groepen in uw lijst van contactpersonen" +msgstr "Contact is niet aan deze groep toegevoegd" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" -msgstr "Deze groep is niet leeg" +msgstr "De groep is niet leeg" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "De opgegeven naam voor een groep is te lang" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "De groepnaam is te lang; hij kan niet langer zijn dan 61 bytes." -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" -msgstr "" +msgstr "Geprobeerd om groep \"0\" te wijzigen" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" -msgstr "Er is een interne fout opgetreden in KMess: %1" +msgstr "Er trad een interne fout op in KMess: %1" -#: network/msnnotificationconnection.cpp:2277 -#, fuzzy +#: network/msnconnection.cpp:470 msgid "Invalid Group" -msgstr "Groep &hernoemen" +msgstr "Ongeldige groep" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" -msgstr "" +msgstr "Lege domeinnaam" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "Ongeldig ADL-commandoformaat" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" -msgstr "Schakelserver is uitgevallen" +msgstr "Schakelbordserver gefaald" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" -msgstr "Overdracht naar schakelserver is mislukt" +msgstr "Overdracht naar schakelbordserver is mislukt" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "Fout in de directe verbinding (MSNSLP), verbinden is mislukt" +msgstr "Fout met directe verbinding (MSNSLP), verbinding mislukt" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" -msgstr "" +msgstr "Vereist veld mist" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" -msgstr "" +msgstr "Niet ingelogd" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Aangepaste emoticons voor deze account:" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "Dit account heeft geen toegang tot de MSN-service." -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" -msgstr "" +msgstr "Commando is uitgeschakeld" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." -msgstr "Uw account is in de ban gedaan." +msgstr "Uw account is verbannen." -#: network/msnnotificationconnection.cpp:2314 -#, fuzzy +#: network/msnconnection.cpp:512 msgid "Challenge response failed" -msgstr "De overdracht is mislukt." +msgstr "Challenge-antwoord mislukt" -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" -msgstr "" +msgstr "Corrupte commandodata" -#: network/msnnotificationconnection.cpp:2323 -#, fuzzy +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" -msgstr "U heeft teveel sessies kort na elkaar geopend" +msgstr "U opent de chatsessies te snel" -#: network/msnnotificationconnection.cpp:2327 -#, fuzzy +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" -msgstr "U heeft teveel sessies geopend" +msgstr "U hebt te veel actieve chatsessies" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" -msgstr "" +msgstr "Onverwachte commandosequentie" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" -msgstr "Ongeldige bijnaam" +msgstr "Corrupte schermnaam" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" -msgstr "" +msgstr "Corrupte CVR-data" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "De server meldt dat het van KMess teveel gegevens tegelijk ontvangt" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" +msgstr "De server meldt dat KMess hem overspoelt met data" -#: network/msnnotificationconnection.cpp:2357 -#, fuzzy +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" -msgstr "Aanmelden is mislukt" +msgstr "Aanmeldingsticket was incorrect" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." -msgstr "U kunt geen chat beginnen met iemand als u onzichtbaar bent." +msgstr "" +"U kunt geen chat met iemand starten terwijl u de status Onzichtbaar hebt." -#: network/msnnotificationconnection.cpp:2364 -#, fuzzy +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" -msgstr "De server accepteert geen nieuwe personen" +msgstr "Geen nieuwe contacten accepteren" -#: network/msnnotificationconnection.cpp:2368 -#, fuzzy +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -"Je gebruikt een \"kinderpaspoort\", vraag aan je ouders toestemming om te " -"chatten." +"Je hebt een Kids Passport-account, dus heb je toestemming van je ouders " +"nodig om online te chatten." -#: network/msnnotificationconnection.cpp:2371 -#, fuzzy -msgid "Your passport account needs to be verified first." -msgstr "Uw \"paspoort\" moet eerst bevestigd worden." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." +msgstr "Uw Passport-account moet nog geverifieerd worden." -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" -msgstr "" +msgstr "Corrupt USR-ticket" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -"Fout bij de toegang tot de lijst van contactpersonen, probeer het later " -"opnieuw" +"Een fout trad op tijdens het verkrijgen van de contactenlijst, probeer het " +"later nog eens" -#: network/msnnotificationconnection.cpp:2399 -#, fuzzy +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." -msgstr "Er is een interne serverfout" - -#: network/msnnotificationconnection.cpp:2410 -msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" +"De MSN-service is tijdelijk onbeschikbaar, er trad een interne serverfout op." -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:603 +msgid "The MSN service is temporarily unavailable, the server is too busy" +msgstr "De MSN-service is tijdelijk onbeschikbaar, de server is overbelast" + +#: network/msnconnection.cpp:607 msgid "Peer notification server down" -msgstr "Peer meldingsserver is uitgevallen" +msgstr "Peermeldingsserver offline" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "De server wordt uitgezet" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" -msgstr "De server zal zo dadelijk worden uitgezet" +msgstr "De server wordt spoedig uitgezet" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" -msgstr "Schrijven is geblokkeerd" +msgstr "Schrijven blokkeert" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "Sessie is overbelast" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" -msgstr "De server is niet bereikbaar" +msgstr "De server is niet beschikbaar" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" -msgstr "Aanmelden is mislukt" +msgstr "Aanmelden mislukt" -#: network/msnnotificationconnection.cpp:2449 -#, fuzzy -msgid "Unknown error code received from the server: %1" -msgstr "KMess ontving een onbekende opdracht van de server: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "Onbekende foutcode ontvangen van server: %1
Technische details: %2" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 -#, fuzzy +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 msgctxt "Error dialog box title" -msgid "MSN error" -msgstr "KMess - MSN-fout" +msgid "MSN Error" +msgstr "MSN-fout" -#: network/msnnotificationconnection.cpp:2596 -#, fuzzy +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "HTTP-terugvalmethode proberen..." + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Aanmelden..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Aangemeld" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Overschakelen naar andere server..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Verbinden..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "Onbekend commando ontvangen van de server: %1" + +#: network/msnnotificationconnection.cpp:2109 msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" -msgstr[0] "minuten" -msgstr[1] "minuten" +msgstr[0] "%1 minuut" +msgstr[1] "%1 minuten" -#: network/msnnotificationconnection.cpp:2599 -#, fuzzy +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" -msgstr "Waarschuwing: de server wordt over %1 minuten voor onderhoud uitgezet!" +msgstr "De server wordt afgesloten voor onderhoud over %1!" -#: network/msnnotificationconnection.cpp:2604 -#, fuzzy +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." -msgstr "" -"De MSN-server meldt dat die over een minuut voor onderhoud wordt uitgezet." +msgstr "De MSN-server wordt over %1 afgesloten voor onderhoud." -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" -msgstr "" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "SOAP-client is niet langer geldig" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -#, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" -msgstr "" -"KMess kon Offline-IM-berichten niet verwerken.\n" -"\n" -"Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess kon de offlineberichten niet doorvoeren.
Details: %1" -#: network/msnnotificationconnection.cpp:3172 -#, fuzzy +#: network/msnnotificationconnection.cpp:2589 msgid "Authentication time limit exceeded" -msgstr "Aanmelden is mislukt" +msgstr "Aanmeldstijdslimiet verlopen" -#: network/msnnotificationconnection.cpp:3218 -#, fuzzy +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Wachten op contactenlijst..." + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Waarschuwing: %1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "MSN-waarschuwing" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" -msgstr "Er is een interne fout opgetreden in KMess: %1" +msgstr "
Reden voor interne fout: %1" -#: network/msnnotificationconnection.cpp:3242 -#, fuzzy -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" -msgstr "" -"KMess kon geen verbinding maken met de servers van MSN Messenger. Deze " -"servers kunnen tijdelijk buiten dienst zijn of er is een probleem met uw " -"Internetverbinding." +msgstr "

Aanmelden mislukt, controleer uw accountnaam en wachtwoord.

" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

De account %1 is op een andere locatie aangemeld.

" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -#, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "De verbinding met de server is verbroken." - -#: network/msnnotificationconnection.cpp:3302 -#, fuzzy +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" -"Aanmelden is mislukt, KMess kon het inloggen van het paspoort niet " -"verwerken.\n" -"\n" -"Details: %1" +"

U bent uitgelogd!

Uw account is ingelogd met een ander " +"chatprogramma, of op een andere locatie.

" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Serverfout" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" +"

Kon geen verbinding maken met de Live Messenger-service.
Wellicht " +"moet u zich eerst aanmelden bij het netwerk?

" -#: network/msnsockettcp.cpp:352 -#, fuzzy +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

KMess kan geen verbinding maken met de Live Messenger-servers
Er is " +"mogelijk een probleen met uw internetverbinding, of de Live Messenger-server " +"zijn tijdelijk onbeschikbaar.
Het is mogelijk dat u zich moet aanmelden " +"bij een webpagina of proxy, voordat u toegang hebt tot het netwerk.

Klik hier om de statuspagina van de Live Messenger-service te " +"openen.

" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

Kon geen verbinding maken met de Live Messenger-service.

" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

KMess kan geen verbinding maken met de Live Messenger-servers
Er is " +"mogelijk een probleen met uw internetverbinding, of de Live Messenger-server " +"zijn tijdelijk onbeschikbaar.

Klik hier om de " +"statuspagina van de Live Messenger-service te openen.

" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Fout: %1

" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

De Live Messenger-server heeft een foutmelding gemeld:

%1

" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Messenger Service-fout: %1

" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

De Live Messenger-server heeft een foutmelding gemeld:

%1

" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Foutmelding van KMess

%1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

Er trad een interne foutmelding in KMess op:

%1

" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Netwerkverbinding verbroken.

" + +#: network/msnnotificationconnection.cpp:3017 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

Verbinding met de Live Messenger-server is verbroken.

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" +"

Informatie voor ontwikkelaars:
Foutcode: %1
Foutmelding: %2

" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Interne foutcode: %2)" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" +"%1 (Interne foutcode: %2)
Reactie: %3 %4
Omleidingsdoel: %5" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" -msgstr "Verbinding maken duurt te lang" +msgstr "Verbindings-tijdlimiet is verlopen" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" -msgstr "1 ping gemist" +msgstr "1 ping verloren" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" -msgstr "%1 pings gemist" +msgstr "%1 pings verloren" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." -msgstr "De verbinding met de server is verbroken." +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "De verbinding met de server is verbroken" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Deze persoon is offline of onzichtbaar." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "Het opgegeven e-mailadres, \"%s\", is geen geldig adres!" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" msgstr "" -"De contactpersoon heeft een MSN7-functie gestart die KMess nog niet " -"ondersteunt." +"Het opgegeven e-mailadres, \"%s\", behoort niet tot een Live Messenger-" +"account!" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "Het bericht \"%1\" is niet aangekomen!" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Ongeldige webserviceaanvraag (%1)" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "Er kon geen verbinding worden gemaakt: %1" +#: network/soap/httpsoapconnection.cpp:402 +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "De webservice is niet toegankelijk (%1)" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/httpsoapconnection.cpp:471 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Te veel redirects bij de loginservice" + +#: network/soap/httpsoapconnection.cpp:521 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "De server is niet beschikbaar" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "Te veel omleidingen door de logindienst" +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Ongeldig webserviceantwoord %1 (%2)" -#: notification/chatnotification.cpp:163 -#, fuzzy -msgid "In %1's chat: %2" -msgstr "In %1's chat: %2" +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Geen antwoord van webservice" -#: notification/chatnotification.cpp:167 -#, fuzzy -msgid "%1 says:
'%2'" -msgstr "%1 zegt:
'%2'" +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Onverwacht antwoord van server (%1)" -#: notification/chatnotification.cpp:171 -#, fuzzy -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 heeft u een offline-bericht gestuurd:
'%2'" +#: notification/chatnotification.cpp:154 +msgid "In %1's chat:
%2" +msgstr "In %1's chat:
%2" -#: notification/chatnotification.cpp:178 -#, fuzzy +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "%1 zegt:
'%2'" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 heeft u een offlinebericht gestuurd:
'%2'" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" -msgstr "%1's chat vraagt aandacht!" +msgstr "%1's chatgesprek vraagt attentie!" -#: notification/chatnotification.cpp:183 -#, fuzzy -msgid "%1:
%2" -msgstr "%1:
%2" +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr "%1 heeft u een buzzer verstuurd!" +msgstr "%1 heeft u een handgeschreven bericht gestuurd!" -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr "%1 heeft u een buzzer verstuurd!" +msgstr "%1 heeft u een buzzer gestuurd!" -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr "%1heeft u een wink verstuurd!" +msgstr "%1 heeft u een wink gestuurd!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 wilt uw webcambeeld bekijken!" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 stuurt u een bestand!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 heeft u een uitnodiging gestuurd!" #: notification/chatnotification.cpp:204 -#, fuzzy -msgid "%1 wants to use the webcam!" -msgstr "%1 wil de webcam gebruiken!" +msgid "%1 has canceled the webcam session!" +msgstr "%1 heeft de webcamsessie geannuleerd!" #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 zendt u een bestand!" +msgid "%1 has canceled the file transfer!" +msgstr "%1 heeft de bestandsoverdracht geannuleerd!" #: notification/chatnotification.cpp:206 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "%1 heeft u een uitnodiging gestuurd!" +msgid "%1's activity has been canceled!" +msgstr "%1's activiteit is beëindigd!" #: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "%1 heeft de webcam-sessie afgbroken!" +msgid "%1 has accepted to use the webcam!" +msgstr "%1 heeft het webcamverzoek geaccepteerd!" #: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "%1 heeft de bestandsoverdracht afgebroken!" +msgid "%1 has accepted the file transfer!" +msgstr "%1 heeft de bestandsoverdracht geaccepteerd!" #: notification/chatnotification.cpp:215 -#, fuzzy -msgid "%1's activity has been canceled!" -msgstr "De activiteit van %1 is beëindigd!" +msgid "%1 has accepted your invitation!" +msgstr "%1 heeft uw uitnodiging geaccepteerd!" #: notification/chatnotification.cpp:222 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1 gaat accoord met het gebruik van de webcam!" +msgid "%1 has ended the webcam session!" +msgstr "%1 heeft de webcamsessie beëindigd!" #: notification/chatnotification.cpp:223 -#, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "%1 gaat accoord met de bestandsoverdracht!" +msgid "The file transfer with %1 is done!" +msgstr "De bestandsoverdracht met %1 is klaar!" #: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1 heeft uw uitnodiging aanvaard!" +msgid "%1's activity has ended!" +msgstr "%1's activiteit is beëindigd!" #: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "%1 heeft de webcam-sessie beëindigd!" +msgid "%1's webcam session has failed!" +msgstr "%1's webcamsessie is mislukt!" #: notification/chatnotification.cpp:232 -#, fuzzy -msgid "The file transfer with %1 is done!" -msgstr "De bestandsuitwisseling met %1 is klaar!" +msgid "The file transfer with %1 has failed!" +msgstr "De bestandsoverdracht met %1 is mislukt!" #: notification/chatnotification.cpp:233 -#, fuzzy -msgid "%1's activity has ended!" -msgstr "De activiteit van %1 is beëindigd!" - -#: notification/chatnotification.cpp:240 -#, fuzzy -msgid "%1's webcam session has failed!" -msgstr "De webcam-sessie met %1 is mislukt!" - -#: notification/chatnotification.cpp:241 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "De bestandsuitwisseling met %1 is mislukt!" - -#: notification/chatnotification.cpp:242 -#, fuzzy msgid "%1's activity has ended with an error!" -msgstr "De activiteit van %1 is met een foutmelding beëindigd!" +msgstr "%1'activiteit is beëindigd met een fout!" -#: notification/contactstatusnotification.cpp:70 -#, fuzzy -msgid "%1 is now online" -msgstr "%1 is nu online" +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
is nu online" -#: notification/contactstatusnotification.cpp:71 -#, fuzzy -msgid "%1 has gone away" -msgstr "%1 is weggegaan" +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
is weg gegaan" -#: notification/contactstatusnotification.cpp:72 -#, fuzzy -msgid "%1 will be right back" -msgstr "%1 komt zodadelijk terug" +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
is zo terug" -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1 is nu bezig" +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
is nu bezig" -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1 is nu onzichtbaar" +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
is onzichtbaar geworden" -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1 is nu niet actief" +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
is inactief geworden" -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1 heeft uitgelogd" +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
heeft uitgelogd" -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 is aan de telefoon" +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
is aan de telefoon" -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 is gaan lunchen" +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
gaat lunchen" -#: notification/newemailnotification.cpp:78 -#, fuzzy -msgid "New email:
'%1'
by '%2'" -msgstr "Nieuwe email:
'%1'
van '%2'" +#: notification/newemailnotification.cpp:90 +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Nieuwe mail:
'%1'
door '%2'" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Een chat beginnen" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Een bericht achterlaten" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Bericht weergeven" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Details" + +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "E-mail lezen" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Verbergen" + +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Wanneer u het hoofdvenster sluit, blijft KMess actief in het systeemvak. " +"Gebruik 'Afsluiten' in het menu 'Verbinden' om het programma af te sluiten." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "In systeemvak vastzetten" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 msgid "Browse..." -msgstr "" +msgstr "Bladeren..." -#: settings/accountpage.cpp:70 -#, fuzzy -msgid "Browse and crop picture..." -msgstr "Bladeren naar en bijsnijden van afbeelding..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Afbeelding selecteren en bijsnijden..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." -msgstr "" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Vorige afbeelding instellen..." -#: settings/accountpage.cpp:448 -#, fuzzy +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" -msgstr "Het ophalen van de afbeelding is mislukt" +msgstr "Laden van schermafbeelding mislukt" -#: settings/accountpage.cpp:507 -#, fuzzy +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -"Er is een fout opgetreden bij het veranderen van uw afbeelding.\n" -"Gebruik een afbeeldingsbestand van het juiste type" +"Er deed zich een fout voor tijdens het veranderen van de schermafbeelding.\n" +"Zorg dat u een bestaande afbeelding heeft geselecteerd." -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "Contactpersoon verwij&deren" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Instellingen" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "Account" -#: settings/accountsettingsdialog.cpp:76 -#, fuzzy +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" -msgstr "Account" +msgstr "Mijn account" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Waarschuwingen" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "KMess-melding" +msgid "Contact List" +msgstr "Contactpersonen" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Chatten" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" -msgstr "Chat bewaren" +msgstr "Chatloggen" -#: settings/accountsettingsdialog.cpp:193 -#, fuzzy +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" -msgstr "Het adres dat u opgaf voor de contactpersoon, is ongeldig: '%1'" +msgstr "" +"Het ingevoerde e-mailadres is niet geldig, en kan niet als account gebruikt " +"worden: '%1'" -#: settings/accountsettingsdialog.cpp:201 -#, fuzzy +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" -msgstr "Het adres dat u opgaf voor de contactpersoon, is ongeldig: '%1'" +msgstr "Het e-mailadres dat u hebt ingevoerd is al in gebruik: '%1'" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" -msgstr "Weet u zeker dat u deze account wilt verwijderen?" +msgstr "Weet u zeker dat u dit account wilt verwijderen?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." -msgstr "Weet u zeker dat u deze account wilt verwijderen?" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Weet u zeker dat u de account '%1' wilt verwijderen?
Alle instellingen " +"van dit account zullen verloren gaan." -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" -msgstr "Hai, hoe gaat het ermee? :)" +msgstr "Hoi, hoe gaat het? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "Stacy" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" -msgstr "Groots!" +msgstr "Goed!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" -msgstr "Ik kom /juist/ terug van vakantie in Italië!" +msgstr "Ik kom /net/ terug van mijn vakantie in Italië!" -#: settings/emoticonspage.cpp:122 +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "U kunt maar maximaal 7 karakters voor de sneltoets gebruiken." + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "Ongeldige naam voor emoticon" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" msgid "Replace Existing Emoticon" -msgstr "" +msgstr "Bestaande emoticon vervangen" -#: settings/globalsettingsdialog.cpp:45 -#, fuzzy +#: settings/emoticonspage.cpp:233 +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Weet u zeker dat u de emoticon \"%1\" wilt verwijderen?" + +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Emoticon verwijderen" + +#: settings/globalsettingsdialog.cpp:46 msgid "KMess Settings" -msgstr "Instellingen" +msgstr "KMess Instellingen" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Accounts" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 -#, fuzzy -msgid "Notification" -msgstr "Melding van email" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notificaties" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." -msgstr "" +msgstr "Geen beschikbare browsers gevonden." -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." -msgstr "" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Geen beschikbare e-mailprogramma's gevonden." -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" +"U moet een terminalcommando opgeven om een eigen browser op te starten!" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" +"Het opgegeven terminalcommando om een eigen browser te openen, bevat " +"niet de parameter '%u'. Zonder deze parameter zullen koppelingen niet openen." +"
Wilt u dat KMess dit voor u toevoegt?" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" +"U moet een terminalcommando opgeven om een eigen e-mailprogramma op te " +"starten!" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" +"Het opgegeven terminalcommando om een eigen e-mailprogramma te openen, " +"bevat niet de parameter '%u'. Zonder deze parameter zult u geen mail kunnen " +"opstellen.
Wilt u dat KMess dit voor u toevoegt?" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" -msgstr "" +msgstr "U moet een map voor ontvangen bestanden selecteren!" -#: settings/miscellaneouspage.cpp:404 -#, fuzzy +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" -msgstr "Bewaar chat-bestanden in deze hoofdmap:" +msgstr "Selecteer bestandslocatie" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"Als u het hoofdvenster sluit blijft KMess actief in het systeemvak. Gebruik " -"de optie 'Afsluiten' in het menu 'Bestanden' als u KMess helemaal wilt " -"afsluiten." -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Actief in systeemvak" +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

KMess kon de configuratiebestanden niet openen!

" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "Een opmerking naar de ontwikkelaars &versturen" -#: systemtraywidget.cpp:245 -#, fuzzy -msgid "- %1 (%2)" -msgstr "%1 %2" +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Welkom bij de testversie van %1." -#~ msgid "Click to send an email to this contact." -#~ msgstr "Klik om een email naar deze contactpersoon te sturen." +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "Welkom bij %1." -#~ msgid "Picture:" -#~ msgstr "Afbeelding:" +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" +"Wanneer u een frustrerende of positieve ervaring hebt, klik dan op het " +"bijbehorende gezichtje onder de vensterbalk, beschrijf uw ervaring en druk " +"op Verzenden." -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Toon informatie over nieuwe email" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" +"Wanneer u een positieve ervaring hebt, klik dan op het lachende gezichtje " +"onder de vensterbalk, beschrijf uw ervaring en druk op Verzenden." -#~ msgid "Logging in..." -#~ msgstr "Bezig met aanmelden..." +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" +"Wanneer u een frustrerende ervaring hebt, klik dan op het fronsende " +"gezichtje onder de vensterbalk, beschrijf uw ervaring en druk op Verzenden." + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" +"Wanneer u een onjuiste handeling of actie tegenkomt in het programma, kunt u " +"op het picogram voor defecte objecten in de rechterbovenhoek van het venster " +"klikken, het beschrijven en op Verzenden drukken." + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "Het nieuwe artwork vind ik mooi
. Lekker verfrissend." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" +"De welkomstpagina van die assistent gebruik ik niet. Kost onnodig " +"veel tijd." + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"Het programma gedraagt zich onjuist wanneer ik op de Toevoegen-knop " +"druk. Er gebeurt niets." + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" +"Ik wens een nieuwe mogelijkheid en ik wil mijn idee per e-mail " +"verzenden." + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "Uw opmerkingen zijn belangrijk om het programma te verbeteren." + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Voorbeeld" +msgstr[1] "Voorbeelden" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Help mee het programma te verbeteren" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Verstuur opmerkingen naar de ontwikkelaars" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Gelieve in %1 te schrijven (hierbij kunt u een online " +"vertaalhulpmiddel gebruiken).
" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Gelieve in %1 of %2 te schrijven (hierbij kunt u een online " +"vertaalhulpmiddel gebruiken).
" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" +"Probeer eenzelfde aantal positief en negatief commentaar te versturen, om uw " +"opmerkingen meer nuttig te maken.
" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" +"Gelieve niet te vragen om nieuwe mogelijkheden in het programma: deze worden " +"genegeerd.
" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" +"

U kunt de ontwikkelaars een korte omschrijving sturen over uw mening over " +"%1.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"Het ingevoerde e-mailadres is niet geldig, en kan niet gebruikt worden: '%1'" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" +"

Uw opmerking is succesvol verzonden. Het zal ons helpen dit programma te " +"verbeteren!

Wij danken u voor de moeite.

" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Opmerking verzonden." + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" +"

Er was een probleem met het verzenden van het rapport.

Probeer het " +"later nog een keer.

" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Probleem met opmerking verzenden" + +#~ msgid "Conversations Filter" +#~ msgstr "Gesprekkenfilter" + +#~ msgid "Filter by &conversation" +#~ msgstr "Op &gesprek filteren" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Kies het account die u wilt veranderen, en klik daarna hier" + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "De buzzer naar %1 kon niet verzonden worden." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "De wink naar %1 kon niet verzonden worden." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "De tekening naar %1 kon niet verzonden worden." + +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Het bericht '%1' naar %2 kon niet verzonden worden." + +#~ msgid "Contact List Alerts" +#~ msgstr "Meldingen van contactenlijst" + +#~ msgid "&Show winks from contacts" +#~ msgstr "&Toon winks van contacten" + +#~ msgid "Enable in the contact list" +#~ msgstr "In contactenlijst inschakelen" + +#~ msgid "Enable in the chat windows" +#~ msgstr "In chatvensters inschakelen" + +#~ msgid "&Copy..." +#~ msgstr "&Kopiëren..." + +#~ msgid "Insert New" +#~ msgstr "Nieuwe invoeren" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "E-mailadres: %1" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Chatprogramma: %1" + +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Geblokkeerd: %1" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Laatst gezien: %1" + +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Laatste bericht: %1" + +#~ msgctxt "Message in list tooltip" +#~ msgid "Has you: %1" +#~ msgstr "Heeft u: %1" + +#~ msgid "Alerts" +#~ msgstr "Meldingen" + +#~ msgid "Alerts and Notifications" +#~ msgstr "Meldingen en notificaties" + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "U kunt optioneel een groep voor het nieuwe contactpersoon kiezen" + +#~ msgid "No Group" +#~ msgstr "Geen groep" + +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "" +#~ "KMess kon geen toegang verkrijgen tot de externe webservice.
Details: %1" #~ msgid "" -#~ "Allows you to choose which e-mail program KMess should open to view e-" -#~ "mail messages." +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" #~ msgstr "" -#~ "U kunt het emailprogramma kiezen waarmee KMess uw emailberichten opent." +#~ "Aanmelden mislukt. KMess kon de Passport-loginprocedure niet voltooien." +#~ "
Details: %1" -#~ msgid "Use a specified command:" -#~ msgstr "Gebruik een bepaalde opdracht:" +#~ msgid "SOAP connection error: %1" +#~ msgstr "SOAP-verbindingsfout: %1" -#~ msgid "This account does not have an Hotmail inbox!" -#~ msgstr "Deze account heeft geen inbox voor Hotmail!" +#~ msgid "Now listening to: %1" +#~ msgstr "Luistert nu naar: %1" -#, fuzzy -#~ msgid "Email: " -#~ msgstr "Email" +#~ msgid "&Listening Music" +#~ msgstr "&Beluisterde muziek" -#~ msgid "Remove group" -#~ msgstr "Groep verwijderen" +#~ msgid "Close all tabs" +#~ msgstr "Alle tabbladen sluiten" -#, fuzzy -#~ msgid "Show &Display Pictures" -#~ msgstr "Afbeelding tonen" +#~ msgid "&Send email" +#~ msgstr "E-mail &verzenden" -#~ msgid "You have 1 new e-mail in your inbox." -#~ msgstr "U heeft 1 nieuwe email in uw postvak in." +#~ msgid "Save complete" +#~ msgstr "Opslaan voltooid" -#~ msgid "You have %1 new emails in your inbox." -#~ msgstr "U heeft %1 nieuwe emails in uw postvak in." +#~ msgid "C&lose all tabs" +#~ msgstr "Alle tabbladen &sluiten" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "&Online komt" +#~ msgid "Connect" +#~ msgstr "Verbinden" -#~ msgid "The transfer of %1 failed. Couldn't open file" -#~ msgstr "De overdracht van %1 is mislukt. Bestand kon niet worden geopend" +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: account not found." +#~ msgstr "Kan niet verbinden: account niet gevonden" -#, fuzzy -#~ msgid "Sidebar" -#~ msgstr "Zijbalk" +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: no password has been entered." +#~ msgstr "Kan niet verbinden: er is geen wachtwoord ingevoerd." -#, fuzzy -#~ msgid "New contact's group" -#~ msgstr "&Nieuwe contactpersoon" +#~ msgid "Rename group" +#~ msgstr "Groep hernoemen" -#~ msgid "Enter your login information:" -#~ msgstr "Vul uw inloggegevens in:" - -#~ msgid "Your friendly name:" -#~ msgstr "Uw bijnaam:" - -#, fuzzy -#~ msgid "Your email address:" -#~ msgstr "Emailadres: " - -#~ msgid "Your password:" -#~ msgstr "Uw wachtwoord:" - -#~ msgid "Display picture:" -#~ msgstr "Afbeelding:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "&Geen afbeelding tonen" - -#~ msgid "Status to set at login:" -#~ msgstr "In te stellen status bij het inloggen:" - -#~ msgid "Show notifications when you recei&ve an email" -#~ msgstr "Toon een melding als u een email ont&vangt" - -#~ msgid "Organize chat folders by:" -#~ msgstr "Deel de chat-mappen in naar:" - -#~ msgid "&Show graphics in chat messages" -#~ msgstr "Toon &afbeeldingen in chatberichten" - -#~ msgid "Use Hotmail" -#~ msgstr "Gebruik Hotmail" - -#~ msgid "says:" -#~ msgstr "zegt:" - -#~ msgid "Current name: " -#~ msgstr "Huidige naam: " - -#, fuzzy -#~ msgid "" -#~ "KMess could not connect to the MSN Messenger service.\n" -#~ "Please, be sure to be connected to the internet.\n" -#~ "reason: %1." -#~ msgstr "" -#~ "KMess kon geen verbinding maken met de MSN Messenger service.\n" -#~ "Controleer uw verbinding met het internet.\n" -#~ "Systeemfout: %1 (code %2)." - -#~ msgid "The remote server has closed the connection." -#~ msgstr "De verbinding werd door de andere server beëindigd." - -#~ msgid "Show MSN Messenger Service status?" -#~ msgstr "Status van MSN Messenger Service weergeven?" - -#~ msgid "Received user confirmation" -#~ msgstr "Ontving bevestiging gebruiker" - -#~ msgid "Transfer to notification server" -#~ msgstr "Overdracht naar meldingenserver" - -#~ msgid "The server is too busy" -#~ msgstr "De server is te druk bezet" - -#~ msgid "The server is unavailable" -#~ msgstr "De server is niet bereikbaar" - -#~ msgid "KMess received an unknown error message from the server: %1" -#~ msgstr "KMess ontving een onbekende foutmelding van de server: %1" - -#~ msgid "Warning: Server closes for maintenance in 1 minute!" -#~ msgstr "" -#~ "Waarschuwing: de server wordt over 1 minuut voor onderhoud uitgezet!" - -#~ msgid "Add contact" -#~ msgstr "Contactpersoon toevoegen" - -#, fuzzy -#~ msgid "KMess Notification" -#~ msgstr "Melding van email" - -#~ msgid "" -#~ msgstr "" +#~ msgid "Account &Settings..." +#~ msgstr "Account&instellingen..." #~ msgid "" -#~ "_: NAME OF TRANSLATORS\n" -#~ "Your names" -#~ msgstr "Arend van Beelen jr., Diederik van der Boor, Jaap Woldringh" +#~ "Basic DBus support, tab closing message, menu hiding shortcut, toolbars " +#~ "lock" +#~ msgstr "" +#~ "Basisondersteuning voor DBus, sneltoets voor het verbergen van het menu, " +#~ "melding bij sluiten tabbladen, vergrendeling van werkbalken" + +#~ msgctxt "Connection error dialog box" +#~ msgid "%1" +#~ msgstr "%1" + +#~ msgctxt "Server error dialog box" +#~ msgid "

MSN server message

%1

" +#~ msgstr "

MSN-serverbericht

%1

" + +#~ msgctxt "Server-reported client error dialog box" +#~ msgid "

Internal error in KMess

%1

" +#~ msgstr "

Interne fout in KMess

%1

" #~ msgid "" -#~ "_: EMAIL OF TRANSLATORS\n" -#~ "Your emails" +#~ "Error in the fallback Web connection. It is possible you need to " +#~ "authenticate to a proxy server or a web page." #~ msgstr "" -#~ "arend op auton.nl, vdboor op codingdomain punt com, jjh punt woldringh op " -#~ "planet punt nl" - -#~ msgid "Show/Hide &Contact Sidebar" -#~ msgstr "Zijbalk &Contactpersonen weergeven/verbergen" - -#~ msgid "Away - Idle" -#~ msgstr "Afwezig - Niet actief" - -#~ msgid "chat-style-text" -#~ msgstr "Chat-tekststijl" - -#~ msgid "The e-mail address given was invalid!" -#~ msgstr "Het opgegeven emailadres is ongeldig!" - -#~ msgid "(Away)" -#~ msgstr "(Afwezig)" - -#~ msgid "(Be Right Back)" -#~ msgstr "(Ben zo terug)" - -#~ msgid "(Busy)" -#~ msgstr "(Bezig)" - -#~ msgid "(Invisible)" -#~ msgstr "(Onzichtbaar)" - -#~ msgid "(Away - Idle)" -#~ msgstr "(Afwezig - Niet actief)" - -#~ msgid "(Out to Lunch)" -#~ msgstr "(Aan het lunchen)" - -#~ msgid "(On the Phone)" -#~ msgstr "(Aan de telefoon)" - -#~ msgid "The current status of your contact." -#~ msgstr "De huidige status van uw contactpersoon." - -#, fuzzy -#~ msgid "The contact is listening to music" -#~ msgstr "Deze contactpersoon is niet in uw lijst opgenomen" - -#~ msgid "File transfer dialog message" -#~ msgstr "Bericht in dialoog voor bestandsoverdracht" - -#~ msgid "The file transfer invitation was cancelled. Bad data was received." -#~ msgstr "" -#~ "De bestandsoverdracht werd afgebroken. Verkeerde gegevens ontvangen." - -#~ msgid "ChatViewInterface" -#~ msgstr "ChatViewInterface" - -#~ msgid "Alt+E" -#~ msgstr "Alt+E" - -#~ msgid "Alt+W" -#~ msgstr "Alt+W" - -#~ msgid "ContactFrameInterface" -#~ msgstr "ContactFrameInterface" - -#~ msgid "AddEmoticonDialogInterface" -#~ msgstr "AddEmoticonDialogInterface" - -#~ msgid "..." -#~ msgstr "..." - -#~ msgid "TransferEntryInterface" -#~ msgstr "TransferEntryInterface" - -#~ msgid "InitialViewInterface" -#~ msgstr "InitialViewInterface" - -#~ msgid "Alt+B" -#~ msgstr "Alt+O" - -#~ msgid "KMessViewInterface" -#~ msgstr "KMessViewInterface" - -#~ msgid "popupMessage" -#~ msgstr "Aankondiging" - -#~ msgid "Alt+H" -#~ msgstr "Alt+W" - -#~ msgid "Alt+Y" -#~ msgstr "Alt+G" - -#~ msgid "Alt+G" -#~ msgstr "Alt+O" - -#~ msgid "Alt+C" -#~ msgstr "Alt+C" - -#~ msgid "Alt+S" -#~ msgstr "Alt+S" - -#~ msgid "Alt+F" -#~ msgstr "Alt+F" - -#~ msgid "Alt+V" -#~ msgstr "Alt+V" - -#~ msgid "ChattingWidget" -#~ msgstr "ChattingWidget" - -#~ msgid "EmailWidget" -#~ msgstr "EmailWidget" - -#~ msgid "EmoticonWidgetInterface" -#~ msgstr "EmoticonWidgetInterface" - -#~ msgid "Alt+N" -#~ msgstr "Alt+N" +#~ "Fout bij de web-terugvalverbinding. U moet mogelijk uw computer aanmelden " +#~ "bij een proxyserver of webpagina." diff --git a/po/pt_BR.po b/po/pt_BR.po index f8ebb12..117b5ca 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -2,818 +2,1470 @@ # translation of pt_BR.po to Brazilian Portuguese # translation of pt_BR.po to # Copyright (C) 2003 Free Software Foundation, Inc. -# , 2003 -# Mauricio Röther , 2003 # +# Mauricio Röther , 2003. +# Sergio Rafael Lemke , 2009. +# Mauricio Arozi Moraes , 2009. msgid "" msgstr "" "Project-Id-Version: pt_BR\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2003-04-26 19:03-0300\n" -"Last-Translator: Mauricio Röther \n" -"Language-Team: Português Brasileiro \n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-03-22 15:07+0000\n" +"Last-Translator: Mauricio Arozi Moraes\n" +"Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.0.1\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 -#, fuzzy +msgid "Standard text mode" +msgstr "Modo texto padrão" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "Clique neste botão para mudar para o modo texto padrão" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +msgid "Ink message" +msgstr "Manuscrito" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" +"Clique neste botão para começar a usar o KMess ou para cancelar uma conexão" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "Emoticons padrão" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" +"Clique neste botão para mostrar todos os emoticons padrão do MSN, e então " +"você pode adicioná-los facilmente nas suas mensagens" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "Emoticons personalizados" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" +"Se você adicionou qualquer emoticon personalizado, clique neste botão para " +"vê-los, e então você pode adicioná-los facilmente nas suas mensagens" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "Winks" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "Clique este botão para ver todos os WInks disponíveis" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" msgstr "Nova Linha" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 -#, fuzzy +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" -msgstr "Enviar" +msgstr "&Enviar" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -#, fuzzy -msgid "Contacts" -msgstr "&Adicionar Contato" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Conversa" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." -msgstr "" +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Barra de Ferramentas Principal" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" -msgstr "" +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" +msgstr "Clique aqui para mostrar o menu para este contato" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 -#, fuzzy +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "Clique aqui para abrir as suas preferências" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "Limpar Área" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "Cor da Caneta" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "Tamanho da Caneta" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "Pincel removedor" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "Grupos iniciais" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" -msgstr "Informe o email da pessoa que você deseja adicionar:" +msgstr "Informe aqui o email da pessoa que você deseja adicionar" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -#, fuzzy -msgid "Email address" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" msgstr "Endereço de Email:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Digite um atalho para este emoticon:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -#, fuzzy -msgid "Initial group" -msgstr "Re&nomear Grupo" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" -msgstr "" +msgstr "Selecione um arquivo de imagem:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 -#, fuzzy +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "" -"Entre com a mensagem que será automaticamente\n" -"enviada à pessoa que tentar entrar em contato:" +"Digite uma mensagem a ser enviada automaticamente as pessoas que tentarem " +"entrar em contato com você." -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "Mensagem de au&sência automática:" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +msgid "Search through contacts..." +msgstr "Procurar nos contatos..." + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 #, fuzzy -msgid "&Automatic away message" -msgstr "Especificar uma mensagem de Ausente" +msgid "Chat Log Filter" +msgstr "Gravação das Conversar" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" -msgstr "" +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" +msgstr "Não Filtrar" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "Filtrar por &data" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "de" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "para" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 #, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "Adicionar este contato à sua lista \"Amigos\"" +msgid "Filter by &chat" +msgstr "Filtrar por &data" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "O que você gostaria de fazer?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +msgid "&Add this person to these groups of my contact list:" +msgstr "&Adicionar esta pessoa para estes grupos da minha lista de contato:" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" -msgstr "Não adicionar este contato, mas deixá-lo ver seu estado online" +msgid "&Do not add this person; only allow them to see my status" +msgstr "Não adicionar esta pessoa; &Deixar ela ver quando eu estiver online" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" -msgstr "Bloquear esta pessoa para não contactar você ou ver seu estado online." +msgid "&Block this person from contacting me or seeing my status" +msgstr "Bloquear esta pessoa para não me contatar ou ver quando estou online." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, fuzzy, no-c-format -msgid "Contact Properties for %1" -msgstr "Propriedades de contato para " - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" -msgstr "" +msgstr "&Informação" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 -#, fuzzy -msgid "Restore" -msgstr "Removido" +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "Clique este botão para restaurar a imagem original deste contato" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Restaurar" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Grupos:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -#, fuzzy -msgid "Use alternative name for this person" -msgstr "Usar um nome diferente para essa pessoa" +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "Us&ar um nome diferente para esta pessoa" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "Exibir um balão popup quando essa pessoa mudar online/offline" +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "Notificar quando este contato conectar/desconectar-se" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "Som:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Som:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" -msgstr "" +msgstr "I&magens" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" +"Clique aqui para utilizar a imagem selecionada como sua imagem de exibição" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +msgid "Use As Display Picture" +msgstr "Usar Como Imagem de Exibição" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 msgid "&Clear Cache" -msgstr "" +msgstr "Limpar &Cache" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -msgid "Notes" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "&Notas" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "&Emoticons" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" +"Você pode esconder qualquer emoticon recebido deste contado. Clique com o " +"botão direito no emoticon recebido e selecione \"Ignorar este Emoticon\".\n" +"Com esta página você pode restaurar os emoticons escondidos." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "Clique aqui remover o Emoticon selecionado" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Remo&ver" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "Contatos Disponíveis" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "Convidar um contato que não está na sua lista" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "Insira o email do contato a convidar" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "Contatos Convidados" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Itens a exportar:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Formato" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Contatos:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "Marcar Todos" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Desmarcar Todos" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Exportar..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Fechar" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" -msgstr "" +msgstr "Janela da Rede" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" -msgstr "" +msgstr "Comando para a Aba Atual" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "Comando:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" -msgstr "" +msgstr "Tipo:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "" +msgstr "Padrão" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" -msgstr "" +msgstr "MIME" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" msgstr "Enviar" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" -msgstr "" +msgstr "Command payload (can be empty):" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" -msgstr "" +msgstr "Abrir" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" +msgstr "Cancelar" + +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "Recebido" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "Enviado" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "&Limpar" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "Fe&char" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" msgstr "" +"Clique aqui para ver as opções da conta atualmente selecionada, ou " +"navegue usando a roda do mouse entre as contas já salvas" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" -msgstr "" +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Insira o endereço de email do Passaporte ou de sua conta Live" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "Endereço de Email: " - -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 -#, fuzzy +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" msgstr "Senha:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" -msgstr "" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "Insira aqui a senha da sua conta" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "" +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Status Inicial:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 #, fuzzy -msgid " Account options " -msgstr "Con&figurações de Conta" +msgid "Choose a status to set when successfully connected." +msgstr "Escolha um status do MSN para usar quando conectar" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -#, fuzzy -msgid "Remem&ber this profile" -msgstr "Lembrar este perfil" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "Se habilitado, KMess vai salvar sua conta" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" +msgstr "Lem&brar Conta" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" +"Se você escolher para que o KMess lembre da sua conta, você pode também " +"salvar sua senha" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "L&embrar Senha" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Clique neste botão para começar a usar o KMess ou para cancelar uma conexão" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Conectar" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Nova Conta" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 -#, fuzzy -msgid "Your Account Information" -msgstr "Con&figurações de Conta" +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 -#, fuzzy -msgid "&Friendly name:" -msgstr "Seu nome amigável:" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" msgstr "" +"Clique aqui para registrar uma nova conta Live que você poderá usar " +"para se conectar no MSN.
Se preferir poderá usar seu email existente" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "Esqueceu a senha?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 #, fuzzy -msgid "&Email address:" -msgstr "Endereço de Email: " +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Clique aqui para ir ao web site de Live, lá você poderá resetar a " +"senha da sua conta" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Conectar" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Ver" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Ações" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "Formato" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +msgid "Account &Info" +msgstr "&Informações da Conta" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "Informações da sua conta" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." +msgstr "Insira o nome que outros contatos vão ver quando você conectar." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 +msgid "&Friendly name:" +msgstr "Apelido:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Insira o endereço de email do seu passaporte MSN. Você pode registrar uma " +"nova conta em http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 +msgid "&Email address:" +msgstr "&Endereço de Email: " + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" +"Insira a senha da sua conta MSN. Voce pode registrar uma nova conta em " +"http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" msgstr "Senha:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -#, fuzzy -msgid "&Remember Password" -msgstr "Senha:" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "Lemb&rar Senha" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 -#, fuzzy +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" -msgstr "Imagem:" +msgstr "Imagem" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." -msgstr "" +msgstr "&Modificar..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" -msgstr "" +msgstr "Não Usar" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" +"A opção \"Lembrar este Perfil\" estava desmarcada enquanto você conectava, " +"com isso suas preferências, por padrão, não serão salvas. Marque esta opção " +"caso você queira salvar suas preferências neste sistema.\n" +"\n" +"Recomendamos usar esta opção em seu computador pessoal, caso esteja " +"acessando de outro lugar como uma LanHouse ou sistema público não a marque." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "" +msgstr "Lembrar as preferências desta conta" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." -msgstr "" +msgstr "Se habilitada o KMess vai conectar esta conta automaticamente ao abrir" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" -msgstr "Logar com esta conta automaticamente ao iniciar" +msgid "Log in &with this account automatically" +msgstr "Entrar com esta conta automaticamente ao iniciar" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "Logar todos os chats" +msgstr "Entr&ar como" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" +"Você precisa conectar ao site Passaporte e confirmar que o endereço de email " +"usando no registro existe." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" +"Você não pode trocar seu apelido porque o email registrado ao Passporte não " +"é verificado" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" -msgstr "" +msgstr "Requisitar email de verificação" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" -msgstr "" +msgstr "https://accountservices.passport.net/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" -msgstr "" +msgstr "Vá para accountservices.passport.net" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"Você precisa de um passaporte para conectar a rede do MSN. Você pode " +"registrar seu endereço de email atual em register.passport.com ou usar uma " +"conta de email do Hotmail para conectar." + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" +"Para se conectar ao MSN você precisa registrar um endereço de email como " +"conta passaporte." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" -msgstr "" +msgstr "Registrar nova conta" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" -msgstr "" +msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" -msgstr "" +msgstr "Vá para register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "&Opções de Status" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Se habilitado, seu status será mudado para \"Ausente-Inativo\" quando você " +"não estiver usando o computador por alguns minutos. Se esta função não está " +"disponível é porque esta versão foi gerada sem este suporte." + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Mudar status para \"&Inativo\" quando ocioso" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"Controla o número de minutos para o KMess alterar o status para \"Ausente-" +"Inativo\"." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Alterar para inativo depois de" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minutos" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" +"Isto acontece por que o KMess foi compilado sem suporte a extensão " +"\"XScreenSaver\" do Xorg, que é utilizada para detectar atividades do " +"usuário\n" +"Entre em contato com o sua equipe de enpacotamente para mais detalhes." + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" +"Ativar o modo inativo automaticamente é impossível: KMess compilado sem " +"detecção de inatividade." + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 #, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "Não &mostrar notificações quando meu status for \"Ocupado\"" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 msgid "Saved accounts:" -msgstr "Contas" +msgstr "Contas Salvas:" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -#, fuzzy -msgid "Click" -msgstr "Bloqueado" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" +"Clique aqui para criar uma nova conta no KMess usando um email ja associado " +"a uma conta MSN" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +msgid "&Add Account..." +msgstr "&Adicionar Conta..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 #, fuzzy -msgid "&Add account..." -msgstr "Contas" +msgid "Select an account and click here to modify it" +msgstr "Selecione uma conta, depois clique aqui para remover ela" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" -msgstr "" +msgstr "&Editar" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 -#, fuzzy +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "Selecione uma conta, depois clique aqui para remover ela" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" -msgstr "Removido" +msgstr "&Remover" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Notificação de email" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "Ative esta caixa para salvar suas conversas para ver posteriormente" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 -#, fuzzy -msgid "Contact Events" -msgstr "&Adicionar Contato" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -#, fuzzy -msgid "Show notifications when your contacts:" -msgstr "Exibir notificações quando contatos mudar para offline" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" msgstr "" +"

Se você ativar o registro de conversa, todas as suas conversas " +"serão salvas em um local que pode ser definido abaixo.

\n" +"

As conversas salvas permitem que você encontre algo nas suas discussões " +"antigas, como um link, ou você pode usá-las para lembrar o que você disse em " +"alguma ocasião para alguém.

\n" +"

Elas também possuem problemas de privacidade, pois pessoas não " +"autorizadasque utilizarem a sua conta podem ler estes registro.

\n" +"

Tenha certeza de manter esta opção inativa em computadores " +"publicamente acessíveis!

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -#, fuzzy -msgid "&Go online" -msgstr "Offline" +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "Guardar Conversas" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" +"O KMess também pode salvar suas conversar em HTML, e mantê-las organizadas" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "Gravar conversas em Arquivo" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "Com esta opção, você escolhe como o KMess vai salvar suas conversas" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "Gravar em formato de arquivo:" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" msgstr "" +"\n" +"

O formato de arquivo que você utilizar é importante.

\n" +"

Registros em HTML podem ser abertos em qualquer navegador, mas " +"geralmente não são exibidos corretamente em outros computadores.

\n" +"

Arquivos texto, no entando podem ser lidos perfeitamente em qualquer " +"lugar; mas não contém nada além de texto.

\n" +"" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "" +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "Páginas(HTML)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "Texto Plano" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." msgstr "" +"Estas opções permitem que você escolha como o KMess vai organizar suas " +"conversas salvas nos diretórios abaixo." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -#, fuzzy -msgid "S&end you a message" -msgstr "Especificar uma mensagem de Ausente" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." msgstr "" +"Dependendo de qual opções você escolher aqui, o KMess irá criar alguns " +"diretórios para ajudá-lo a manter seus registros organizados. Use a função " +"\"O que é isso?\" em uma opção específica para obter mais detalhes" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "" +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" +msgstr "Guardar conversas salvas por:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "Criar um diretório para organizar conversas por ano" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" msgstr "" +"Esta opção diz ao KMess para dividir os seus registros apenas por ano.\n" +"Você encontrará diretórios para cada ano registrado; estes irão conter todos " +"os registros do ano, agrupados.\n" +"\n" +"Uma conversa no dia 29 de Novembro de 2008 será salva no diretóriocomo:\n" +"/2008/data-e-nome-do-contato.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -#, fuzzy -msgid "Go o&ffline" -msgstr "Offline" +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Ano" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "Criar diretórios para organizar conversas por ano e mês" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "Endereço de Email:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "" -"Exibir uma notificação quando o email for recebido em \"outras pastas\"" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" msgstr "" +"Esta opção diz ao KMess para dividir os seus registros por ano, depois por " +"mês.\n" +"Você irá encontrar diretórios para cada ano registrado. Nelesdiretórios para " +"cada mês registrado no ano.\n" +"\n" +"Uma conversa de 29 de Novembro de 2008 seria salva no diretório de " +"registroscomo:\n" +"/2008/11/data-e-nome-do-contato.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -#, fuzzy -msgid "In other folders" -msgstr "em outra pasta" +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr " Ano e Mês" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "Criar diretórios para organizar as conversar por ano, mês e dia" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" msgstr "" +"Esta opção diz ao KMess para dividir os seus registros por ano, depois por " +"mês, e depois por dia.\n" +"Você irá encontrar diretórios para cada ano registrado. Nelesdiretórios para " +"cada mês registrado no ano; e neles as conversas divididas em diretórios " +"para seus dias.\n" +"\n" +"Uma conversa de 29 de Novembro de 2008 seria salva no diretório de " +"registroscomo:\n" +"/2008/11/29/data-e-nome-do-contato.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Esconder pop-ups após" +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr " Ano, Mês e Dia" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "segundos" +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" +msgstr "Salvar conversas salvas diretamente no diretório especificado abaixo" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" +"Esta opção diz ao KMess para salvar seus registros na mesma pasta, sem nem " +"sequer organizá-los" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "Não organizar arquivos" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "Clique aqui para selecionar um diretório" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "O diretório onde todos os seus registros de conversa serão salvaos" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" +"Escolha o diretório no seu sistema onde você deseja salvar seus registros" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "Salvar os arquivos com conversas gravadas neste diretório:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "Est&ilo" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"Permite que você escolha o tema utilizado pelo KMess para mostrar suas " +"conversas" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "Estilo da &conversa:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "Obter &Novos Estilos..." + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Configurações da Conversa" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 #, fuzzy -msgid "Other Alerts" -msgstr "Alertas" +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Ativa os emoticons nas conversas" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Exibir Contatos &Offline" +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "Mostrar &Emoticons" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +msgid "Show &winks" +msgstr "Mostrar &winks" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Esta opção ativa o agrupamento de mensagens de um mesmo contato. Mesmo que " +"ele envie múltiplas mensagens, o KMess irá agrupá-las como em uma única " +"mensagem. A aparência exata depende do tema das mensagem." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "A&grupar mensagens consecutivas de um mesmo contato" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Ativa o carimbo de data/hora em cada mensagem." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +msgid "S&how timestamp" +msgstr "Mostrar carimbo do tempo" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +msgid "Show &date" +msgstr "Mostrar &data" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +msgid "Show s&econds" +msgstr "Mostrar s&egundos" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Texto" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Esta é o estilo e cor da fonte utilizada nas suas mensagens." + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "Fonte de suas &mensagens:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"Permite sobreescrever os estilos de escrita das mensagens de seus contatos " +"por um escolhido por você abaixo." + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "&Forçar mensagens dos contatos a usar esta fonte:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +msgid "Chat Window Formatting" +msgstr "Formatação da Janela de Conversas" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Ativa o uso de efeitos de fonte. Escrevendo *negrito*, /italico/ e " +"_sublinhado_ faz com que estas palavras apareçam com seus respectivos " +"efeitos." + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Usar efeitos de fontes nas mensagens (*negrito*, /Itálico/ e _sublinhado_)" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" +msgstr "Ativar formatação do MSN Plus" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "Comportamento" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -822,3335 +1474,4719 @@ msgid "" "Contacts may send multiple nudges at once, but KMess only shakes the chat " "window with the first nudge.

" msgstr "" +"

Quando contatos querem a sua atenção eles podem enviar um nudge. Por " +"padrão a janela de conversa treme quando um nudge é recebido ou enviado. " +"Desativeesta opção se o efeito de tremer é muito obstrusivo.

\n" +"

Quando esta opção é ativada, o KMess ainda limita estes efeitos. Contatos " +"podem enviar diversos nudges ao mesmo tempo, mas o KMess treme apenas com o " +"primeiro nudge.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" -msgstr "" +msgstr "Balançar a janela de mensagem quando receber ou enviar um Nudge" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 +#, fuzzy msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" +"

Quando esta opção é ativada, você vera sua própria imagem de exibição " +"no Painel de Contatos, junto com a dos outros contatos na conversa

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Mostra sua própria imagem de exibição na conversa" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "Ag&rupar conversas na mesma janela:" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Sempre" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "Para contatos do mesmo grupo" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Nunca" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +msgid "Display Options" +msgstr "Opções de Exibição" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" +"Se habilitado, uma notificação é mostrada quando vocẽ receber um email na " +"caixa de entrada. O número de email não lidos é mostrado acima da lista de " +"contatos. Esta opção só é valida para contas Hotmail." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "Mostrar &uma contagem de emails não lidos" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" +"Se habilitado, KMess mostra aos contatos o que você está ouvindo. Esta " +"informação é pega do reprodutor de música em uso." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 -msgid "Inform contacts w&hich song I am listening to" -msgstr "" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" +msgstr "Mostrar aos contatos a música estou ouvindo" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "Mostrar &imagem de fundo" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -#, fuzzy -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Mudar status para \"Ausente - Inativo\" quando inativo" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" +msgstr "Formatação da Lista" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "Ativar formatações do MSN &Plus" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Ficar Inativo após" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "Mostrar &email dos contatos ao invés do nome amigável" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minutos" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -#, fuzzy -msgid "Log &all chats" -msgstr "Logar todos os chats" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Salvar arquivos de chat neste diretório principal:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Ano" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -#, fuzzy -msgid "Month" -msgstr "Mês" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Dia" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Salvar todos os chats no diretório principal" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -msgid "&Chat style:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Configurações" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Mostrar &Emoticons" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Mostrar data/hora nas mensagens" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Ausente" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Sua lista de contatos está cheia" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Erro no servidor" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "Sua fonte para mensagens:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Forçar mensagens dos contatos a usar esta fonte:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"Usar efeitos de fontes nas mensagens (*negrito*, /Itálico/ e _sublinhado_)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "&Localizar Contato" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 -#, fuzzy +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" -msgstr "Mostrar &Emoticons" +msgstr "T&emas" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 -#, fuzzy +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" -msgstr "Mostrar &Emoticons" +msgstr "Estilos disponíveis:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 -#, fuzzy +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" -msgstr "Emoticons Cartoon" +msgstr "Emoticons Personalizados" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" -msgstr "" +msgstr "Emoticons personalizados para esta conta:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "" +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "Clique aqui para adicionar um novo Emoticon personalizado" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." +msgstr "Adicionar novo..." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 -#, fuzzy +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Clique aqui para renomear o Emoticon selecinonado" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" -msgstr "Seu nome" +msgstr "Renomear" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -#, fuzzy -msgid "Remo&ve" -msgstr "Removido" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" -msgstr "" +msgstr "Navegador Web" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" +"Escolha esta opção para usar o navegador padrão usado pelo resto do KDE" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "&Usar o navegador padrão do KDE" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" +"Selecione esta opção escolher entre uma lista dos navegadores instalados." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "Us&ar outro navegador:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." -msgstr "" +msgstr "Escolha esta opção para especificar o caminho do seu navegador." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "Especificar um comando personalizado:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" +"Especifique o caminho para o programa a ser usado para abrir links; um '%u' " +"aqui será substituído pela URI do link." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." -msgstr "" +msgstr "Use '%u' para inserir a URL na linha de comando." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" -msgstr "Cliente de email" +msgstr "Cliente de Email" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" +"Marque esta opção para usar o site do Live Mail quanto conectar-se usando " +"contas conpatíveis com Live Mail." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "Usar o &Live Mail caso seja suportado" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" +"Escolha esta opção para usar o cliente de email padrão utilizado pelo resto " +"do KDE." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "Usar o cliente de email padrão do &KDE" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "Usar outro cl&iente de Email:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." -msgstr "" +msgstr "Use '%u' para inserir o endereço de email na linha de comando." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" -msgstr "Transferência de arquivo completada." +msgstr "Transferências de Arquivo" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" -msgstr "Salvar arquivos de chat neste diretório principal:" +msgstr "&Salvar todos os arquivos recebidos em um único diretório:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" -msgstr "" +msgstr "&Usar portas entre" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 msgid "and" msgstr "e" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 msgid "for file transfers" -msgstr "Transferência de arquivo completada." +msgstr "para as transferências de arquivo" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "Seu comentário:" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" +"\n" +"\n" +"

" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "Seu comentário é sobre:" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "Algo que você gosta" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "Algo que você não gosta" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "Um comportamento inadequado do aplicativo" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "Uma função nova que você deseja" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "Especifique um endereço de email para ser contatato novamente" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "Mostrar a barra dos botões de opinião nas janelas" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" -msgstr "Estou distante do computador" +msgstr "Estou Longe do meu Computador" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Seu nome" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "voce@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" +"Algumas senhas inseguras foram encontradas.
Você gostariade " +"importá-las para a Carteira do KDE chamada '%1', mantê-las assim, ou de " +"deletá-las permanentemente?

Nota: não é recomendado usar " +"senhas inseguras se a Carteira do KDE está disponível, por que suas senhas " +"podem ser facilmente obtidas através dos arquivos do KMess." -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Secure Password Storage" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importar" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Remover" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Manter" + +#: chat/chat.cpp:119 #, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" +"Você não pode enviar convites quanto está numa conversa com múltiplos " +"participantes." + +#: chat/chat.cpp:142 msgid "%1 has joined the chat." -msgstr "entrou no chat" +msgstr "%1 juntou-se à conversa." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "saiu do chat" +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "A conversa ficou parada, %1 deixou o bate-papo" -#: chat/chat.cpp:215 -#, fuzzy +#: chat/chat.cpp:202 +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." -msgstr "saiu do chat" +msgstr "%1 deixou a conversa." -#: chat/chat.cpp:364 -#, fuzzy +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr " está digitando." +msgstr "%1 e %2" -#: chat/chat.cpp:371 -#, fuzzy +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." -msgstr " et al." +msgstr "%1 et al." -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr " (Esta mensagem foi enviada automaticamente)" +msgstr "%1 (Esta mensagem foi enviada automaticamente)" -#: chat/chat.cpp:934 -msgid "You received a wink from %1." -msgstr "" - -#: chat/chat.cpp:971 -msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "" - -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" - -#: chat/chat.cpp:1080 -msgid "You have received a wink from %1" -msgstr "" - -#: chat/chat.cpp:1100 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chat.cpp:1119 +#: chat/chat.cpp:830 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "não foi recebida" +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" +"O KMess não pôde salvar o registro para esta conversa.
O " +"diretório de registros, '%1', não existe." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:941 +msgid "You have sent a wink" +msgstr "Você enviou um wink" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Ocorreu um probelma com a conexão" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" +"%1 lhe enviou um clipe de voz, mas o KMess não suporta isto ainda." + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" +"%1 enviou uma mensagem de ação, o KMess ainda não suporta isto." + +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "%1 usou um recurso do MSN que o KMess ainda não suporta." + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" +"Você recebeu um wink de &1, mas a sua exibição foi desativada nas opções de " +"conta." + +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" +"Você recebeu um wink de %1, mas ele não pôde ser exibido. Certifique-se de " +"que você possui o 'cabextract' instalado." + +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Voce recebeu um wink de %1, mas ele não pôde ser exibido devido a uma falha " +"na estração do pacote utilizando o 'cabextract'." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" +"Voce recebeu um wink de %1, mas ele não pôde ser exibido devido. Os dados " +"não puderam ser lidos." + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 enviou um wink!" + +#: chat/chat.cpp:1284 +#, fuzzy +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" +"%1 ficou offline. Quaisquer mensagens enviadas a ele serão entregues " +"na próxima vez que ele(a) se conectar." + +#: chat/chat.cpp:1289 +msgid "%1 has gone offline." +msgstr "%1 ficou offline." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 mudou seu status para \"%2\"" + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 enviou um nudge!" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "todos os contatos" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Você recebeu um nudge de %1!" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Você recebeu um wink de %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 juntou-se à conversa." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1 enviou para você uma mensagem offline:
'%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "" +"O arquivo '%1' não pôde ser achado no computador e nem baixado." + +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" -msgstr "" +msgstr "Você enviou um nudge para %1!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" -msgstr "" +msgstr "Você enviou um nudge!" -#: chat/chatmaster.cpp:1219 -msgid "%1 is sending a wink: %2" -msgstr "" - -#: chat/chatmessagestyle.cpp:298 +#: chat/chat.cpp:1593 #, fuzzy -msgid "%1 says:" -msgstr "diz: " - -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 -msgid "Add this emoticon: %1" -msgstr "" - -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "Conv&idar" - -#: chat/chatview.cpp:695 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." msgstr "" +"%1 está offline. Quaisquer mensagens que você enviar serão entregues na " +"próxima vez que ele(a) se conectar." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatmaster.cpp:1368 +msgid "%1 is sending a wink: %2" +msgstr "%1 está enviando um wink: %2" + +#: chat/chatmessagestyle.cpp:372 +msgid "%1 says:" +msgstr "%1 diz:" + +#: chat/chatmessageview.cpp:320 +#, fuzzy +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "COnversa com %1
Iniciada em: %2" + +#: chat/chatmessageview.cpp:364 +#, fuzzy +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "Conversa iniciada em: %2" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Conversas com %1 guardadas" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 +msgid "Add this emoticon: %1" +msgstr "Adicionar este emoticon: %1" + +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Reconectar" + +#: chat/chatview.cpp:299 +msgid "" +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." +msgstr "" +"Não pude salvar o registro no diretório '%1':\n" +"Certifique-se de que você tem permissões de escrita na pasta onde os " +"registros estão sendo salvos." + +#: chat/chatview.cpp:438 +#, fuzzy +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" +"*.html *.htm|Página Web (*.html)\n" +"*.txt|Documento de Texto (*.txt)\n" +"*.xml|Documento de XML (*.xml)" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" +"O arquivo '%1' já existe.\n" +"Você gostaria de sobrescrevê-lo?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" -msgstr "" +msgstr "Substituir arquivo" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "" +msgstr "Subistituir" -#: chat/chatview.cpp:1275 -#, fuzzy +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." -msgstr "Mostrar &Emoticons" +msgstr "Adicionar este &Emoticon..." -#: chat/chatview.cpp:1282 -#, fuzzy +#: chat/chatview.cpp:827 +msgid "Ignore this &Emoticon" +msgstr "Ignorar este &Emoticon" + +#: chat/chatview.cpp:833 msgid "Send &Email" -msgstr "&Enviar email" +msgstr "Enviar &Email" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "Adicionar &Contato" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +msgid "Copy E&mail Address" +msgstr "Copiar endereço de E&mail" + +#: chat/chatview.cpp:847 msgid "Visit &Link" -msgstr "" +msgstr "Visitar &Link" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" -msgstr "" +msgstr "Copi&ar Endereço" -#: chat/chatview.cpp:1312 -msgid "&Copy text" -msgstr "" +#: chat/chatview.cpp:867 +msgid "&Copy Text" +msgstr "Copiar Texto" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" +msgstr "Selecion&ar Tudo" + +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "Procurar &Texto..." + +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +msgid "C&lear Chat" +msgstr "&Limpar Conversa" + +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Salvar conversa para Arquivo..." + +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Contatos" + +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Emoticons" + +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" +msgstr "Meus Emoticons" + +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" +"Há várias abas abertas nesta janela. Você quer fechar apenas a aba " +"atual, ou todas?

Nota: Você pode fechar todas apenas " +"pressionando Alt+F4." -#: chat/chatview.cpp:1314 -msgid "Find &Text" -msgstr "" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Fechar uma aba da conversa" -#: chat/chatview.cpp:1315 -#, fuzzy -msgid "Save chat to &File" -msgstr "Enviar um &Arquivo" +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" +msgstr "Fechar Todas as Abas" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Chat" +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" +msgstr "Fechar Aba Corrente" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "Enviar um &Arquivo" +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "Conv&idar..." -#: chat/chatwindow.cpp:493 +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." +msgstr "Enviar um Arquivo..." + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "Conversa via webcam" + +#: chat/chatwindow.cpp:412 msgid "Start a &Meeting" msgstr "Iniciar uma &Conferência" -#: chat/chatwindow.cpp:494 -#, fuzzy +#: chat/chatwindow.cpp:413 msgid "Send a &Nudge!" -msgstr "Enviar um &Arquivo" +msgstr "Enviar um &Nudge!" -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "" +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "Salvar conversa..." -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Mostrar &Emoticons" - -#: chat/chatwindow.cpp:498 +#: chat/chatwindow.cpp:415 msgid "Close &All Tabs" -msgstr "" +msgstr "Fechar Todas as &Abas" -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "Configurações" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "" - -#: chat/chatwindow.cpp:568 +#: chat/chatwindow.cpp:420 msgid "Change &Font" msgstr "Mudar &Fonte" -#: chat/chatwindow.cpp:569 +#: chat/chatwindow.cpp:421 msgid "Change Font &Color" msgstr "Mudar &Cor de Fonte" -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&Conectar" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Mudar &Cor de Fonte" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 -#, fuzzy -msgid "Emoticons" -msgstr "Mostrar &Emoticons" - -#: chat/chatwindow.cpp:658 -#, fuzzy -msgid "My emoticons" -msgstr "Mostrar &Emoticons" - -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "Configurações" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 +#: chat/chatwindow.cpp:428 msgid "Show &Emoticons" msgstr "Mostrar &Emoticons" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "Mostrar/Esconder Barra de &Contatos" +#: chat/chatwindow.cpp:429 +msgid "Show S&tatus Messages" +msgstr "Mostrar Mensagens de S&tatus" -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Mostrar/Esconder Barra de &Contatos" +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "Paineis" -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Mostrar ou esconder barra de contatos" +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "U&sar Verificação Ortográfica" -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Conferência" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Nudge" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Enviar um &Arquivo" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "Aba anteior" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "Aba posterior" + +#: chat/chatwindow.cpp:465 +msgid "Enable or disable the contacts panel" +msgstr "Ativar ou desativar o painel de Contatos" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Contatos" + +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "Ativar ou desativar a barra padrão de Emoticons" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emoticons" + +#: chat/chatwindow.cpp:477 +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Ativar ou desativar a barra de Emoticons personalizados" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Meus Emoticons" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Fonte" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "&Cor da Fonte" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "Limpar Janela da Conversa" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Iniciar ou Termina uma &Conversa" + +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" +"Você utilizou uma síntase incorreta para o comando /status. A correta " +"é: /status online|away|idle|brb|busy|lunch|phone|invisible.
Ou " +"você pode utilizar os atalhos /online, /phone etc." -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "Síntaxe /status incorreta" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +#, fuzzy +msgid "You can't block anyone in a group chat." +msgstr "Você não pode bloquear alguém em uma conversa em grupo." + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +#, fuzzy +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "Impossível bloquear agora!" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." msgstr "" +"Comando desconhecido %1. se você não queria que essa mensagem " +"fosse um comando, inicie a sua mensagem com mais uma barra ( / )." -#: chat/chatwindow.cpp:855 -msgid "Close all tabs" -msgstr "" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Comando desconhecido" -#: chat/chatwindow.cpp:856 -msgid "Close current tab" -msgstr "" - -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "Mostrar/Esconder Barra de &Contatos" - -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "Mostrar ou esconder barra de contatos" - -#: chat/chatwindow.cpp:1565 -#, fuzzy -msgid "%1 is typing." -msgstr " está digitando." - -#: chat/chatwindow.cpp:1575 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr " está digitando." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "" - -#: chat/chatwindow.cpp:1611 -#, fuzzy +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" -msgstr "&Chat" +msgstr "Conversa" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" +msgstr "%1 - Conversa" + +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" msgstr "" +"Você tem certeza de que quer esconder a barra de mnus? Para mostrá-la " +"novamente você vai precisar utilizar o atalho: %1" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "&Enviar email" +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Escondendo o menu" -#: chat/contactframe.cpp:285 kmessview.cpp:561 -#, fuzzy +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1 está digitando..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 e %2 estão digitando..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 e %3 outros estão digitando..." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" +"

Info da Conversa

Contatos:
  • %1
Conversa iniciou:
%2
Conectado " +"como:
%3
" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "Iniciar Conver&sa Privada" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +msgid "&Send Email" +msgstr "Enviar Email" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" -msgstr "Mo&strar Perfil" +msgstr "&Ver Perfil" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" -msgstr "" +msgstr "Ed&itar Notas" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Adicionar Contato" -#: chat/contactframe.cpp:289 kmessview.cpp:565 -#, fuzzy +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" -msgstr "&Permitir Contato" +msgstr "Permitir Contato" -#: chat/contactframe.cpp:290 kmessview.cpp:568 -#, fuzzy +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "&Remover Contato" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Bloquear Contato" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "&Desbloquear Contato" -#: chat/contactframe.cpp:295 kmessview.cpp:571 -#, fuzzy +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" -msgstr "Seu nome amigável:" +msgstr "Apelido" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" -msgstr "" +msgstr "&Mensagem Pessoal" -#: chat/contactframe.cpp:297 kmessview.cpp:573 -#, fuzzy +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" -msgstr "Endereço de Email:" +msgstr "&Endereço de Email" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "" +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" +msgstr "&Copiar" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Bloqueado" -#: chat/contactframe.cpp:652 -#, fuzzy +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" -msgstr "O contato está convidando você a iniciar " +msgstr "O contado está %1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" +"

Você não adicionou nenhum emoticon personalizado ainda.

" +"

Para isso, clique aqui!

" -#: chat/emoticonsidebar.cpp:212 -#, fuzzy +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" -msgstr "Adicionar um contato" +msgstr "Adicionar a conversa" -#: chat/emoticonsidebar.cpp:213 -#, fuzzy -msgid "Insert new" -msgstr "Inserir um emoticon" +#: chat/emoticonswidget.cpp:450 +msgid "Add New" +msgstr "Adicionar Novo" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" -msgstr "" +msgstr "Editar" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 -#, fuzzy +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" -msgstr "Removido" +msgstr "Remover" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +#, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

Você não adicionou nenhum emoticon personalizado ainda.

" +"

Para isso, clique aqui!

" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" -msgstr "" +msgstr "Windows Mobile" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 msgid "Web Messenger" -msgstr "" - -#: contact/contactbase.cpp:288 -msgid "Office Communicator" -msgstr "" - -#: contact/contactbase.cpp:292 -msgid "Messenger Bot" -msgstr "" - -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 -msgid "MSN Messenger %1 compatible" -msgstr "" +msgstr "Web Messenger" #: contact/contactbase.cpp:312 -msgid "Windows Live Messenger %1" -msgstr "" +msgid "Office Communicator" +msgstr "Office Communicator" #: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" +msgid "Messenger Bot" +msgstr "Messenger Bot" -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "Compatível com MSN Messenger %1" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" -msgstr "" +msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Compatível com Windows Live Messenger %1" + +#: contact/contactbase.cpp:367 +msgid "Windows Live Messenger compatible" +msgstr "Compatível com Windows Live Messenger" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Online" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Offline" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Permitido" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Removido" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr " está digitando." - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Ausente" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Volto Logo" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Ocupado" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Invisível" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Ausente" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "Ausente com auto-resposta" + +#: contact/msnstatus.cpp:160 msgid "Idle" -msgstr "" +msgstr "Inativo" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Volto Logo" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "No telefone" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Saiu para Comer" -#: dialogs/addcontactdialog.cpp:48 -#, fuzzy +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Invisível" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Offline" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Meu Status" + +#: contact/msnstatus.cpp:215 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Desconectar" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" -msgstr "Adicionar um contato" +msgstr "Adicionar um Contato" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Re&mover Grupo" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 -#, fuzzy +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" -msgstr "Mostrar &Emoticons" +msgstr "Adicionar Novo Emoticon" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "Mostrar &Emoticons" +msgstr "Editar Emoticon" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "O Emoticon \"%1\" já existe. Você gostaria de substituí-lo?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "Especificar uma mensagem de Ausente" +#: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "Mensagem de Ausente Automática" -#: dialogs/contactaddeduserdialog.cpp:33 -msgid "You have been added by someone" -msgstr "" +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Histórico da Conversa" -#: dialogs/contactaddeduserdialog.cpp:85 -#, fuzzy +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " -msgstr "adicionou você a lista de contato dele(a). Você deseja:" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" +"Houve um problema ao abrir os seus registros. Geralmente isto é devido a um " +"problema de permissões, verifique se você possui permissões de leitura/" +"escrita para o diretório \"%1\". Caso contrário, seus registros podem " +"estar corrompidos." -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Não consegui abrir o histórico de conversas." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" +"Impossível recuperar uma data válida para seus registros! Provavelmente isto " +"é devido a eles terem sido gerados com uma versão antiga do KMess" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" +"Seus registros parecem estar corrompidos ou pertencem a uma versão antida do " +"KMess. O KMess pode tentar migrar os seus registros. Deseja fazer isto agora?" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" +"Migração terminada.\n" +"Tentei migrar %1 itens\n" +"%2 itens smigrados com sucesso\n" +"%3 itens não puderam ser migrados." + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "Migração de registros do Alpha" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Você foi adicionado por alguém" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"adicionou você a lista de contatos dele(a)." + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Propriedades do contato %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Conectado" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" -msgstr "" +msgstr "Não visto ainda" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "Mostrar data/hora nas mensagens" +msgstr "Nenhuma mensagem ainda" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" -msgstr "" +msgstr "Última vez visto: %1" -#: dialogs/contactpropertiesdialog.cpp:382 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" -msgstr "Sua fonte para mensagens:" +msgstr "Última mensagem: %1" -#: dialogs/contactpropertiesdialog.cpp:383 -#, fuzzy -msgid "Email: %1" -msgstr "Endereço de Email: " +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Endereço de Email: %1" -#: dialogs/contactpropertiesdialog.cpp:384 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" msgid "Client: %1" -msgstr "Cliente de email" +msgstr "Cliente: %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Clique este botão para restaurar a imagem original deste contato" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Lista de Contatos" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Convidar Contatos" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "Exportar Lista de Contatos de %1" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Nada para exportar" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "O arquivo existe" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "O arquivo %1 já existe, deseja sobrescrevê-lo?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "Exportação Terminada" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "A exportação da lista de contatos terminou" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "S&alvar Aba" #: dialogs/networkwindow.cpp:79 -msgid "S&ave tab" -msgstr "" +msgid "C&lear Tab" +msgstr "Limpas Aba" #: dialogs/networkwindow.cpp:80 -msgid "C&lear tab" -msgstr "" +msgid "C&lose All Tabs" +msgstr "Fechar Todas as Abas" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "" +"Nenguma conexão presente.\n" +"Impossível abrir a Janela da Rede." -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" +"Impossível salvar o registro de da Janela da Rede. Certifique-se de que você " +"possui permissões de escrite na pasta em que ele esta sendo salvo.\t" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." -msgstr "" +msgstr "Impossível fechar a aba da conexão principal." -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" +"Enviar comandos ao servidor é uma operação ariscada.
Se você não sabe " +"como fazer isto, com sorte você pode ser desconectado, ou isto pode " +"resultar em conseqüências mais sérias.
Você foi avisado!
Deseja proseguir com o envio desta mensagem?" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" +"A carga útil que você esta tentando enviar não termina com uma nova linha, o " +"que é exijido ('\\r\\n')!
O KMess deve adicioná-la para você?" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" -msgstr "" +msgstr "Não posso enviar comandos para este tipo de conexão" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" -msgstr "" +msgstr "Cancelado" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "Falhou!" -#: dialogs/transferentry.cpp:217 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Conectado" +msgstr "Finalizado" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" -msgstr "" +msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" -msgstr "" +msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" -msgstr "" +msgstr "%1 bytes" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." -msgstr "" +msgstr "%1 de %2 recebido." -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." -msgstr "" +msgstr "%1 de %2 enviado." -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "Infinito" -#: dialogs/transferwindow.cpp:54 -msgid "Cl&ean Up" -msgstr "" +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "&Usar" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "Remover" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Escolha ou remova seu Avatar" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Deletar Imagem" + +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete the picture?" +msgstr "Tem certeza que deseja remover esta imagem ?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" - -#: emoticontheme.cpp:809 -msgid "Smile" -msgstr "" - -#: emoticontheme.cpp:810 -msgid "Wink" -msgstr "" - -#: emoticontheme.cpp:811 -msgid "Tongue out" -msgstr "" - -#: emoticontheme.cpp:812 -msgid "Big smile" -msgstr "" - -#: emoticontheme.cpp:813 -#, fuzzy -msgid "Sad" -msgstr "e" - -#: emoticontheme.cpp:814 -msgid "Crying" -msgstr "" - -#: emoticontheme.cpp:815 -msgid "Angry" -msgstr "" - -#: emoticontheme.cpp:816 -msgid "Confused" -msgstr "" - -#: emoticontheme.cpp:817 -msgid "Embarrassed" -msgstr "" - -#: emoticontheme.cpp:818 -#, fuzzy -msgid "Disappointed" -msgstr "Desconectado" - -#: emoticontheme.cpp:819 -msgid "Hot" -msgstr "" - -#: emoticontheme.cpp:820 -msgid "Baring teeth" -msgstr "" - -#: emoticontheme.cpp:821 -msgid "Nerd" -msgstr "" +"Impossível salvar o tema de emoticons. Certifique-se de possuir permissões " +"de escrita na pasta '%1'." #: emoticontheme.cpp:822 -msgid "Sick" -msgstr "" +msgid "Smile" +msgstr "Sorrindo" #: emoticontheme.cpp:823 -msgid "Surprised" -msgstr "" +msgid "Wink" +msgstr "Wink" #: emoticontheme.cpp:824 -msgid "Party" -msgstr "" +msgid "Tongue out" +msgstr "Mostrando a língua" #: emoticontheme.cpp:825 -msgid "Sleepy" -msgstr "" +msgid "Big smile" +msgstr "Grande Sorriso" #: emoticontheme.cpp:826 -msgid "Thinking" -msgstr "" +msgid "Sad" +msgstr "Triste" #: emoticontheme.cpp:827 -msgid "Don't tell anyone" -msgstr "" +msgid "Crying" +msgstr "Chorando" #: emoticontheme.cpp:828 -#, fuzzy -msgid "Secret telling" -msgstr "Configurações" +msgid "Angry" +msgstr "Raivoso" #: emoticontheme.cpp:829 -msgid "Eye-rolling" -msgstr "" +msgid "Confused" +msgstr "Confuso" #: emoticontheme.cpp:830 -msgid "Sarcastic" -msgstr "" +msgid "Embarrassed" +msgstr "Envergonhado" #: emoticontheme.cpp:831 -msgid "I don't know" -msgstr "" +msgid "Disappointed" +msgstr "Desapontamento" #: emoticontheme.cpp:832 -#, fuzzy -msgid "Be right back" -msgstr "(Volto Logo)" +msgid "Hot" +msgstr "Quente" #: emoticontheme.cpp:833 -msgid "Angel" -msgstr "" +msgid "Baring teeth" +msgstr "Rangindo os dentes" #: emoticontheme.cpp:834 -msgid "Left hug" -msgstr "" +msgid "Nerd" +msgstr "Nerd" #: emoticontheme.cpp:835 -msgid "Boy" -msgstr "" +msgid "Sick" +msgstr "Doente" #: emoticontheme.cpp:836 -msgid "Red heart" -msgstr "" +msgid "Surprised" +msgstr "Surpreso" #: emoticontheme.cpp:837 -msgid "Red rose" -msgstr "" +msgid "Party" +msgstr "Festa" #: emoticontheme.cpp:838 -msgid "Thumby up" -msgstr "" +msgid "Sleepy" +msgstr "Cansado" #: emoticontheme.cpp:839 -msgid "Dog face" -msgstr "" +msgid "Thinking" +msgstr "Pensando" #: emoticontheme.cpp:840 -#, fuzzy -msgid "Sun" -msgstr "Som:" +msgid "Don't tell anyone" +msgstr "É segredo" #: emoticontheme.cpp:841 -msgid "Devil" -msgstr "" +msgid "Secret telling" +msgstr "Segredinho" #: emoticontheme.cpp:842 -msgid "Right hug" -msgstr "" +msgid "Eye-rolling" +msgstr "Olhos girando" #: emoticontheme.cpp:843 -msgid "Girl" -msgstr "" +msgid "Sarcastic" +msgstr "Sarcásmo" #: emoticontheme.cpp:844 -msgid "Broken heart" -msgstr "" +msgid "I don't know" +msgstr "Eu não sei" #: emoticontheme.cpp:845 -msgid "Wilted rose" -msgstr "" +msgid "Be right back" +msgstr "Volto Logo" #: emoticontheme.cpp:846 -msgid "Thumbs down" -msgstr "" +msgid "Angel" +msgstr "Anjo" #: emoticontheme.cpp:847 -msgid "Cat face" -msgstr "" +msgid "Left hug" +msgstr "Abraço pela esquerda" #: emoticontheme.cpp:848 -msgid "Sleeping half-moon" -msgstr "" +msgid "Boy" +msgstr "Garoto" #: emoticontheme.cpp:849 -msgid "Red lips" -msgstr "" +msgid "Red heart" +msgstr "Coração vermelho" #: emoticontheme.cpp:850 -#, fuzzy -msgid "Clapping" -msgstr "Conversando" +msgid "Red rose" +msgstr "Rosa vermelha" #: emoticontheme.cpp:851 -msgid "Crossed fingers" -msgstr "" +msgid "Thumbs up" +msgstr "Polegar para cima" #: emoticontheme.cpp:852 -msgid "Auto" -msgstr "" +msgid "Dog face" +msgstr "Cachorro" #: emoticontheme.cpp:853 -msgid "Airplane" -msgstr "" +msgid "Sun" +msgstr "Sol" #: emoticontheme.cpp:854 -msgid "Turtle" -msgstr "" +msgid "Devil" +msgstr "Demônio" #: emoticontheme.cpp:855 -#, fuzzy -msgid "Snail" -msgstr "&Enviar email" +msgid "Right hug" +msgstr "Abraço pela direita" #: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "" +msgid "Girl" +msgstr "Garota" #: emoticontheme.cpp:857 -msgid "Goat" -msgstr "" +msgid "Broken heart" +msgstr "Coração partido" #: emoticontheme.cpp:858 -msgid "Vampire bat" -msgstr "" +msgid "Wilted rose" +msgstr "Rosa murcha" #: emoticontheme.cpp:859 -msgid "Pizza" -msgstr "" +msgid "Thumbs down" +msgstr "Polegar para baixo" #: emoticontheme.cpp:860 -msgid "Beer mug" -msgstr "" +msgid "Cat face" +msgstr "Gato" #: emoticontheme.cpp:861 -msgid "Martini glass" -msgstr "" +msgid "Sleeping half-moon" +msgstr "Meia-lua dormindo" #: emoticontheme.cpp:862 -msgid "Coffee cup" -msgstr "" +msgid "Red lips" +msgstr "Lábios vermelhos" #: emoticontheme.cpp:863 -msgid "Birthday cake" -msgstr "" +msgid "Clapping" +msgstr "Batendo as Mãos" #: emoticontheme.cpp:864 -msgid "Plate" -msgstr "" +msgid "Crossed fingers" +msgstr "Dedos crusados" #: emoticontheme.cpp:865 -msgid "Bowl" -msgstr "" +msgid "Auto" +msgstr "Carro" #: emoticontheme.cpp:866 -msgid "Star" -msgstr "" +msgid "Airplane" +msgstr "Avião" #: emoticontheme.cpp:867 -msgid "Rainbow" -msgstr "" +msgid "Turtle" +msgstr "Tartaruga" #: emoticontheme.cpp:868 -msgid "Stormy cloud" -msgstr "" +msgid "Snail" +msgstr "Lesma" #: emoticontheme.cpp:869 -msgid "Lightning" -msgstr "" +msgid "Sheep" +msgstr "Ovelha" #: emoticontheme.cpp:870 -msgid "Umbrella" -msgstr "" +msgid "Goat" +msgstr "Bode" #: emoticontheme.cpp:871 -msgid "Island with a palm tree" -msgstr "" +msgid "Vampire bat" +msgstr "Morcego vampiro" #: emoticontheme.cpp:872 -msgid "Telephone receiver" -msgstr "" +msgid "Pizza" +msgstr "Pizza" #: emoticontheme.cpp:873 -msgid "Mobile Phone" -msgstr "" +msgid "Beer mug" +msgstr "Caneca de chop" #: emoticontheme.cpp:874 -msgid "Email" -msgstr "" +msgid "Martini glass" +msgstr "Dose de martini" #: emoticontheme.cpp:875 -#, fuzzy -msgid "Clock" -msgstr "Bloqueado" +msgid "Coffee cup" +msgstr "Chícara de café" #: emoticontheme.cpp:876 -#, fuzzy -msgid "Camera" -msgstr "Seu nome" +msgid "Birthday cake" +msgstr "Bolo de aniversário" #: emoticontheme.cpp:877 -msgid "Filmstrip" -msgstr "" +msgid "Plate" +msgstr "Prato" #: emoticontheme.cpp:878 -msgid "Note" -msgstr "" +msgid "Bowl" +msgstr "Arco" #: emoticontheme.cpp:879 -msgid "Handcuffs" -msgstr "" +msgid "Star" +msgstr "Estrela" #: emoticontheme.cpp:880 -#, fuzzy -msgid "Money" -msgstr "Mês" +msgid "Rainbow" +msgstr "Arco-íris" #: emoticontheme.cpp:881 -#, fuzzy -msgid "Light bulb" -msgstr "Lista cheia" +msgid "Stormy cloud" +msgstr "Nuvens chovendo" #: emoticontheme.cpp:882 -msgid "Cigarrette" -msgstr "" +msgid "Lightning" +msgstr "Luminária" #: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "" +msgid "Umbrella" +msgstr "Guarda-chuva" #: emoticontheme.cpp:884 -msgid "Gift with a bow" -msgstr "" +msgid "Island with a palm tree" +msgstr "Ilha com palma" #: emoticontheme.cpp:885 -msgid "X-Box" -msgstr "" +msgid "Telephone receiver" +msgstr "Raio" #: emoticontheme.cpp:886 -msgid "Computer" -msgstr "" +msgid "Mobile Phone" +msgstr "Celular" #: emoticontheme.cpp:887 -#, fuzzy +msgid "Email" +msgstr "Email" + +#: emoticontheme.cpp:888 +msgid "Clock" +msgstr "Relógio" + +#: emoticontheme.cpp:889 +msgid "Camera" +msgstr "Câmera" + +#: emoticontheme.cpp:890 +msgid "Filmstrip" +msgstr "Rolo de filme" + +#: emoticontheme.cpp:891 +msgid "Note" +msgstr "Nota" + +#: emoticontheme.cpp:892 +msgid "Handcuffs" +msgstr "Algemas" + +#: emoticontheme.cpp:893 +msgid "Money" +msgstr "Dinheiro" + +#: emoticontheme.cpp:894 +msgid "Light bulb" +msgstr "Lâmpada" + +#: emoticontheme.cpp:895 +msgid "Cigarette" +msgstr "Cigarros" + +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "Bola de futebol" + +#: emoticontheme.cpp:897 +msgid "Gift with a bow" +msgstr "Presente com laço" + +#: emoticontheme.cpp:898 +msgid "X-Box" +msgstr "X-Box" + +#: emoticontheme.cpp:899 +msgid "Computer" +msgstr "Computador" + +#: emoticontheme.cpp:900 msgid "KMess Icon" -msgstr "KMess" +msgstr "Ícone KMess" -#: initialview.cpp:226 -#, fuzzy +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "Impossível reocnectar: conta não encontrada" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "Impossível reconectar: esta conta não possui senha salva." + +#: initialview.cpp:280 initialview.cpp:379 +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" +"Esperando por uma conexão a internet para reconectar...
Reconectar agora!" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" msgid "Internet connection not available." -msgstr "A conexão ao servidor falhou." +msgstr "Conexão com internet não disponível" -#: initialview.cpp:377 -msgid "Connect" -msgstr "Conectar" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +"Aguardando %1 segundo antes de reconectar...
Reconectar " +"agora!" +msgstr[1] "" -#: initialview.cpp:382 -#, fuzzy -msgid "Disconnect" -msgstr "&Desconectar" +#: initialview.cpp:581 +msgctxt "Button label" +msgid "&Connect" +msgstr "&Conectar" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "" +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" +msgstr "&Cancelar" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "" +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "Por favor, especifiqe ambos seu e-mail e senha" -#: kmess.cpp:223 -#, fuzzy +#: initialview.cpp:657 +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Por favor, entre com um endereço de email válido" + +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "Informação do Contato" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "%1 já está presente em sua lista de contatos." + +#: kmess.cpp:250 msgid "New Group" -msgstr "Novo &Grupo" +msgstr "Novo Grupo" -#: kmess.cpp:226 -#, fuzzy -msgid "Add a group" -msgstr "&Adicionar Grupo" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Adicionar um grupo" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" -msgstr "Informe o nove nome para esse grupo:" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" +msgstr "Informe nome para o novo grupo:" -#: kmess.cpp:569 -#, fuzzy +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" -msgstr "Tem certeza que deseja remover este grupo?" +msgstr "" +"Você tem certeza que deseja remover o contato %1 de sua lista de " +"contatos?" -#: kmess.cpp:571 -#, fuzzy -msgid "Remove contact" -msgstr "&Remover Contato" +#: kmess.cpp:579 +msgid "Remove Contact" +msgstr "Remover Contato" -#: kmess.cpp:573 -#, fuzzy -msgid "Remove and block" -msgstr "Removido" +#: kmess.cpp:581 +msgid "Remove and Block" +msgstr "Remover e Bloquear" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" +"O grupo \"%1\" não está vazio: remova todos os contatos e tente " +"novamente!" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" -msgstr "" +msgid "Group Removal" +msgstr "Remoção de Grupo" -#: kmess.cpp:628 -#, fuzzy +#: kmess.cpp:634 msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" -msgstr "Tem certeza que deseja remover este grupo?" +msgstr "" +"Você tem certeza que deseja remover o grupo %1 de sua lista de " +"contatos?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" -msgstr "Removido" +msgstr "Remover" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Este é um grupo especial e não pode ser alterado." -#: kmess.cpp:671 -#, fuzzy -msgid "Rename group" -msgstr "Re&nomear Grupo" +#: kmess.cpp:677 +msgid "Rename Group" +msgstr "Renomear Grupo" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Informe o novo nome para este grupo:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" +"

Não pude logar automaitcamente com a conta \"%1\":
você deve " +"primeirosalvar a sua senha para esta conta!

" -#: kmess.cpp:746 -#, fuzzy +#: kmess.cpp:757 msgctxt "dialog title" -msgid "Autologin failed" -msgstr "Autenticação falhou" +msgid "Autologin Failed" +msgstr "Entrada Automática Falhou" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Tempo Limite de Conexão Atingido" + +#: kmess.cpp:1123 +msgctxt "Status bar message" msgid "Disconnected" msgstr "Desconectado" -#: kmess.cpp:1408 +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "

O KMess procurou nas seguintes pastas:
%1

" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" +"

O KMess não tocará sons ou mostrará notificações.

O arquivo " +"'kmess.notifyrc' não foi encontrado em nenhuma pasta de aplicativos.

%" +"1

Por favor, verifique sua instalação.

" -#: kmess.cpp:1412 -#, fuzzy -msgid "Error with notifications" -msgstr "Notificação de email" +#: kmess.cpp:1481 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Erro com Notificações" -#: kmess.cpp:1589 -#, fuzzy -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Ações" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Novo &Contato" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Novo &Grupo" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "&Localizar Contato" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Pesquisar por &Interesse" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "&Localizar Contato" +msgstr "KMess - %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Nova Cont&a" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Con&figurações de Conta" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "Co&nectado" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&Desconectar" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "Mostrar Meu &Perfil" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Meu Status" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Ausente com auto-resposta" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" -msgstr "E&xibir Contatos Permitidos" +msgstr "Exibir Removidos não Bloque&ados" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Exibir Contatos &Offline" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" -msgstr "Exibir Contatos &Removidos" +msgstr "Exibir &Removidos Bloqueados" -#: kmessinterface.cpp:318 -#, fuzzy +#: kmessinterface.cpp:172 +msgid "Show &History Box" +msgstr "Mostrar Caixa do &Histórico" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "Exibir Barra de Procura" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" -msgstr "Mostrar &Emoticons" +msgstr "Exibir Grupos Va&zios" -#: kmessinterface.cpp:321 -#, fuzzy -msgid "Display Pictures Size" -msgstr "Imagem:" +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "Tamanho da Imagem" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -#, fuzzy -msgid "Small" -msgstr "&Enviar email" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" msgstr "&Ordenar Contatos por" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Mostrar Janela de Transferência" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "Novo &Contato" + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "Novo &Grupo" + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "&Exportar Lista de Contatos..." + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "Localizar C&ontato" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Pesquisar por &Interesse" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Mostrar &Histórico de Conversas" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "Nova Cont&a" + +#: kmessinterface.cpp:189 +msgid "Configure Account..." +msgstr "Configurar Conta..." + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "Co&nfigurações" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "Mostrar &Menu de seleção" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "Não Mostrar" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "Média" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "Média" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "Grande" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "Grupo" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Online/Offline" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "Misturado" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Mostrar Ja&nela de Rede" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "[%1] Conectado como %2" -#: kmessview.cpp:358 -#, fuzzy +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr " está offline" +msgstr "[%1] %2 conectou" -#: kmessview.cpp:363 -#, fuzzy +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr " está offline" +msgstr "[%1] %2 desconectou" -#: kmessview.cpp:559 -#, fuzzy +#: kmessview.cpp:590 msgid "Cha&t" -msgstr "&Chat" +msgstr "&Conversar" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Propriedades" -#: kmessview.cpp:569 -#, fuzzy -msgid "&Remove from group" -msgstr "Re&mover Grupo" +#: kmessview.cpp:600 +msgid "&Remove From Group" +msgstr "Remover do Grupo" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "Enviando arquivo " +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "&Nome da Música" -#: kmessview.cpp:601 -#, fuzzy +#: kmessview.cpp:632 msgid "&Copy to Group" -msgstr "&Mover para Grupo" +msgstr "&Copiar para o Grupo" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" -msgstr "&Mover para Grupo" +msgstr "&Mover para o Grupo" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "Mover Grupo para &Baixo" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Mover Grupo para &Cima" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "Re&mover Grupo" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Re&nomear Grupo" -#: kmessview.cpp:1053 -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "" +#: kmessview.cpp:1124 +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Esta pessoa não tem você na lista dela" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" -msgstr "" +#: kmessview.cpp:1133 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Endereço de email" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" +#: kmessview.cpp:1140 +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Cliente:" -#: kmessview.cpp:1076 -#, fuzzy -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "Sua fonte para mensagens:" +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "Sim" -#: kmessview.cpp:1085 +#: kmessview.cpp:1156 +msgid "No" +msgstr "Não" + +#: kmessview.cpp:1159 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Bloqueado" + +#: kmessview.cpp:1179 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Última vez visto" + +#: kmessview.cpp:1194 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Última mensagem" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" -msgstr "" +msgstr "Grupo %1" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "&Adicionar Contato" - -#: kmessview.cpp:1095 -#, fuzzy +#: kmessview.cpp:1212 msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "&Adicionar Contato" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 contato, %2 online" +msgstr[1] "&Adicionar Contato" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 contato" +msgstr[1] "&Adicionar Contato" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" -msgstr "" +msgstr "<Mensagem pessoal>" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" +"Especifique aqui uma mensagem para mostrar aos seus contatos; eles verão ela " +"junto com o seu nome amigável" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" -msgstr[0] "" +msgstr[0] "%1 novos emails" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" -msgstr "" +msgstr "Um cliente MSN Messenger para o KDE" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:60 msgid "Developer and project founder" -msgstr "" +msgstr "Desenvolvedor e fundado do projeto" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:61 msgid "Developer" -msgstr "" +msgstr "Desenvolvedor" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 msgid "Project support" -msgstr "" +msgstr "Suporte ao projeto" -#: main.cpp:73 main.cpp:74 main.cpp:75 -#, fuzzy +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" -msgstr "Desenvolvedor do GnomeMeeting" +msgstr "Desenvolvedor atual" -#: main.cpp:78 -#, fuzzy +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastasi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." -msgstr "Tradução para Alemão, testes, documentação, e página web" +msgstr "" +"Tradução para Alemão, testes, documentação, página web, gerenciamento do " +"projeto, etc..." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:70 msgid "Web design" -msgstr "" +msgstr "Web-design" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "" -"Conjunto de emoticons padrão amarelo/azul/violeta e tradução para Italiano" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" +"Conjuntos de emoticons (padrão, amarelo, azul e violeta) e tradução para o " +"Italiano" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Emoticons Cartoon" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:73 msgid "Default sound theme" -msgstr "Tema Som padrão" +msgstr "Tema padrão de som" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "Michael Anderton" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" -msgstr "" +msgstr "Ícones do Kmess no estilo Oxygen" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "Mantedor de traduções" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." -msgstr "Tradução para Árabe, correção do salvamento de arquivo." +msgstr "" +"Tradução para Árabe, correção para internacionalização do texto de salvar " +"arquivos." -#: main.cpp:88 -#, fuzzy +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:80 msgid "More Arabic translation" -msgstr "Mais Tradução para Turco" +msgstr "Adições à tradução para Árabe" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Tradução para Português do Brasil" -#: main.cpp:90 -#, fuzzy +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "Tradução para Português do Brasil" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Tradução para Catalão" -#: main.cpp:92 -#, fuzzy +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" -msgstr "Tradução para Chinês Simplificado, correção do envio de arquivos" +msgstr "" +"Tradução para Chinês Simplificado, correção do envio de arquivos, código de " +"conexão por proxy" -#: main.cpp:93 -#, fuzzy +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" -msgstr "Tradução para Chinês Simplificado, correção do envio de arquivos" +msgstr "Adições à tradução para Chines Simplificado" -#: main.cpp:94 -#, fuzzy +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:89 msgid "Traditional Chinese translation" -msgstr "Tradução para Catalão" +msgstr "Tradução para Chinês Tradicional" -#: main.cpp:96 -#, fuzzy +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-Chinese" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "Mais tradução para Chinês Tradicional" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:92 msgid "Danish translation" msgstr "Tradução para Dinamarquês" -#: main.cpp:97 -#, fuzzy +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:93 msgid "More Danish translation" -msgstr "Tradução para Dinamarquês" +msgstr "Adições à tradução para Dinamarquês" + +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:94 +msgid "Dutch translation" +msgstr "Tradução para Holandês" + +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 +msgid "More Dutch translation" +msgstr "Adições à tradução para Holandês" + +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:97 +msgid "Elve" +msgstr "Elve" #: main.cpp:98 -msgid "Dutch translation" -msgstr "Tradução para Alemão" +msgid "Sander Pientka" +msgstr "Sander Pientka" -#: main.cpp:99 main.cpp:100 -#, fuzzy -msgid "More Dutch translation" -msgstr "Tradução para Alemão" +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "Mais tradução alemã, tradução para Grego" -#: main.cpp:102 -#, fuzzy +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:101 +msgid "More Greek translation" +msgstr "Mais traduções em Grego" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:103 msgid "Estonian translation" msgstr "Tradução para Estoniano" -#: main.cpp:103 -#, fuzzy +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:104 msgid "Finnish translation" -msgstr "Tradução para Dinamarquês" +msgstr "Tradução para Finlandês" -#: main.cpp:104 main.cpp:105 -#, fuzzy +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" -msgstr "Tradução para Dinamarquês" +msgstr "Adições à tradução para Finlandês" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:108 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:108 msgid "French translation" msgstr "Tradução para Francês" -#: main.cpp:108 -#, fuzzy -msgid "More French translation, MSN6 emoticon definitions" -msgstr "Tradução para Francês" +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" #: main.cpp:109 -#, fuzzy +msgid "More French translation, MSN6 emoticon definitions" +msgstr "Mais traduções francesas, definição dos emoticons do MSN6" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" -msgstr "Tradução para Francês" +msgstr "Adições à tradução para Francês" #: main.cpp:111 -#, fuzzy -msgid "Hungarian translation" -msgstr "Tradução para Estoniano" +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" -#: main.cpp:112 main.cpp:113 -#, fuzzy -msgid "More Italian translation" -msgstr "Tradução para Coreano" +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:113 +msgid "Hungarian translation" +msgstr "Tradução para Húngaro" #: main.cpp:114 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "Adições à tradução para Húngaro" + +#: main.cpp:115 main.cpp:116 +msgid "More Italian translation" +msgstr "Mais tradução italiana" + +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:117 msgid "Korean translation" msgstr "Tradução para Coreano" -#: main.cpp:115 -#, fuzzy +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:118 msgid "Norsk Bokmål translation" msgstr "Tradução para Norsk Bokmi" -#: main.cpp:117 -#, fuzzy -msgid "Slovenian translation" -msgstr "Tradução para Coreano" +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" -#: main.cpp:118 +#: main.cpp:120 +msgid "Serbian translation" +msgstr "Tradução para Sérbio" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "Tradução para Eslovaco" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "Matjaž kaše" + +#: main.cpp:123 +msgid "Slovenian translation" +msgstr "Tradução para Esloveno" + +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Tradução para Espanhol" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 -#, fuzzy -msgid "More Spanish translation" -msgstr "mais tradução para Espanhol" - -#: main.cpp:123 -#, fuzzy -msgid "Swedish translation" -msgstr "Tradução para Espanhol" - #: main.cpp:125 -#, fuzzy +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 +msgid "More Spanish translation" +msgstr "Mais tradução Espanhola" + +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "Tradução para Sueco" + +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:133 +msgid "More Swedish translation" +msgstr "Mais tradução para Sueco" + +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:135 msgid "Thai translation" msgstr "Tradução para Tailandês" -#: main.cpp:126 +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:136 msgid "Turkish translation" msgstr "Tradução para Turco" -#: main.cpp:127 main.cpp:128 +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:137 main.cpp:138 msgid "More Turkish translation" -msgstr "Mais Tradução para Turco" +msgstr "Adições à tradução para Turco" -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" -#: main.cpp:132 +#: main.cpp:141 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" +msgstr "Suporte ao MSNP12, diversos patches" + +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:142 msgid "Pictures in contact list code, contact client info, chat font zoom" msgstr "" +"Código de imagens na lista de contato, informações do cliente do contato, " +"zoom da fonte da conversa" -#: main.cpp:133 -#, fuzzy +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:143 msgid "File transfer thumbnails" -msgstr "Transferência de arquivo completada." +msgstr "Miniaturas das transferências" -#: main.cpp:134 +#: main.cpp:144 msgid "P4-Context field support" -msgstr "" +msgstr "Suporte ao campo P4-Context" -#: main.cpp:135 +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:145 msgid "Xinerama fixes" msgstr "Correções Xinerama" -#: main.cpp:136 +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:146 msgid "Original file receive code" msgstr "Código de recepção do arquivo original" -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" -msgstr "" +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" -#: main.cpp:138 +#: main.cpp:147 msgid "KWallet support" -msgstr "" +msgstr "Suporte KWallet" -#: main.cpp:139 +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:148 msgid "" -"Notifications blocking option,winks disabling option,last message date " +"Notifications blocking option, winks disabling option, last message date " "feature" msgstr "" +"Opção de bloquear notificações, opção de desativar winks, função data da " +"última mensagem" -#: main.cpp:142 -#, fuzzy +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "Comandos tipo IRC na janela de conversas" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "Andrea Decorte" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "Seleçpão de grupo no dialogo 'contato adicionado'" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "Dario Freddi" + +#: main.cpp:151 +msgid "Chat history dialog" +msgstr "Diálogo do Histórico da Conversa" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:154 msgid "Various internationalization fixes" msgstr "Várias correções de internacionalização." -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Várias correções de internacionalização." -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "Desenvolvedor do GnomeMeeting" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Cara com um saco sobre a cabeça" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspiração e códigos diversos" -#: main.cpp:150 -#, fuzzy -msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "Código de Dicas Balão" +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" -#: main.cpp:151 +#: main.cpp:162 +msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgstr "Old popup balloons code, initial p2p code, msn challenge handler" + +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Código do Timer de Intatividade" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" -msgstr "" +msgstr "Código de fechar para a bandeja do sistema" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:165 msgid "Custom crash handler implementation" -msgstr "" +msgstr "Implementação do gerenciador de erros personalizado" -#: main.cpp:156 -#, fuzzy +#: main.cpp:168 msgid "Your name here?" -msgstr "Seu nome" +msgstr "Seu nome aqui?" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" +"Você é bem-vindo para enviar correções para bugs e patches para o forum de " +"ajuda do KMess\n" +"Se você acha que o seu nome esta faltando aqui, por favor, entre em contato!" -#: main.cpp:159 -#, fuzzy +#: main.cpp:171 msgctxt "NAME OF TRANSLATORS" msgid "Your names" -msgstr "Seu nome" +msgstr "Seus nomes" -#: main.cpp:160 -#, fuzzy +#: main.cpp:172 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" -msgstr "Seu endereço de email:" +msgstr "Seus Emails:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "Não mostrar a Lista de Contatos inicialmente" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Conectar automaticamente com o email fornecido" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" -msgstr "" +msgstr "Rodar um teste de depuração (compilações de desenvolvedor apenas)" + +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "Pessoas" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Permitido" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Removido" #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 -#, fuzzy msgid "The contact cancelled the session." -msgstr "O Contato cancelou o convite." +msgstr "O Contato cancelou a sessão." #: network/applications/application.cpp:306 -#, fuzzy msgid "The contact rejected the invitation." msgstr "O contato rejeitou o convite." #: network/applications/application.cpp:378 -#, fuzzy msgid "You have cancelled the session." -msgstr "Você cancelou o convite." +msgstr "Você cancelou a sessão." #: network/applications/application.cpp:390 msgid "You have rejected the invitation." msgstr "Você rejeitou o convite." #: network/applications/application.cpp:540 -msgid "Do you want to accept or cancel?" -msgstr "" +msgid "Do you want to accept or cancel?" +msgstr "Você gostaria de aceitar ou cancelar?" #: network/applications/application.cpp:581 -msgid "Click to cancel." +msgid "Click to cancel." +msgstr "Clique para cancelar." + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." msgstr "" +"O contato gostaria de enviar um arquivo para você: "%1" (%2)." -#: network/applications/filetransfer.cpp:134 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Você deseja aceitar o arquivo: " +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"O arquivo "%1" já existe.\n" +"você gostaria de substituí-lo?" -#: network/applications/filetransfer.cpp:221 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "falhou. Impossível abrir arquivo" +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "" +"A transferência do arquivo "%1" falhou. Não pude salvar o arquivo." -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "A Transferência de %1 falhou. Não consegui abrir o arquivo de destino." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Transferência aceita." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 -#, fuzzy +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" -msgstr "Tempo Limite de Conexão Atingido" +msgstr "Conectando em %1, porta %2" -#: network/applications/filetransfer.cpp:339 -#, fuzzy -msgid "The transfer was cancelled" -msgstr "Transferência aceita." +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "O contato cancelou a transferência do arquivo "%1"." -#: network/applications/filetransfer.cpp:386 -#, fuzzy +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "Você cancelou a transferência do arquivo "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "Você rejeitou a transferência do arquivo "%1"." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" -msgstr "Tempo Limite de Conexão Atingido" +msgstr "Conexão estabelecida" -#: network/applications/filetransfer.cpp:456 -#, fuzzy -msgid "Successfully transferred file: %1" -msgstr "Arquivo transferido com sucesso: " +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "Arquivo enviado com sucesso "%1"." -#: network/applications/filetransfer.cpp:620 -#, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "falhou. O arquivo não existe" +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "Arquivo recebido com sucesso "%1"." -#: network/applications/filetransfer.cpp:624 -#, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "falhou. Uma conexão não pôde ser estabelecida" - -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -#, fuzzy -msgid "Sending file %1" -msgstr "Enviando arquivo " - -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 -msgid "Negotiating options to connect" +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "" +"A transferência do arquivo "%1" falhou. O arquivo não existe." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "" +"A transferência do arquivo "%1" falhou. O arquivo não pôde ser " +"lido." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Enviando arquivo "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "O contato aceitou a transferência do arquivo "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 +msgid "Negotiating options to connect" +msgstr "Negociando opções para conectar" #: network/applications/filetransferp2p.cpp:129 #: network/applications/filetransferp2p.cpp:143 #: network/applications/filetransferp2p.cpp:160 #: network/extra/msnftpconnection.cpp:132 -#, fuzzy msgid "The file transfer invitation was cancelled. Bad data was received." -msgstr "O Contato cancelou o convite." - -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." msgstr "" +"The file transfer invitation was cancelled. Bad data was received. A " +"transferência de arquivo foi cancelada. Dados inválidos recebidos." -#: network/applications/filetransferp2p.cpp:348 -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "falhou. Impossível abrir arquivo" - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." -msgstr "" +msgstr "Você aceitou a transferência do arquivo "%1"." -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "O Contato cancelou o convite." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Você cancelou o convite." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" -msgstr "" - -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Arquivo transferido com sucesso: " - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Arquivo transferido com sucesso: " - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "falhou. O arquivo não existe" - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "falhou. Uma conexão não pôde ser estabelecida" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Enviando arquivo " - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "O Contato cancelou o convite." +msgstr "O arquivo não pôde ser escrito." #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "Você está convidade a iniciar uma conferência (usando GnomeMeeting)." +msgstr "Você está convidado a iniciar uma conferência (usando GnomeMeeting)." #: network/applications/gnomemeeting.cpp:118 -#, fuzzy msgid "Starting GnomeMeeting. Connecting to %1." -msgstr "Iniciando o GnomeMeeting. Conectando a " +msgstr "Iniciando o GnomeMeeting. Conectando a %1." #: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." -msgstr "Convidadando o contato para uma conferência." +msgstr "Convidando o contato para uma conferência." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." -msgstr "" +msgstr "O convite foi rejeitado. Ele não é suportado pelo outro cliente." -#: network/applications/mimeapplication.cpp:122 -#, fuzzy +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." -msgstr "O contato rejeitou o convite." +msgstr "O contato convite foi abortado. Ocorreu um erro interno." -#: network/applications/mimeapplication.cpp:128 -#, fuzzy +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." -msgstr "falhou. Impossível criar um soquete" +msgstr "" +"O convite foi abortado. O tempo de espera para o contato aceitar acabou." -#: network/applications/mimeapplication.cpp:133 -#, fuzzy +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "O Contato cancelou o convite." +msgstr "O convite foi abortado." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" +"O convite foi abortado. O quadro de distribuição fechou a conexão da " +"conversa." -#: network/applications/mimeapplication.cpp:144 -#, fuzzy +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." -msgstr "O Contato cancelou o convite." +msgstr "O convite foi abortado." #: network/applications/msnremotedesktop.cpp:52 msgid "You are invited to share this person's desktop." msgstr "Você foi convidado a compartilhar o desktop dessa pessoa." #: network/applications/msnremotedesktop.cpp:159 -#, fuzzy msgid "Starting KRDC. Connecting to %1." -msgstr "Iniciando o KRDC. Conectando a " +msgstr "Iniciando KRDC. Conectando a %1." -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -#, fuzzy -msgid "The contact rejected the invitation. An internal error occured." -msgstr "O contato rejeitou o convite." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "O contato iniciou uma função do MSN6 ou que o KMess ainda não possui." -#: network/applications/p2papplicationbase.cpp:609 -#, fuzzy -msgid "The transfer failed." -msgstr "A transferência de " - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "" +"Este convite foi cancelado. O contato enviou dados errados, ou o KMess não " +"os suporta." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -#, fuzzy -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "falhou. O arquivo não existe" - -#: network/applications/p2papplicationbase.cpp:996 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "falhou. Impossível criar um soquete" - -#: network/applications/p2papplicationbase.cpp:1015 -#, fuzzy -msgid "The transfer failed. An internal error occured." -msgstr "O contato rejeitou o convite." - -#: network/applications/p2papplicationbase.cpp:1176 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "falhou. Impossível criar um soquete" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:1071 -#, fuzzy +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." -msgstr "O Contato cancelou o convite." +msgstr "A transferência falhou." -#: network/applications/p2papplication.cpp:1178 -#, fuzzy +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." -msgstr "O Contato cancelou o convite." +msgstr "O convite foi cancelado. A mensagem não era direcionada a nós." -#: network/applications/p2papplication.cpp:1716 -#, fuzzy +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "falhou. O arquivo não existe" - -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 -msgid "Awaiting connection at %1, port %2" msgstr "" +"A transferência falhou. O contato enviou dados estranhos ou o KMess não " +"suporta." -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "O contato rejeitou o convite. Ocorreu um erro interno." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 +msgid "Awaiting connection at %1, port %2" +msgstr "Esperando conexão em %1, porta %2" + +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" +"Revertendo para transferência indireta de arquivos (que pode ser lenta)." -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" -msgstr "" +msgstr "Aguardando pela conexão" -#: network/applications/p2papplication.cpp:3364 -#, fuzzy +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." -msgstr "falhou. Impossível criar um soquete" +msgstr "" +"O convite foi cancelado. O tempo de espera para o contato aceitar acabou." -#: network/applications/p2papplication.cpp:3373 -#, fuzzy +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." -msgstr "falhou. Impossível criar um soquete" - -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 -msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" +"O convite foi cancelado. O tempo de espera para uma resposta de conexão bem " +"ou mal sucedida acabou." + +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 +msgid "The invitation was cancelled. A timeout occured waiting for data." +msgstr "O convite foi cancelado. Tempo de espera por dados excedido." + +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "A transferência falhou." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"A transferência falhou. O contato enviou dados estranhos ou que o KMess não " +"suporta." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" +"A Transferência de arquivos falhou. Tempo de espera pela aceitação do " +"usuário excedido." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "A transferência falhou. Um erro interno ocorreu." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "A transferência falhou. Não consegui abrir os dados para envio." #: network/applications/voiceconversation.cpp:71 -#, fuzzy msgid "You are invited to start a voice conversation." -msgstr "Você foi convidado a compartilhar o desktop dessa pessoa." +msgstr "Você foi convidado a iniciar um conversa por voz." #: network/applications/voiceconversation.cpp:76 -#, fuzzy msgid "" "You are invited to start a voice conversation but support for this was not " "installed" -msgstr "Você está convidade a iniciar uma conferência (usando GnomeMeeting)." +msgstr "" +"Você iniciou uma conversa por voz, mas o suporte para isto não foi instalado" #: network/applications/voiceconversation.cpp:168 -#, fuzzy msgid "You have cancelled the voice conversation." -msgstr "Você cancelou o convite." +msgstr "Você cancelou a conversa por voz." #: network/applications/voiceconversation.cpp:205 -#, fuzzy msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "O Contato cancelou o convite." +msgstr "" +"O convite foi cancelado. Não foi possível abrir o dispositivo de áudio." #: network/applications/voiceconversation.cpp:218 -#, fuzzy msgid "Start voice conversation. Connecting to %1." -msgstr "Iniciando o GnomeMeeting. Conectando a " +msgstr "Iniciar conversa por voz. Conectando a %1" #: network/applications/voiceconversation.cpp:224 -#, fuzzy msgid "Start voice conversation. Listening on %1." -msgstr "Iniciando o GnomeMeeting. Conectando a " +msgstr "Iniciar conversa por voz. Ouvindo em %1." #: network/applications/voiceconversation.cpp:289 -#, fuzzy msgid "Inviting the contact to a voice conversation." -msgstr "Convidadando o contato para uma conferência." +msgstr "Convidando o contato para uma conversa por voz." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 -#, fuzzy +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "" -"O contato está tentando iniciar uma conversa de voz, mas isso ainda não foi " +"O contato está convidando você para '%1', mas isso ainda não foi " "implementado." -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" -msgstr "" +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "O convite a webcam foi cancelado. Dados ruins foram recebidos." -#: network/extra/msnftpconnection.cpp:119 -#, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "A transferência de " +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Foi pedido que você mostre sua webcam." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "Você foi convidado a ver a webcam dessa pessoa" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "webcam" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" -msgstr "" +msgstr "Falhou" -#: network/extra/msnftpconnection.cpp:407 -#, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "falhou. Impossível abrir arquivo" +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Enviando arquivo %1" -#: network/extra/msnftpconnection.cpp:408 -#, fuzzy +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "A Transferência de %1 falhou. Não consegui abrir uma porta local." + +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." -msgstr "falhou. Impossível abrir arquivo" +msgstr "Não consegui abrir uma porta local." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" -msgstr "" +msgstr "Iniciando a transferência de arquivos" -#: network/extra/msnftpconnection.cpp:478 -#, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "falhou. Uma conexão não pôde ser estabelecida" +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "O envio de %1 falhou. Uma conexão não pôde ser estabelecida" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." -msgstr "" +msgstr "Impossível fazer uma conexão" -#: network/extra/msnftpconnection.cpp:583 -#, fuzzy +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" -msgstr "Recebendo o arquivo " +msgstr "Recebendo arquivo %1" -#: network/msnconnection.cpp:589 -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Você foi desconectado porque você \n" -"conectou-se de outro cliente MSN Messenger \n" -"ou de outro local" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Obter sincronização" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Autenticando" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -msgid "Authentication failed, please verify your account name and password." -msgstr "" - -#: network/msnnotificationconnection.cpp:1993 -#, fuzzy -msgid "Connecting..." -msgstr "Conectar" - -#: network/msnnotificationconnection.cpp:2167 -msgid "Unknown command received from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" -msgstr "" +msgstr "Síntaxe de comando inválida" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" -msgstr "" +msgstr "Parâmetro de comando inválido" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "" +msgstr "O email que você tentou adicionar não é uma conta de MSN Messenger" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" -msgstr "" +msgstr "Nome de monínio faltando" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" -msgstr "" +msgstr "Já logado" -#: network/msnnotificationconnection.cpp:2211 -#, fuzzy -msgid "The account name given is invalid" -msgstr "O usuário informado é inválido" +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" +msgstr "O nome da conta dado é inválido" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" +"Este nome de conta é inválido ou sua conta passaporte ainda não foi " +"confirmada" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "Sua lista de contatos está cheia" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" -msgstr "" +msgstr "Parâmetro SBP inválido" -#: network/msnnotificationconnection.cpp:2226 -#, fuzzy +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" -msgstr "Adicionar este contato à sua lista \"Amigos\"" +msgstr "Este contato já encontra-se em sua lista" -#: network/msnnotificationconnection.cpp:2230 -#, fuzzy +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" -msgstr "O contato está convidando você a iniciar " +msgstr "Este contato não está em sua lista" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" -msgstr "" +msgstr "Este contato não está online" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" +msgstr "Já neste modo" + +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." msgstr "" +"Este contato não pode ser adicionado para ambas listas de permissão e " +"bloqueio." -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "O contato está convidando você a iniciar " - -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" +"O nome do grupo já foi adicionado para a lista de contatos do seu Messenger " +"ou Hotmail. Por favor, utlize um nome diferente." -#: network/msnnotificationconnection.cpp:2251 -#, fuzzy -msgid "Your contact list has too many groups" -msgstr "Sua lista de contatos está cheia" +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "Sua lista de contatos tem grupos demais; você pode ter no máximo 30." -#: network/msnnotificationconnection.cpp:2255 -#, fuzzy +#: network/msnconnection.cpp:448 msgid "This group can't be changed" -msgstr "Este é um grupo especial e não pode ser alterado." +msgstr "Este grupo não pode ser alterado" -#: network/msnnotificationconnection.cpp:2260 -#, fuzzy +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" -msgstr "Sua lista de contatos está cheia" +msgstr "Contato não está adicionado neste grupo" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" -msgstr "" +msgstr "Este grupo não está vazio" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "O nome do grupo é muito longo; ele não pode ter mais de 67 bytes" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" -msgstr "" +msgstr "Tentei mudar o grupo \"0\"" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 -#, fuzzy +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" -msgstr "Há um erro interno do servidor" +msgstr "Há um erro interno no Kmess: %1" -#: network/msnnotificationconnection.cpp:2277 -#, fuzzy +#: network/msnconnection.cpp:470 msgid "Invalid Group" -msgstr "Re&nomear Grupo" +msgstr "Grupo Inválido" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" -msgstr "" +msgstr "Domínio vazio" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "Formado errado de comando ADL" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" -msgstr "" +msgstr "O servidor de distribuição falhou" -#: network/msnnotificationconnection.cpp:2287 -#, fuzzy +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" -msgstr "Transferir para servidor de notificação" +msgstr "Transferência para o servidor de distribuição falhou" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" -msgstr "" +msgstr "Erro de conexão direta (MSNSLP); a conexão falhou" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" -msgstr "" +msgstr "Campo necessário faltando" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" -msgstr "" +msgstr "Não logado" -#: network/msnnotificationconnection.cpp:2302 -msgid "No permissions given for this account" -msgstr "" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "O acesso ao serviço MSN foi negado para esta conta" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" -msgstr "" +msgstr "O comando está desabilitado" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." -msgstr "" +msgstr "Sua conta está banida." -#: network/msnnotificationconnection.cpp:2314 -#, fuzzy +#: network/msnconnection.cpp:512 msgid "Challenge response failed" -msgstr "A transferência de " +msgstr "Falha de pedido de resposta" -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" -msgstr "" +msgstr "Dados de comando errados" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" -msgstr "" +msgstr "Você esta abrindo sessões de conversa muito rápido" -#: network/msnnotificationconnection.cpp:2327 -#, fuzzy +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" -msgstr "Você cancelou o convite." +msgstr "Você tem excessivo número de janelas abertas" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" -msgstr "" +msgstr "Sequência inexperada de comandos" -#: network/msnnotificationconnection.cpp:2338 -#, fuzzy +#: network/msnconnection.cpp:536 msgid "Bad friend name" -msgstr "Nome amigável inválido" +msgstr "Nome de amigo inválido" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" -msgstr "" +msgstr "Dado CVR errado" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" -msgstr "" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" +msgstr "O servidor reporta que o KMess o está inundando com muitos dados" -#: network/msnnotificationconnection.cpp:2357 -#, fuzzy +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" -msgstr "Autenticação falhou" +msgstr "Tiquete de autenticação incorreto" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "" "Você não pode iniciar um chat com alguém enquanto você estiver invisível." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" -msgstr "" +msgstr "Não aceitando novos contatos" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" +"Você tem um passaporte Kids, você precisa pedir permissão para conversar " +"online." -#: network/msnnotificationconnection.cpp:2371 -msgid "Your passport account needs to be verified first." -msgstr "" +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." +msgstr "Seu passaporte precisa ser confirmado primeiro." -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" -msgstr "" +msgstr "Tiquete USR errado" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" -msgstr "" +msgstr "Erro ao acessar a lista de contatos, tente novamente mais tarde" -#: network/msnnotificationconnection.cpp:2399 -#, fuzzy +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." -msgstr "Há um erro interno do servidor" +msgstr "" +"O serviço MSN está temporariamente indisponível, ocorreu um erro interno no " +"servidor" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" +"O serviço MSN está temporariamente indisponível, o servidor está muito " +"ocupado" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Servidor de notificação de pontos indisponível" -#: network/msnnotificationconnection.cpp:2418 -#, fuzzy +#: network/msnconnection.cpp:611 msgid "The server is going down" -msgstr "O servidor sairá do ar em breve" +msgstr "O servidor esta saindo do ar" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "O servidor sairá do ar em breve" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" -msgstr "" +msgstr "A escrita está bloqueando" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" -msgstr "" +msgstr "A sessão esta sobrecarregada" -#: network/msnnotificationconnection.cpp:2438 -#, fuzzy +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "O servidor está indisponível" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Autenticação falhou" -#: network/msnnotificationconnection.cpp:2449 -msgid "Unknown error code received from the server: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" +"Código de erro desconhecido recebido do servidor: %1
Detalhes " +"técnicos: %2" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 msgctxt "Error dialog box title" -msgid "MSN error" -msgstr "" +msgid "MSN Error" +msgstr "Erro MSN" -#: network/msnnotificationconnection.cpp:2596 -#, fuzzy +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "Tentando o modo HTTP..." + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Autenticando..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Autenticado" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Mudando de servidor..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Conectando..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "Comando desconhecido recebido do servidor: %1" + +#: network/msnnotificationconnection.cpp:2109 msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" -msgstr[0] "minutos" +msgstr[0] "%1 minuto" msgstr[1] "minutos" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" -msgstr "" +msgstr "Servidor fechado para manutenção em %1!" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." -msgstr "" +msgstr "Os servidores MSN seão desligados em %1 para manutenção." -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" -msgstr "" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "Cliente SOAP não é mais válido." -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -msgid "KMess could not process Offline-IM messages.
Details: %1" -msgstr "" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess não pôde processar mensagens office.
Detalhes: %1" -#: network/msnnotificationconnection.cpp:3172 -#, fuzzy +#: network/msnnotificationconnection.cpp:2589 msgid "Authentication time limit exceeded" -msgstr "Autenticação falhou" +msgstr "Tempo para autenticação excedido" -#: network/msnnotificationconnection.cpp:3218 -#, fuzzy +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Carregando a lista de contatos..." + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

Aviso: %1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "Aviso do MSN" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" -msgstr "Há um erro interno do servidor" +msgstr "
Razão do erro interno: %1" -#: network/msnnotificationconnection.cpp:3242 -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" +"

Falha na autenticação, por favor verifique seu nome de usuário e a senha." +"

" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

A conta %1 conectou-se a partir de outra localização.

" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -#, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "A conexão ao servidor falhou." - -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" +"

Você foi desconectado: porque você conectou com a conta %1 em " +"outro cliente MSN Messenger ou de outro local.

" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Erro no servidor" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" +"

Impossível acessar o serviço Live Messenger.
Talvez você " +"preciseautenticar-se antes de acessar a rede?

" -#: network/msnsockettcp.cpp:352 -#, fuzzy +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

KMess não pôde se conectar aos servidores Live Messenger.
Podem " +"haver problemas com a sua conexão de internet, ou os servidores podem estar " +"indisponíveis .
É possível que uma autenticação via web ou proxy sejá " +"necessária para acessar a rede

Clique aqui para " +"visitar a página de estado do serviço.

" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

Impossível conectar-se ao serviço Live Messenger.

" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

KMess não pôde se conectar aos servidores Live Messenger.
Podem " +"haver problemas com a sua conexão de internet, ou os servidores podem estar " +"indisponíveis .

Clique aqui para visitar a página de " +"estado do serviço.

" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

Erro: %1

" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

O servidor Live Messenger reportou um erro:

%1

" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Erro no servidor Live Messenger:

%1

" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

O servidor do Live Messenger reportou um erro:

%1

" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

Erro do KMess: %1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

KMess encoutrou um erro interno:

%1

" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

Conexão de rede perdida.

" + +#: network/msnnotificationconnection.cpp:3017 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

A conexão com o servidor Live Messenger foi perdida

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" +"

Info do desenvolvedor:
Número do erro: %1
Stringo do erro: %2

" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "Especifique o seu usuário e senha para acessar o proxy da rede" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Código de erro interno: %2)" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" +"%1 (Código de erro interno: %2)
Resposta: %3 %4
Alvo de " +"redirecionamento: %5" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" msgstr "Tempo Limite de Conexão Atingido" -#: network/msnsockettcp.cpp:368 -#, fuzzy +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" -msgstr "Adquirindo listas" +msgstr "1 ping perdido" -#: network/msnsockettcp.cpp:372 -#, fuzzy +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" -msgstr "Adquirindo listas" +msgstr "%1 pings perdidos" -#: network/msnsockettcp.cpp:387 -#, fuzzy -msgid "The connection to the server was lost." -msgstr "A conexão ao servidor falhou." +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "A conexão com o servidor foi perdida" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Esta pessoa está offline ou invisível." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "O endereço de email especificado \"%1\", é inválido!" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" msgstr "" +"O endereço de email especificado \"%1\", não pertence a uma conta do Live " +"Messenger!" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -#, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "não foi recebida" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "Pedido inválido do serviço web (%1)" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "" +#: network/soap/httpsoapconnection.cpp:402 +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "O serviço online não está acessível (%1)" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "" +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Redirecionamentos demais feitos pelo serviço web" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "" +#: network/soap/httpsoapconnection.cpp:521 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "O serviço web de Mensagens Offline não está disponível no momento" -#: notification/chatnotification.cpp:163 -msgid "In %1's chat: %2" -msgstr "" +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "O serviço web do Live Messenger está passando por problemas" -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" -msgstr "" +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "Resposta inválida do serviço web %1 (%2)" -#: notification/chatnotification.cpp:171 -#, fuzzy -msgid "%1 has sent you an offline message:
'%2'" -msgstr " está online" +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "Sem respostas do serviço web" -#: notification/chatnotification.cpp:178 +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Resposta inesperada do servidor (%1)" + +#: notification/chatnotification.cpp:154 +msgid "In %1's chat:
%2" +msgstr "In %1's chat:
%2" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "%1 diz:
'%2'" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 enviou para você uma mensagem offline:
'%2'" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" -msgstr "" +msgstr "Conversa de %1 pede atenção!" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" -msgstr "" +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr " está online" +msgstr "%1 enviou uma mensagem escrita a mão!" -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr " está online" +msgstr "%1 enviou um nudge!" -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr " está online" +msgstr "%1 enviou um wink!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 quer usar a webcam!" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 está enviando um arquivo!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 fez um convite!" #: notification/chatnotification.cpp:204 -msgid "%1 wants to use the webcam!" -msgstr "" +msgid "%1 has canceled the webcam session!" +msgstr "%1 cancelou a sessão de webcam!" #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr " está online" +msgid "%1 has canceled the file transfer!" +msgstr "%1 cancelou a transferência de arquivo!" #: notification/chatnotification.cpp:206 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr " está online" +msgid "%1's activity has been canceled!" +msgstr "A atividade de %1 foi cencelada!" #: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "Você cancelou o convite." +msgid "%1 has accepted to use the webcam!" +msgstr "%1 aceitou em usar a webcam!" #: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "O Contato cancelou o convite." +msgid "%1 has accepted the file transfer!" +msgstr "%1 aceitou a transferência de arquivo!" #: notification/chatnotification.cpp:215 -msgid "%1's activity has been canceled!" -msgstr "" +msgid "%1 has accepted your invitation!" +msgstr "%1 aceitou o seu convite!" #: notification/chatnotification.cpp:222 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "Você cancelou o convite." +msgid "%1 has ended the webcam session!" +msgstr "%1 encerrou essa sessão webcam!" #: notification/chatnotification.cpp:223 -#, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "O Contato cancelou o convite." +msgid "The file transfer with %1 is done!" +msgstr "Transferência de arquivos com %1 terminada!" #: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr " está online" +msgid "%1's activity has ended!" +msgstr "A atividade de %1 terminou!" #: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "Você cancelou o convite." +msgid "%1's webcam session has failed!" +msgstr "A sessão de webcam de %1 falhou!" #: notification/chatnotification.cpp:232 -#, fuzzy -msgid "The file transfer with %1 is done!" -msgstr "A transferência de " +msgid "The file transfer with %1 has failed!" +msgstr "A transferência com %1 falhou!" #: notification/chatnotification.cpp:233 -msgid "%1's activity has ended!" -msgstr "" - -#: notification/chatnotification.cpp:240 -msgid "%1's webcam session has failed!" -msgstr "" - -#: notification/chatnotification.cpp:241 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "A transferência de " - -#: notification/chatnotification.cpp:242 msgid "%1's activity has ended with an error!" +msgstr "A atividade de %1 terminou com um erro!" + +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
está conectado" + +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
ficou ausente" + +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
já volto" + +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
está ocupado" + +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
ficou Invisível" + +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
está inativo" + +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
desconectou" + +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
está ao telefone" + +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
saiu para almoçar" + +#: notification/newemailnotification.cpp:90 +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Novo email:
'%1'
por '%2'" + +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Iniciar Conversa" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Deixar uma mensagem" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Ver mensagem" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Detalhes" + +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Ler Email" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Esconder" + +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." msgstr "" +"Fechar a janela principal mantem o KMess rodando na bandeja do sistema. Use " +"'Sair' no menu 'Conectar' para finalizar o aplicativo." -#: notification/contactstatusnotification.cpp:70 -#, fuzzy -msgid "%1 is now online" -msgstr " está online" +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Indo para Bandeja do Sistema" -#: notification/contactstatusnotification.cpp:71 -#, fuzzy -msgid "%1 has gone away" -msgstr " está online" +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" -msgstr "" +#: notification/systemtraywidget.cpp:246 +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " - %1 (%2)" -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr " está online" - -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr " está online" - -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr " está online" - -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr " está online" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr " está online" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr " está online" - -#: notification/newemailnotification.cpp:78 -msgid "New email:
'%1'
by '%2'" -msgstr "" - -#: settings/accountpage.cpp:69 +#: settings/accountpage.cpp:80 msgid "Browse..." -msgstr "" +msgstr "Escolher..." -#: settings/accountpage.cpp:70 -msgid "Browse and crop picture..." -msgstr "" +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Escolher e cortar imagem..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." -msgstr "" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Usar imagem anterior..." -#: settings/accountpage.cpp:448 -#, fuzzy +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" -msgstr "Imagem:" +msgstr "Baixar imagem do contato falhou" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" +"Um erro ocorreu ao tentar modificar a sua imagem de exibição.\n" +"Certifique-se de você selecionou um arquivo existente." -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "&Remover Contato" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Configurações" -#: settings/accountsettingsdialog.cpp:75 -#, fuzzy +#: settings/accountsettingsdialog.cpp:78 msgid "Account" -msgstr "Contas" +msgstr "Conta" -#: settings/accountsettingsdialog.cpp:76 -#, fuzzy +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" -msgstr "Contas" +msgstr "Minha Conta" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Alertas" +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "Lista de Contatos" -#: settings/accountsettingsdialog.cpp:81 -#, fuzzy -msgid "Alerts and Notifications" -msgstr "Notificação de email" - -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" -msgstr "Conversando" +msgstr "Conversas" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" -msgstr "Log de Chat" +msgstr "Gravação das Conversar" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" +"Clique aqui para deletar esta conta da lista de contas registradas.\n" +"Você não pode deletar uma conta conectada ou uma conta de convidado, queserá " +"deletada ao se desconectar." + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "" +"O endereço de email que você especificou é inválido, e não pode ser " +"utilizado como uma conta: '%1'" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" -msgstr "" +msgstr "O endereço de email que você especificou já esta em uso: '%1'" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Tem certeza que deseja remover esta conta?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." -msgstr "Tem certeza que deseja remover esta conta?" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Você tem certeza que gostaria de remover a conta '%1' ?
Todas as " +"configurações desta conta serão perdidas." -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" -msgstr "" +msgstr "Olá, como vai você? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" -msgstr "" +msgstr "Maria" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" -msgstr "" +msgstr "Ótimo!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" -msgstr "" +msgstr "Eu /acabei/ de voltar das minhas férias na Itália!" -#: settings/emoticonspage.cpp:122 +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "Você pode utilizar 7 caracteres para os atalhos de emoticon" + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "Nome de emoticon inválido" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" msgid "Replace Existing Emoticon" -msgstr "" +msgstr "Substituir Emoticon existente" -#: settings/globalsettingsdialog.cpp:45 -#, fuzzy +#: settings/emoticonspage.cpp:233 +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Tem certeza que deseja remover o emoticon \"%1\" ?" + +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Remover Emoticon" + +#: settings/globalsettingsdialog.cpp:46 msgid "KMess Settings" msgstr "Configurações" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Contas" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 -#, fuzzy -msgid "Notification" -msgstr "Notificação de email" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Notificações" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." -msgstr "" +msgstr "Nenhum navegador selecionável detectado." -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." -msgstr "" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Nenhum cliente de emails selecionável detectado." -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" +"Você deve especificar um comando de console para executar um navegador " +"personalizado!" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" +"O comando de console que você especificou para executar um navegador " +"personalizado não contem o parâmetro '%u'. Sem ele, os sites não serão " +"abertos.
O KMess deve adicioná-lo para você?" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" +"Você deve especificar um comando de console para executar um cliente " +"personalizado de emails!" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" +"O comando de console que você especificou para executar um cliente de " +"emails personalizado não contem o parâmetro '%u'. Sem ele, a composição de " +"emails não irá funcionar.
O KMess deve adicioná-lo para você?" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" -msgstr "" +msgstr "Você tem que selecionar um diretório para os arquivos recebidos!" -#: settings/miscellaneouspage.cpp:404 -#, fuzzy +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" -msgstr "Salvar arquivos de chat neste diretório principal:" +msgstr "Selecionar diretório de arquivos" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

KMess não conseguiu acessar os seus arquivos de configuração!

" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "Enviar comentário aos desenvolvedores" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Bem-vindo a esta versão de testes de %1." + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "Bem-vindo a %1." + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" +"Cada vez que você tiver uma ótima ou frustrante experiência, clique na " +"carinha apropriada abaixo da barra de título, resumidamente descreva o que " +"você gosta ou não e clique em enviar." -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." msgstr "" +"Cada vez que você tiver uma ótima experiência, clique na carinha sorridente " +"abaixoda barra de título, resumidamente descreva o que você gosta e clique " +"em enviar." -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." msgstr "" +"Cada vez que você tiver uma experiência frustrante, clique na carinha " +"tristeabaixo da barra de título, resumidamente descreva o que você não gosta " +"e clique em enviar." -#: systemtraywidget.cpp:245 -msgid "- %1 (%2)" +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." msgstr "" +"Se você observar um comportamento impróprio no aplicativo, apenas clique no " +"ícone do objeto-quebrado icon no canto superior direito da janela, descreva-" +"o eclique em Enviar." + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "Eu gosto do novo tema artístico. Muito moderno." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" +"Eu não gosto da página de boas-vindas deste assistente. Toma muito " +"tempo." + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"O aplicativo tem um comportamento impróprio ao clicar no botão. Nada " +"acontece." + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" +"Eu desejo um recurso novo permitindo que eu envia meu trabalho por " +"email." + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "Para nos ajudar a melhorar, seus comentários são importantes." + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Exemplo" +msgstr[1] "Exemplos" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Ajuda a melhorar o Aplicativo" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Envie um comentário para os Desenvolvedores" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Por favor, escreva isso em %1 (você pode querer usar uma ferramenta online de tradução para isto).
" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Por favor, escreva isso em %1 ou %2 (você pode querer usar uma ferramenta online de tradução para isto).
" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" +"Para tornar seus comentários mais úteis no melhoramento deste aplicativo, " +"tente enviar a mesma quantidade de comentários positivos, e negativos.
" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" +"Por favor, não peça por novos recursos: este tipo de pedido será ignorado." +"
" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" +"

Você pode dar aos desenvolvedores uma breve descrição das suas opiniões de" +"%1.
%2 %3%4

" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"O endereço de email que você digitou é inválido, e não pode ser usado: '%1'" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" +"

Seu comentário foi enviado com sucesso.Ele vai ajudar-nos a melhorar " +"oaplicativo!

Agradecemos pelo seu tempo.

" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Comentário Enviado" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" +"

Houve um erro durante o envio do relatório.

Por favor, rente " +"novamente mais tarde.

" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Erro no Envio do Comentário" + +#~ msgid "Conversations Filter" +#~ msgstr "Filtro de Conversas" + +#~ msgid "Filter by &conversation" +#~ msgstr "Filtrar por &conversa" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Selecione a conta que deseja alterar, depois clique aqui" + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "O nudge para %1 não pode ser enviado." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "O wink para %1 não pode ser enviado." + +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "O desenho para %1 não pôde ser enviado" + +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "A mensagem '%1' para %2 não pôde ser enviada." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "&Usar" + +#~ msgid "&Copy..." +#~ msgstr "&Copiar..." + +#~ msgid "Insert New" +#~ msgstr "Inserir Novo" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "Endereço de Email: %1" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Cliente: %1" + +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Bloqueado: %1" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Última vez visto: %1" + +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Última mensagem: %1" + +#~ msgid "Contact List Alerts" +#~ msgstr "Eventos da Lista de Contatos" + +#~ msgid "&Show winks from contacts" +#~ msgstr "Mostrar wink&s dos contatos" + +#~ msgid "Enable in the contact list" +#~ msgstr "Ativar na lista de contatos" + +#~ msgid "Enable in the chat windows" +#~ msgstr "Ativar nas janelas de conversações" + +#~ msgid "Alerts" +#~ msgstr "Eventos" + +#~ msgid "Alerts and Notifications" +#~ msgstr "Eventos e Notificações" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Nenhum grupo" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "Enviando arquivo " + +#~ msgid "&Send email" +#~ msgstr "&Enviar email" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "Conectado" + +#~ msgid "Connect" +#~ msgstr "Conectar" + +#~ msgid "Rename group" +#~ msgstr "Renomear grupo" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "Con&figurações de Conta" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 acabou de entrar" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 mudou o seu status para \"Ausente\"" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 mudou o seu status para \"Ocupado\"" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 tornou-se \"Inativo\"" + +#~ msgid "Popup Notifications" +#~ msgstr "Notificações Popup" + +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Mostrar notificações quando seus contatos:" + +#~ msgid "&Go online" +#~ msgstr "&Conectarem" + +#~ msgid "Start a &chat with you" +#~ msgstr "Iniciarem uma &conversa com você" + +#~ msgid "S&end you a message" +#~ msgstr "&Enviarem uma mensagem para você" + +#~ msgid "Change their &status" +#~ msgstr "Mudarem de &status" + +#~ msgid "Go o&ffline" +#~ msgstr "&Desconectarem" + +#~ msgid "Email Events" +#~ msgstr "Eventos de Email" + +#~ msgid "Show notifications when email is received:" +#~ msgstr "Mostrar uma notificação quando um email for recebido:" + +#~ msgid "In the Inbox" +#~ msgstr "Na Caixa de Entrada" + +#~ msgid "In other folders" +#~ msgstr "Em outras pastas" + +#~ msgid "Hide popups after" +#~ msgstr "Esconder popups após" + +#~ msgid "seconds" +#~ msgstr "segundos" + +#~ msgid "Other Alerts" +#~ msgstr "Out&ros Alertas" + +#, fuzzy +#~ msgid "Save logged chats as:" +#~ msgstr "Salvar conversa" + +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Esconder Contatos" + +#~ msgid "Also r&emember the password" +#~ msgstr "L&embrar minha senha" + +#~ msgid "Log &all chats" +#~ msgstr "Sa&lvar todas as conversas" + +#~ msgid "Log Structure" +#~ msgstr "Organização do Histórico" + +#~ msgid "Month" +#~ msgstr "Mês" + +#~ msgid "Day" +#~ msgstr "Dia" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "&Adicionar Contato" + +#~ msgctxt "Status message on login screen" +#~ msgid "Reconnecting in %1 seconds..." +#~ msgstr "Reconectando em %1 segundos..." + +#~ msgid "&Search in Contact List" +#~ msgstr "Localizar na Li&sta de Contatos" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Esta pessoa está offline ou invisível." + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "A mensagem \"%1\" não foi recebida!" + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "Mostrar/Esconder Barra de &Contatos" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "Mostrar ou esconder barra de contatos" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "Mostrar ou esconder barra de contatos" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "O contato está convidando você a iniciar " + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "Conv&idar" + +#~ msgid "Specify an Away message" +#~ msgstr "Especificar uma mensagem de Ausente" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "Endereço de Email: " + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "Adicionar este contato à sua lista \"Amigos\"" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "O contato está convidando você a iniciar " + +#, fuzzy +#~ msgid "Click" +#~ msgstr "Bloqueado" + +#~ msgid "Co&nnect" +#~ msgstr "Co&nectado" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "Con&figurações de Conta" + +#~ msgid "Got synchronization" +#~ msgstr "Obter sincronização" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Configurações" + +#, fuzzy +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Você deseja aceitar o arquivo: " + +#, fuzzy +#~ msgid "The transfer was cancelled" +#~ msgstr "Transferência aceita." + +#, fuzzy +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Arquivo transferido com sucesso: " + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "falhou. O arquivo não existe" + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "falhou. Uma conexão não pôde ser estabelecida" + +#, fuzzy +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "A transferência de " #~ msgid "Picture:" #~ msgstr "Imagem:" @@ -4159,10 +6195,6 @@ msgstr "" #~ msgid "Speed:" #~ msgstr "Erro no servidor" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Exibir informação de email na lista de contatos" - #~ msgid "Logging in..." #~ msgstr "Conectando..." @@ -4185,10 +6217,6 @@ msgstr "" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "novos emails" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "Online" - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "falhou. Impossível abrir arquivo" @@ -4215,10 +6243,6 @@ msgstr "" #~ msgid "Your password:" #~ msgstr "Sua senha:" -#, fuzzy -#~ msgid "Display picture:" -#~ msgstr "Imagem:" - #, fuzzy #~ msgid "Show notifications when you recei&ve an email" #~ msgstr "" @@ -4363,10 +6387,6 @@ msgstr "" #~ msgid "Show popup notifications for program events" #~ msgstr "Exibir notificações popup para eventos do programa" -#, fuzzy -#~ msgid "Connection good" -#~ msgstr "Tempo Limite de Conexão Atingido" - #, fuzzy #~ msgid "Server too busy" #~ msgstr "O servidor está ocupado" @@ -4400,13 +6420,6 @@ msgstr "" #~ msgid "There may be a problem with the servers" #~ msgstr "Deve haver um problema com os servidores" -#~ msgid "System Message" -#~ msgstr "Mensagem do sistema" - -#, fuzzy -#~ msgid "Show incoming server messages" -#~ msgstr "Exibir gráficos nas mensagens de chat" - #, fuzzy #~ msgid "Show outgoing server messages" #~ msgstr "Exibir gráficos nas mensagens de chat" @@ -4423,7 +6436,3 @@ msgstr "" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "Obter Novo Emoticon ou Som &Temas" - -#, fuzzy -#~ msgid "n&ame" -#~ msgstr "Seu nome" diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..81bb7c2 --- /dev/null +++ b/po/sk.po @@ -0,0 +1,6432 @@ +# translation of kmess.po to Slovak +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Rastislav Krupanský , 2008. +msgid "" +msgstr "" +"Project-Id-Version: kmess\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2008-09-27 23:17+0100\n" +"Last-Translator: Rastislav Krupanský \n" +"Language-Team: Slovak \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Poedit-Language: Slovak\n" +"X-Poedit-Country: SLOVAKIA\n" +"X-Generator: KBabel 1.11.4\n" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Kreslené emotikony" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "" +"Kliknite na toto tlačidlo, ak chcete začať používať KMess, alebo zrušiť " +"pripojenie" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Zatiaľ žiadne správy" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" +"Kliknite na toto tlačidlo, ak chcete začať používať KMess, alebo zrušiť " +"pripojenie" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Kreslené emotikony" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "&Vlastné emotikony" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Žmurk" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "Kliknite sem pre zobrazenie profilu kontaktu." + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "No&vý riadok" + +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "O&doslať" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Konverzácia" + +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Hlavný panel s nástrojmi" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +#, fuzzy +msgid "Click here to display the menu for this contact" +msgstr "Kliknite sem pre zobrazenie profilu kontaktu." + +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +#, fuzzy +msgid "Click here to open your account settings" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "&Vyčistiť medzipamäť" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "Farba pera" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "Veľkosť pera" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +#, fuzzy +msgid "&Erase brush" +msgstr "Mazací štetec" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Pôvodná skupina" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 +msgid "" +"Enter here the email address of the person you wish to add to your contact " +"list" +msgstr "" +"Zadajte sem e-mailovú adresu osoby, ktorú chcete pridať do vášho zoznamu " +"kontaktov" + +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "E-mailová adresa:" + +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +#, fuzzy +msgid "Enter a shortcut for the emoticon:" +msgstr "Zadajte skratku pre túto emotikonu:" + +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Vybrať súbor s obrázkom:" + +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 +msgid "" +"Enter a message to be automatically sent to people who try to message you." +msgstr "" +"Napíšte správu, ktorá bude automaticky odoslaná ľuďom, ktorí sa vám pokúsia " +"písať." + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +#, fuzzy +msgid "&Specify an automatic away message:" +msgstr "&Správa automaticky preč" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "Vyhľadať kontakt" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Záznam konverzácie" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "&Nepoužívať" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +#, fuzzy +msgid "to" +msgstr "Auto" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Začať alebo ukončiť &konverzáciu" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Čo by ste chcel urobiť?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" +msgstr "&Pridať túto osobu do môjho \"Priatelia\" zoznamu" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person; only allow them to see my status" +msgstr "Nepridávať túto osobu; umožniť jej iba vidieť môj online stav" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting me or seeing my status" +msgstr "&Blokovať túto osobu, alebo vidieť môj online stav" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +msgid "&Information" +msgstr "&Informácia" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +#, fuzzy +msgid "Click this button to restore the display picture of this contact" +msgstr "Kliknite sem pre zobrazenie profilu kontaktu." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" +msgstr "Obnoviť" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +#, fuzzy +msgid "&Groups:" +msgstr "Skupina" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" +msgstr "Použiť alternatívne meno pre túto osobu" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Show a &popup when the contact goes online/offline" +msgstr "Zobraziť vyskakovacie okno keď sa kontakt pripojí/odpojí" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" +msgstr "Zvuk:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 +msgid "I&mages" +msgstr "O&brázky" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Zobraziť obrázok" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +msgid "&Clear Cache" +msgstr "&Vyčistiť medzipamäť" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +#, fuzzy +msgid "&Notes" +msgstr "Poznámky" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "&Emotikony" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +#, fuzzy +msgid "Click here to delete the selected emoticon" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Odstrá&niť" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "P&ovoliť kontakt" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "Tento kontakt nie je vo vašom zozname" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "%1 kontakty" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Položky na export:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Formát" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Kontakty:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "Vybrať všetko" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Zrušiť všetko" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Export..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Zavrieť" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 +msgid "Network Window" +msgstr "Sieťové okno" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +msgid "Command to Current Tab" +msgstr "Príkaz k aktuálnej karte" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 +msgid "Command:" +msgstr "Príkaz:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 +msgid "Type:" +msgstr "Písať:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 +#, fuzzy +msgid "Standard" +msgstr "Hviezda" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 +msgid "Send" +msgstr "Odoslať" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 +msgid "Command payload (can be empty):" +msgstr "Príkaz payload (môže byť prázdny):" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 +msgid "Open" +msgstr "Otvoriť" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 +msgid "Cancel" +msgstr "Zrušiť" + +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "Vy&čistiť" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "Zavrieť" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" +"Kliknite pre zobrazenie možností pre aktuálne vybrané konto, alebo " +"použite koliesko myši pre prepnutie medzi uloženými kontami" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Zadajte e-mailovú adresu vášho Passport, alebo Live konta" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 +msgid "Password:" +msgstr "Heslo:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "Zadajte vaše heslo konta" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Stav pri prihlásení:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +#, fuzzy +msgid "Choose a status to set when successfully connected." +msgstr "Vyberte MSN stav po úspešnom pripojení." + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +#, fuzzy +msgid "If enabled, KMess will save your account" +msgstr "KMess sa automaticky prihlási s týmto kontom, ak je povolené." + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +#, fuzzy +msgid "Remem&ber account" +msgstr "Zapamä&tať tento profil" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +#, fuzzy +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "Ak vyberiete zapamätať profil v KMess, môžete tiež uložiť jeho heslo" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "&Zapamätať heslo" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Kliknite na toto tlačidlo, ak chcete začať používať KMess, alebo zrušiť " +"pripojenie" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 +msgid "&Connect" +msgstr "&Pripojiť" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Nové konto" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" +"Kliknite pre registráciu nového Live konta, ktoré môžete použiť pre " +"pripojenie k MSN.
Taktiež môžete použiť existujúcu e-mailovú adresu" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "Zabudnuté heslo?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +#, fuzzy +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Kliknite sem pre prechod na Live web stránku, kde sa resetne heslo " +"vášho konta" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Pripojiť" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +#, fuzzy +msgctxt "@title:menu" +msgid "&View" +msgstr "Zobraziť" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Akcie" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "Tvar" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Konto" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "Informácie o vašom účte" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." +msgstr "Zadajte mená iných kontaktov, ktoré majú vidieť váš online stav." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 +msgid "&Friendly name:" +msgstr "&Meno:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +#, fuzzy +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Zadajte e-mailovú adresu vášho MSN Passport konta. Nové konto si môžete " +"vytvoriť na http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 +msgid "&Email address:" +msgstr "&E-mailová adresa:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 +msgid "" +"Enter the password of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Zadajte heslo vášho MSN Passport konta. Nové konto si môžete vytvoriť na " +"http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 +msgid "&Password:" +msgstr "&Heslo:" + +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +#, fuzzy +msgid "&Remember password" +msgstr "&Zapamätať heslo" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 +msgid "Display Picture" +msgstr "Zobraziť obrázok" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 +msgid "C&hange..." +msgstr "Z&meniť..." + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 +msgid "&Do not use" +msgstr "&Nepoužívať" + +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy +msgid "" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" +"\n" +"It's recommended to enable this option unless you're using KMess as guest or " +"you're using a public system (e.g. Internet cafe)." +msgstr "" +"Možnosť \"Zapamätať tento profil\" nebola zaškrtnutá, takže vaše nastavenia " +"nebudú štandardne uložené. Povolte túto možnosť ak chcete uložiť nastavenia " +"vášho konta v tomto systéme.\n" +"\n" +"Je doporučené povoliť túto možnosť ak používate KMess ako hosť, alebo " +"používate verejný systém (napr. Internet cafe)." + +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +msgid "Re&member the settings of this account" +msgstr "Za&pamätať nastavenia tohto konta" + +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 +msgid "If enabled, KMess automatically logs in with this account." +msgstr "KMess sa automaticky prihlási s týmto kontom, ak je povolené." + +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "Automaticky prihlásiť &s týmto kontom" + +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 +msgid "Login &as" +msgstr "Prihlásiť &ako" + +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 +#, fuzzy +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"Potrebujete sa pripojiť k Passport stránke pre potvrdenie, že vaša e-mailová " +"adresa existuje." + +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 +#, fuzzy +msgid "" +"You can't change your friendly name because your Passport email address is " +"not verified." +msgstr "" +"Nemôžete meniť vaše meno, pretože vaša Passport e-mailová adresa nie je " +"overená." + +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 +msgid "Request verification email" +msgstr "Požiadať overovací e-mail" + +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 +msgid "Go to accountservices.passport.net" +msgstr "Prejsť na accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 +#, fuzzy +msgid "" +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"Pre pripojenie k sieti MSN Messenger, potrebujete Passport konto. Môžete si " +"zaregistrovať vašu aktuálnu e-mailovú adresu na register.passport.com, alebo " +"použiť pre pripojenie konto služby Hotmail." + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +#, fuzzy +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " +"address as Passport account." +msgstr "" +"Ak sa chcete pripojiť k službe MSN Messenger, musíte zaregistrovať e-mailovú " +"adresu ako Passport konto." + +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 +msgid "Register new account" +msgstr "Zaregistrovať nové konto" + +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 +msgid "http://register.passport.com/" +msgstr "http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 +msgid "Go to register.passport.com" +msgstr "Prejsť na register.passport.com" + +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +#, fuzzy +msgid "&Status Options" +msgstr "Stav pri prihlásení:" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Ak zapnuté, váš stav bude automaticky zmenený na \"Preč-Nečinný \", keď " +"nepoužívate počítač pár minút. Ak nie je dostupná táto možnosť, KMess bol " +"vytvorený bez podpory tejto funkcie." + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Zmeniť stav na \"Preč-Nečinný \" keď neaktívny" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "Určuje počet sekúnd, kedy KMess zmení stav na \"Preč-Nečinný \"." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Stať sa nečinný po" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minútach" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +#, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "&Skryť upozornenia keď je môj stav nastavený ako Nemám čas" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 +msgid "Saved accounts:" +msgstr "Uložené kontá:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +#, fuzzy +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" +msgstr "Kliknite pre vytvorenie nového KMess konta pre váš MSN e-mail" + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +#, fuzzy +msgid "&Add Account..." +msgstr "&Pridať konto..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" +msgstr "Vyberte konto a kliknite sem pre odstránenie" + +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 +msgid "&Edit" +msgstr "&Editovať" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "Vyberte konto a kliknite sem pre odstránenie" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 +msgid "&Remove" +msgstr "&Odstrániť" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +#, fuzzy +msgid "Enable chat logging" +msgstr "Záznam konverzácie" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "Uložiť konverzáciu do &súboru" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +#, fuzzy +msgid "Plain Text" +msgstr "Nájsť &text" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Samostatne uložiť záznamy podľa:" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +#, fuzzy +msgid "Create a directory to organize chats by year" +msgstr "" +"KMEss automaticky vytvorí podadresáre, keď si zvolíte organizovať adresár " +"konverzácie podľa roku, mesiaca alebo dňa." + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Rok" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +#, fuzzy +msgid "Create directories to organize chats by year then by month" +msgstr "" +"KMEss automaticky vytvorí podadresáre, keď si zvolíte organizovať adresár " +"konverzácie podľa roku, mesiaca alebo dňa." + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +#, fuzzy +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" +"KMEss automaticky vytvorí podadresáre, keď si zvolíte organizovať adresár " +"konverzácie podľa roku, mesiaca alebo dňa." + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Uložiť priamo do určeného adresára" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" +"Vybrať adresár vo vašom systéme, kde chcete uložiť záznamy konverzácie." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "Uložiť súbory záznamu do tohto adresára:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "Št&ýl" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"Umožňuje vám zmeniť témy KMess, používané k zobrazeniu všetkých správ " +"konverzácie." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "Štýl &konverzácie:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Nastavenia konverzácie" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Umožňuje vzhľad emotikon v konverzáciách." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "&Zobraziť emotikony" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Zobraziť &emotikony" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +#, fuzzy +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Toto nastavenie povoľuje zoskupovanie správ od rovnakého kontaktu. Keď " +"kontakt používa hromadné správy na vysvetlenie niečoho, KMess zoskupuje " +"tieto správy ako jednu správu. Presná podoba závisí na zvolenom štýle správy." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "&Zoskupovať nadväzujúce správy od toho istého kontaktu" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Umožňuje vzhľad časového údaja v každej správe konverzácie." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Z&obraziť čas správ" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" +msgstr "Kontakty" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +#, fuzzy +msgid "Show s&econds" +msgstr "&Zobraziť emotikony" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Text" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Toto je typ písma a farby, ktoré sú použité v správach." + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "Váš typ písma &správ:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"Umožňuje prepísať typ písma a farbu správ kontaktov, s dolu zvoleným typom " +"písma a farbou." + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "&Vnútiť tento typ písma správam kontaktov:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "V&yčistiť kartu" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +#, fuzzy +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Povoľuje používať efekty písma. Písanie *bold*, /italic/, a " +"_underline_spôsobí, že sa slová objavia v tomto poradí ako hrubé, šikmé " +"alebo podčiarknuté." + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "Použiť &efekty písma v správach ako *bold*, /italic/, a _underline_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 +msgid "" +"

When contacts like to have your attention they can send a nudge. By " +"default the chat window shakes when a nudge is received or sent. Disable " +"this option if the shaking effect is too obtrusive.

\n" +"

When this option is enabled, KMess still limits the shaking effect. " +"Contacts may send multiple nudges at once, but KMess only shakes the chat " +"window with the first nudge.

" +msgstr "" +"

Ak chcú kontakty vašu pozornosť, môžu odoslať štuchanec. Štandardne " +"sa okno konverzácie zatrasie, keď je prijatý, alebo odoslaný štuchanec. Ak " +"je tento efekt príliš obťažujúci, vypnúť túto možnosť.

\n" +"

Ak je táto možnosť zapnutá, KMess stále obmedzuje trasúci sa efekt. " +"Kontakty môžu odoslať viacej štuchancov naraz, ale KMess zatrasie oknom iba " +"s prvým štuchancom.

" + +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "Zatriasť konverzačným &oknom, keď je prijatý, alebo odoslaný štuchanec" + +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 +msgid "" +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "S&kupina konverzuje v tom istom okne:" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Vždy" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "Pre kontakty v tej istej skupine" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Nikdy" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Zobraziť obrázok" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +#, fuzzy +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." +msgstr "" +"Ak zapnuté, zobrazí sa vyskakovacia správa, keď je vo vašom inboxe prijatý e-" +"mail. Počet neprečítaných e-mailov je zobrazený nad zoznamom kontaktov. Toto " +"nastavenie je dostupné iba pre Hotmail konto." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Zobraziť počet neprečítaných e-mailov" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 +#, fuzzy +msgid "" +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." +msgstr "" +"Ak zapnuté, KMess informuje kontakty čo počúvate. Táto informácia je získaná " +"z aktívneho audio prehrávača aplikácií." + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +#, fuzzy +msgid "Show contacts w&hich song I am listening to" +msgstr "Informovať kontakty, k&torú skladbu počúvam" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 +msgid "&Emoticon Themes" +msgstr "Témy &emotikon" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 +msgid "Available emoticon styles:" +msgstr "Dostupné štýly emotikon:" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 +msgid "&Custom Emoticons" +msgstr "&Vlastné emotikony" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 +msgid "Custom emoticons for this account:" +msgstr "Vlastné emotikony pre toto konto:" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +#, fuzzy +msgid "Click here to add a new custom emoticon" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Pridať no&vé..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Kliknite sem na premenovanie zvolenej emotikony" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 +msgid "Re&name" +msgstr "Pre&menovať" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 +msgid "Web Browser" +msgstr "Webový prehliadač" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "Vybrať toto nastavenie pre použitie prehliadača použitého KDE." + +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 +msgid "&Use the KDE default browser" +msgstr "&Použiť KDE predvolený prehliadač" + +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 +msgid "Select this option to choose from a list of installed browsers." +msgstr "" +"Zvoliť toto nastavenie na výber zo zoznamu nainštalovaných prehliadačov." + +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 +msgid "&Use an installed browser:" +msgstr "&Použiť nainštalovaný prehliadač:" + +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 +msgid "Choose this option to enter the path to your favorite browser." +msgstr "" +"Vybrať toto nastavenie pre zadanie cesty k vášmu obľúbenému prehliadaču." + +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +msgid "&Specify a custom command:" +msgstr "&Špecifikovať vlastný príkaz:" + +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 +#, no-c-format +msgid "" +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." +msgstr "" +"Špecifikovať cestu programu použitému k otvoreniu odkazu; '%u' tu bude " +"nahradený odkazom URL." + +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "Použiť '%u' pre vloženie URL v príkazovom riadku." + +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 +msgid "Email Client" +msgstr "E-mailový klient" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 +msgid "" +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." +msgstr "" +"Zaškrtnite toto políčko ak používate Live Mail, keď sa pripojíte s kontom " +"kompatibilným s Live Mail." + +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +#, fuzzy +msgid "Use &Live Mail if the account supports it" +msgstr "Použiť Live Mail ak ho konto podporuje" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 +msgid "Choose this option to use the email client used by the rest of KDE." +msgstr "Vybrať toto nastavenie pre použitie e-mailového klienta použitého KDE." + +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +#, fuzzy +msgid "Use the &KDE default email client" +msgstr "&Použiť KDE predvolený e-mailový klient" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +#, fuzzy +msgid "Use an &installed email client:" +msgstr "&Použiť nainštalovaný e-mailový klient:" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "Použiť '%u' pre vloženie e-mailovej adresy v príkazovom riadku." + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 +msgid "File Transfers" +msgstr "Prenosy súborov" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 +msgid "&Save all received files in one directory:" +msgstr "&Uložiť všetky prijaté súbory do jedného adresára:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 +msgid "&Use ports between" +msgstr "&Použiť porty medzi" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "a" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "pre prenosy súborov" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "Vaše meno" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "Vaše konto je zakázané." + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 +msgid "I'm away from my computer" +msgstr "Som preč" + +#: account.cpp:54 +msgid "Your name" +msgstr "Vaše meno" + +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 +msgid "you@hotmail.com" +msgstr "" + +#: accountsmanager.cpp:388 +msgid "" +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +#, fuzzy +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Zabudnuté heslo?" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "&Odstrániť" + +#: accountsmanager.cpp:404 +#, fuzzy +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Nuda" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" +"Nemôžete spustiť toto privítanie, pretože je v tejto konverzácii viacej " +"kontaktov." + +#: chat/chat.cpp:142 +msgid "%1 has joined the chat." +msgstr "%1 sa pripojil ku konverzácii." + +#: chat/chat.cpp:196 +#, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "Konverzácia sa stala nečinnou, %1 opustil konverzáciu." + +#: chat/chat.cpp:202 +#, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 opustil konverzáciu." + +#: chat/chat.cpp:367 +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 a %2" + +#: chat/chat.cpp:374 +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "%1 a iní." + +#: chat/chat.cpp:664 +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Táto správa bola odoslaná automaticky)" + +#: chat/chat.cpp:830 +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" + +#: chat/chat.cpp:941 +#, fuzzy +msgid "You have sent a wink" +msgstr "Prijali ste odkaz od %1" + +#: chat/chat.cpp:966 +#, fuzzy +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" +"Konverzácia bola zrušená, pretože už nie ste pripojení k MSN serveru. Môžete " +"sa pokúsiť o obnovu pripojenia pre pokračovanie konverzácie." + +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 sa stal neviditeľný" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "%1 vám odoslal offline správu:
'%2'" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "%1 vám odoslal offline správu:
'%2'" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "%1 vám odoslal správu písanú rukou!" + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" +"Prijali ste odkaz od %1, ale zobrazenie odkazov je vypnuté v možnostiach " +"účtu." + +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" +"Prijali ste odkaz od %1, ale nemôže byť zobrazený. Uistite sa, že máte " +"nainštalované 'cabextract'." + +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Prijali ste odkaz od %1, ale nemôže byť zobrazený. Extrahovanie odkazu s " +"balíkom 'cabextract zlyhalo'." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" +"Prijali ste odkaz od %1, ale nemôže byť zobrazený. Dáta sa nedali prečítať." + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 vám odoslal odkaz!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 sa pripojil ku konverzácii." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 sa pripojil ku konverzácii." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 vám odoslal/la štuchanec!" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "P&ovoliť kontakt" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Prijali ste štuchanec od %1!" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Prijali ste odkaz od %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 sa pripojil ku konverzácii." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1 vám odoslal offline správu:
'%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "Správa '%1' nemohla byť odoslaná." + +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You've sent a nudge to %1!" +msgstr "Poslali ste štuchanec %1!" + +#: chat/chat.cpp:1532 +msgid "You've sent a nudge!" +msgstr "Poslali ste štuchanec!" + +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 +msgid "%1 is sending a wink: %2" +msgstr "%1 odosiela štuchnutie: %2" + +#: chat/chatmessagestyle.cpp:372 +msgid "%1 says:" +msgstr "%1 hovorí:" + +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Spustiť hlasovú konverzáciu. Počúvať %1" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 +msgid "Add this emoticon: %1" +msgstr "Pridať túto emotikonu: %1" + +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Pripojiť" + +#: chat/chatview.cpp:299 +#, fuzzy +msgid "" +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." +msgstr "" +"Nedal sa uložiť záznam konverzácie. Uistite sa, že máte právo zapisovať do " +"priečinka, kde sú ukladané záznamy." + +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 +#, fuzzy +msgid "" +"The file '%1' already exists.\n" +"Do you want to overwrite it?" +msgstr "" +"Súbor %1 už existuje.\n" +"Chcete ho prepísať?" + +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Overwrite File" +msgstr "Prepísať súbor" + +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Over&write" +msgstr "Pre&písať" + +#: chat/chatview.cpp:824 +msgid "Add this &Emoticon..." +msgstr "Pridať túto &emotikonu..." + +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Pridať túto &emotikonu..." + +#: chat/chatview.cpp:833 +msgid "Send &Email" +msgstr "Odoslať &e-mail" + +#: chat/chatview.cpp:837 +#, fuzzy +msgid "Add &Contact" +msgstr "&Pridať kontakt" + +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-mailová adresa" + +#: chat/chatview.cpp:847 +msgid "Visit &Link" +msgstr "Navštíviť &odkaz" + +#: chat/chatview.cpp:851 +msgid "Copy &Address" +msgstr "Kopírovať &adresu" + +#: chat/chatview.cpp:867 +#, fuzzy +msgid "&Copy Text" +msgstr "&Kopírovať text" + +#: chat/chatview.cpp:868 +msgid "Select &All" +msgstr "Vybrať &všetko" + +#: chat/chatview.cpp:869 +#, fuzzy +msgid "Find &Text..." +msgstr "Nájsť &text" + +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +#, fuzzy +msgid "C&lear Chat" +msgstr "V&yčistiť kartu" + +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." +msgstr "Uložiť konverzáciu do &súboru" + +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Kontakty" + +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Emotikony" + +#: chat/chatwindow.cpp:121 +#, fuzzy +msgid "My Emoticons" +msgstr "Moje emotikony" + +#: chat/chatwindow.cpp:328 +#, fuzzy +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." +msgstr "" +"V konverzačnom okne je otvorených viac kariet. Chcete zatvoriť iba " +"aktuálnu kartu, alebo všetky karty?

Poznámka:Všetky karty " +"môžete naraz zatvoriť použitím Shift+Esc." + +#: chat/chatwindow.cpp:331 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Zatvorenie karty konverzácie" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "Zatvoriť &všetky karty" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "Zatvoriť aktuálnu kartu" + +#: chat/chatwindow.cpp:409 +#, fuzzy +msgid "&Invite..." +msgstr "&Pozvať" + +#: chat/chatwindow.cpp:410 +#, fuzzy +msgid "Send a &File..." +msgstr "Odoslať &súbor" + +#: chat/chatwindow.cpp:411 +#, fuzzy +msgid "Webcam Chat" +msgstr "Konverzáciu pomocou webovej kamery" + +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Spustiť &schôdzku" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "Odoslať &štuchanec!" + +#: chat/chatwindow.cpp:414 +#, fuzzy +msgid "Save Chat..." +msgstr "Uložiť konverzáciu" + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "Zatvoriť &všetky karty" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Zmeniť &písmo" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Zmeniť &farbu písma" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Zobraziť &emotikony" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Z&obraziť čas správ" + +#: chat/chatwindow.cpp:435 +#, fuzzy +msgid "&Panels" +msgstr "&Zrušiť" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "Použiť &kontrolu pravopisu" + +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Schôdzka" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Štuchanec" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Odoslať &súbor" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Povoliť v zozname kontaktov" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakty" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Povoliť v zozname kontaktov" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emotikony" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Povoliť v zozname kontaktov" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Moje emotikony" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Písmo" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "&Farba písma" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "V&yčistiť kartu" + +#: chat/chatwindow.cpp:561 +#, fuzzy +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Začať alebo ukončiť &konverzáciu" + +#: chat/chatwindow.cpp:977 +#, fuzzy +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" +"Použili ste nesprávnu syntax pre príkaz /stav. Správna syntax je: /" +"stav online|preč|nečinný|hsv|zaneprázdnený|obed|telefón|neviditeľný.
Alebo môžete použiť /online, /telefón a pod. skratky." + +#: chat/chatwindow.cpp:980 +#, fuzzy +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "Nesprávna /stav syntax " + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +#, fuzzy +msgid "You can't block anyone in a group chat." +msgstr "Nemôžete blokovať nikoho v skupinovej konverzácii." + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +#, fuzzy +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "Nemôžete teraz blokovať!" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" +"Neznámy príkaz %1. Ak ste nechceli, aby táto správa bola " +"príkaz, použite správu s iným /." + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Neznámy príkaz" + +#: chat/chatwindow.cpp:1555 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Konverzácia" + +#: chat/chatwindow.cpp:1559 +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Konverzácia" + +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr "%1 píše." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr "%1 a %2 píšu." + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 a %3 píšu." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Spustiť &schôdzku" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" +msgstr "Odoslať &e-mail" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 +msgid "&View Profile" +msgstr "&Zobraziť profil" + +#: chat/contactframe.cpp:307 +msgid "Ed&it Notes" +msgstr "Up&raviť poznámky" + +#: chat/contactframe.cpp:309 kmessview.cpp:595 +msgid "&Add Contact" +msgstr "&Pridať kontakt" + +#: chat/contactframe.cpp:310 kmessview.cpp:596 +msgid "A&llow Contact" +msgstr "P&ovoliť kontakt" + +#: chat/contactframe.cpp:311 kmessview.cpp:599 +msgid "&Delete Contact" +msgstr "&Odstrániť kontakt" + +#: chat/contactframe.cpp:313 kmessview.cpp:597 +msgid "&Block Contact" +msgstr "&Blokovať kontakt" + +#: chat/contactframe.cpp:314 kmessview.cpp:598 +msgid "&Unblock Contact" +msgstr "&Odblokovať kontakt" + +#: chat/contactframe.cpp:316 kmessview.cpp:602 +msgid "&Friendly Name" +msgstr "&Meno" + +#: chat/contactframe.cpp:317 kmessview.cpp:603 +msgid "&Personal Message" +msgstr "&Súkromná správa" + +#: chat/contactframe.cpp:318 kmessview.cpp:604 +msgid "&Email Address" +msgstr "&E-mailová dresa" + +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" +msgstr "&Kopírovať..." + +#: chat/contactframe.cpp:693 +msgid "Blocked" +msgstr "Blokovaný" + +#: chat/contactframe.cpp:705 +#, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" +msgid "The contact is %1" +msgstr "Kontakt je %1" + +#: chat/emoticonswidget.cpp:287 +#, fuzzy +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You haven't added any custom emoticons yet.

To add new " +"emoticons, click here!

" +msgstr "" +"

Zatiaľ ste nepridali žiadne vlastné emotikony.

Pre " +"pridanie nových emotikon, kliknite sme!

" + +#: chat/emoticonswidget.cpp:449 +msgid "Add to Chat" +msgstr "Pridať do konverzácie" + +#: chat/emoticonswidget.cpp:450 +#, fuzzy +msgid "Add New" +msgstr "Pridať no&vé..." + +#: chat/emoticonswidget.cpp:451 +msgid "Edit" +msgstr "Editovať" + +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 +msgid "Remove" +msgstr "Odobrať" + +#: chat/winkswidget.cpp:106 +#, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

Zatiaľ ste nepridali žiadne vlastné emotikony.

Pre " +"pridanie nových emotikon, kliknite sme!

" + +#: contact/contactbase.cpp:304 +msgid "Windows Mobile" +msgstr "" + +#: contact/contactbase.cpp:308 +msgid "Web Messenger" +msgstr "" + +#: contact/contactbase.cpp:312 +msgid "Office Communicator" +msgstr "" + +#: contact/contactbase.cpp:316 +msgid "Messenger Bot" +msgstr "" + +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 kompatibilný" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 kompatibilný" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 kompatibilný" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Online" + +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Nemám čas" + +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Som preč" + +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Preč s automatickou odpoveďou" + +#: contact/msnstatus.cpp:160 +msgid "Idle" +msgstr "Nečinný" + +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Hneď sa vrátim" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "Na telefóne" + +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Obedujem" + +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Neviditeľný" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Offline" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Môj stav" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Odpojiť" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Pridať kontakt" + +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 +msgid "Add New Emoticon" +msgstr "Pridať novú emotikonu" + +#: dialogs/addemoticondialog.cpp:129 +msgid "Edit Emoticon" +msgstr "Editovať emotikonu" + +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +#, fuzzy +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "Emotikona \"%1\" už existuje, chcete ju nahradiť?" + +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" +msgstr "&Správa automaticky preč" + +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Štýl &konverzácie:" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Nedal sa otvoriť lokálny port." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Boli ste niekým pridaný" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2) \n" +"si vás pridal/la do zoznamu kontaktov. " + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Vlastnosti kontaktu pre %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 +msgid "Connected" +msgstr "Pripojené" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 +msgid "Not seen yet" +msgstr "Zatiaľ nevidený" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 +msgid "No messages yet" +msgstr "Zatiaľ žiadne správy" + +#: dialogs/contactpropertiesdialog.cpp:419 +#, fuzzy +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Videný naposledy: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Posledná správa: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-mailová adresa:" + +#: dialogs/contactpropertiesdialog.cpp:422 +#, fuzzy +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Klient: %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Kliknite sem pre zobrazenie profilu kontaktu." + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kontakty" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "%1 kontakty" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "Export zoznamu kontaktov pre %1" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Nič na export" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "Súbor existuje" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "Súbor %1 už existuje, chcete ho prepísať?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "Uloženie zoznamu kontaktov je dokončené" + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "U&ložiť kartu" + +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "V&yčistiť kartu" + +#: dialogs/networkwindow.cpp:80 +#, fuzzy +msgid "C&lose All Tabs" +msgstr "Zatvoriť &všetky karty" + +#: dialogs/networkwindow.cpp:1081 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"Nie sú prítomné žiadne spojenia.\n" +"Nedá sa otvoriť sieťové okno." + +#: dialogs/networkwindow.cpp:1125 +msgid "" +"Could not save the Network Window log. Make sure you have permission to " +"write in the folder where it is being saved." +msgstr "" +"Nedal sa uložiť záznam sieťového okna. Uistite sa, že máte právo zapisovať " +"do priečinka, kde sú ukladané záznamy." + +#: dialogs/networkwindow.cpp:1172 +msgid "Cannot close the main connection tab." +msgstr "Nedá sa zatvoriť hlavná karta pripojenia." + +#: dialogs/networkwindow.cpp:1268 +msgid "" +"Sending commands to the server is a risky operation.
If you don't know " +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" +msgstr "" +"Odosielanie príkazov na server je riskantná operácia.
Ak neviete ako to " +"presne urobiť, mohli by ste byť odpojení, alebo vám môžu vzniknúť " +"vážnejšie dôsledky.
Boli ste varovaní!
Chcete pokračovať v " +"odosielaní tejto správy?" + +#: dialogs/networkwindow.cpp:1298 +msgid "" +"The payload you are trying to send does not end with the required newline " +"('\\r\\n')!
Do you want KMess to add it for you?" +msgstr "" +"Dáta, ktoré sa snažíte odoslať, musia končiť znakom prechodu na nový riadok " +"('\\r\\n')!
Chcete aby vám ho KMess pridal?" + +#: dialogs/networkwindow.cpp:1374 +msgid "Cannot send commands to this kind of connection!" +msgstr "Nemôžete odoslať príkazy k tomuto druhu pripojenia!" + +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 +#: network/applications/filetransferp2p.cpp:99 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 +msgid "Cancelled" +msgstr "Zrušené" + +#: dialogs/transferentry.cpp:181 +msgid "Failed!" +msgstr "Zlyhané!" + +#: dialogs/transferentry.cpp:225 +msgid "Completed" +msgstr "Dokončené" + +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +msgid "%1 MB" +msgstr "%1 MB" + +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +msgid "%1 kB" +msgstr "%1 kB" + +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +msgid "%1 bytes" +msgstr "%1 bytov" + +#: dialogs/transferentry.cpp:343 +msgid "%1 of %2 received." +msgstr "%1 z %2 prijaté." + +#: dialogs/transferentry.cpp:347 +msgid "%1 of %2 sent." +msgstr "%1 z %2 odoslané." + +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "nekonečný" + +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Použiť" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Odstrániť" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Vyberte, alebo odstráňte váš avatar" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Zobraziť obrázok" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Ste si istý, že chcete odstrániť toto konto?" + +#: emoticontheme.cpp:612 +msgid "" +"Could not save the emoticon theme. Make sure you have permission to write to " +"the theme folder '%1'." +msgstr "" +"Nedala sa uložiť téma emotikon. Uistite sa, že máte právo zapisovať do " +"priečinka s témou '%1'." + +#: emoticontheme.cpp:822 +msgid "Smile" +msgstr "Úsmev" + +#: emoticontheme.cpp:823 +msgid "Wink" +msgstr "Žmurk" + +#: emoticontheme.cpp:824 +msgid "Tongue out" +msgstr "Uštipačnosť" + +#: emoticontheme.cpp:825 +msgid "Big smile" +msgstr "Široký úsmev" + +#: emoticontheme.cpp:826 +msgid "Sad" +msgstr "Smútok" + +#: emoticontheme.cpp:827 +msgid "Crying" +msgstr "Plač" + +#: emoticontheme.cpp:828 +msgid "Angry" +msgstr "Hnev" + +#: emoticontheme.cpp:829 +msgid "Confused" +msgstr "Bezradnosť" + +#: emoticontheme.cpp:830 +msgid "Embarrassed" +msgstr "Rozpaky" + +#: emoticontheme.cpp:831 +msgid "Disappointed" +msgstr "Sklamanie" + +#: emoticontheme.cpp:832 +msgid "Hot" +msgstr "Pohoda" + +#: emoticontheme.cpp:833 +msgid "Baring teeth" +msgstr "Zúrivosť" + +#: emoticontheme.cpp:834 +msgid "Nerd" +msgstr "Intelektuál" + +#: emoticontheme.cpp:835 +msgid "Sick" +msgstr "Je mi zle" + +#: emoticontheme.cpp:836 +msgid "Surprised" +msgstr "Údiv" + +#: emoticontheme.cpp:837 +msgid "Party" +msgstr "Oslava" + +#: emoticontheme.cpp:838 +msgid "Sleepy" +msgstr "Nuda" + +#: emoticontheme.cpp:839 +msgid "Thinking" +msgstr "Rozmýšľam" + +#: emoticontheme.cpp:840 +msgid "Don't tell anyone" +msgstr "Nikomu ani slovo" + +#: emoticontheme.cpp:841 +msgid "Secret telling" +msgstr "Pošepkám ti tajomstvo" + +#: emoticontheme.cpp:842 +msgid "Eye-rolling" +msgstr "Ach jaj" + +#: emoticontheme.cpp:843 +msgid "Sarcastic" +msgstr "Sarkazmus" + +#: emoticontheme.cpp:844 +msgid "I don't know" +msgstr "Neviem" + +#: emoticontheme.cpp:845 +msgid "Be right back" +msgstr "Hneď sa vrátim" + +#: emoticontheme.cpp:846 +msgid "Angel" +msgstr "Anjelik" + +#: emoticontheme.cpp:847 +msgid "Left hug" +msgstr "Objatie" + +#: emoticontheme.cpp:848 +msgid "Boy" +msgstr "Chlapec" + +#: emoticontheme.cpp:849 +msgid "Red heart" +msgstr "Srdce" + +#: emoticontheme.cpp:850 +msgid "Red rose" +msgstr "Ruža" + +#: emoticontheme.cpp:851 +msgid "Thumbs up" +msgstr "OK" + +#: emoticontheme.cpp:852 +msgid "Dog face" +msgstr "Pes" + +#: emoticontheme.cpp:853 +msgid "Sun" +msgstr "Slnko" + +#: emoticontheme.cpp:854 +msgid "Devil" +msgstr "Čert" + +#: emoticontheme.cpp:855 +msgid "Right hug" +msgstr "Objatie" + +#: emoticontheme.cpp:856 +msgid "Girl" +msgstr "Dievča" + +#: emoticontheme.cpp:857 +msgid "Broken heart" +msgstr "Zlomené srdce" + +#: emoticontheme.cpp:858 +msgid "Wilted rose" +msgstr "Zvädnutá ruža" + +#: emoticontheme.cpp:859 +msgid "Thumbs down" +msgstr "K.O." + +#: emoticontheme.cpp:860 +msgid "Cat face" +msgstr "Mačka" + +#: emoticontheme.cpp:861 +msgid "Sleeping half-moon" +msgstr "Mesiac" + +#: emoticontheme.cpp:862 +msgid "Red lips" +msgstr "Bozk" + +#: emoticontheme.cpp:863 +msgid "Clapping" +msgstr "Potlesk" + +#: emoticontheme.cpp:864 +msgid "Crossed fingers" +msgstr "Skrížené prsty" + +#: emoticontheme.cpp:865 +msgid "Auto" +msgstr "Auto" + +#: emoticontheme.cpp:866 +msgid "Airplane" +msgstr "Lietadlo" + +#: emoticontheme.cpp:867 +msgid "Turtle" +msgstr "Korytnačka" + +#: emoticontheme.cpp:868 +msgid "Snail" +msgstr "Slimák" + +#: emoticontheme.cpp:869 +#, fuzzy +msgid "Sheep" +msgstr "Nuda" + +#: emoticontheme.cpp:870 +msgid "Goat" +msgstr "Koza" + +#: emoticontheme.cpp:871 +msgid "Vampire bat" +msgstr "Upír" + +#: emoticontheme.cpp:872 +msgid "Pizza" +msgstr "Pizza" + +#: emoticontheme.cpp:873 +msgid "Beer mug" +msgstr "Pivo" + +#: emoticontheme.cpp:874 +msgid "Martini glass" +msgstr "Martini" + +#: emoticontheme.cpp:875 +msgid "Coffee cup" +msgstr "Šálka kávy" + +#: emoticontheme.cpp:876 +msgid "Birthday cake" +msgstr "Torta" + +#: emoticontheme.cpp:877 +msgid "Plate" +msgstr "Tanier" + +#: emoticontheme.cpp:878 +msgid "Bowl" +msgstr "Misa" + +#: emoticontheme.cpp:879 +msgid "Star" +msgstr "Hviezda" + +#: emoticontheme.cpp:880 +msgid "Rainbow" +msgstr "Dúha" + +#: emoticontheme.cpp:881 +msgid "Stormy cloud" +msgstr "Búrkové mračno" + +#: emoticontheme.cpp:882 +msgid "Lightning" +msgstr "Blesk" + +#: emoticontheme.cpp:883 +msgid "Umbrella" +msgstr "Dáždnik" + +#: emoticontheme.cpp:884 +msgid "Island with a palm tree" +msgstr "Palmový ostrov" + +#: emoticontheme.cpp:885 +msgid "Telephone receiver" +msgstr "Slúchadlo" + +#: emoticontheme.cpp:886 +msgid "Mobile Phone" +msgstr "Mobilný telefón" + +#: emoticontheme.cpp:887 +msgid "Email" +msgstr "E-mail" + +#: emoticontheme.cpp:888 +msgid "Clock" +msgstr "Hodiny" + +#: emoticontheme.cpp:889 +msgid "Camera" +msgstr "Fotoaparát" + +#: emoticontheme.cpp:890 +msgid "Filmstrip" +msgstr "Film" + +#: emoticontheme.cpp:891 +msgid "Note" +msgstr "Hudba" + +#: emoticontheme.cpp:892 +msgid "Handcuffs" +msgstr "Putá" + +#: emoticontheme.cpp:893 +msgid "Money" +msgstr "Peniaze" + +#: emoticontheme.cpp:894 +msgid "Light bulb" +msgstr "Žiarovka" + +#: emoticontheme.cpp:895 +#, fuzzy +msgid "Cigarette" +msgstr "Cigareta" + +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" + +#: emoticontheme.cpp:897 +msgid "Gift with a bow" +msgstr "Darček" + +#: emoticontheme.cpp:898 +msgid "X-Box" +msgstr "X-Box" + +#: emoticontheme.cpp:899 +msgid "Computer" +msgstr "Počítač" + +#: emoticontheme.cpp:900 +msgid "KMess Icon" +msgstr "KMess ikona" + +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "Nedá sa obnoviť pripojenie: konto nenájdené." + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "Nedá sa obnoviť pripojenie: toto konto nemá uložené heslo." + +#: initialview.cpp:280 initialview.cpp:379 +#, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Čaká sa na obnovu internetového pripojenia..." + +#: initialview.cpp:384 +msgctxt "Status message on login screen" +msgid "Internet connection not available." +msgstr "Nie je dostupné internetové pripojenie." + +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: initialview.cpp:581 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&Pripojiť" + +#: initialview.cpp:586 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "Zrušiť" + +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "Prosím vyplňte váš e-mail a heslo." + +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Neplatná e-mailová adresa." + +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "Kontaktné informácie" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Tento kontakt je už vo vašom zozname" + +#: kmess.cpp:250 +msgid "New Group" +msgstr "Nová skupina" + +#: kmess.cpp:253 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Pridať skupinu" + +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" +msgstr "Zadajte nový názov pre túto skupinu:" + +#: kmess.cpp:577 +msgid "" +"Are you sure you want to remove the contact %1 from your contact " +"list?" +msgstr "" +"Ste si istý, že chcete odstrániť kontakt %1 z vášho zoznamu " +"kontaktov?" + +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" +msgstr "Odstrániť kontakt" + +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" +msgstr "Odstrániť a blokovať" + +#: kmess.cpp:627 +msgctxt "dialog text" +msgid "" +"The group \"%1\" is not empty: remove all contacts from it, then try " +"again!" +msgstr "" +"Skupina \"%1\" nie je prázdna: odstráňte všetky kontakty, potom to " +"skúste znova!" + +#: kmess.cpp:629 kmess.cpp:636 +#, fuzzy +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Odstránenie skupiny" + +#: kmess.cpp:634 +#, fuzzy +msgctxt "dialog text" +msgid "" +"Are you sure you want to remove the group %1 from your contact " +"list?" +msgstr "" +"Ste si istý, že chcete odstrániť skupinu %1z vášho zoznamu " +"kontaktov?" + +#: kmess.cpp:637 +msgctxt "dialog button" +msgid "Remove" +msgstr "Odstrániť" + +#: kmess.cpp:668 +msgid "This is a special group and can't be changed." +msgstr "Toto je špeciálna skupina a nemôže byť odstránená." + +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "Pr&emenovať skupinu" + +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Zadajte nový názov pre túto skupinu:" + +#: kmess.cpp:754 +msgctxt "dialog text" +msgid "" +"

Cannot login automatically with account \"%1\":
you must first " +"save the account password!

" +msgstr "" +"

Nedá sa automaticky prihlásiť s kontom \"%1\":
musíte najskôr " +"uložiť heslo konta!

" + +#: kmess.cpp:757 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Automatické prihlásenie zlyhalo" + +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Pripája sa..." + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Odpojený" + +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "" + +#: kmess.cpp:1475 +#, fuzzy +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" +"

KMess nebude schopný prehrať zvuky a upozornenia.

KMess súbor " +"'kmess.notifyrc' nebol nájdený v jednom z nasledujúcich priečinkov:%1

Prosím overte vašu inštaláciu a skopírujte chýbajúci súbor do jedného z " +"uvedených priečinkov.

" + +#: kmess.cpp:1481 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Chyba s upozorneniami" + +#: kmess.cpp:1759 +#, fuzzy +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "KMess - %1" + +#: kmessinterface.cpp:163 +msgid "&Disconnect" +msgstr "&Odpojiť" + +#: kmessinterface.cpp:164 +msgid "Show My &Profile" +msgstr "Zobraziť môj &profil" + +#: kmessinterface.cpp:169 +msgid "Show &Allowed Contacts" +msgstr "Zobraziť &povolené kontakty" + +#: kmessinterface.cpp:170 +msgid "Show &Offline Contacts" +msgstr "Zobraziť &offline kontakty" + +#: kmessinterface.cpp:171 +msgid "Show &Removed Contacts" +msgstr "Zobraziť &odstránené kontakty" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &History Box" +msgstr "Štýl &konverzácie:" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Zobraziť bočný &panel" + +#: kmessinterface.cpp:174 +msgid "Show &Empty Groups" +msgstr "Zobraziť &prázdne skupiny" + +#: kmessinterface.cpp:175 +#, fuzzy +msgid "&Display Pictures Size" +msgstr "Zobraziť veľkosť obrázkov" + +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "&Zoradiť kontakty podľa" + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Zobraziť &okno prenosu" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "Nový &kontakt" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "Nová &skupina" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "Export zoznamu kontaktov" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "Vyhľadať kontakt" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Hľadať podľa &záujmov" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Štýl &konverzácie:" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "Nové &konto" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Nové &konto" + +#: kmessinterface.cpp:190 +#, fuzzy +msgid "Configure &KMess..." +msgstr "Konfigurovať &KMess" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +#, fuzzy +msgid "Do Not Display" +msgstr "Nezobraziť" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "Malý" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "Stredný" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "Veľký" + +#: kmessinterface.cpp:201 +msgid "Group" +msgstr "Skupina" + +#: kmessinterface.cpp:202 +msgid "Online/Offline" +msgstr "Online/Offline" + +#: kmessinterface.cpp:203 +msgid "Mixed" +msgstr "Zmiešané" + +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Zobraziť &sieťové okno" + +#: kmessview.cpp:315 +msgid "[%1] Logged with %2" +msgstr "[%1] Prihlásený s %2" + +#: kmessview.cpp:352 +msgid "[%1] %2 goes online" +msgstr "[%1] %2 je online" + +#: kmessview.cpp:357 +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 je offline" + +#: kmessview.cpp:590 +msgid "Cha&t" +msgstr "Konverzáci&a" + +#: kmessview.cpp:593 +msgid "&Properties" +msgstr "&Vlastnosti" + +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" +msgstr "&Odstrániť zo skupiny" + +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" + +#: kmessview.cpp:632 +msgid "&Copy to Group" +msgstr "&Kopírovať do skupiny" + +#: kmessview.cpp:633 +msgid "&Move to Group" +msgstr "&Presunúť do skupiny" + +#: kmessview.cpp:683 +msgid "Move Group &Down" +msgstr "Posunúť skupinu &nadol" + +#: kmessview.cpp:684 +msgid "Move Group &Up" +msgstr "Move Group &Up" + +#: kmessview.cpp:685 +msgid "Re&move Group" +msgstr "Od&strániť skupinu" + +#: kmessview.cpp:686 +msgid "Re&name Group" +msgstr "Pr&emenovať skupinu" + +#: kmessview.cpp:1124 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "&Pridať túto osobu do môjho \"Priatelia\" zoznamu" + +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-mailová adresa" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Klient: %1" + +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "" + +#: kmessview.cpp:1156 +#, fuzzy +msgid "No" +msgstr "Hudba" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokovaný" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Videný naposledy: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Posledná správa: %1" + +#: kmessview.cpp:1204 +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Skupina %1" + +#: kmessview.cpp:1212 +#, fuzzy +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 kontakty, %2 online" +msgstr[1] "%1 kontakty, %2 online" +msgstr[2] "%1 kontakty, %2 online" + +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 kontakty" +msgstr[1] "%1 kontakty" +msgstr[2] "%1 kontakty" + +#: kmessview.cpp:1631 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Napíšte sem vašu osobnú správu>" + +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 nová e-mailová správa" +msgstr[1] "%1 nové e-mailové správy" +msgstr[2] "%1 nových e-mailových správ" + +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 +msgid "KMess" +msgstr "KMess" + +#: main.cpp:44 +msgid "A MSN Messenger client for KDE" +msgstr "MSN Messenger klient pre KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "Vývojár a zakladateľ projektu" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "Vývojár" + +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "Podpora projektu" + +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 +msgid "Current developer" +msgstr "Aktuálny vývojár" + +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 +msgid "" +"German translation, testing, documentation, web master, project management, " +"etc..." +msgstr "" + +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 +msgid "Web design" +msgstr "Webový design" + +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 +msgid "Cartoon emoticons" +msgstr "Kreslené emotikony" + +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 +msgid "Default sound theme" +msgstr "Predvolená zvuková téma" + +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 +msgid "KMess icon in Oxygen style" +msgstr "KMess ikona v štýle Oxygen" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 +msgid "Arabic translation, internationalization of file saving fix." +msgstr "" + +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 +msgid "More Arabic translation" +msgstr "" + +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 +msgid "Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 +msgid "Catalan translation" +msgstr "" + +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" + +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 +msgid "More Simplified Chinese translation" +msgstr "" + +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 +msgid "Traditional Chinese translation" +msgstr "" + +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 +msgid "Danish translation" +msgstr "" + +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 +msgid "More Danish translation" +msgstr "" + +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 +msgid "Dutch translation" +msgstr "" + +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 +msgid "More Dutch translation" +msgstr "" + +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +msgid "More Greek translation" +msgstr "" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 +msgid "Estonian translation" +msgstr "" + +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 +msgid "Finnish translation" +msgstr "" + +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 +msgid "More Finnish translation" +msgstr "" + +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 +msgid "French translation" +msgstr "" + +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 +msgid "More French translation" +msgstr "" + +#: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 +msgid "Hungarian translation" +msgstr "" + +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "" + +#: main.cpp:115 main.cpp:116 +msgid "More Italian translation" +msgstr "" + +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 +msgid "Korean translation" +msgstr "" + +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 +msgid "Norsk Bokmål translation" +msgstr "" + +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +msgid "Serbian translation" +msgstr "" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 +msgid "Slovenian translation" +msgstr "" + +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 +msgid "Spanish translation" +msgstr "" + +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 +msgid "More Spanish translation" +msgstr "" + +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "" + +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:133 +msgid "More Swedish translation" +msgstr "" + +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:135 +msgid "Thai translation" +msgstr "" + +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "" + +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "" + +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +#, fuzzy +msgid "MSNP12 support, various patches" +msgstr "MSNP12 podpora, rôzne opravy." + +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" +"Obrázky v zozname kontaktu, kontaktné info klienta, lupa písma v konverzácii" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +msgid "File transfer thumbnails" +msgstr "Náhľady prenosu súborov" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "KWallet podpora" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +#, fuzzy +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" +"Nastavenie blokovania upozornení,nastavenie vypnutia odkazov,funkcia dátumu " +"poslednej správy" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "Ako IRC príkazy v okne konverzácie" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "Štýl &konverzácie:" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "Rôzne medzinárodné opravy" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 +msgid "Various internationalization fixes." +msgstr "Rôzne medzinárodné opravy." + +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 +msgid "GnomeMeeting developer" +msgstr "" + +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 +msgid "Guy with a bag over his head" +msgstr "Chlapík s taškou cez hlavu" + +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 +msgid "Inspiration and assorted code" +msgstr "" + +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:162 +msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgstr "" + +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 +msgid "Idle timer code" +msgstr "" + +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 +msgid "Close-to-tray icon screenshot code" +msgstr "" + +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:165 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:168 +msgid "Your name here?" +msgstr "Vaše meno?" + +#: main.cpp:168 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forums!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" +"Ste vítaní posielaním opráv na KMEss fórum!\n" +"Ak máte pocit, že vaše meno tu chýba, prosím kontaktujte nás!" + +#: main.cpp:171 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Vaše mená" + +#: main.cpp:172 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your emails" +msgstr "Vaše e-maily" + +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 +msgid "Autologin with the given email address" +msgstr "Prihlásenie s danou e-mailovou adresou" + +#: main.cpp:184 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Povolený" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Odobraný" + +#: network/applications/application.cpp:294 +msgid "The contact cancelled the session." +msgstr "Kontakt zrušil reláciu." + +#: network/applications/application.cpp:306 +msgid "The contact rejected the invitation." +msgstr "Kontakt odmietol pozvánku." + +#: network/applications/application.cpp:378 +msgid "You have cancelled the session." +msgstr "Zrušil ste reláciu." + +#: network/applications/application.cpp:390 +msgid "You have rejected the invitation." +msgstr "Odmietol ste pozvánku." + +#: network/applications/application.cpp:540 +#, fuzzy +msgid "Do you want to
accept or cancel?" +msgstr "Chcete prijať, alebo zrušiť?" + +#: network/applications/application.cpp:581 +#, fuzzy +msgid "Click to cancel." +msgstr "Kliknite pre zrušiť." + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "Kontakt vám chce odoslať súbor: "%1" (%2)." + +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Súbor "%1" už existuje.\n" +"Chcete ho prepísať?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "Prenos súboru "%1" zlyhal. Súbor sa nedal uložiť." + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "Prenos %1 zlyhal. Nedal sa otvoriť cieľový súbor." + +#: network/applications/filetransfer.cpp:319 +msgid "Transfer accepted." +msgstr "Prenos prijatý." + +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 +msgid "Connecting to %1, port %2" +msgstr "Pripájanie k %1, port %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakt zrušil prenos súboru "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "Zrušili ste prenos súboru "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "Odmietli ste prenos súboru "%1"." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Pripojenie nadviazané" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "Súbor úspešne odoslaný "%1"." + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "Súbor úspešne prijatý "%1"." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." +msgstr "Prenos súboru "%1" zlyhal. Súbor neexistuje." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "Prenos súboru "%1" zlyhal. Súbor nemohol byť prečítaný." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Odosiela sa súbor "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Kontakt akceptoval prenos súboru "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 +msgid "Negotiating options to connect" +msgstr "Prebieha vyjednávanie o možnostiach pripojenia" + +#: network/applications/filetransferp2p.cpp:129 +#: network/applications/filetransferp2p.cpp:143 +#: network/applications/filetransferp2p.cpp:160 +#: network/extra/msnftpconnection.cpp:132 +msgid "The file transfer invitation was cancelled. Bad data was received." +msgstr "Prenos súboru pozvánky bol zrušený. Boli prijaté chybné dáta." + +#: network/applications/filetransferp2p.cpp:404 +msgid "You have accepted the transfer of file "%1"." +msgstr "Akceptovali ste prenos súboru "%1"." + +#: network/applications/filetransferp2p.cpp:615 +msgid "File could not be written" +msgstr "Súbor nemohol byť zapísaný" + +#: network/applications/gnomemeeting.cpp:56 +msgid "You are invited to start a meeting (using GnomeMeeting)." +msgstr "Ste pozvaný spustiť stretnutie.(použitie GnomeMeeting)." + +#: network/applications/gnomemeeting.cpp:118 +msgid "Starting GnomeMeeting. Connecting to %1." +msgstr "Spúšťa sa GnomeMeeting. Pripája sa k %1." + +#: network/applications/gnomemeeting.cpp:161 +msgid "Inviting the contact to a meeting." +msgstr "Pozvanie kontaktu na stretnutie." + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It's not supported by the other client." +msgstr "Pozvanie bolo odmietnuté. Nie je podporované iným klientom." + +#: network/applications/mimeapplication.cpp:164 +msgid "The invitation was aborted. An internal error occured." +msgstr "Pozvanie bolo prerušené. Vyskytla sa interná chyba." + +#: network/applications/mimeapplication.cpp:170 +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "" +"Pozvanie bolo prerušené. Vypršal časový limit na akceptáciu užívateľa." + +#: network/applications/mimeapplication.cpp:175 +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "Pozvanie bolo prerušené. Vypršal časový limit na odpoveď." + +#: network/applications/mimeapplication.cpp:180 +msgid "" +"The invitation was aborted. The switchboard closed the chat connection." +msgstr "Pozvanie bolo prerušené. Ukončené pripojenie." + +#: network/applications/mimeapplication.cpp:186 +msgid "The invitation was aborted." +msgstr "Pozvanie bolo prerušené." + +#: network/applications/msnremotedesktop.cpp:52 +msgid "You are invited to share this person's desktop." +msgstr "Ste pozvaný zdielať pracovnú plochu tejto osoby." + +#: network/applications/msnremotedesktop.cpp:159 +msgid "Starting KRDC. Connecting to %1." +msgstr "Spúšťa sa KRDC. Pripája sa k %1." + +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "Kontakt inicializoval funkciu MSN6, ktorú KMess ešte nemôže zvládnuť." + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"support it." +msgstr "" +"Pozvanie bolo zrušené. Kontakt odoslal chybné dáta, alebo KMess ich " +"nepodporuje." + +#: network/applications/p2papplication.cpp:1084 +msgid "The transfer failed. Data preparation failed." +msgstr "Prenos zlyhal. Príprava dát zlyhala." + +#: network/applications/p2papplication.cpp:1191 +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "Pozvanie bolo zrušené. Správa nebola smerovaná ku vám." + +#: network/applications/p2papplication.cpp:1743 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Prenos zlyhal. Kontakt odoslal chybné dáta, alebo KMess ich nepodporuje." + +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakt odmietol pozvanie. Vyskytla sa interná chyba." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 +msgid "Awaiting connection at %1, port %2" +msgstr "Čaká sa na pripojenie k %1, port %2" + +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 +msgid "Reverting to indirect file transfer (this could be slow)." +msgstr "Vrátenie na nepriamy prenos súboru (toto môže byť pomalé)." + +#: network/applications/p2papplication.cpp:3166 +msgid "Waiting for connection" +msgstr "Čaká sa na pripojenie" + +#: network/applications/p2papplication.cpp:3420 +msgid "" +"The invitation was cancelled. A timeout occured waiting for the contact to " +"accept." +msgstr "Pozvanie bolo zrušené. Vypršal časový limit na akceptáciu užívateľa." + +#: network/applications/p2papplication.cpp:3429 +msgid "" +"The invitation was cancelled. A timeout occured waiting for a connection to " +"succeed or fail." +msgstr "" +"Pozvanie bolo zrušené. Vypršal časový limit na pripojenie, alebo zlyhanie " +"spojenia." + +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 +msgid "The invitation was cancelled. A timeout occured waiting for data." +msgstr "Pozvanie bolo zrušené. Vypršal časový limit na odpoveď." + +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Prenos sa zrušil." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Prenos zlyhal. Kontakt odoslal chybné dáta, alebo KMess ich nepodporuje." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Prenos zlyhal. Vypršal časový limit na akceptáciu užívateľa." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Prenos zlyhal. Vyskytla sa vnútorná chyba." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "Prenos zlyhal. Nedal sa otvoriť zdroj dát." + +#: network/applications/voiceconversation.cpp:71 +msgid "You are invited to start a voice conversation." +msgstr "Ste pozvaný na hlasovú konverzáciu." + +#: network/applications/voiceconversation.cpp:76 +msgid "" +"You are invited to start a voice conversation but support for this was not " +"installed" +msgstr "" +"Ste pozvaný na hlasovú konverzáciu, ale podpora pre ňu nebola nainštalovaná." + +#: network/applications/voiceconversation.cpp:168 +msgid "You have cancelled the voice conversation." +msgstr "Zrušili ste hlasovú konverzáciu." + +#: network/applications/voiceconversation.cpp:205 +msgid "The invitation was cancelled. The audio device couldn't be opened." +msgstr "Pozvanie bolo zrušené. Audio zariadenie sa nedalo otvoriť." + +#: network/applications/voiceconversation.cpp:218 +msgid "Start voice conversation. Connecting to %1." +msgstr "Spustiť hlasovú konverzáciu. Pripájanie k %1." + +#: network/applications/voiceconversation.cpp:224 +msgid "Start voice conversation. Listening on %1." +msgstr "Spustiť hlasovú konverzáciu. Počúvať %1" + +#: network/applications/voiceconversation.cpp:289 +msgid "Inviting the contact to a voice conversation." +msgstr "Pozvať kontakt na hlasovú konverzáciu." + +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +msgid "The contact is inviting you for '%1', but this is not implemented yet." +msgstr "Kontakt vás pozýva na '%1', ale ešte nie je implementované." + +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Pozvanie pre webovú kameru bolo zrušené. Boli prijaté chybné dáta." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Ste požiadaný zobraziť obraz pomocou webovej kamery." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "Ste pozvaný na zobrazenie užívateľovej kamery." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "webová kamera" + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "Neúspešné" + +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Odosielanie súboru %1" + +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "Prenos %1 zlyhal. Nedal sa otvoriť lokálny port." + +#: network/extra/msnftpconnection.cpp:399 +msgid "Couldn't open a local port." +msgstr "Nedal sa otvoriť lokálny port." + +#: network/extra/msnftpconnection.cpp:456 +msgid "Initiating file transfer" +msgstr "Inicializácia prenosu súboru" + +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "Prenos %1 zlyhal. Nedá sa nadviazať spojenie" + +#: network/extra/msnftpconnection.cpp:470 +msgid "Unable to make a connection." +msgstr "Nedá sa vytvoriť spojenie." + +#: network/extra/msnftpconnection.cpp:574 +msgid "Receiving file %1" +msgstr "Prijímanie súboru %1" + +#: network/msnconnection.cpp:385 +msgid "Invalid command syntax" +msgstr "Neplatná syntax príkazu" + +#: network/msnconnection.cpp:389 +msgid "Invalid command parameter" +msgstr "Neplatný parameter príkazu" + +#: network/msnconnection.cpp:392 +msgid "The email you have tried to add is not a MSN Messenger account" +msgstr "E-mail, ktorý ste sa snažili pridať, nie je konto MSN Messengera" + +#: network/msnconnection.cpp:397 +msgid "Domain name missing" +msgstr "Chýba meno domény" + +#: network/msnconnection.cpp:401 +msgid "Already logged in" +msgstr "Už prihlásený" + +#: network/msnconnection.cpp:404 +#, fuzzy +msgid "The given account name is invalid" +msgstr "Názov konta je neplatný" + +#: network/msnconnection.cpp:408 +#, fuzzy +msgid "" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" +msgstr "Názov konta je neplatný, alebo vaše heslo ešte nebolo potvrdené" + +#: network/msnconnection.cpp:411 +msgid "Your contact list is full" +msgstr "Váš zoznam kontaktov je plný" + +#: network/msnconnection.cpp:416 +msgid "Invalid SBP parameter" +msgstr "Neplatný SBP parameter" + +#: network/msnconnection.cpp:419 +msgid "This contact is already on your list" +msgstr "Tento kontakt je už vo vašom zozname" + +#: network/msnconnection.cpp:423 +msgid "This contact is not on your list" +msgstr "Tento kontakt nie je vo vašom zozname" + +#: network/msnconnection.cpp:427 +msgid "This contact is not online" +msgstr "Tento kontakt nie je online" + +#: network/msnconnection.cpp:432 +msgid "Already in this mode" +msgstr "Už sa nachádza v tomto režime" + +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" + +#: network/msnconnection.cpp:440 +msgid "" +"The group name is already added to your Messenger or Hotmail contact list. " +"Please use a different name." +msgstr "" +"Názov skupiny je už pridaný do Messengera, alebo do zoznamu kontaktov " +"Hotmailu. Prosím, použite iný názov." + +#: network/msnconnection.cpp:444 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "Váš zoznam kontaktov má príliš veľa skupín" + +#: network/msnconnection.cpp:448 +msgid "This group can't be changed" +msgstr "Táto skupina nemôže byť zmenená" + +#: network/msnconnection.cpp:453 +msgid "Contact is not added to this group" +msgstr "Kontakt nie je pridaný do tejto skupiny" + +#: network/msnconnection.cpp:457 +msgid "This group is not empty" +msgstr "Táto skupina nie je prázdna" + +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" + +#: network/msnconnection.cpp:466 +msgid "Attempted to change group \"0\"" +msgstr "Pokus o zmenu skupiny \"0\"" + +#: network/msnconnection.cpp:466 +msgid "There was an internal error in KMess: %1" +msgstr "V KMess sa vyskytla vnútorná chyba: %1" + +#: network/msnconnection.cpp:470 +msgid "Invalid Group" +msgstr "Neplatná skupina" + +#: network/msnconnection.cpp:474 +msgid "Empty domain" +msgstr "Prázdna doména" + +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "Nesprávny formát príkazu ADL" + +#: network/msnconnection.cpp:481 +msgid "Switchboard server failed" +msgstr "Server ústredne zlyhal" + +#: network/msnconnection.cpp:484 +msgid "Transfer to switchboard server failed" +msgstr "Prenos na server ústredne zlyhal" + +#: network/msnconnection.cpp:488 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "Chyba priameho pripojenia (MSNSLP), pripojenie zlyhalo" + +#: network/msnconnection.cpp:492 +msgid "Required field missing" +msgstr "Chýba požadované pole" + +#: network/msnconnection.cpp:496 +msgid "Not logged in" +msgstr "Neprihlásený" + +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "" + +#: network/msnconnection.cpp:505 +msgid "Command is disabled" +msgstr "Príkaz je zrušený" + +#: network/msnconnection.cpp:508 +msgid "Your account is banned." +msgstr "Vaše konto je zakázané." + +#: network/msnconnection.cpp:512 +msgid "Challenge response failed" +msgstr "Odpoveď výzvy zlyhala" + +#: network/msnconnection.cpp:517 +msgid "Bad command data" +msgstr "Chybný príkaz údajov" + +#: network/msnconnection.cpp:521 +msgid "You are opening chat sessions too fast" +msgstr "Otvárate reláciu konverzácie príliš rýchlo" + +#: network/msnconnection.cpp:525 +msgid "You have too many open chat sessions" +msgstr "Máte otvorených príliš veľa relácií konverzácie" + +#: network/msnconnection.cpp:532 +msgid "Unexpected command sequence" +msgstr "Neočakávaná postupnosť príkazu" + +#: network/msnconnection.cpp:536 +msgid "Bad friend name" +msgstr "Chybné meno priateľa" + +#: network/msnconnection.cpp:542 +msgid "Bad CVR data" +msgstr "Chybné údaje CVR" + +#: network/msnconnection.cpp:548 +#, fuzzy +msgid "The server reports KMess is flooding it with too much data" +msgstr "Server hlási zahltený KMess s príliš veľa údajmi" + +#: network/msnconnection.cpp:555 +msgid "Authentication ticket was incorrect" +msgstr "Overovací lístok bol nesprávny" + +#: network/msnconnection.cpp:558 +msgid "You can't start a chat with someone while you are invisible." +msgstr "Nemôžete spustiť konverzáciu s niekým, pokiaľ ste neviditeľný." + +#: network/msnconnection.cpp:562 +msgid "Not accepting new contacts" +msgstr "Neakceptovanie nových kontaktov" + +#: network/msnconnection.cpp:566 +#, fuzzy +msgid "" +"You have a Kids Passport account, you need parental consent to chat online." +msgstr "Máte detské konto, potrebujete rodičovský súhlas." + +#: network/msnconnection.cpp:569 +#, fuzzy +msgid "Your Passport account needs to be verified first." +msgstr "Vaše konto potrebuje byť najskôr overené." + +#: network/msnconnection.cpp:573 +msgid "Bad USR ticket" +msgstr "" + +#: network/msnconnection.cpp:583 +msgid "Error accessing contact list, try again later" +msgstr "Chyba prístupu k zoznamu, skúste to neskôr" + +#: network/msnconnection.cpp:592 +msgid "" +"The MSN service is temporarily unavailable, there was an internal server " +"error." +msgstr "MSN služba je dočasne nedostupná, vnútorná chyba servera" + +#: network/msnconnection.cpp:603 +msgid "The MSN service is temporarily unavailable, the server is too busy" +msgstr "MSN služba je dočasne nedostupná, server je príliš zaneprázdnený" + +#: network/msnconnection.cpp:607 +msgid "Peer notification server down" +msgstr "Upozornenie server nepracuje" + +#: network/msnconnection.cpp:611 +msgid "The server is going down" +msgstr "Server prestáva pracovať" + +#: network/msnconnection.cpp:615 +msgid "The server is going down soon" +msgstr "Server nebude čoskoro pracovať" + +#: network/msnconnection.cpp:620 +msgid "Write is blocking" +msgstr "Písanie je blokované" + +#: network/msnconnection.cpp:624 +msgid "Session is overloaded" +msgstr "Relácia je preťažená" + +#: network/msnconnection.cpp:631 +msgid "The server is not available" +msgstr "Server nie je dostupný" + +#: network/msnconnection.cpp:635 +msgid "Authentication failed" +msgstr "Overenie zlyhalo" + +#: network/msnconnection.cpp:642 +#, fuzzy +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "Prijatá neznáma chyba zo servera: %1" + +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN chyba" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Overuje sa..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Overené" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Prepínanie na iný server..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Pripája sa..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "Obdržaný neznámy príkaz zo servera: %1" + +#: network/msnnotificationconnection.cpp:2109 +#, fuzzy +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minút" +msgstr[1] "1 minúta" +msgstr[2] "%1 minúty" + +#: network/msnnotificationconnection.cpp:2112 +msgid "Server closes for maintenance in %1!" +msgstr "Server sa uzatvára pre údržbu v %1!" + +#: network/msnnotificationconnection.cpp:2117 +msgctxt "Server maintenance dialog box text" +msgid "The MSN Server will be going down in %1 for maintenance." +msgstr "MSN server nebude pracovať %1 pre údržbu." + +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2318 +#, fuzzy +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess nemá prístup ku vzdialenej webovej službe.
Detaily: %1" + +#: network/msnnotificationconnection.cpp:2589 +msgid "Authentication time limit exceeded" +msgstr "Overovacia lehota prekročená" + +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Čaká sa na zoznam kontaktov..." + +#: network/msnnotificationconnection.cpp:2805 +#, fuzzy +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

MSN správa

%1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 +msgid "
Internal error reason: %1" +msgstr "
Dôvod vnútornej chyby: %1" + +#: network/msnnotificationconnection.cpp:2916 +#, fuzzy +msgctxt "Connection error: dialog box" +msgid "" +"

Authentication has failed, please verify your account email and password." +"

" +msgstr "" +"

Overenie zlyhalo, prosím skontrolujte názov vášho konta a heslo.

" + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2932 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"

Boli ste odpojení!

Pripojte sa s týmto kontom z iného Messenger " +"klienta, alebo z iného miesta.

" + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

KMess sa nemohol pripojiť k MSN Messenger serverom.
Máte problém s " +"internetovým pripojením, alebo MSN Messenger servery môžu byť dočasne " +"nedostupné.%1

Zobraziť stránku stavu MSN Messenger služby?

" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

KMess sa nemohol pripojiť k MSN Messenger serverom.
Máte problém s " +"internetovým pripojením, alebo MSN Messenger servery môžu byť dočasne " +"nedostupné.%1

Zobraziť stránku stavu MSN Messenger služby?

" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +#, fuzzy +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

MSN správa

%1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

Pripojenie k MSN serveru bolo stratené.%1

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +#, fuzzy +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "
Dôvod vnútornej chyby: %1" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 +msgid "Connection time limit exceeded" +msgstr "Časový limit pripojenia bol prekročený" + +#: network/msnsockettcp.cpp:375 +msgid "1 ping lost" +msgstr "1 ping stratený" + +#: network/msnsockettcp.cpp:379 +msgid "%1 pings lost" +msgstr "%1 pingy stratené" + +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "Pripojenie k serveru bolo stratené" + +#: network/soap/addressbookservice.cpp:777 +#, fuzzy +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "E-mail, ktorý ste sa snažili pridať, nie je konto MSN Messengera" + +#: network/soap/addressbookservice.cpp:787 +#, fuzzy +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "E-mail, ktorý ste sa snažili pridať, nie je konto MSN Messengera" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Server nie je dostupný" + +#: network/soap/httpsoapconnection.cpp:471 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "Príliš veľa presmerovaní pri prihlásení" + +#: network/soap/httpsoapconnection.cpp:521 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Server nie je dostupný" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +#, fuzzy +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Neočakávaná postupnosť príkazu" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" +msgstr "V %1's konverzácii: %2" + +#: notification/chatnotification.cpp:158 +#, fuzzy +msgid "%1 says:
'%2'" +msgstr "%1 hovorí:
'%2'" + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 vám odoslal offline správu:
'%2'" + +#: notification/chatnotification.cpp:169 +msgid "%1's chat requests attention!" +msgstr "%1's vyžaduje pozornosť!" + +#: notification/chatnotification.cpp:174 +#, fuzzy +msgid "%1:
%2" +msgstr "%1:
%2" + +#: notification/chatnotification.cpp:181 +msgid "%1 has sent you a handwritten message!" +msgstr "%1 vám odoslal správu písanú rukou!" + +#: notification/chatnotification.cpp:185 +msgid "%1 has sent you a nudge!" +msgstr "%1 vám odoslal/la štuchanec!" + +#: notification/chatnotification.cpp:189 +msgid "%1 has sent you a wink!" +msgstr "%1 vám odoslal odkaz!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 chce použiť kameru!" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 vám odosiela súbor!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 vám odoslal privítanie!" + +#: notification/chatnotification.cpp:204 +msgid "%1 has canceled the webcam session!" +msgstr "%1 zrušil reláciu webovej kamery!" + +#: notification/chatnotification.cpp:205 +msgid "%1 has canceled the file transfer!" +msgstr "%1 zrušil prenos súboru!" + +#: notification/chatnotification.cpp:206 +msgid "%1's activity has been canceled!" +msgstr "%1's činnosť bola zrušená!" + +#: notification/chatnotification.cpp:213 +msgid "%1 has accepted to use the webcam!" +msgstr "%1 prijal použitie webovej kamery!" + +#: notification/chatnotification.cpp:214 +msgid "%1 has accepted the file transfer!" +msgstr "%1 akceptoval prenos súboru!" + +#: notification/chatnotification.cpp:215 +msgid "%1 has accepted your invitation!" +msgstr "%1 prijal vaše privítanie!" + +#: notification/chatnotification.cpp:222 +msgid "%1 has ended the webcam session!" +msgstr "%1 ukončil reláciu webovej kamery!" + +#: notification/chatnotification.cpp:223 +msgid "The file transfer with %1 is done!" +msgstr "prenos súboru s %1 ukončený!" + +#: notification/chatnotification.cpp:224 +msgid "%1's activity has ended!" +msgstr "%1's činnosť sa ukončila!" + +#: notification/chatnotification.cpp:231 +msgid "%1's webcam session has failed!" +msgstr "%1's zlyhala relácia webovej kamery!" + +#: notification/chatnotification.cpp:232 +msgid "The file transfer with %1 has failed!" +msgstr "Prenos súboru s %1 zlyhal!" + +#: notification/chatnotification.cpp:233 +msgid "%1's activity has ended with an error!" +msgstr "%1's činnosť ukončil s chybou!" + +#: notification/contactstatusnotification.cpp:91 +#, fuzzy +msgid "%1
is now online" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:92 +#, fuzzy +msgid "%1
has gone away" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:93 +#, fuzzy +msgid "%1
will be right back" +msgstr "%1 hneď sa vráti" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy +msgid "%1
is now busy" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy +msgid "%1
has become invisible" +msgstr "%1 sa stal neviditeľný" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy +msgid "%1
has gone idle" +msgstr "%1:
%2" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy +msgid "%1
has logged out" +msgstr "%1 sa odhlásil" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy +msgid "%1
is on the phone" +msgstr "%1 je na telefóne" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy +msgid "%1
is out for lunch" +msgstr "%1 je na obede" + +#: notification/newemailnotification.cpp:90 +#, fuzzy +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Nový e-mail:
'%1'
od '%2'" + +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Spustiť &schôdzku" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "&Súkromná správa" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "O&doslať správu" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Čert" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Odoslať &e-mail" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "" + +#: notification/systemtraywidget.cpp:78 +#, fuzzy +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Zatvorením hlavného okna bude KMess spustený v systémovom paneli. Použite " +"'Ukončiť' z ponuky 'Súbor' pre ukončenie aplikácie." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Minimalizovať do systémového panela" + +#: notification/systemtraywidget.cpp:240 +#, fuzzy +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Prehliadať..." + +#: settings/accountpage.cpp:81 +#, fuzzy +msgid "Browse and Crop Picture..." +msgstr "Prehliadať a orezať obrázok..." + +#: settings/accountpage.cpp:82 +#, fuzzy +msgid "Set Previous Image..." +msgstr "Nastaviť predchádzajúci obrázok..." + +#: settings/accountpage.cpp:493 +msgid "Downloading of display picture failed" +msgstr "Sťahovanie obrázka zlyhalo" + +#: settings/accountpage.cpp:552 +msgid "" +"An error occurred when trying to change the display picture.\n" +"Make sure that you have selected an existing picture file." +msgstr "" +"Vyskytla sa chyba počas zmeny obrázka.\n" +"Uistite sa, že ste vybrali existujúci súbor s obrázkom." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Nastavenia" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Konto" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Moje konto" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Kontakty" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Konverzácia" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Záznam konverzácie" + +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"E-mailovú adresu, ktorú ste zadali je neplatná a nemôže byť použitá ako " +"konto: '%1'" + +#: settings/accountsettingsdialog.cpp:214 +msgid "The email address you have entered is already in use: '%1'" +msgstr "E-mailovú adresu, ktorú ste zadali sa už používa: '%1'" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "Ste si istý, že chcete odstrániť toto konto?" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Ste si istý, že chcete odstrániť toto konto '%1' ?
Všetky nastavenia " +"tohto konta sa stratia." + +#: settings/chatstylepage.cpp:378 +msgid "Hi, how are you doing? :)" +msgstr "Ahoj, ako sa ti darí? :)" + +#: settings/chatstylepage.cpp:379 +msgid "Stacy" +msgstr "" + +#: settings/chatstylepage.cpp:380 +msgid "Great!" +msgstr "Super!" + +#: settings/chatstylepage.cpp:382 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "Práce som sa vrátil z dovolenky v Taliansku!" + +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "" + +#: settings/emoticonspage.cpp:119 +#, fuzzy +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "Neplatný parameter príkazu" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Nahradiť existujúcu emotikonu" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Ste si istý, že chcete odstrániť toto konto?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Editovať emotikonu" + +#: settings/globalsettingsdialog.cpp:46 +msgid "KMess Settings" +msgstr "Nastavenia KMess" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 +msgid "Accounts" +msgstr "Kontá" + +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Upozornenia" + +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable browsers detected." +msgstr "Nebol zistený voliteľný prehliadač." + +#: settings/miscellaneouspage.cpp:101 +#, fuzzy +msgid "No selectable email clients detected." +msgstr "Nebol zistený voliteľný e-mailový klient." + +#: settings/miscellaneouspage.cpp:286 +#, fuzzy +msgid "You have to specify a console command to launch a custom browser!" +msgstr "Musíte vybrať príkaz pre spustenie vlastného prehliadača!" + +#: settings/miscellaneouspage.cpp:291 +#, fuzzy, c-format +msgid "" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" +msgstr "" +"Príkaz, ktorý ste vybrali pre spustenie vlastného prehliadača, " +"nezahŕňa '%u' parameter. Bez toho nebude otváranie webových stránok fungovať." +"
Chcete aby vám to KMess pridal?" + +#: settings/miscellaneouspage.cpp:316 +#, fuzzy +msgid "You have to specify a console command to launch a custom email client!" +msgstr "Musíte vybrať príkaz pre spustenie vlastného e-mailového klienta!" + +#: settings/miscellaneouspage.cpp:321 +#, fuzzy, c-format +msgid "" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" +msgstr "" +"Príkaz, ktorý ste vybrali pre spustenie vlastného prehliadača, " +"nezahŕňa '%u' parameter. Bez toho nebude e-mailový klient fungovať.
Chcete aby vám to KMess pridal?" + +#: settings/miscellaneouspage.cpp:344 +msgid "You have to select a directory for the received files!" +msgstr "Musíte vybrať adresár pre prijaté súbory!" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Vybrať adresár" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +#, fuzzy +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"E-mailovú adresu, ktorú ste zadali je neplatná a nemôže byť použitá ako " +"konto: '%1'" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Udalosti kontaktu" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Vyberte konto, ktoré si želáte upraviť, potom kliknite sem" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Správa '%1' nemohla byť odoslaná." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "Správa '%1' nemohla byť odoslaná." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Správa '%1' nemohla byť odoslaná." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Správa '%1' nemohla byť odoslaná." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Použiť" + +#~ msgid "&Copy..." +#~ msgstr "&Kopírovať..." + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Vložiť nový" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "E-mailová adresa:" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Klient: %1" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Blokovaný" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Naposledy videné: %1" + +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Posledná správa: %1" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "Udalosti kontaktu" + +#~ msgid "&Show winks from contacts" +#~ msgstr "&Zobraziť odkazy z kontaktov" + +#~ msgid "Enable in the contact list" +#~ msgstr "Povoliť v zozname kontaktov" + +#~ msgid "Enable in the chat windows" +#~ msgstr "Povoliť v okne konverzácie" + +#~ msgid "Alerts" +#~ msgstr "Výstrahy" + +#~ msgid "Alerts and Notifications" +#~ msgstr "Výstrahy a upozornenia" + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "Voliteľne, môžete vybrať skupinu, kde umiestniť nový kontakt" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Žiadna skupina" + +#, fuzzy +#~ msgid "Now listening to: %1" +#~ msgstr "Teraz počúvate %1" + +#~ msgid "&Listening Music" +#~ msgstr "&Počúvanie hudby" + +#, fuzzy +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "KMess nemá prístup ku vzdialenej webovej službe.
Detaily: %1" + +#, fuzzy +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "Overenie zlyhalo, KMess nespracoval prihlásenie.
Detaily: %1" + +#~ msgid "Close all tabs" +#~ msgstr "Zatvoriť všetky karty" + +#~ msgid "&Send email" +#~ msgstr "&Odoslať e-mail" + +#~ msgid "Save complete" +#~ msgstr "Uloženie dokončené" + +#~ msgid "C&lose all tabs" +#~ msgstr "Z&atvoriť všetky karty" + +#~ msgid "Connect" +#~ msgstr "Pripojiť" + +#, fuzzy +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: account not found." +#~ msgstr "Nedá sa obnoviť pripojenie: konto nenájdené." + +#, fuzzy +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: no password has been entered." +#~ msgstr "Nedá sa obnoviť pripojenie: toto konto nemá uložené heslo." + +#~ msgid "Rename group" +#~ msgstr "Premenovať skupinu" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "Nastavenia &konta" + +#, fuzzy +#~ msgid "" +#~ "Basic DBus support, tab closing message, menu hiding shortcut, toolbars " +#~ "lock" +#~ msgstr "" +#~ "Základná DBus podpora,správa zatvárania karty,skratka skrývania ponuky," +#~ "zámok panela s nástrojmi" + +#~ msgctxt "Connection error dialog box" +#~ msgid "%1" +#~ msgstr "%1" + +#~ msgctxt "Server error dialog box" +#~ msgid "

MSN server message

%1

" +#~ msgstr "

MSN server správa

%1

" + +#~ msgctxt "Server-reported client error dialog box" +#~ msgid "

Internal error in KMess

%1

" +#~ msgstr "

Vnútorná chyba v KMess

%1

" + +#~ msgid "Select an emoticon and click here to delete it" +#~ msgstr "Vyberte emotikonu a kliknite sem na jej odstránenie" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 je teraz online" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 odišiel preč" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 je teraz zaneprázdnený" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 odišiel nečinný" + +#~ msgid "Popup Notifications" +#~ msgstr "Upozornenie vyskakovacím oknom" + +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Zobraziť upozornenia keď váš kontakt:" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "" +#~ "Ak zapnuté, je zobrazená vyskakovacia správa, keď sa pripojí jeden z " +#~ "vašich kontaktov k MSN." + +#~ msgid "&Go online" +#~ msgstr "&Prejsť do režimu online" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "" +#~ "Ak zapnuté, je zobrazená vyskakovacia správa, keď jeden z vašich " +#~ "kontaktov začne s vami konverzáciu." + +#~ msgid "Start a &chat with you" +#~ msgstr "Spustiť &konverzáciu s vami" + +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "" +#~ "Ak zapnuté, je vždy zobrazená vyskakovacia správa, keď vám jeden z vašich " +#~ "kontaktov odosiela správu." + +#~ msgid "S&end you a message" +#~ msgstr "O&doslať správu" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when your contacts change their MSN " +#~ "status." +#~ msgstr "" +#~ "Ak zapnuté, je zobrazená takisto vyskakovacia správa, keď vaše kontakty " +#~ "zmenia svoj MSN stav." + +#~ msgid "Change their &status" +#~ msgstr "Zmeniť &stav" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts goes " +#~ "offline." +#~ msgstr "" +#~ "Ak zapnuté, je zobrazená takisto vyskakovacia správa, keď sa jeden z " +#~ "vašich kontaktov odhlási." + +#~ msgid "Go o&ffline" +#~ msgstr "Prejsť do režimu &offline" + +#~ msgid "Email Events" +#~ msgstr "Udalosti e-mailu" + +#~ msgid "Show notifications when email is received:" +#~ msgstr "Zobraziť upozornenia keď je prijatý e-mail:" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in the Inbox. " +#~ "This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Ak zapnuté, takisto sa zobrazí vyskakovacia správa, keď je prijatý e-mail " +#~ "v iných priečinkoch. Toto nastavenie je dostupné iba pre Hotmail konto." + +#~ msgid "In the Inbox" +#~ msgstr "V Inbox" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in other " +#~ "folders. This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Ak zapnuté, takisto sa zobrazí vyskakovacia správa, keď je prijatý e-mail " +#~ "v iných priečinkoch. Toto nastavenie je dostupné iba pre Hotmail konto." + +#~ msgid "In other folders" +#~ msgstr "V iných priečinkoch" + +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "Určuje počet sekúnd pred uzavretím vyskakovacieho okna." + +#~ msgid "Hide popups after" +#~ msgstr "Skryť vyskakovacie okno po" + +#~ msgid "seconds" +#~ msgstr "sekundy" + +#~ msgid "Other Alerts" +#~ msgstr "Iné upozornenia" + +#, fuzzy +#~ msgid "Save logged chats as:" +#~ msgstr "Uložiť konverzáciu" + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "" +#~ "Kontakt inicializoval funkciu MSN7, ktorú KMess ešte nemôže zvládnuť." + +#~ msgid "" +#~ "You can disable this checkbox to make KMess to delete this account when " +#~ "you quit" +#~ msgstr "" +#~ "Môžete zakázať toto zaškrtávacie políčko, aby KMess pri ukončení " +#~ "odstránil toto konto" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Kontakty" + +#~ msgid "Also r&emember the password" +#~ msgstr "Taktiež z&apamätať heslo" + +#, fuzzy +#~ msgid "" +#~ "If enabled, all chat conversations will be saved in the specified " +#~ "directory." +#~ msgstr "Ak zapnuté, konverzácia bude uložená do určeného adresára." + +#~ msgid "Log &all chats" +#~ msgstr "Uložiť záznam &všetkých konverzácií" + +#~ msgid "Log Structure" +#~ msgstr "Štruktúra záznamu" + +#~ msgid "Month" +#~ msgstr "Mesiac" + +#~ msgid "Day" +#~ msgstr "Deň" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "%1 kontakty" + +#~ msgctxt "Status message on login screen" +#~ msgid "Reconnecting in %1 seconds..." +#~ msgstr "Obnovenie pripojenia o %1 sekúnd..." + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "Hľadať v zozname kontaktov" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Osoba je offline, alebo neviditeľná." + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "Správa \"%1\" nebola prijatá!" + +#~ msgid "Hide Side&bar" +#~ msgstr "Skryť bočný &panel" + +#~ msgid "Hide the contact sidebar" +#~ msgstr "Skryť bočný panel kontaktov" + +#~ msgid "Show the contact sidebar" +#~ msgstr "Zobraziť bočný panel kontaktov" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Kontakt je %1" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "&Pozvať" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "Nedá sa vytvoriť spojenie: %1" + +#~ msgid "Unable to parse SOAP response" +#~ msgstr "Nie je možné analyzovať SOAP odpoveď" + +#, fuzzy +#~ msgid "" +#~ "Click here to add a new custom emoticon which can be sent to your contacts" +#~ msgstr "" +#~ "Kliknite sem pre pridanie novej vlastnej emotikony zaslanej vašim " +#~ "kontaktom" + +#~ msgid "Black sheep" +#~ msgstr "Čierna ovca" + +#~ msgid "Copy E&mail" +#~ msgstr "Kopírovať &e-mail" + +#~ msgid "Specify an Away message" +#~ msgstr "Špecifikovať správu Som preč" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "E-mail: %1" + +#~ msgid "Soccer ball" +#~ msgstr "Lopta" + +#~ msgid "Contact %1 already exists." +#~ msgstr "Kontakt %1 už existuje." + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "E-mail: %1" + +#~ msgid "Contact is in the opposite list" +#~ msgstr "Kontakt je v opačnom zozname" + +#~ msgid "The group name is too long" +#~ msgstr "Názov skupiny je príliš dlhý" + +#~ msgid "No permissions given for this account" +#~ msgstr "Neboli vydané povolenia pre toto konto" + +#~ msgid "Enter your personal message here" +#~ msgstr "Zadajte sem vašu osobnú správu" + +#~ msgid "Click" +#~ msgstr "Kliknúť" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "Sieťové okno" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Windows Live Messenger %1 kompatibilný" + +#~ msgid "Co&nnect" +#~ msgstr "Pr&ipojiť" + +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "Čaká sa na zoznam kontaktov (%1%)..." + +#~ msgid "" +#~ "Groups:\n" +#~ " " +#~ msgstr "" +#~ "Skupiny:\n" +#~ " " + +#~ msgid "SSL Error" +#~ msgstr "SSL Chyba" + +#~ msgid "Size pen" +#~ msgstr "Veľkosť pera" + +#~ msgid "More options..." +#~ msgstr "Viac nastavení..." + +#~ msgid " Account options " +#~ msgstr " Nastavenia konta " + +#~ msgid "You received a wink from %1." +#~ msgstr "Prijali ste odkaz od %1." + +#~ msgid "&Help" +#~ msgstr "&Pomoc" + +#~ msgid "&Settings" +#~ msgstr "&Nastavenia" + +#~ msgctxt "Clickable label on login screen" +#~ msgid "Less options..." +#~ msgstr "Menej možností..." + +#~ msgctxt "Clickable label on login screen" +#~ msgid "More options..." +#~ msgstr "Viac možností..." + +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Chcete prijať súbor: %1 (%2)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "Prenos bol zrušený" + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Úspešne prenesený súbor: %1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "Prenos %1 zlyhal. Súbor neexistuje." + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "Prenos %1 zlyhal. Súbor sa nedal prečítať." + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "Prenos %1 bol zrušený." + +#~ msgid "Got synchronization" +#~ msgstr "Synchronizácia" diff --git a/po/sl.po b/po/sl.po index 11152bd..afd734d 100644 --- a/po/sl.po +++ b/po/sl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: sl\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2005-09-30 08:03+0200\n" "Last-Translator: Matjaž kaše \n" "Language-Team: Slovenščina \n" @@ -18,83 +18,186 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3);\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 #, fuzzy +msgid "Standard text mode" +msgstr "Smeški iz risank" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "V sporočilih prikaži grafiko" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Smeški iz risank" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Smeški iz risank" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Pomežik" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +#, fuzzy msgid "Ne&w Line" msgstr "No&va vrstica" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 #, fuzzy msgid "S&end" msgstr "&Pošlji" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 #, fuzzy -msgid "Contacts" -msgstr "Dodaj osebo" +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Klepet" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Prikaži/Skrij prijatelje&vo stransko okno" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "Mačji ksiht" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "Spremeni &barvo pisave" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Preimenu&j skupino" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 #, fuzzy msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "Vpišite e-poštni naslov osebe, ki jo želite dodati:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Email address" +msgid "Email address:" msgstr "E-poštni naslov:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 #, fuzzy -msgid "Initial group" -msgstr "Preimenu&j skupino" +msgid "Enter a shortcut for the emoticon:" +msgstr "Vnesite ime nove skupine:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -102,722 +205,1227 @@ msgstr "" "Vnesite sporočilo, ki bo samodejno odoposlano\n" "osebam, ki se skušajo povezati z vami:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 #, fuzzy -msgid "&Automatic away message" +msgid "&Specify an automatic away message:" msgstr "Določite sporočilo ob odsotnosti" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "Poišči osebo" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Dnevniki klepetov" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "to" +msgstr "Avto" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Prični ali prekini &pogovor" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" msgstr "&Dodati to osebo na seznam\"Prijatelji\"" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "Te osebe ne dodaj, vendar naj vidi moje stanje" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "To osebo blokiraj v celoti" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "Lastnosti osebe %1" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +#, fuzzy msgid "&Information" +msgstr "Prikaži e-poštno sporočilo " + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 #, fuzzy -msgid "Restore" +msgid "&Restore" msgstr "Odstranjeno" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Use alternative name for this person" +msgid "&Groups:" +msgstr "Skupini" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" msgstr "Za to osebo uporabite nadomestno ime" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 #, fuzzy -msgid "Show a popup when the contact goes online/offline" +msgid "Show a &popup when the contact goes online/offline" msgstr "Prikaži oblaček, ko se ta oseba prijavi ali odjavi" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "Zvok:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Vaša slika" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 #, fuzzy msgid "&Clear Cache" msgstr "Mačji ksiht" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 #, fuzzy -msgid "Notes" +msgid "&Notes" msgstr "Nota" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "Prikaži sme&ške" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +#, fuzzy +msgid "Remo&ve" +msgstr "Odstranjeno" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "Dovoli stik" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "Te osebe ni na vašem seznamu" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "Dodaj osebo" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "Povezujem se na %1:vrata %2" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "Dodaj osebo" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "Zmeda" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Omrežno okno" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "Vrsta:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 #, fuzzy msgid "Standard" msgstr "Zvezda" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "&Pošlji" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "E-poštni naslov:" +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "&Počisti" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "Zmeda" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Vpišite e-poštni naslov osebe, ki jo želite dodati:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "Geslo:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -#, fuzzy -msgid " Account options " -msgstr "Nastavitve računa" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 #, fuzzy -msgid "Remem&ber this profile" +msgid "Remem&ber account" msgstr "Zapomni si ta profil" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "Geslo:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Povezava" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +#, fuzzy +msgid "New Account" +msgstr "Nov &Račun" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Povezava" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Dejanja" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Računi" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr "Nastavitve računa" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +msgid "Enter the name other contacts should see when you are online." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "Vaše prijazno ime:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "E-poštni naslov:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "Geslo:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "Geslo:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "Vaša slika" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 +#, fuzzy msgid "C&hange..." -msgstr "" +msgstr "P&ovabi" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, fuzzy msgid "Re&member the settings of this account" -msgstr "" +msgstr "Zapomni si ta profil" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "Ob zagonu me samodejno prijavi s tem računom" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "Beleži vse pogovore" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "Zapomni si ta profil" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Ob nedejavnosti spremeni stanje v \"Odsoten\" " + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Kot \"Odsoten\" me prikaži po" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minutah" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 #, fuzzy msgid "Saved accounts:" msgstr "Računi" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -#, fuzzy -msgid "Click" -msgstr "Ura" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." +msgid "&Add Account..." msgstr "Računi" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "Odstranjeno" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Obvestilo o e-pošti" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "Dnevniki klepetov" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "Pošlji &datoteko" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Datoteke o pogovorih shrani v naslednji matični imenik:" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Letih" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Vse pogovore shrani v matični imenik" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Vse pogovore shrani v matični imenik" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "Datoteke o pogovorih shrani v naslednji matični imenik:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "Nastavitve" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Čakanje na seznam stikov" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "Prikaži sme&ške" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Prikaži sme&ške" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Prikaži dohodna sporočila strežnika" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "Dodaj osebo" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Show notifications when your contacts:" -msgstr "Sporoči, ko se osebe odjavijo" +msgid "Show s&econds" +msgstr "Prikaži sme&ške" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "Vaša pisava:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 #, fuzzy -msgid "&Go online" -msgstr "Neprijavljen" +msgid "&Force messages from your contacts to use this font:" +msgstr "Sporočila drugih oseb naj uporabijo pisavo:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Mačji ksiht" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 #, fuzzy -msgid "S&end you a message" -msgstr "Določite sporočilo ob odsotnosti" +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "Uporabi učinke pisave *poudarjeno*, /poševno/ in _podčrtano_" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -#, fuzzy -msgid "Go o&ffline" -msgstr "Neprijavljen" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "E-poštni naslov:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "Prikaži sporočilo, ko prispe pošta v \"druge mape\"" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -#, fuzzy -msgid "In other folders" -msgstr "" -"V drugi mapi je\n" -"\"%1\"\n" -"od %2" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Oblačke skrij po " - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "sekundah" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "Opozorila" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Prikaži osebe, ki niso prijavljene" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -827,1560 +1435,1905 @@ msgid "" "window with the first nudge.

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" -msgstr "Te osebe ni na vašem seznamu" +msgid "Display your own &display picture in the chat window" +msgstr "Želim prikaz slike" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 #, fuzzy -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Ob nedejavnosti spremeni stanje v \"Odsoten\" " - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Kot \"Odsoten\" me prikaži po" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minutah" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -#, fuzzy -msgid "Log &all chats" -msgstr "Beleži vse pogovore" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Datoteke o pogovorih shrani v naslednji matični imenik:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Letih" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Mesecih" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Dnevih" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Vse pogovore shrani v matični imenik" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -msgid "&Chat style:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Nastavitve" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Prikaži sme&ške" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "V sporočilih prikaži grafiko" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 msgid "G&roup chats in the same window:" -msgstr "" +msgstr "Vaš seznam vsebuje preveč skupin" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 #, fuzzy msgid "Always" msgstr "Odsoten" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 #, fuzzy msgid "For contacts in the same group" msgstr "Vaš seznam vsebuje preveč skupin" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 #, fuzzy msgid "Never" msgstr "Piflar" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 #, fuzzy -msgid "Your &message font:" -msgstr "Vaša pisava:" +msgid "Display Options" +msgstr "Prikaži sliko" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Sporočila drugih oseb naj uporabijo pisavo:" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 #, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "Uporabi učinke pisave *poudarjeno*, /poševno/ in _podčrtano_" +msgid "Show contacts w&hich song I am listening to" +msgstr "Te osebe ni na vašem seznamu" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Čakanje na seznam stikov" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 #, fuzzy msgid "&Emoticon Themes" msgstr "Prikaži sme&ške" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 #, fuzzy msgid "Available emoticon styles:" msgstr "Prikaži sme&ške" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 #, fuzzy msgid "&Custom Emoticons" msgstr "Smeški iz risank" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 +#, fuzzy msgid "Custom emoticons for this account:" +msgstr "Zapomni si ta profil" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Računi" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 #, fuzzy msgid "Re&name" msgstr "ime" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -#, fuzzy -msgid "Remo&ve" -msgstr "Odstranjeno" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 #, fuzzy msgid "Web Browser" msgstr "Ovela vrtnica" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 #, fuzzy msgid "&Use the KDE default browser" msgstr "&Uporabi privzeto sliko" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 +#, fuzzy msgid "&Use an installed browser:" -msgstr "" +msgstr "&Uporabi privzeto sliko" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "Določite sporočilo ob odsotnosti" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "Poštni odjemalec" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 #, fuzzy -msgid "&Use the KDE default email client" +msgid "Use the &KDE default email client" msgstr "&Uporabi privzeto sliko" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +#, fuzzy +msgid "Use an &installed email client:" +msgstr "&Uporabi privzeto sliko" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "Prenosi datotek" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "Datoteke o pogovorih shrani v naslednji matični imenik:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 msgid "and" msgstr "in" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "Prenosi datotek" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "Vaše ime" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "Vaše ime" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "NIsem ob računalniku" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Vaše ime" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "vašeime@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." msgstr "" -#: chat/chat.cpp:158 +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Odstrani to osebo" + +#: accountsmanager.cpp:404 +#, fuzzy +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Zaspan" + +#: chat/chat.cpp:119 +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" + +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "%1 se je pridružil/a klepetu." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "%1 je zapustil/a klepet" -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "%1 je zapustil/a klepet" -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr "Klepet - %1 in %2" -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr "Klepet %1" -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr "(To sporočilo je bilo poslano samodejno)" -#: chat/chat.cpp:934 -msgid "You received a wink from %1." -msgstr "" - -#: chat/chat.cpp:971 +#: chat/chat.cpp:830 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "" - -#: chat/chat.cpp:1080 -msgid "You have received a wink from %1" -msgstr "" - -#: chat/chat.cpp:1100 -msgid "You received a nudge from %1!" -msgstr "" - -#: chat/chat.cpp:1119 +#: chat/chat.cpp:941 #, fuzzy -msgid "The message '%1' could not be sent." +msgid "You have sent a wink" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1194 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" + +#: chat/chat.cpp:1220 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" + +#: chat/chat.cpp:1230 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" + +#: chat/chat.cpp:1241 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 se je pridružil/a klepetu." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 se je pridružil/a klepetu." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "Dovoli stik" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "%1 se je pridružil/a klepetu." + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 se je pridružil/a klepetu." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1 je prijavljen/a" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "Sporočilo \"%1\"ni bilo sprejeto." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 #, fuzzy msgid "%1 says:" msgstr "pravi: " -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Začenjam zvočni pogovor. Poslušam na %1." + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "P&ovabi" +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Poveži" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 #, fuzzy msgid "Add this &Emoticon..." msgstr "Prikaži sme&ške" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Prikaži sme&ške" + +#: chat/chatview.cpp:833 #, fuzzy msgid "Send &Email" msgstr "Pošlji e-poštno sporočilo" -#: chat/chatview.cpp:1286 +#: chat/chatview.cpp:837 #, fuzzy -msgid "Copy E&mail" -msgstr "E-pošta" +msgid "Add &Contact" +msgstr "Dodaj osebo" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-poštni naslov:" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "Save chat to &File" +msgid "C&lear Chat" +msgstr "Mačji ksiht" + +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Pošlji &datoteko" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Klepet" - -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "Pošlji &datoteko" - -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "Prični &srečanje" - -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:108 #, fuzzy -msgid "Send a &Nudge!" -msgstr "Pošlji &datoteko" +msgid "Contacts" +msgstr "Dodaj osebo" -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Prikaži sme&ške" - -#: chat/chatwindow.cpp:498 -msgid "Close &All Tabs" -msgstr "" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "Nastavitve" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "Prični ali prekini &pogovor" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Spremeni P&isavo" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Spremeni &barvo pisave" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&Povezava" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Spremeni &barvo pisave" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "Prikaži sme&ške" -#: chat/chatwindow.cpp:658 +#: chat/chatwindow.cpp:121 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "Prikaži sme&ške" -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "Nastavitve" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "Prikaži sme&ške" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "Prikaži/Skrij prijatelje&vo stransko okno" - -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Prikaži/Skrij prijatelje&vo stransko okno" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Prikaži ali skrij prijateljevo stransko okno" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:328 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" msgid "Closing a Chat Tab" msgstr "" -#: chat/chatwindow.cpp:855 -msgid "Close all tabs" +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" msgstr "" -#: chat/chatwindow.cpp:856 -msgid "Close current tab" +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" msgstr "" -#: chat/chatwindow.cpp:1467 +#: chat/chatwindow.cpp:409 #, fuzzy -msgid "Show Side&bar" -msgstr "Prikaži/Skrij prijatelje&vo stransko okno" +msgid "&Invite..." +msgstr "P&ovabi" -#: chat/chatwindow.cpp:1468 +#: chat/chatwindow.cpp:410 #, fuzzy -msgid "Show the contact sidebar" -msgstr "Prikaži ali skrij prijateljevo stransko okno" +msgid "Send a &File..." +msgstr "Pošlji &datoteko" -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1tipka." - -#: chat/chatwindow.cpp:1575 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1tipka." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" msgstr "" -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Prični &srečanje" + +#: chat/chatwindow.cpp:413 +#, fuzzy +msgid "Send a &Nudge!" +msgstr "Pošlji &datoteko" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "" + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Spremeni P&isavo" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Spremeni &barvo pisave" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Prikaži sme&ške" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "V sporočilih prikaži grafiko" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 +#, fuzzy +msgid "Meeting" +msgstr "Nastavitve" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Pošlji &datoteko" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Čakanje na seznam stikov" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Dodaj osebo" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Čakanje na seznam stikov" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Prikaži sme&ške" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Čakanje na seznam stikov" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Prikaži sme&ške" + +#: chat/chatwindow.cpp:491 +#, fuzzy +msgid "&Font" +msgstr "&Povezava" + +#: chat/chatwindow.cpp:492 +#, fuzzy +msgid "Font &Color" +msgstr "Spremeni &barvo pisave" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "Mačji ksiht" + +#: chat/chatwindow.cpp:561 +#, fuzzy +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Prični ali prekini &pogovor" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" + +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Klepet" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "Klepet" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr "%1tipka." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr "%1tipka." + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr "%1tipka." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Prični &srečanje" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" msgstr "Pošlji e-poštno sporočilo" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "Prikaži profil" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "Dodaj osebo" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "Dovoli stik" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 #, fuzzy msgid "&Delete Contact" msgstr "Odstrani to osebo" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "Blokiraj to osebo" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "Odblokiraj to osebo" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 #, fuzzy msgid "&Friendly Name" msgstr "Vaše prijazno ime:" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 #, fuzzy msgid "&Email Address" msgstr "E-poštni naslov:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" msgstr "" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Blokiran" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "Oseba ni prijavljena" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "Dodajte prijatelja" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Vstavi smeška" +msgid "Add New" +msgstr "Računi" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 #, fuzzy msgid "Remove" msgstr "Odstranjeno" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 #, fuzzy msgid "Web Messenger" msgstr "Spletno oblikovanje" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "Spletno oblikovanje" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 #, fuzzy msgid "Windows Live Messenger %1" msgstr "Spletno oblikovanje" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Spletno oblikovanje" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Prijavljen" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Neprijavljen" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Dovoljeno" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Odstranjeno" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 MB" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 MB" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Odsoten" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Pridem takoj" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Zaseden" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Neviden" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Odsoten" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Odsoten s samodejnim odgovarjanjem" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Pridem takoj" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Telefoniram" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Na kosilu" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Neviden" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Neprijavljen" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Moje stanje" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Odklopi" + +#: dialogs/addcontactdialog.cpp:49 #, fuzzy msgid "Add a Contact" msgstr "Dodajte prijatelja" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Odstrani skupino" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 #, fuzzy msgid "Add New Emoticon" msgstr "Prikaži sme&ške" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "Prikaži sme&ške" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "Določite sporočilo ob odsotnosti" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "" "%1\n" "vas je dodal/a med prijatelje. Želite:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Lastnosti osebe %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Povezan" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "V sporočilih prikaži grafiko" -#: dialogs/contactpropertiesdialog.cpp:381 -msgid "Last seen: %1" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:419 #, fuzzy +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Oblika sporočila v pogovoru:" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "Oblika sporočila v pogovoru:" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "E-pošta" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-poštni naslov:" -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "Poštni odjemalec" -#: dialogs/networkwindow.cpp:79 -msgid "S&ave tab" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Res želite izbrisati ta račun? " + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Dodaj osebo" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Dodaj osebo" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "Lastnosti osebe %1" + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "Povezujem se na %1:vrata %2" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" msgstr "" +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "Čakanje na seznam stikov" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "" + +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "Mačji ksiht" + #: dialogs/networkwindow.cpp:80 -msgid "C&lear tab" +msgid "C&lose All Tabs" msgstr "" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "" -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" msgstr "" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Računalnik" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 #, fuzzy -msgid "Cl&ean Up" -msgstr "&Počisti" +msgid "&Use" +msgstr "Zmeda" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "Odstrani to osebo" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Vaša slika" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Vaša slika" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Res želite izbrisati ta račun? " + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Nasmeh" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "Pomežik" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Jezik" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "Širok nasmeh" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Žalost" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "Jok" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "Jeza" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Zmeda" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "Nerodno" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "razočaran" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "Vroče" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "Režanje" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "Piflar" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "bolan" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Presenečen" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Zabava" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "Zaspan" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "Zamišljen" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Psssst" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "Skrivnostno" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "zavijanje z očmi" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "Sarkastično" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "Ne vem" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Pridem takoj" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Angel" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Levi objem" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Fant" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Rdeče srce" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Rdeča vrtnica" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +#, fuzzy +msgid "Thumbs up" msgstr "Palec gor" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Pasji ksiht" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Sonček" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Hudič" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Desni objem" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Dekle" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Počeno srce" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "Ovela vrtnica" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Palec dol" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Mačji ksiht" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "Speči polmesec" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Žnabelčki" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Aplavz" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "Fige" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Avto" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Letalo" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Želva" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "Polž" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Črna ovca" +#: emoticontheme.cpp:869 +#, fuzzy +msgid "Sheep" +msgstr "Zaspan" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "Vampirski netopir" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Krugl pira" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "Martini" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "Kavica" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Torta" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Krožnik" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Čaša" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Zvezda" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Mavrica" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Necihtni oblak" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Bliskanje" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Dežnik" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Osamljeni otok" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "slušalka" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Mobi" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "E-pošta" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Ura" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "Fotoaparat" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "Filmski trak" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Nota" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Lisice" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Soldi" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "Žarnica" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +#, fuzzy +msgid "Cigarette" msgstr "Čik" -#: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "Žoga" +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Darilo" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Računalnik" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "Ikona KMess" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Povezava s strežnikom ni uspela " + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "Povezava s strežnikom ni uspela " -#: initialview.cpp:377 -msgid "Connect" -msgstr "Poveži" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "Odklopi" +msgctxt "Button label" +msgid "&Connect" +msgstr "&Povezava" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: kmess.cpp:223 +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "E-poštni naslov:" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "Prikaži e-poštno sporočilo " + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Ta oseba je že na vašem seznamu." + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "Nova &skupina" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Dodaj skupino" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Vnesite ime nove skupine:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" @@ -2388,319 +3341,381 @@ msgstr "" "Ste prepričani, da želite osebo %1 odstraniti z vašega seznama?" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" msgstr "Odstrani osebo" -#: kmess.cpp:573 +#: kmess.cpp:581 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "Odstranjeno" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" "Ste prepričani, da želite skupino %1 odstraniti s svojega seznama?" "list?" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "Odstranjeno" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Te skupine ni mogoče spreminjati" -#: kmess.cpp:671 -msgid "Rename group" -msgstr "Preimenuj skupino" +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "Preimenu&j skupino" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Vnesite ime nove skupine:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "Overitev ni uspela" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Povezava - dobra" + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Nepovezan" -#: kmess.cpp:1408 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" msgstr "" -#: kmess.cpp:1412 +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" + +#: kmess.cpp:1481 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Obvestilo o e-pošti" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Dejanja" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Nov &stik" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Nova &skupina" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "Poišči osebo" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Išči po interesih" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "Poišči osebo" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Nov &Račun" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Nastavitve računa" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "Poveži" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "Odklopi" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "Prikaži moj profil" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Moje stanje" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Odsoten s samodejnim odgovarjanjem" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "Prikaži dovoljene stike" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Prikaži osebe, ki niso prijavljene" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "Prikaži odstranjene osebe" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +msgid "Show &History Box" +msgstr "" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Prikaži/Skrij prijatelje&vo stransko okno" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "Prikaži sme&ške" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "Vaša slika" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "Razvrsti osebe po " + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Prikaži okno prenosov" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "Nov &stik" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "Nova &skupina" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "Poišči osebo" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "Poišči osebo" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Išči po interesih" + +#: kmessinterface.cpp:187 +msgid "Show Chat &History..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "Nov &Račun" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Nov &Račun" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "Nasmeh" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "Razvrsti osebe po " - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "Skupini" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Prijavljene/neprijavljene" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "Prikaži okno prenosov" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "Prikaži spletno okno" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 #, fuzzy msgid "[%1] %2 goes online" msgstr "%1 ni prijavljen" -#: kmessview.cpp:363 +#: kmessview.cpp:357 #, fuzzy msgid "[%1] %2 goes offline" msgstr "%1 ni prijavljen" -#: kmessview.cpp:559 +#: kmessview.cpp:590 #, fuzzy msgid "Cha&t" msgstr "Klepet" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "Lastnosti" -#: kmessview.cpp:569 +#: kmessview.cpp:600 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "Odstrani skupino" -#: kmessview.cpp:574 +#: kmessview.cpp:605 #, fuzzy -msgid "&Listening Music" -msgstr "Pošiljanje datoteke %1" +msgid "Song &Name" +msgstr "&ime" -#: kmessview.cpp:601 +#: kmessview.cpp:632 #, fuzzy msgid "&Copy to Group" msgstr "Premakni v skupino" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "Premakni v skupino" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "Pomakni skupino navzdol" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Pomakni skupino navzgor" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "I&zbriši skupino" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Preimenu&j skupino" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "E-pošta" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "&Dodati to osebo na seznam\"Prijatelji\"" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-poštni naslov:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Poštni odjemalec" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" - -#: kmessview.cpp:1076 +#: kmessview.cpp:1156 #, fuzzy -msgctxt "Last time a message was received" -msgid "Last message: %1" +msgid "No" +msgstr "Nota" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokiran" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "Oblika sporočila v pogovoru:" -#: kmessview.cpp:1085 +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Oblika sporočila v pogovoru:" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "Dodaj osebo" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Oseba ni prijavljena" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "Oseba ni prijavljena" +msgstr[1] "Oseba ni prijavljena" +msgstr[2] "Oseba ni prijavljena" +msgstr[3] "Oseba ni prijavljena" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "Dodaj osebo" +msgstr[1] "Dodaj osebo" +msgstr[2] "Dodaj osebo" +msgstr[3] "Dodaj osebo" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" @@ -2708,299 +3723,705 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +#, fuzzy +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 MB" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 MB" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 msgid "Project support" msgstr "" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "Razvijalec GnomeMeeting" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "Nemški prevod, testiranje, dokumentacija...." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "Spletno oblikovanje" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "Italijanski prevod in večina smeškov" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Smeški iz risank" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Privzeta zvočna tema" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arabski prevod" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 #, fuzzy msgid "More Arabic translation" msgstr "Turški prevod" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Prevod v brazilsko portugalščino" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Prevod v brazilsko portugalščino" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 #, fuzzy msgid "Catalan translation" msgstr "Katalonski prevod" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "Prevod v poenostavljeno kitajščino" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 #, fuzzy msgid "More Simplified Chinese translation" msgstr "Prevod v poenostavljeno kitajščino" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 #, fuzzy msgid "Traditional Chinese translation" msgstr "Prevod v tradicionalno kitajščino" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Prevod v tradicionalno kitajščino" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 #, fuzzy msgid "Danish translation" msgstr "Danski prevod" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "More Danish translation" msgstr "Danski prevod" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "Nizozemski prevod" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 #, fuzzy msgid "More Dutch translation" msgstr "Nizozemski prevod" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Turški prevod" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Francoski prevod" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 #, fuzzy msgid "Estonian translation" msgstr "Estonski prevod" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 #, fuzzy msgid "Finnish translation" msgstr "Danski prevod" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 #, fuzzy msgid "More Finnish translation" msgstr "Danski prevod" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "Francoski prevod" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 msgid "More French translation, MSN6 emoticon definitions" msgstr "Francoski prevod, smeški MSN6" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 #, fuzzy msgid "More French translation" msgstr "Francoski prevod" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 #, fuzzy msgid "Hungarian translation" msgstr "Estonski prevod" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Estonski prevod" + +#: main.cpp:115 main.cpp:116 #, fuzzy msgid "More Italian translation" msgstr "Korejski prevod" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "Korejski prevod" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 #, fuzzy msgid "Norsk Bokmål translation" msgstr "Norveški prevod bokmal" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Korejski prevod" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "Korejski prevod" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 #, fuzzy msgid "Slovenian translation" msgstr "Korejski prevod" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Španski prevod" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 #, fuzzy msgid "More Spanish translation" msgstr "Španski prevod" -#: main.cpp:123 -msgid "Swedish translation" -msgstr "Švedski prevod" - -#: main.cpp:125 -#, fuzzy -msgid "Thai translation" -msgstr "Tajski prevod" - #: main.cpp:126 -msgid "Turkish translation" -msgstr "Turški prevod" +msgid "Alejandro Araiza Alvarado" +msgstr "" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "Turški prevod" +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "Švedski prevod" + +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Prenosi datotek" +msgid "More Swedish translation" +msgstr "Švedski prevod" -#: main.cpp:134 -msgid "P4-Context field support" +#: main.cpp:135 +msgid "Rachan Hongpairote" msgstr "" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Popravki za Xineramo" +#, fuzzy +msgid "Thai translation" +msgstr "Tajski prevod" #: main.cpp:136 -msgid "Original file receive code" -msgstr "Originalna koda za sprejem datotek" +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Turški prevod" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" msgstr "" +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "Turški prevod" + #: main.cpp:138 -msgid "KWallet support" +msgid "Uğur Çetin" msgstr "" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "Prijavljen" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Prenosi datotek" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Popravki za Xineramo" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "Originalna koda za sprejem datotek" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +msgid "Chat history dialog" +msgstr "" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "Razni popravki" -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Razni popravki" -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "Razvijalec GnomeMeeting" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Tip z vrečko na glavi" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspiracija" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 #, fuzzy msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "Koda za oblačke" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Koda za čas odsotnosti" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "Your name here?" msgstr "Vaše ime" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Vaše ime" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "Vaš e-poštni naslov:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Samodejna prijava z navedenim e-poštnim naslovom" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Dovoljeno" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Odstranjeno" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "Oseba je prekinila povezavo." @@ -3018,64 +4439,110 @@ msgstr "Zavrnili ste povabilo." #: network/applications/application.cpp:540 #, fuzzy -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "Boste sprejeli alizavrnili?" #: network/applications/application.cpp:581 #, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "Kliknite za preklic." -#: network/applications/filetransfer.cpp:134 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Sprejmete datoteko :%1 (%2 bytov)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Prenos sprejet." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "Povezujem se na %1:vrata %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "Prenos je bil preklican." +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Oseba je prekinila povezavo." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "Prekinili ste povezavo." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "Prekinili ste povezavo." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Povezava vzpostavljena" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy +msgid "Successfully sent file "%1"." msgstr "Prenos datoteke %1 se je uspešno zaključil." -#: network/applications/filetransfer.cpp:620 +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 #, fuzzy -msgid "The transfer of %1 failed. The file does not exist." +msgid "Successfully received file "%1"." +msgstr "Prenos datoteke %1 se je uspešno zaključil." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "Prenos %1 je spodletel. Datoteka ne obstaja." -#: network/applications/filetransfer.cpp:624 +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 #, fuzzy -msgid "The transfer of %1 failed. The file could not be read." +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "Prenos %1 je spodletel. Povezave ni mogoče vzpostaviti" -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy +msgid "Sending file "%1" (%2)." msgstr "Pošiljanje datoteke %1" -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Oseba je prekinila povezavo." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3088,69 +4555,14 @@ msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "" "Vabilo za prenos podatkov je bilo preklicano, ker so bili podatki slabi." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Oseba je prekinila povezavo." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Prekinili ste povezavo." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Prenos datoteke %1 se je uspešno zaključil." - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Prenos datoteke %1 se je uspešno zaključil." - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "Prenos %1 je spodletel. Datoteka ne obstaja." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "Prenos %1 je spodletel. Povezave ni mogoče vzpostaviti" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Pošiljanje datoteke %1" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Oseba je prekinila povezavo." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Povabljeni ste k srečanju GnomeMeeting." @@ -3164,28 +4576,28 @@ msgstr "Pričenjam GnomeMeeting. Povezujem se na %1." msgid "Inviting the contact to a meeting." msgstr "Vabilo osebi na sestanek" -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "Vabilo je bilo zavrnjeno, ker na drugi strani ni podprto." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "Povabilo je bilo prekinjeno. Prišlo je do notranje napake." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "Povabilo je bilo prekinjeno. Čas se je iztekel." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "Povabilo je bilo prekinjeno. Čas se je iztekel." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "Povabilo je bilo prekinjeno." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Povabilo je bilo prekinjeno." @@ -3198,25 +4610,17 @@ msgstr "Oseba vas vabi, da si delite njeno namizje." msgid "Starting KRDC. Connecting to %1." msgstr "Pričenjam KRDC Povezujem se na %1" -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Oseba je zavrnila povabilo. Prišlo je notranje napake." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "Oseba je uporabila funkcijo MSN6, ki je KMess ne podpira." -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "Prenos ni uspel." - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." @@ -3224,62 +4628,46 @@ msgstr "" "Povabilo je bilo preklicano. Oseba je poslala slabe podatke, ali pa jih " "KMess ne podpira." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"Prenos ni uspel. Oseba je poslala slabe podatke, ali pa jih KMess ne podpira." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Prenos ni uspel.Iztekel se je čas za sprejem." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "Prenos ni uspel. Pojavila se je notranja napaka." - -#: network/applications/p2papplicationbase.cpp:1176 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "Prenos ni uspel. Vira podatkov ni mogoče odpreti." - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "Oseba je uporabila funkcijo MSN6, ki je KMess ne podpira." - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "Prenos ni uspel; spodletela je priprava podatkov." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 #, fuzzy msgid "The invitation was cancelled. Message was not directed to us." msgstr "Povabilo je bilo preklicano, ker sporočilo ni bilo namenjeno nam." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 #, fuzzy msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" "Prenos ni uspel. Oseba je poslala slabe podatke, ali pa jih KMess ne podpira." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Oseba je zavrnila povabilo. Prišlo je notranje napake." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "Čakam na povezavo na %1: vrata%2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 #, fuzzy msgid "Waiting for connection" msgstr "Čakanje na seznam stikov" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " @@ -3288,7 +4676,7 @@ msgstr "" "Povabilo je bilo preklicano. Čas, določen, da oseba povabilo sprejme, se je " "iztekel." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " @@ -3297,12 +4685,36 @@ msgstr "" "Povabilo je bilo preklicano. Čas, določen, da oseba povabilo sprejme, se je " "iztekel." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" "Povabilo je bilo preklicano. Čas, določen za sprejem podatkov, se je iztekel." +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Prenos ni uspel." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Prenos ni uspel. Oseba je poslala slabe podatke, ali pa jih KMess ne podpira." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Prenos ni uspel.Iztekel se je čas za sprejem." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Prenos ni uspel. Pojavila se je notranja napaka." + +#: network/applications/p2papplicationbase.cpp:1350 +#, fuzzy +msgid "The transfer failed. Couldn't open data source." +msgstr "Prenos ni uspel. Vira podatkov ni mogoče odpreti." + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "Vabijo vas k zvočnem pogovoru." @@ -3337,646 +4749,844 @@ msgstr "Začenjam zvočni pogovor. Poslušam na %1." msgid "Inviting the contact to a voice conversation." msgstr "Osebo vabim n zvočni pogovor." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "Oseba vas vabi k %1, vendar ta funkcija še ni vključena." -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "" +"Vabilo za prenos podatkov je bilo preklicano, ker so bili podatki slabi." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "Prenos %1 je bil preklican. " +#: network/applications/webcamtransferp2p.cpp:138 +#, fuzzy +msgid "You are invited to view this person's webcam." +msgstr "Oseba vas vabi, da si delite njeno namizje." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Pošiljanje datoteke %1" + +#: network/extra/msnftpconnection.cpp:398 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy msgid "Couldn't open a local port." msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Prenos datoteke protokola za zagon seje" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy +msgid "The transfer of %1 failed. A connection could not be made." msgstr "Prenos %1 je spodletel. Povezave ni mogoče vzpostaviti" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "Sprejem datoteke %1" -#: network/msnconnection.cpp:589 -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Povezava je bila prekinjena, ker ste že \n" -"povezani preko drugega odjemalca za MSN \n" -"Messenger." - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Sinhronizirano" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Overjanje" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "Čakanje na seznam stikov" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "Overjanje ni uspelo; preverite svoj račun in geslo" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Povezovanje..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess je dobil sporočilo o neznani napaki od strežnika %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" +#: network/msnconnection.cpp:404 +#, fuzzy +msgid "The given account name is invalid" msgstr "Navedeno ime računa ni veljavno" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 +#, fuzzy msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "Ime računa ni veljavno ali pa še ni uveljavljeno." -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "Vaš seznam stikov je poln" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "Ta oseba je že na vašem seznamu." -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "Te osebe ni na vašem seznamu" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "Oseba ni prijavljena" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Te osebe ni na vašem seznamu" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 #, fuzzy msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "Ime skupine ste že uporabili." -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:444 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "Vaš seznam vsebuje preveč skupin" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "Te skupine ni mogoče spreminjati" -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "Vaš seznam vsebuje preveč skupin" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "Taskupina ni prazna" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "Ime skupine je predolgo" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "V KMess je prišlo do notranje napake: %1" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "Preimenu&j skupino" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "Preklopni strežnik ne deluje" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "Prenos k preklopnemu strežniku je spodletel " -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -msgid "No permissions given for this account" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "Prenos ni uspel." -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 #, fuzzy msgid "You are opening chat sessions too fast" msgstr "Prehitro odpirate sejo" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "Odprtih imate preveč sej" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "Neustrezno ime za prijatelja" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "Overitev ni uspela" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "Pogovora ne morete pričeti, dokler ste nevidni." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 #, fuzzy msgid "Not accepting new contacts" msgstr "Novih vodij ni mogoče sprejeti" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 #, fuzzy msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr " " -#: network/msnnotificationconnection.cpp:2371 +#: network/msnconnection.cpp:569 #, fuzzy -msgid "Your passport account needs to be verified first." +msgid "Your Passport account needs to be verified first." msgstr " " -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "Prišlo je do notranje napake strežnika." -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Strežnik za obveščanje je izključen" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "Strežnik se izključuje" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "strežnik se bo kmalu izključil" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "Pisanje je blokirano" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "Saja je prezasedena" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 #, fuzzy msgid "The server is not available" msgstr "Strežnik ni dosegljiv" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Overitev ni uspela" -#: network/msnnotificationconnection.cpp:2449 +#: network/msnconnection.cpp:642 #, fuzzy -msgid "Unknown error code received from the server: %1" +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "KMess je dobil sporočilo o neznani napaki od strežnika %1" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +#, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" +msgstr "Napaka strežnika" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "Overjanje" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "Overitev ni uspela" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Povezovanje..." + +#: network/msnnotificationconnection.cpp:1949 +#, fuzzy +msgid "Unknown command received from the server: %1" +msgstr "KMess je dobil sporočilo o neznani napaki od strežnika %1" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "minutah" msgstr[1] "minutah" msgstr[2] "minutah" msgstr[3] "minutah" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" msgstr "" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -msgid "KMess could not process Offline-IM messages.
Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "Overitev ni uspela" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Čakanje na seznam stikov" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "V KMess je prišlo do notranje napake: %1" -#: network/msnnotificationconnection.cpp:3242 -msgctxt "Login error message, with more details for developer versions" -msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" -"

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2916 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: dialog box" +msgid "" +"

Authentication has failed, please verify your account email and password." +"

" +msgstr "Overjanje ni uspelo; preverite svoj račun in geslo" + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2932 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"Povezava je bila prekinjena, ker ste že \n" +"povezani preko drugega odjemalca za MSN \n" +"Messenger." + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "Povezava s strežnikom ni uspela " -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Napaka strežnika" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:681 +#, fuzzy +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "V KMess je prišlo do notranje napake: %1" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "Čas za povezavo se je iztekel." -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "1 ping izgubljen" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "Izgubljeni pingi: %1" -#: network/msnsockettcp.cpp:387 +#: network/msnsockettcp.cpp:395 #, fuzzy -msgid "The connection to the server was lost." +msgid "The connection to the server was lost" msgstr "Povezava s strežnikom ni uspela " -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Oseba ni prijavljena ali pa ni vidna." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" -#: network/msnswitchboardconnection.cpp:1117 +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 #, fuzzy -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "Oseba je uporabila funkcijo MSN6, ki je KMess ne podpira." +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Strežnik ni dosegljiv" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "Sporočilo \"%1\"ni bilo sprejeto." +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Strežnik ni dosegljiv" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" msgstr "" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" msgstr "" -#: notification/chatnotification.cpp:163 -msgid "In %1's chat: %2" +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" msgstr "" -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/chatnotification.cpp:171 +#: notification/chatnotification.cpp:154 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgid "In %1's chat:
%2" msgstr "%1 je prijavljen/a" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:158 +#, fuzzy +msgid "%1 says:
'%2'" +msgstr "%1 je prijavljen/a" + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 je prijavljen/a" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" msgstr "" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" -msgstr "" +#: notification/chatnotification.cpp:174 +#, fuzzy +msgid "%1:
%2" +msgstr "%1 je prijavljen/a" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr "%1 je prijavljen/a" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr "%1 je prijavljen/a" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr "%1 je prijavljen/a" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 msgid "%1 wants to use the webcam!" msgstr "" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr "%1 je prijavljen/a" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr "%1 je prijavljen/a" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "Prekinili ste povezavo." -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "Oseba je prekinila povezavo." -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 msgid "%1's activity has been canceled!" msgstr "" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "Prekinili ste povezavo." -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "Oseba je prekinila povezavo." -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr "%1 je prijavljen/a" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "Prekinili ste povezavo." -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "Prenos %1 je bil preklican. " -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 msgid "%1's activity has ended!" msgstr "" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" msgstr "" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "Prenos %1 je bil preklican. " -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 msgid "%1's activity has ended with an error!" msgstr "" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" +msgid "%1
is now online" msgstr "%1 je prijavljen/a" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" +msgid "%1
has gone away" msgstr "%1 je prijavljen/a" -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" +#: notification/contactstatusnotification.cpp:93 +#, fuzzy +msgid "%1
will be right back" +msgstr "%1 je prijavljen/a" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy +msgid "%1
is now busy" +msgstr "%1 je prijavljen/a" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy +msgid "%1
has become invisible" +msgstr "%1 je prijavljen/a" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy +msgid "%1
has gone idle" +msgstr "%1 je prijavljen/a" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy +msgid "%1
has logged out" +msgstr "%1 je prijavljen/a" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy +msgid "%1
is on the phone" +msgstr "%1 je prijavljen/a" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy +msgid "%1
is out for lunch" +msgstr "%1 je prijavljen/a" + +#: notification/newemailnotification.cpp:90 +#, fuzzy +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "%1 je prijavljen/a" + +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Prični &srečanje" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Sistemsko sporočilo" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Določite sporočilo ob odsotnosti" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Hudič" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Pošlji e-poštno sporočilo" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1 je prijavljen/a" - -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1 je prijavljen/a" - -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1 je prijavljen/a" - -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1 je prijavljen/a" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 je prijavljen/a" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 je prijavljen/a" - -#: notification/newemailnotification.cpp:78 -msgid "New email:
'%1'
by '%2'" +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." msgstr "" -#: settings/accountpage.cpp:69 +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 MB" + +#: settings/accountpage.cpp:80 #, fuzzy msgid "Browse..." msgstr "&Brskaj..." -#: settings/accountpage.cpp:70 -msgid "Browse and crop picture..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." msgstr "" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "Prenos slike zaslona ni uspel" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 #, fuzzy msgid "" "An error occurred when trying to change the display picture.\n" @@ -3985,157 +5595,626 @@ msgstr "" "Pri poskusu zamenjave slike je prišlo do napake.\n" "Prepričajte se, če ste izbrali pravo sliko." -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "Odstrani to osebo" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Nastavitve" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 #, fuzzy msgid "Account" msgstr "Računi" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "Računi" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Opozorila" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "Obvestilo o e-pošti" +msgid "Contact List" +msgstr "Dodaj osebo" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Klepet" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Dnevniki klepetov" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Res želite izbrisati ta račun? " -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "Res želite izbrisati ta račun? " -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "Stacy" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Prikaži sme&ške" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Res želite izbrisati ta račun? " + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Prikaži sme&ške" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "Nastavitve" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Računi" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "Obvestilo o e-pošti" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "Datoteke o pogovorih shrani v naslednji matični imenik:" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 MB" +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Dodaj osebo" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Sporočilo \"%1\"ni bilo sprejeto." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "Sporočilo \"%1\"ni bilo sprejeto." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Sporočilo \"%1\"ni bilo sprejeto." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Sporočilo \"%1\"ni bilo sprejeto." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Zmeda" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Vstavi smeška" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "E-poštni naslov:" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Blokiran" + +#, fuzzy +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Oblika sporočila v pogovoru:" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "Dodaj osebo" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "Prikaži osebe, ki niso prijavljene" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "Čakanje na seznam stikov" + +#~ msgid "Alerts" +#~ msgstr "Opozorila" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "Obvestilo o e-pošti" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Odstrani skupino" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "Pošiljanje datoteke %1" + +#~ msgid "&Send email" +#~ msgstr "Pošlji e-poštno sporočilo" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "Računalnik" + +#~ msgid "Connect" +#~ msgstr "Poveži" + +#~ msgid "Rename group" +#~ msgstr "Preimenuj skupino" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "Nastavitve računa" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 je prijavljen/a" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 je prijavljen/a" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 je prijavljen/a" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 je prijavljen/a" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "Obvestilo o e-pošti" + +#, fuzzy +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Sporoči, ko se osebe odjavijo" + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "Neprijavljen" + +#, fuzzy +#~ msgid "S&end you a message" +#~ msgstr "Določite sporočilo ob odsotnosti" + +#, fuzzy +#~ msgid "Go o&ffline" +#~ msgstr "Neprijavljen" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "E-poštni naslov:" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "Prikaži sporočilo, ko prispe pošta v \"druge mape\"" + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "" +#~ "V drugi mapi je\n" +#~ "\"%1\"\n" +#~ "od %2" + +#~ msgid "Hide popups after" +#~ msgstr "Oblačke skrij po " + +#~ msgid "seconds" +#~ msgstr "sekundah" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "Opozorila" + +#, fuzzy +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "Oseba je uporabila funkcijo MSN6, ki je KMess ne podpira." + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Dodaj osebo" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "Geslo:" + +#, fuzzy +#~ msgid "Log &all chats" +#~ msgstr "Beleži vse pogovore" + +#~ msgid "Month" +#~ msgstr "Mesecih" + +#~ msgid "Day" +#~ msgstr "Dnevih" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "Dodaj osebo" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "Poišči osebo" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Oseba ni prijavljena ali pa ni vidna." + +#, fuzzy +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "Sporočilo \"%1\"ni bilo sprejeto." + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "Prikaži/Skrij prijatelje&vo stransko okno" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "Prikaži ali skrij prijateljevo stransko okno" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "Prikaži ali skrij prijateljevo stransko okno" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Oseba ni prijavljena" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "P&ovabi" + +#~ msgid "Black sheep" +#~ msgstr "Črna ovca" + +#, fuzzy +#~ msgid "Copy E&mail" +#~ msgstr "E-pošta" + +#~ msgid "Specify an Away message" +#~ msgstr "Določite sporočilo ob odsotnosti" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "E-pošta" + +#~ msgid "Soccer ball" +#~ msgstr "Žoga" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "Ta oseba je že na vašem seznamu." + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "E-pošta" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "Te osebe ni na vašem seznamu" + +#~ msgid "The group name is too long" +#~ msgstr "Ime skupine je predolgo" + +#, fuzzy +#~ msgid "Click" +#~ msgstr "Ura" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "Omrežno okno" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Spletno oblikovanje" + +#~ msgid "Co&nnect" +#~ msgstr "Poveži" + +#, fuzzy +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "Čakanje na seznam stikov" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "Nastavitve računa" + +#~ msgid "Got synchronization" +#~ msgstr "Sinhronizirano" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Nastavitve" + +#, fuzzy +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Sprejmete datoteko :%1 (%2 bytov)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "Prenos je bil preklican." + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Prenos datoteke %1 se je uspešno zaključil." + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "Prenos %1 je spodletel. Datoteka ne obstaja." + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "Prenos %1 je spodletel. Povezave ni mogoče vzpostaviti" + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "Prenos %1 je bil preklican. " #~ msgid "Picture:" #~ msgstr "Slika:" @@ -4144,10 +6223,6 @@ msgstr "%1 MB" #~ msgid "Speed:" #~ msgstr "Strežnik:" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Prikaži e-poštno sporočilo " - #~ msgid "Logging in..." #~ msgstr "Prijavljanje....." @@ -4171,10 +6246,6 @@ msgstr "%1 MB" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "V predalu imate %1 novih e-poštnih sporočil" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "Prijavljen" - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "Prenos %1 je spodletel. Datoke ni mogoče odpreti." @@ -4205,10 +6276,6 @@ msgstr "%1 MB" #~ msgid "Display picture:" #~ msgstr "Vaša slika" -#, fuzzy -#~ msgid "Don't show a displa&y picture" -#~ msgstr "Želim prikaz slike" - #, fuzzy #~ msgid "Show notifications when you recei&ve an email" #~ msgstr "Prikaži sporočilo, ko prispe pošta v \"druge mape\"" @@ -4398,9 +6465,6 @@ msgstr "%1 MB" #~ msgid "Passport not verified" #~ msgstr " " -#~ msgid "Connection good" -#~ msgstr "Povezava - dobra" - #~ msgid "The account name given does not exist" #~ msgstr "Račun s tem imenom ne obstaja" @@ -4450,12 +6514,6 @@ msgstr "%1 MB" #~ msgid "time" #~ msgstr "čas" -#~ msgid "System Message" -#~ msgstr "Sistemsko sporočilo" - -#~ msgid "Show incoming server messages" -#~ msgstr "Prikaži dohodna sporočila strežnika" - #~ msgid "Show outgoing server messages" #~ msgstr "Prikaži odhodna sporočila strežnika" @@ -4481,9 +6539,6 @@ msgstr "%1 MB" #~ msgid "The transfer of %1 failed. Couldn't create a socket." #~ msgstr "Prenos je spodletel. Ni mogoče ustvariti kanala za izmenjavo" -#~ msgid "Display pic" -#~ msgstr "Prikaži sliko" - #~ msgid "" #~ "{time} {name} says:\n" #~ "{message}\n" @@ -4500,9 +6555,6 @@ msgstr "%1 MB" #~ msgid "Get New Emoticon or Sound &Themes" #~ msgstr "Pridobi nove smeške ali zvoke" -#~ msgid "n&ame" -#~ msgstr "&ime" - #~ msgid "Update preview" #~ msgstr "Osveži predogled" diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 0000000..9a42e70 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,6029 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Zoran Milovanovic, 2008. +# Zoran Milovanovic , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: sr\n" +"Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-02-01 13:50+0100\n" +"Last-Translator: Zoran Milovanovic \n" +"Language-Team: American English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 0.3\n" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "&Prikazuj smeške" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "" +"Kliknite na ovo dugme da bi počeli koristiti KMess ili da prekinete pokušaj " +"povezivanja" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Bez dopisivanja" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +#, fuzzy +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" +"Kliknite na ovo dugme da bi počeli koristiti KMess ili da prekinete pokušaj " +"povezivanja" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "&Prikazuj smeške" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Prilagođeni smešci" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "" +"Kliknite na ovo dugme da bi vratili sliku kontakta koju je on sam odabrao." + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "No&va linija" + +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 +msgid "S&end" +msgstr "Poša&lji" + +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Ćaskanje" + +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Glavna alatna traka" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" +msgstr "Kliknite ovde za prikaz opcija ovog kontakta" + +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +#, fuzzy +msgid "Click here to open your account settings" +msgstr "Kliknite ovde da preimenujete obeleženi smešak" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "Očistiti &sve" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "&Boja Olovke" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "Veličina olovke" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "&Gumica" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Grupa:" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 +msgid "" +"Enter here the email address of the person you wish to add to your contact " +"list" +msgstr "" +"Unesite email adresu prijatelja koga želite da dodate u vašu listu kontakata" + +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "Email adresa:" + +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "Unesite skraćenicu za smešak:" + +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 +msgid "Select an image file:" +msgstr "Izaberite sliku:" + +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 +msgid "" +"Enter a message to be automatically sent to people who try to message you." +msgstr "Poruka za automatski odgovor." + +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "&Poruka za automatski odgovor:" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "Pronađi k&ontakt" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Čet logovi" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "&Ne koristi" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Pokreni ili zaustavi &konverzaciju" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "Šta želite da uradite?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" +msgstr "Dod&ajte osobu u listu prijatelja" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 +#, fuzzy +msgid "&Do not add this person; only allow them to see my status" +msgstr "Dozvolite osobi da vidi vaš status bez dodavanja u listu" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 +#, fuzzy +msgid "&Block this person from contacting me or seeing my status" +msgstr "Za&branite osobi da vidi Vaš status." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +msgid "&Information" +msgstr "&Informacije" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "" +"Kliknite na ovo dugme da bi vratili sliku kontakta koju je on sam odabrao." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "&Vrati" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "&Grupe:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "Koristite &sopstveni nadimak za ovu osobu" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "Omogući iskačuće prozore kada se kontakt prijavljuje/odjavljuje." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "&Zvuk:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 +msgid "I&mages" +msgstr "Sli&ke" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Kliknite ovde da obrišete obeleženi smešak" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Prikaži sliku" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +msgid "&Clear Cache" +msgstr "Obriši keš" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "&Zabeleške" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "Smešci" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "Kliknite ovde da obrišete obeleženi smešak" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Brisanje" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "Dostupni kontakti" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "Pozovite kontakt koji nije na vašoj listi:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "Unesite email osobe koju želite da pozovete" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "Pozvani kontakti" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "Stavke za izvoz:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "Format" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "Kontakti:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "Obeleži sve" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "Odselektovati sve" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "Izvezi..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "Zatvori" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 +msgid "Network Window" +msgstr "Mrežni prozor" + +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +msgid "Command to Current Tab" +msgstr "Komanda za trenutni jezičak" + +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 +msgid "Command:" +msgstr "Komanda:" + +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 +msgid "Type:" +msgstr "Tip:" + +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 +msgid "Standard" +msgstr "Standardni" + +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 +msgid "MIME" +msgstr "MIME" + +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 +msgid "Send" +msgstr "Pošalji" + +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 +msgid "Command payload (can be empty):" +msgstr "Vrednost komande (može biti prazno):" + +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 +msgid "Open" +msgstr "Otvori" + +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 +msgid "Cancel" +msgstr "Odkaži" + +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "&Preuzimi" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "&Pošalji" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "&Očisti prozor" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "&Zatvori" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" +"Kliknite ovde da bi prikazali mogućnosti za trenutno obeleženi nalog, " +"ili okrećite točkić na mišu da bi izvršili promenu između naloga" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Unesite email adresu vašeg Passport ili Live naloga" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 +msgid "Password:" +msgstr "Lozinka:" + +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "Ovde unesite lozinku vašeg naloga" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "Stanje pri uključenju:" + +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +#, fuzzy +msgid "Choose a status to set when successfully connected." +msgstr "Izaberite MSN stanje koje će biti postavljeno kada se veza uspostavi." + +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "Kada je izabrano, KMess će zapamtiti Vaš nalog" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" +msgstr "Zapamti nalo&g" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "" +"Ukoliko izaberete da KMess pamti Vaš nalog, takođe, KMess može zapamtiti i " +"vašu lozinku." + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "Zapamti lozi&nku" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" +"Kliknite na ovo dugme da bi počeli koristiti KMess ili da prekinete pokušaj " +"povezivanja" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 +msgid "&Connect" +msgstr "&Poveži se" + +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "Novi nalog" + +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" +"Kliknite ovde da bi napravili novi Live nalog, koji možete koristiti " +"da bi se povezali na MSN.
Takođe, možete koristiti i već postojeću email " +"adresu." + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "Zaboravljena lozinka?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +#, fuzzy +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" +"Kliknite ovde da bi otvorili stranicu za zaboravljenu lozinku na Live " +"web sajtu" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Veza" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Pogled" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Akcije" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "Format" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Nalog" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "Informacije o vašem nalogu" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." +msgstr "Unesite ime koje će drugi korisnici videti kada ste povezani." + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 +msgid "&Friendly name:" +msgstr "&Nadimak:" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Unesite email adresu vašeg MSN Passport naloga. Novi nalog možeteotvoriti na " +"http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 +msgid "&Email address:" +msgstr "&Email adresa:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 +msgid "" +"Enter the password of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Unesite lozinku vašeg MSN Passport naloga. Novi nalog možeteotvoriti na " +"http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 +msgid "&Password:" +msgstr "&Lozinka:" + +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "&Zapamti lozinku" + +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 +msgid "Display Picture" +msgstr "Prikaži sliku" + +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 +msgid "C&hange..." +msgstr "&Promeni..." + +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 +msgid "&Do not use" +msgstr "&Ne koristi" + +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +msgid "" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" +"\n" +"It's recommended to enable this option unless you're using KMess as guest or " +"you're using a public system (e.g. Internet cafe)." +msgstr "" + +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +msgid "Re&member the settings of this account" +msgstr "Zapamti podešavanja ovog naloga" + +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 +msgid "If enabled, KMess automatically logs in with this account." +msgstr "Ako je omogućeno, KMess će se automatski prijaviti na vaš nalog." + +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 +#, fuzzy +msgid "Log in &with this account automatically" +msgstr "Prijavi se sa ovim nalogom automatski" + +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 +msgid "Login &as" +msgstr "Prijavi se kao" + +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 +msgid "" +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" +"Morate se povezati sa Passport sajtom da potvrdite da vaša email adresa " +"postoji." + +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 +msgid "" +"You can't change your friendly name because your Passport email address is " +"not verified." +msgstr "" +"Ne možete promeniti vaš nadimak zato što niste potvrdili vašu Passport email " +"adresu." + +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 +msgid "Request verification email" +msgstr "Zahtevaj potvrdu za email" + +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 +msgid "Go to accountservices.passport.net" +msgstr "Go to accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 +msgid "" +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"Potreban vam je Passport nalog da bi ste mogli da se povežete sa MSN " +"Messenger mrežom. Možete registrovati vašu trenutnu adresu na register." +"passport.com ili koristiti Hotmail nalog za povezivanje." + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " +"address as Passport account." +msgstr "" +"Da bi se povezali sa MSN Messenger servisom, morate imati registrovanu email " +"adresu kao Passport nalog." + +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 +msgid "Register new account" +msgstr "Otvori novi nalog" + +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 +msgid "http://register.passport.com/" +msgstr "http://register.passport.com/" + +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 +msgid "Go to register.passport.com" +msgstr "Idi na register.passport.com" + +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +#, fuzzy +msgid "&Status Options" +msgstr "Stanje pri uključenju:" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Ukoliko je omogućeno, tvoj status će se automatski promeniti u \"Away-Idle" +"\" kada ne koristite računar nekoliko minuta. Ako ova opcija nije omogućena, " +"KMess će raditi bez ove mogućnosti." + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +msgid "Change status to \"&Idle\" when inactive" +msgstr "Promeni status u \"&Idle\" kada sam neaktivan" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "Broj minuta pre nego što KMess promeni status u \"Away-Idle\"." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Promeni status u idle posle" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minuta" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +#, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "Zabrani obaveštenja kada je moj status Busy" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 +msgid "Saved accounts:" +msgstr "Zapamćeni nalozi:" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" +msgstr "" +"Kliknite ovde da napravite nov KMess nalog za email nalog koji se već " +"koristi za povezivanje na MSN." + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +#, fuzzy +msgid "&Add Account..." +msgstr "Dodaj nalog..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" +msgstr "Izaberite nalog, a zatim kliknite ovde da ga izbrišete" + +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 +msgid "&Edit" +msgstr "&Izmeniti" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "Izaberite nalog, a zatim kliknite ovde da ga izbrišete" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 +msgid "&Remove" +msgstr "I&zbrisati" + +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" +"Omogućite ovu opciju ukoliko želite da sačuvate vaše četove za kasnije " +"pregledavanje" + +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "Omogući čet logove" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" +"KMess može čuvati vaše četove kao HTML fajlove i održavatii ih organizovane" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "Sačuvaj četove kao fajl" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" +"Sa ovom opcijom, Vi možete izabrati na koji način će KMess čuvati vaše četove" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "Koji format fajla koristiti za čuvanje:" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" +"\n" +"

Format fajla koji koristite je bitan.

\n" +"

HTML čet logovi mogu da se pregledaju u bilo kom veb pregledaču, ali mana " +"im je što se obično ne prikazuju ispravno na drugim računarima.

\n" +"

Tekst fajlovi, mogu se pravilno prikazati svuda; ali oni ne mogu sadrzati " +"nikakav tekst format, slike kontakta ili smeške.

\n" +"" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "Web strane (HTML)" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "Običan tekst" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" +"Ove opcije Vam dozvoljavaju da odaberete kako će KMess organizovati vaše " +"četove u direktorijumima koje izaberete." + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" +"U zavisnosti od toga koje ste opcije izabrali, KMess će napraviti neke " +"direktorijume kako bi Vam pomogao da čet logove čuvate organizovane. " +"Pročitajte \"pomoć\" svake opcije da bi ste saznali kako ona funkcioniše. " + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" +msgstr "Razdvojiti čet logove pomoću:" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "Napraviti direktorijum za organizovanje čet logova po godini" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" +"Ova opcija omogućava KMess-u da logove organizuje na godišnjem nivou.\n" +"Pronaćićete direktorijume za svaku godinu u kojoj postoji čet log; svi čet " +"logovi iz jedne godine će biti u istom direktorijumu.\n" +"\n" +"Čet koji je vođen 29 Novembra 2008 godine, biće sačuvan u direktorijumu " +"kao:\n" +"/2008/datum-i-kontakt-ime.html" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Godina" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" +"Napravite direktorijume za organizovanje čet logova po godini, a zatim po " +"mesecu" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +#, fuzzy +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" +"Ova opcija omogućava KMess-u da logove organizuje na godišnjem nivou.\n" +"Pronaćićete direktorijume za svaku godinu u kojoj postoji čet log; svi čet " +"logovi iz jedne godine će biti u istom direktorijumu.\n" +"\n" +"Čet koji je vođen 29 Novembra 2008 godine, biće sačuvan u direktorijumu " +"kao:\n" +"/2008/datum-i-kontakt-ime.html" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "Godina pa mesec" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" +"Napravite direktorijume za organizovanje čet logova po godini, po mesecu, a " +"zatim po danu" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +#, fuzzy +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" +"Ova opcija omogućava KMess-u da logove organizuje na godišnjem nivou.\n" +"Pronaćićete direktorijume za svaku godinu u kojoj postoji čet log; svi čet " +"logovi iz jedne godine će biti u istom direktorijumu.\n" +"\n" +"Čet koji je vođen 29 Novembra 2008 godine, biće sačuvan u direktorijumu " +"kao:\n" +"/2008/datum-i-kontakt-ime.html" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "Godina, mesec zatim dan" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" +msgstr "Čuvaj sve čet logove direktno u direktorijumu koji je naznačen ispod" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" +"Ova opcija govori KMess-u da sve čet logove čuva u zajedničkom " +"direktorijumu, bez ikakve organizacije nad njima." + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "Bez organizovanja fajlova" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "Kliknite ovde da odaberete direktorijum" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "Direktorijum gde će se svi vaši čet logovi čuvati" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "Izaberite direktorijum na računaru gde želite da čuvate čet logove" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "Čuvaj čet logove u ovom direktorijumu:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "S&til" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "Dozvoljava da promenite osnovni izgled čet prozora sa porukama" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "&Čet stil:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Podešavanja vezana za čet" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Dozvoljava slikovne smeške u čet konverzaciji." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "&Prikazuj smeške" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Prika&zuj smeške" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Ova opcija Vam omogućava grupisanje poruka od istog kontakta. Ukoliko Vam " +"isti kontakt posalje vise poruka u različitim vremenskim periodima, KMess će " +"grupisati sve poruke u jednu. Tačan izgled poruke zavisi od izabranog čet " +"stila." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "Grupiši više poruka od istog kontakta" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Prikazuje vreme poslatih i primljenih poruka." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "P&rikaži vreme poruke" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +msgid "Show &date" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +#, fuzzy +msgid "Show s&econds" +msgstr "&Prikazuj smeške" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Tekst" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Izgled fontova i boja koje se koriste u čet porukama" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "&Font poruke:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"Omogućava Vam da sami izaberete font i boju poruke koje šalju vaši " +"prijatelji." + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "Primorati poruke koje salju vaši prijatelji da koriste font:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Dogadjaji za čet prozor" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Ukucavanjem *podebljan*, /nakošen/, and _podvučen_ menjati osobine fonta, " +"podebljano, nakošeno, podvučeno." + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Koristi efekte nad tekstom u porukama, kao što je *bold*, /italic/, i " +"_underline_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +#, fuzzy +msgid "Enable MSN Plus formatting" +msgstr "MSN Plus dodaci" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 +msgid "" +"

When contacts like to have your attention they can send a nudge. By " +"default the chat window shakes when a nudge is received or sent. Disable " +"this option if the shaking effect is too obtrusive.

\n" +"

When this option is enabled, KMess still limits the shaking effect. " +"Contacts may send multiple nudges at once, but KMess only shakes the chat " +"window with the first nudge.

" +msgstr "" +"

Kada prijatelj želi da ima vašu pažnju on će poslati nudge. Prozor će " +"početi da se trese kada je nudge poslat ili primljen.

\n" +"

Kada je ova opcija omogućena, KMess će ipak limitirati efekte potresa. " +"Kontakti Vam mogu poslati više nudge zahteva zaredom, ali KMess će prozor " +"protresti samo jednom.

" + +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 +msgid "Shake the chat &window when a nudge is received or sent" +msgstr "Protresi čet prozor kada je nudge poslat ili primljen" + +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 +msgid "" +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +msgid "Display your own &display picture in the chat window" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "G&rupiši četove u jednom prozoru:" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Uvek" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "Samo za kontakte iz iste grupe" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Nikada" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Prikaži sliku" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." +msgstr "" +"Ako je omogućena, iskačući prozor će se pojaviti kada imate email u " +"sandučetu. Broj nepročitanih emailova će biti prikazan ispod liste " +"kontakata. Ova opcija je jedino dostupna za Hotmail naloge." + +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Prikaži broj nepročitanih emailova" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 +msgid "" +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." +msgstr "" +"Ako je omogućena, KMess će informisati prijatelje šta vi trenutno slušate. " +"Ove informacije će biti priklupljane iz trenutno aktivnog audio plejera." + +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" +msgstr "Prikaži kontaktima šta slušam trenutno" + +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +#, fuzzy +msgid "List Formatting" +msgstr "MSN Plus dodaci" + +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +#, fuzzy +msgid "Enable MSN &Plus formatting" +msgstr "MSN Plus dodaci" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 +msgid "&Emoticon Themes" +msgstr "&Teme smešaka" + +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 +msgid "Available emoticon styles:" +msgstr "Raspoloživi smešci" + +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 +msgid "&Custom Emoticons" +msgstr "Prilagođeni smešci" + +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 +msgid "Custom emoticons for this account:" +msgstr "Prilagođeni smešci za ovaj nalog" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "Kliknite ovde da dodate nov smešak" + +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." +msgstr "Dodaj nov..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "Kliknite ovde da preimenujete obeleženi smešak" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 +msgid "Re&name" +msgstr "Preime&novati" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 +msgid "Web Browser" +msgstr "Veb čitač" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 +msgid "Choose this option to use the browser used by the rest of KDE." +msgstr "" +"Izaberite ovu opciju ukoliko želite da koristite veb čitač koji se koristi i " +"u ostalim programima pod KDE." + +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 +msgid "&Use the KDE default browser" +msgstr "Koristi osnovni veb čitač iz KDE" + +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 +msgid "Select this option to choose from a list of installed browsers." +msgstr "Izaberite ovu opciju da bi izabrali veb čitač iz liste instaliranih" + +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 +msgid "&Use an installed browser:" +msgstr "Koristi veb čitač:" + +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 +msgid "Choose this option to enter the path to your favorite browser." +msgstr "Iskoristite ovu opciju da unesete putanju do vašeg omiljenog čitača" + +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +msgid "&Specify a custom command:" +msgstr "Unesite komandu:" + +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 +#, no-c-format +msgid "" +"Specify the path of a program to use to open links; a '%u' here will be " +"replaced with the links' URL." +msgstr "" +"Unesite putanju do programa koji želite da koristite za otvaranje linkova; '%" +"u' će biti zamenjeno sa URL linkovima." + +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 +#, no-c-format +msgid "Use '%u' to insert the URL in the command line." +msgstr "Koristite '%u' da unesete URL adresu iz komandne linije." + +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 +msgid "Email Client" +msgstr "Email klijent" + +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 +msgid "" +"Check this box to use the Live Mail webmail site when you connect with " +"accounts compatible with Live Mail." +msgstr "" +"Omogućite ovu opciju ukoliko želite da koristite Live Mail webmail, kada ste " +"na vezi sa nalogom koji je kompatibilan sa Live Mail." + +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "&Koristi Live Mail ukoliko nalog podržava" + +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 +msgid "Choose this option to use the email client used by the rest of KDE." +msgstr "" +"Omogućite ovu opciju ukoliko želite da koristite email klijent koji je " +"postavljen kao osnovni za KDE." + +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "Koristi osnovni KDE email klijent" + +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "Koristi moj omiljeni email klijent:" + +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 +#, no-c-format +msgid "Use '%u' to insert the email address in the command line." +msgstr "Koristite '%u' da unesete email adresu iz komandne linije." + +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 +msgid "File Transfers" +msgstr "Transfer fajlova" + +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 +msgid "&Save all received files in one directory:" +msgstr "Ču&vaj sve primljene fajlove u jednom direktorijumu:" + +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 +msgid "&Use ports between" +msgstr "Koristi portove između" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "i" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "za prenos fajlova" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "Vaš komentar:" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "Vaš komentar je u vezi sa:" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "Vi volite" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "Vi ne volite" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +#, fuzzy +msgid "An improper behavior of the application" +msgstr "Pomognite da unapredimo KMess" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "Navedite Vašu kontakt email adresu " + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "Prikaži feedback dugmad na svim prozorima" + +#: account.cpp:45 account.cpp:736 +msgid "I'm away from my computer" +msgstr "Trenutno nisam za računarom" + +#: account.cpp:54 +msgid "Your name" +msgstr "Vaše ime" + +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 +msgid "you@hotmail.com" +msgstr "vasa_adresa@hotmail.com" + +#: accountsmanager.cpp:388 +msgid "" +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Sigurna čuvalica za Vašu lozinku" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Uvezi" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Obriši" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Zadrži" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "" +"Ne možete pozvati nikoga da vam se pridruži u četu, dok su više prijatelja " +"već zajedno sa Vama u četu." + +#: chat/chat.cpp:142 +msgid "%1 has joined the chat." +msgstr "%1 se pridružio četu." + +#: chat/chat.cpp:196 +#, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "Konverzacija nije bila aktivna, %1 je napustio čet." + +#: chat/chat.cpp:202 +#, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "%1 has left the chat." +msgstr "%1 je napustio čet." + +#: chat/chat.cpp:367 +msgctxt "Name of a chat tab" +msgid "%1 and %2" +msgstr "%1 i %2" + +#: chat/chat.cpp:374 +msgctxt "Name of a chat tab" +msgid "%1 et al." +msgstr "" + +#: chat/chat.cpp:664 +msgctxt "Automatic reply message" +msgid "%1 (This message was sent automatically)" +msgstr "%1 (Ova poruka je poslata automatski)" + +#: chat/chat.cpp:830 +#, fuzzy +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" +"KMess ne može sačuvati čet log.
Direktorijum za čet logove, '%1', " +"ne postoji." + +#: chat/chat.cpp:941 +#, fuzzy +msgid "You have sent a wink" +msgstr "Upravo ste primili namig od %1" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Nastala je greška prilikom povezivanja." + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" +"%1 Vam je poslao zvučnu poruku, ali KMess je ne može pustiti." + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" +"%1 Vam je poslao \"mrdajuću\" poruku, ali KMess je ne može prikazati." + +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "" +"%1 Vam je poslao MSN dodatak koji KMess još uvek nije u mogućnosti da " +"prikaže" + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" +"Upravo ste primili namig od %1, ali prikazivanje namiga je onemogućeno u " +"podešavanjima naloga." + +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" +"Upravo ste primili namig od %1, ali prikazivanje namiga nije moguće. Da li " +"ste sigurni da imate 'cabextract' instaliran." + +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Upravo ste primili namig od %1, ali prikazivanje namiga nije moguće. Došlo " +"je do greške prilikom otvaranja namiga." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" +"Upravo ste primili namig od %1, ali prikazivanje namiga nije moguće. Namig " +"nije moguće pravilno pročitati. " + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 Vam je poslao namig!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 se pridružio četu." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 se pridružio četu." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 Vam je poslao nudge!" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "svi kontakti" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Upravo ste primili nudge od %1!" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Upravo ste primili namig od %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 se pridružio četu." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "" +"%1 vam je poslao poruku dok niste bili na mreži:
'%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "" +"Fajl '%1' ne može biti pronađen na udaljenom računaru, preuzimanje " +"prekinuto." + +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" +msgid "You've sent a nudge to %1!" +msgstr "Nudge je poslat %1!" + +#: chat/chat.cpp:1532 +msgid "You've sent a nudge!" +msgstr "Poslali ste nudge!" + +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 +msgid "%1 is sending a wink: %2" +msgstr "%1 šalje namig: %2" + +#: chat/chatmessagestyle.cpp:372 +msgid "%1 says:" +msgstr "%1 kaže:" + +#: chat/chatmessageview.cpp:320 +#, fuzzy +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "Čet sa %1
Započet je: %2" + +#: chat/chatmessageview.cpp:364 +#, fuzzy +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "Čet je započet u: %2" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "KMess je sačuvao čet log između Vas i %1 " + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 +msgid "Add this emoticon: %1" +msgstr "Dodaj ovaj smešak: %1" + +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Ponovo uspostavljanje veze" + +#: chat/chatview.cpp:299 +msgid "" +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." +msgstr "" +"KMess ne može sačuvati Vaš čet log u direktorijumu '%1'.\n" +"Budite sigurni da imate dozvolu za pisanje u direktorijumu koji ste naveli." + +#: chat/chatview.cpp:438 +#, fuzzy +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" +"*.html *.htm|Veb strana (*.html)\n" +"*.txt|Običan tekst fajl (*.txt)\n" +"*.xml|XML dokument (*.xml)" + +#: chat/chatview.cpp:457 +#, fuzzy +msgid "" +"The file '%1' already exists.\n" +"Do you want to overwrite it?" +msgstr "" +"Ime fajla '%1 već postoji,\n" +"da li želite da ga prebrišete?" + +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Overwrite File" +msgstr "Prebrisivanje fajla" + +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 +msgid "Over&write" +msgstr "Prebrisati" + +#: chat/chatview.cpp:824 +msgid "Add this &Emoticon..." +msgstr "Dodaj ovaj smešak" + +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Dodaj ovaj smešak" + +#: chat/chatview.cpp:833 +msgid "Send &Email" +msgstr "Pošalji email" + +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "Dodaj kontakt" + +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "Kopiraj Email adresu" + +#: chat/chatview.cpp:847 +msgid "Visit &Link" +msgstr "Poseti link" + +#: chat/chatview.cpp:851 +msgid "Copy &Address" +msgstr "Kopiraj adresu" + +#: chat/chatview.cpp:867 +msgid "&Copy Text" +msgstr "Kopiraj tekst" + +#: chat/chatview.cpp:868 +msgid "Select &All" +msgstr "Označi sve" + +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "Pronađi tekst..." + +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +msgid "C&lear Chat" +msgstr "Oč&isti čet prozor" + +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Sačuvaj čet log kao..." + +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Kontakti" + +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "Smešci" + +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" +msgstr "Moji smešci" + +#: chat/chatwindow.cpp:328 +#, fuzzy +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." +msgstr "" +"Više konverzacija je pokrenutno u više jezička. Da li želite da " +"zatvorite samo aktivan jezičak ili sve?

Zapamtite: Sve prozore " +"istovremeno možete zatvoriti pretiskom na tastere Shift+Esc." + +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Zatvori čet jezičak" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "Zatvori &sve jezičke" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "Zatvori aktivan jezičak" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "&Pozvati..." + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." +msgstr "Pošalji &fajl..." + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "Čet sa kamericom" + +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Pokreni &Meeting" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "Pošalji &nudge!" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "Sačuvaj čet..." + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "Zatvori &sve jezičke" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Promeni &font" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Promeni &boju fonta" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Prika&zuj smeške" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "P&rikaži vreme poruke" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "&Paneli" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "Provera pravopi&sa" + +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Meeting" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Nudge" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Pošalji &fajl" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Omogući ili onemogući Kontakt bar" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakti" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Omogući ili onemogući bar sa standardnim smešcima" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Smešci" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Omogući ili onemogući bar sa prilagođenim smešcima" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Moji smešci" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Font" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "&Boja Fonta" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "Očisti čet prozor" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Pokreni ili zaustavi &konverzaciju" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" +"Upotrebili ste nepostojeću komandu za /status. Ispravne komande su: " +"/status online|away|idle|brb|busy|lunch|phone|invisible.
Ili " +"koristite /online, /phone i slične skraćenice." + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "Nepostojeća /status komanda" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +#, fuzzy +msgid "You can't block anyone in a group chat." +msgstr "Ne možete blokirati ikoga u grupnom četu." + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +#, fuzzy +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "Ne možete blokirati u ovom trenutku!" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" +"Nepostojeća komanda %1. Ukoliko ne želite da ova poruka bude " +"poslata kao komanda, na početku dodajte jos jednu /." + +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Nepoznata komanda" + +#: chat/chatwindow.cpp:1555 +msgctxt "Chat window caption, without contact name" +msgid "Chat" +msgstr "Čet" + +#: chat/chatwindow.cpp:1559 +msgctxt "Chat window caption, with contact name" +msgid "%1 - Chat" +msgstr "%1 - Čet" + +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" +"Jeste li sigurni da želite da sakrijete meni bar? Ponovo prikazivanje " +"menija možete pokrenuti korišćenjem skraćenice: %1" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Skrivanje menija" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1 kuca poruku..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 i %2 kucaju poruku..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 i %3 kucaju poruku..." + +#: chat/chatwindow.cpp:2296 +#, fuzzy +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" +"

Informacije o četu

Kontakti:
  • %" +"1
Čet započet u:
%2
" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "&Započni privatni čet" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" +msgstr "Pošalji email" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 +msgid "&View Profile" +msgstr "&Pogledaj profil" + +#: chat/contactframe.cpp:307 +msgid "Ed&it Notes" +msgstr "&Beleške" + +#: chat/contactframe.cpp:309 kmessview.cpp:595 +msgid "&Add Contact" +msgstr "&Dodaj kontakt" + +#: chat/contactframe.cpp:310 kmessview.cpp:596 +msgid "A&llow Contact" +msgstr "&Odobri kontakt" + +#: chat/contactframe.cpp:311 kmessview.cpp:599 +msgid "&Delete Contact" +msgstr "O&briši kontakt" + +#: chat/contactframe.cpp:313 kmessview.cpp:597 +msgid "&Block Contact" +msgstr "B&lokiraj kontakt" + +#: chat/contactframe.cpp:314 kmessview.cpp:598 +msgid "&Unblock Contact" +msgstr "Odblokira&j kontakt" + +#: chat/contactframe.cpp:316 kmessview.cpp:602 +msgid "&Friendly Name" +msgstr "Ime za prika&z" + +#: chat/contactframe.cpp:317 kmessview.cpp:603 +msgid "&Personal Message" +msgstr "Statusna poruka" + +#: chat/contactframe.cpp:318 kmessview.cpp:604 +msgid "&Email Address" +msgstr "&Email adresa" + +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" +msgstr "&Kopiraj" + +#: chat/contactframe.cpp:693 +msgid "Blocked" +msgstr "Blokirani" + +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" +msgid "The contact is %1" +msgstr "Kontakt je %1" + +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" +msgid "" +"

You haven't added any custom emoticons yet.

To add new " +"emoticons, click here!

" +msgstr "" +"

Niste dodali ni jedan prilagođeni smešak.

Da bi ste to " +"uradili, klikniteovde!

" + +#: chat/emoticonswidget.cpp:449 +msgid "Add to Chat" +msgstr "Pridruži četu" + +#: chat/emoticonswidget.cpp:450 +#, fuzzy +msgid "Add New" +msgstr "Dodaj nov..." + +#: chat/emoticonswidget.cpp:451 +msgid "Edit" +msgstr "Izmeni" + +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 +msgid "Remove" +msgstr "Obriši" + +#: chat/winkswidget.cpp:106 +#, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

Niste dodali ni jedan prilagođeni smešak.

Da bi ste to " +"uradili, klikniteovde!

" + +#: contact/contactbase.cpp:304 +msgid "Windows Mobile" +msgstr "Windows Mobile" + +#: contact/contactbase.cpp:308 +msgid "Web Messenger" +msgstr "Web Messenger" + +#: contact/contactbase.cpp:312 +msgid "Office Communicator" +msgstr "Office Communicator" + +#: contact/contactbase.cpp:316 +msgid "Messenger Bot" +msgstr "Messenger Bot" + +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows Media Center" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 compatible" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 +msgid "Windows Live Messenger" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 compatible" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1 compatible" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 +msgid "Online" +msgstr "Na vezi" + +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 +msgid "Busy" +msgstr "Zauzet" + +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Udaljen od računara" + +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Odsutan sa automatskom porukom" + +#: contact/msnstatus.cpp:160 +msgid "Idle" +msgstr "Zaludan" + +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Vraćam se brzo" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 +msgid "On the Phone" +msgstr "Telefoniram" + +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 +msgid "Out to Lunch" +msgstr "Ručam" + +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Nevidljiv" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Odjavljen" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Moj status" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Odjavi se" + +#: dialogs/addcontactdialog.cpp:49 +msgid "Add a Contact" +msgstr "Dodaj kontakt" + +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 +msgid "Add New Emoticon" +msgstr "Dodati nov smešak" + +#: dialogs/addemoticondialog.cpp:129 +msgid "Edit Emoticon" +msgstr "Izmeniti smešak" + +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +#, fuzzy +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "Smešak \"%1\" već postoji, da li želite da ga zamenite?" + +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" +msgstr "Posta" + +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "&Čet stil:" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Ne mogu da otvorim port." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Neko Vas je dodao u listu prijatelja" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"Vas je dodao u njegovu/njenu listu prijatelja." + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Osobine kontakta za %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 +msgid "Connected" +msgstr "Na vezi" + +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 +msgid "Not seen yet" +msgstr "Nije viđen do sada" + +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 +msgid "No messages yet" +msgstr "Bez dopisivanja" + +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Poslednji put viđen u: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Poslednje dopisivanje u: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "Email adresa: %1" + +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" +msgid "Client: %1" +msgstr "Klijent: %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "" +"Kliknite na ovo dugme da bi vratili sliku kontakta koju je on sam odabrao." + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kontakti" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Pozovi kontakte" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "Izvezi listu prijatelja za %1" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "Ništa za izvoz" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "Fajl već postoji" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "Fajl %1 već postoji, želite li da ga prebrišete?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "Čuvanje liste prijatelja je zavšeno" + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "S&ačuvaj jezičak" + +#: dialogs/networkwindow.cpp:79 +#, fuzzy +msgid "C&lear Tab" +msgstr "Očisti jezičak" + +#: dialogs/networkwindow.cpp:80 +#, fuzzy +msgid "C&lose All Tabs" +msgstr "Zatvori &sve jezičke" + +#: dialogs/networkwindow.cpp:1081 +msgid "" +"No connections are present.\n" +"Cannot open the Network Window." +msgstr "" +"Veza nije uspostavljena.\n" +"Ne možete otvoriti Mrežni prozor." + +#: dialogs/networkwindow.cpp:1125 +msgid "" +"Could not save the Network Window log. Make sure you have permission to " +"write in the folder where it is being saved." +msgstr "" +"Čuvanje loga od mrežnog prozora nije moguće. Jeste li sigurni da imate " +"dozvolu za pisanje u navedenom direktorijumu?" + +#: dialogs/networkwindow.cpp:1172 +msgid "Cannot close the main connection tab." +msgstr "Ne možete zatvoriti ovaj jezičak." + +#: dialogs/networkwindow.cpp:1268 +msgid "" +"Sending commands to the server is a risky operation.
If you don't know " +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" +msgstr "" + +#: dialogs/networkwindow.cpp:1298 +msgid "" +"The payload you are trying to send does not end with the required newline " +"('\\r\\n')!
Do you want KMess to add it for you?" +msgstr "" +"Poruka koja se šalje se ne završava specijalnim znakom nova linija. ('\\r" +"\\n')!
Da li želite da ga Kmess doda umesto Vas?" + +#: dialogs/networkwindow.cpp:1374 +msgid "Cannot send commands to this kind of connection!" +msgstr "Ne možete slati komande na ovakvoj vezi!" + +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 +#: network/applications/filetransferp2p.cpp:99 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 +msgid "Cancelled" +msgstr "Otkazano" + +#: dialogs/transferentry.cpp:181 +msgid "Failed!" +msgstr "Neuspešno!" + +#: dialogs/transferentry.cpp:225 +msgid "Completed" +msgstr "Gotovo" + +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 +msgid "%1 MB" +msgstr "" + +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 +msgid "%1 kB" +msgstr "" + +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 +msgid "%1 bytes" +msgstr "%1 bajta" + +#: dialogs/transferentry.cpp:343 +msgid "%1 of %2 received." +msgstr "%1 id %2 primljeno." + +#: dialogs/transferentry.cpp:347 +msgid "%1 of %2 sent." +msgstr "%1 od %2 poslato." + +#: dialogs/transferentry.cpp:381 +msgid "infinite" +msgstr "beskonačno" + +#: dialogs/userpicturesdialog.cpp:43 +#, fuzzy +msgid "&Use" +msgstr "Koristi" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "&Obriši" + +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Izaberite ili obrišite vašu sliku" + +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Prikaži sliku" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Sigurno želite da obrišete ovaj nalog?" + +#: emoticontheme.cpp:612 +msgid "" +"Could not save the emoticon theme. Make sure you have permission to write to " +"the theme folder '%1'." +msgstr "" +"Tema sa smešcima ne može biti sačuvana. Budite sigurni da imate dozvolu za " +"pisanje u navedenom direktorijumu '%1'." + +#: emoticontheme.cpp:822 +msgid "Smile" +msgstr "" + +#: emoticontheme.cpp:823 +msgid "Wink" +msgstr "" + +#: emoticontheme.cpp:824 +msgid "Tongue out" +msgstr "" + +#: emoticontheme.cpp:825 +msgid "Big smile" +msgstr "" + +#: emoticontheme.cpp:826 +msgid "Sad" +msgstr "" + +#: emoticontheme.cpp:827 +msgid "Crying" +msgstr "" + +#: emoticontheme.cpp:828 +msgid "Angry" +msgstr "" + +#: emoticontheme.cpp:829 +msgid "Confused" +msgstr "" + +#: emoticontheme.cpp:830 +msgid "Embarrassed" +msgstr "" + +#: emoticontheme.cpp:831 +msgid "Disappointed" +msgstr "" + +#: emoticontheme.cpp:832 +msgid "Hot" +msgstr "" + +#: emoticontheme.cpp:833 +msgid "Baring teeth" +msgstr "" + +#: emoticontheme.cpp:834 +msgid "Nerd" +msgstr "" + +#: emoticontheme.cpp:835 +msgid "Sick" +msgstr "" + +#: emoticontheme.cpp:836 +msgid "Surprised" +msgstr "" + +#: emoticontheme.cpp:837 +msgid "Party" +msgstr "" + +#: emoticontheme.cpp:838 +msgid "Sleepy" +msgstr "" + +#: emoticontheme.cpp:839 +msgid "Thinking" +msgstr "" + +#: emoticontheme.cpp:840 +msgid "Don't tell anyone" +msgstr "" + +#: emoticontheme.cpp:841 +msgid "Secret telling" +msgstr "" + +#: emoticontheme.cpp:842 +msgid "Eye-rolling" +msgstr "" + +#: emoticontheme.cpp:843 +msgid "Sarcastic" +msgstr "" + +#: emoticontheme.cpp:844 +msgid "I don't know" +msgstr "" + +#: emoticontheme.cpp:845 +msgid "Be right back" +msgstr "" + +#: emoticontheme.cpp:846 +msgid "Angel" +msgstr "" + +#: emoticontheme.cpp:847 +msgid "Left hug" +msgstr "" + +#: emoticontheme.cpp:848 +msgid "Boy" +msgstr "" + +#: emoticontheme.cpp:849 +msgid "Red heart" +msgstr "" + +#: emoticontheme.cpp:850 +msgid "Red rose" +msgstr "" + +#: emoticontheme.cpp:851 +msgid "Thumbs up" +msgstr "" + +#: emoticontheme.cpp:852 +msgid "Dog face" +msgstr "" + +#: emoticontheme.cpp:853 +msgid "Sun" +msgstr "" + +#: emoticontheme.cpp:854 +msgid "Devil" +msgstr "" + +#: emoticontheme.cpp:855 +msgid "Right hug" +msgstr "" + +#: emoticontheme.cpp:856 +msgid "Girl" +msgstr "" + +#: emoticontheme.cpp:857 +msgid "Broken heart" +msgstr "" + +#: emoticontheme.cpp:858 +msgid "Wilted rose" +msgstr "" + +#: emoticontheme.cpp:859 +msgid "Thumbs down" +msgstr "" + +#: emoticontheme.cpp:860 +msgid "Cat face" +msgstr "" + +#: emoticontheme.cpp:861 +msgid "Sleeping half-moon" +msgstr "" + +#: emoticontheme.cpp:862 +msgid "Red lips" +msgstr "" + +#: emoticontheme.cpp:863 +msgid "Clapping" +msgstr "" + +#: emoticontheme.cpp:864 +msgid "Crossed fingers" +msgstr "" + +#: emoticontheme.cpp:865 +msgid "Auto" +msgstr "" + +#: emoticontheme.cpp:866 +msgid "Airplane" +msgstr "" + +#: emoticontheme.cpp:867 +msgid "Turtle" +msgstr "" + +#: emoticontheme.cpp:868 +msgid "Snail" +msgstr "" + +#: emoticontheme.cpp:869 +msgid "Sheep" +msgstr "" + +#: emoticontheme.cpp:870 +msgid "Goat" +msgstr "" + +#: emoticontheme.cpp:871 +msgid "Vampire bat" +msgstr "" + +#: emoticontheme.cpp:872 +msgid "Pizza" +msgstr "" + +#: emoticontheme.cpp:873 +msgid "Beer mug" +msgstr "" + +#: emoticontheme.cpp:874 +msgid "Martini glass" +msgstr "" + +#: emoticontheme.cpp:875 +msgid "Coffee cup" +msgstr "" + +#: emoticontheme.cpp:876 +msgid "Birthday cake" +msgstr "" + +#: emoticontheme.cpp:877 +msgid "Plate" +msgstr "" + +#: emoticontheme.cpp:878 +msgid "Bowl" +msgstr "" + +#: emoticontheme.cpp:879 +msgid "Star" +msgstr "" + +#: emoticontheme.cpp:880 +msgid "Rainbow" +msgstr "" + +#: emoticontheme.cpp:881 +msgid "Stormy cloud" +msgstr "" + +#: emoticontheme.cpp:882 +msgid "Lightning" +msgstr "" + +#: emoticontheme.cpp:883 +msgid "Umbrella" +msgstr "" + +#: emoticontheme.cpp:884 +msgid "Island with a palm tree" +msgstr "" + +#: emoticontheme.cpp:885 +msgid "Telephone receiver" +msgstr "" + +#: emoticontheme.cpp:886 +msgid "Mobile Phone" +msgstr "" + +#: emoticontheme.cpp:887 +msgid "Email" +msgstr "" + +#: emoticontheme.cpp:888 +msgid "Clock" +msgstr "" + +#: emoticontheme.cpp:889 +msgid "Camera" +msgstr "" + +#: emoticontheme.cpp:890 +msgid "Filmstrip" +msgstr "" + +#: emoticontheme.cpp:891 +msgid "Note" +msgstr "" + +#: emoticontheme.cpp:892 +msgid "Handcuffs" +msgstr "" + +#: emoticontheme.cpp:893 +msgid "Money" +msgstr "" + +#: emoticontheme.cpp:894 +msgid "Light bulb" +msgstr "" + +#: emoticontheme.cpp:895 +msgid "Cigarette" +msgstr "" + +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" + +#: emoticontheme.cpp:897 +msgid "Gift with a bow" +msgstr "" + +#: emoticontheme.cpp:898 +msgid "X-Box" +msgstr "" + +#: emoticontheme.cpp:899 +msgid "Computer" +msgstr "" + +#: emoticontheme.cpp:900 +msgid "KMess Icon" +msgstr "" + +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "Ponovno povezivanje neuspelo: nalog ne postoji." + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "Ponovno povezivanje neuspelo: za ovaj nalog nije sačuvana lozinka." + +#: initialview.cpp:280 initialview.cpp:379 +#, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Čekam Internet vezu za ponovno povezivanje...." + +#: initialview.cpp:384 +msgctxt "Status message on login screen" +msgid "Internet connection not available." +msgstr "Internet veza nije dostupna." + +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" + +#: initialview.cpp:581 +#, fuzzy +msgctxt "Button label" +msgid "&Connect" +msgstr "&Poveži se" + +#: initialview.cpp:586 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "Odkaži" + +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "Molim Vas, popunite polje za email i lozinku." + +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "Pogrešna email adresa" + +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "Kontakt informacije" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "Kontakt %1 već postoji u vašoj listi prijatelja." + +#: kmess.cpp:250 +msgid "New Group" +msgstr "Nova grupa" + +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "Dodaj grupu" + +#: kmess.cpp:254 +msgid "Enter a name for the new group:" +msgstr "Navedite ime nove grupe:" + +#: kmess.cpp:577 +msgid "" +"Are you sure you want to remove the contact %1 from your contact " +"list?" +msgstr "" +"Jeste li sigurni da želite da obrišete %1 iz Vaše liste " +"prijatelja?" + +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" +msgstr "Obriši kontakt" + +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" +msgstr "Obriši i blokiraj" + +#: kmess.cpp:627 +msgctxt "dialog text" +msgid "" +"The group \"%1\" is not empty: remove all contacts from it, then try " +"again!" +msgstr "" +"Grupa \"%1\" nije prazna: obrišite sve kontakte iz nje, a onda " +"probajte ponovo!" + +#: kmess.cpp:629 kmess.cpp:636 +#, fuzzy +msgctxt "dialog title" +msgid "Group Removal" +msgstr "Brisanje grupe" + +#: kmess.cpp:634 +#, fuzzy +msgctxt "dialog text" +msgid "" +"Are you sure you want to remove the group %1 from your contact " +"list?" +msgstr "" +"Jeste li sigurni da zelite da obrišete %1iz Vaše kontakt liste" + +#: kmess.cpp:637 +msgctxt "dialog button" +msgid "Remove" +msgstr "Obriši" + +#: kmess.cpp:668 +msgid "This is a special group and can't be changed." +msgstr "Ovo je specijalna grupa i ne može biti menjana." + +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "Preime&nuj grupu" + +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Unesite novo ime grupe:" + +#: kmess.cpp:754 +msgctxt "dialog text" +msgid "" +"

Cannot login automatically with account \"%1\":
you must first " +"save the account password!

" +msgstr "" +"

Automatsko povezivanje na ovaj nalog nije moguće \"%1\":
prvo " +"morate da sačuvate lozinku!

" + +#: kmess.cpp:757 +#, fuzzy +msgctxt "dialog title" +msgid "Autologin Failed" +msgstr "Automatsko povezivanje neuspešno" + +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Povezivanje..." + +#: kmess.cpp:1123 +msgctxt "Status bar message" +msgid "Disconnected" +msgstr "Odjavljen" + +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "

KMess za njega pretražuje sledeće direktorijume:
%1

" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" +"

KMess nije u mogućnosti da pušta zvuke obaveštenja.

Fajl " +"'kmess.notifyrc' ne postoji u ni jednom aplikacionom direktorimu.

%" +"1

Proverite Vašu instalaciju.

" + +#: kmess.cpp:1481 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Javila se greška pri obaveštavanju" + +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" +msgid "KMess - %1" +msgstr "" + +#: kmessinterface.cpp:163 +msgid "&Disconnect" +msgstr "&Odjava" + +#: kmessinterface.cpp:164 +msgid "Show My &Profile" +msgstr "Prikaži moj &Profil" + +#: kmessinterface.cpp:169 +msgid "Show &Allowed Contacts" +msgstr "Prikaži &dozvoljene kontakte" + +#: kmessinterface.cpp:170 +msgid "Show &Offline Contacts" +msgstr "Prikaži kontakte k&oji nisu na vezi" + +#: kmessinterface.cpp:171 +msgid "Show &Removed Contacts" +msgstr "Prikaži ob&risane kontakte" + +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &History Box" +msgstr "&Čet stil:" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "Omogući traku za pretraživanje" + +#: kmessinterface.cpp:174 +msgid "Show &Empty Groups" +msgstr "Prikaži prazn&e grupe" + +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "Veličina prijate&ljeve slike" + +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "&Sortiraj kontakte po" + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Prikaži &Transfer prozor" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "Dodaj nov &kontakt" + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "Dodaj novu &grupu" + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "&Izvezi kontakt listu..." + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "Pronađi k&ontakt" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Pretražuj po &Interesu" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "&Čet stil:" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "Nov Nal&og" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Nov Nal&og" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "Podešavanje &Kmess..." + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "Prikaži selekcioni &Meni" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "Ne prikazuj" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "Mala" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "Velika" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "Najveća" + +#: kmessinterface.cpp:201 +msgid "Group" +msgstr "Grupa" + +#: kmessinterface.cpp:202 +msgid "Online/Offline" +msgstr "Na vezi/Odjavljen" + +#: kmessinterface.cpp:203 +msgid "Mixed" +msgstr "Izmešan" + +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Prikaži &Mrežni prozor" + +#: kmessview.cpp:315 +msgid "[%1] Logged with %2" +msgstr "[%1] Na vezi sa %2" + +#: kmessview.cpp:352 +msgid "[%1] %2 goes online" +msgstr "[%1] %2 se prijavio" + +#: kmessview.cpp:357 +msgid "[%1] %2 goes offline" +msgstr "[%1] %2 se odjavio" + +#: kmessview.cpp:590 +msgid "Cha&t" +msgstr "Če&t" + +#: kmessview.cpp:593 +msgid "&Properties" +msgstr "&Podešavanja" + +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" +msgstr "&Obriši iz grupe" + +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" + +#: kmessview.cpp:632 +msgid "&Copy to Group" +msgstr "&Kopiraj u grupu" + +#: kmessview.cpp:633 +msgid "&Move to Group" +msgstr "&Prebaci u grupu" + +#: kmessview.cpp:683 +msgid "Move Group &Down" +msgstr "Pomeri grupu na &dole" + +#: kmessview.cpp:684 +msgid "Move Group &Up" +msgstr "Pomeri grupu na &gore" + +#: kmessview.cpp:685 +msgid "Re&move Group" +msgstr "O&briši grupu" + +#: kmessview.cpp:686 +msgid "Re&name Group" +msgstr "Preime&nuj grupu" + +#: kmessview.cpp:1124 +#, fuzzy +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Dod&ajte osobu u listu prijatelja" + +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "Email adresa:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Klijent: %1" + +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "" + +#: kmessview.cpp:1156 +msgid "No" +msgstr "" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blokirani" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Poslednji put viđen u: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Poslednje dopisivanje u: %1" + +#: kmessview.cpp:1204 +msgctxt "Group name in group tooltip" +msgid "Group %1" +msgstr "Grupa %1" + +#: kmessview.cpp:1212 +msgctxt "Contacts counters in normal group tooltip" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 kontakt, %2 na vezi" +msgstr[1] "%1 kontakata, %2 na vezi" + +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 kontakt" +msgstr[1] "%1 kontakata" + +#: kmessview.cpp:1631 +msgctxt "Default personal message shown in the contact list" +msgid "<Enter your personal message here>" +msgstr "<Unesite vašu poruku ovde>" + +#: kmessview.cpp:1632 +#, fuzzy +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" +"Unesite poruku koja će biti prikazana vašim kontaktima, pored vašeg imena" + +#: kmessview.cpp:1968 +msgid "%1 new email message" +msgid_plural "%1 new email messages" +msgstr[0] "%1 nepročitan email" +msgstr[1] "%1 nepročitanih emailova" + +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 +msgid "KMess" +msgstr "" + +#: main.cpp:44 +msgid "A MSN Messenger client for KDE" +msgstr "MSN Messanger klijent za KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 +msgid "Developer and project founder" +msgstr "" + +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 +msgid "Developer" +msgstr "" + +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 +msgid "Project support" +msgstr "" + +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 +msgid "Current developer" +msgstr "" + +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 +msgid "" +"German translation, testing, documentation, web master, project management, " +"etc..." +msgstr "" + +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 +msgid "Web design" +msgstr "" + +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 +msgid "Cartoon emoticons" +msgstr "" + +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 +msgid "Default sound theme" +msgstr "" + +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 +msgid "KMess icon in Oxygen style" +msgstr "" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 +msgid "Arabic translation, internationalization of file saving fix." +msgstr "" + +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 +msgid "More Arabic translation" +msgstr "" + +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 +msgid "Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 +msgid "Catalan translation" +msgstr "" + +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 +msgid "Simplified Chinese translation, file send bug fix, proxy connect code" +msgstr "" + +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 +msgid "More Simplified Chinese translation" +msgstr "" + +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 +msgid "Traditional Chinese translation" +msgstr "" + +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 +msgid "Danish translation" +msgstr "" + +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 +msgid "More Danish translation" +msgstr "" + +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 +msgid "Dutch translation" +msgstr "" + +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 +msgid "More Dutch translation" +msgstr "" + +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +msgid "More Greek translation" +msgstr "" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 +msgid "Estonian translation" +msgstr "" + +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 +msgid "Finnish translation" +msgstr "" + +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 +msgid "More Finnish translation" +msgstr "" + +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 +msgid "French translation" +msgstr "" + +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 +msgid "More French translation" +msgstr "" + +#: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 +msgid "Hungarian translation" +msgstr "" + +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "" + +#: main.cpp:115 main.cpp:116 +msgid "More Italian translation" +msgstr "" + +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 +msgid "Korean translation" +msgstr "" + +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 +msgid "Norsk Bokmål translation" +msgstr "" + +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +msgid "Serbian translation" +msgstr "" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 +msgid "Slovenian translation" +msgstr "" + +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 +msgid "Spanish translation" +msgstr "" + +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 +msgid "More Spanish translation" +msgstr "" + +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "" + +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "" + +#: main.cpp:133 +msgid "More Swedish translation" +msgstr "" + +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:135 +msgid "Thai translation" +msgstr "" + +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "" + +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "" + +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" +msgstr "" + +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +msgid "File transfer thumbnails" +msgstr "" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "&Čet stil:" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 +msgid "Various internationalization fixes." +msgstr "" + +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 +msgid "GnomeMeeting developer" +msgstr "" + +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 +msgid "Guy with a bag over his head" +msgstr "" + +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 +msgid "Inspiration and assorted code" +msgstr "" + +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 +msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgstr "" + +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 +msgid "Idle timer code" +msgstr "" + +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 +msgid "Close-to-tray icon screenshot code" +msgstr "" + +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 +msgid "Custom crash handler implementation" +msgstr "" + +#: main.cpp:168 +msgid "Your name here?" +msgstr "" + +#: main.cpp:168 +msgid "" +"You are welcome to send bugfixes and patches to the KMess help forums!\n" +"If you feel your name is missing here, please contact us too!" +msgstr "" + +#: main.cpp:171 +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Vaše ime" + +#: main.cpp:172 +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your emails" +msgstr "Vaš email" + +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 +msgid "Autologin with the given email address" +msgstr "Automatsko prijvljivanje sa ovom email adresom?" + +#: main.cpp:184 +msgid "Run a debug test (developer build only)" +msgstr "" + +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Dozvoljen" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Obrisan" + +#: network/applications/application.cpp:294 +msgid "The contact cancelled the session." +msgstr "Kontakt je otkazao sesiju." + +#: network/applications/application.cpp:306 +msgid "The contact rejected the invitation." +msgstr "Kontakt je odbio poziv." + +#: network/applications/application.cpp:378 +msgid "You have cancelled the session." +msgstr "Vi ste otkazali sesiju." + +#: network/applications/application.cpp:390 +msgid "You have rejected the invitation." +msgstr "Vi ste odbili poziv." + +#: network/applications/application.cpp:540 +msgid "Do you want to
accept or cancel?" +msgstr "Zelite da prihvatite ili odbijete?" + +#: network/applications/application.cpp:581 +msgid "Click to cancel." +msgstr "Da prekinete klikniteovde." + +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "Kontakt želi da Vam pošalje fajl: "%1" (%2)." + +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Fajl "%1" već postoji\n" +"da li želite da ga prebrišete?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "Prenos fajla "%1" nije uspeo. Fajl ne može biti sačuvan." + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "Prenos fajla %1 nije uspeo. Ne mogu da se povežem na udaljeni računar." + +#: network/applications/filetransfer.cpp:319 +msgid "Transfer accepted." +msgstr "Prenos prihvaćen." + +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 +msgid "Connecting to %1, port %2" +msgstr "Povezujem se na %1, port %2" + +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakt je otkazao prenos fajla "%1"." + +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "Vi ste otkazali prenos fajla "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "Odbili ste prenos fajla "%1"." + +#: network/applications/filetransfer.cpp:490 +msgid "Connection established" +msgstr "Veza uspostavljena" + +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "Fajl uspešno poslat "%1". " + +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "Fajl uspešno primljen "%1"." + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." +msgstr "Prenos fajla "%1" neuspešan. Fajl ne postoji." + +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "Prenos fajla "%1" neuspešan. Nije moguće čitanje fajla." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Slanje fajla "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Kontakt je prihvatio da preuzme fajl "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 +msgid "Negotiating options to connect" +msgstr "" + +#: network/applications/filetransferp2p.cpp:129 +#: network/applications/filetransferp2p.cpp:143 +#: network/applications/filetransferp2p.cpp:160 +#: network/extra/msnftpconnection.cpp:132 +msgid "The file transfer invitation was cancelled. Bad data was received." +msgstr "Prenos fajla otkazan. Pogrešan podatak primljen." + +#: network/applications/filetransferp2p.cpp:404 +msgid "You have accepted the transfer of file "%1"." +msgstr "Prihvatili ste prenos fajla "%1"." + +#: network/applications/filetransferp2p.cpp:615 +msgid "File could not be written" +msgstr "Fajl nije moguće zapisati" + +#: network/applications/gnomemeeting.cpp:56 +msgid "You are invited to start a meeting (using GnomeMeeting)." +msgstr "Pozvani ste da se priključite sastanku (korišćenjem GnomeMeeting)." + +#: network/applications/gnomemeeting.cpp:118 +msgid "Starting GnomeMeeting. Connecting to %1." +msgstr "Priključivanje GnomeMeeting. Povezivanje sa %1. " + +#: network/applications/gnomemeeting.cpp:161 +msgid "Inviting the contact to a meeting." +msgstr "Pozovite kontakt na čet sa kamericom." + +#: network/applications/mimeapplication.cpp:154 +msgid "The invitation was rejected. It's not supported by the other client." +msgstr "" +"Poziv je odbijen. Klijent na drugoj strani nije u mogućnosti da prihvati." + +#: network/applications/mimeapplication.cpp:164 +msgid "The invitation was aborted. An internal error occured." +msgstr "Poziv je otkazan. Došlo je do greške." + +#: network/applications/mimeapplication.cpp:170 +msgid "The invitation was aborted. Timeout while waiting for user to accept." +msgstr "Poziv je otkazan. Isteklo je vreme predviđeno da korisnik prihvati." + +#: network/applications/mimeapplication.cpp:175 +msgid "The invitation was aborted. Timeout while waiting for file data." +msgstr "Poziv je otkazan. Isteklo je vreme predviđeno za primanje podatka." + +#: network/applications/mimeapplication.cpp:180 +msgid "" +"The invitation was aborted. The switchboard closed the chat connection." +msgstr "Poziv je otkazan. Promena table je zatvorila čet vezu." + +#: network/applications/mimeapplication.cpp:186 +msgid "The invitation was aborted." +msgstr "Poziv je otkazan." + +#: network/applications/msnremotedesktop.cpp:52 +msgid "You are invited to share this person's desktop." +msgstr "Pozvaniste da podelelite kontaktov desktop." + +#: network/applications/msnremotedesktop.cpp:159 +msgid "Starting KRDC. Connecting to %1." +msgstr "KRDC se startuje. Povezivanje sa %1." + +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "" +"Kontakt je posalo pozivnicu za MSN6 osobine. KMess ih ne može prikazati." + +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 +msgid "" +"The invitation was cancelled. The contact sent bad data, or KMess doesn't " +"support it." +msgstr "" +"Poziv je obustavljen. Kontakt je poslao neispravan podatak ili nepoznat za " +"KMess." + +#: network/applications/p2papplication.cpp:1084 +msgid "The transfer failed. Data preparation failed." +msgstr "Prenos neuspešan. Pripremanje podataka neuspešno." + +#: network/applications/p2papplication.cpp:1191 +msgid "The invitation was cancelled. Message was not directed to us." +msgstr "Poziv je otkazan. Poruka nije poslata k Vama." + +#: network/applications/p2papplication.cpp:1743 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Transfer nije uspeo. Kontakt je poslao loš podatak ili ga KMess ne podržava." + +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakt je odbio poziv. Došlo je do greške." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 +msgid "Awaiting connection at %1, port %2" +msgstr "Čeka se konekcija na %1, port %2" + +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 +msgid "Reverting to indirect file transfer (this could be slow)." +msgstr "Prelazak na indirektan transfer (ovo može biti sporije)." + +#: network/applications/p2papplication.cpp:3166 +msgid "Waiting for connection" +msgstr "Čeka se konekcija" + +#: network/applications/p2papplication.cpp:3420 +msgid "" +"The invitation was cancelled. A timeout occured waiting for the contact to " +"accept." +msgstr "Poziv je otkazan. Vreme predviđeno da kontakt prihvati poziv isteklo." + +#: network/applications/p2papplication.cpp:3429 +msgid "" +"The invitation was cancelled. A timeout occured waiting for a connection to " +"succeed or fail." +msgstr "Poziv je otkazan. Vreme predviđeno za uspostavljanje veze je isteklo." + +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 +msgid "The invitation was cancelled. A timeout occured waiting for data." +msgstr "Poziv je otkazan. Isteklo je vreme za početak prenosa podataka." + +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Transfer nije uspeo." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Transfer nije uspeo. Kontakt je poslao loš podatak ili ga KMess ne podržava." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Transfer nije uspeo. Korisnik nije prihvatio poziv." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Transfer nije uspeo. Došlo je do greške." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "Transfer nije uspeo. Veza nije ostvarena." + +#: network/applications/voiceconversation.cpp:71 +msgid "You are invited to start a voice conversation." +msgstr "Pozvani ste da učestvujete u glasovnoj konverzaciji." + +#: network/applications/voiceconversation.cpp:76 +msgid "" +"You are invited to start a voice conversation but support for this was not " +"installed" +msgstr "" +"Pozvani ste da učestvujete u glasovnoj konverzaciji ali podrška za za " +"glasovnu komunikaciju nije instalirana" + +#: network/applications/voiceconversation.cpp:168 +msgid "You have cancelled the voice conversation." +msgstr "Odbili ste glasovnu konverzaciju." + +#: network/applications/voiceconversation.cpp:205 +msgid "The invitation was cancelled. The audio device couldn't be opened." +msgstr "Poziv je otkazan.Vaš audio uređaj ne odgovara." + +#: network/applications/voiceconversation.cpp:218 +msgid "Start voice conversation. Connecting to %1." +msgstr "Početak glasovne konverzacije. Uspostavljam vezu sa %1." + +#: network/applications/voiceconversation.cpp:224 +msgid "Start voice conversation. Listening on %1." +msgstr "Početak glasovne konverzacije. Slušam na %1." + +#: network/applications/voiceconversation.cpp:289 +msgid "Inviting the contact to a voice conversation." +msgstr "Pridružite kontakt glasovnoj konverzaciji." + +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 +msgid "The contact is inviting you for '%1', but this is not implemented yet." +msgstr "Kontakt vas poziva na %1', ali ovo opcija još uvek nije uvedena." + +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Poziv je otkazan. Primljen je loš podatak." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "Korisnik zeli video razgovor sa vama." + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "Pozvani ste da učestvujete u video razgovoru." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "kamerica" + +#: network/extra/msnftpconnection.cpp:133 +msgid "Failed" +msgstr "Neuspešno" + +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Šaljem %1 fajl" + +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "Transfer %1 fajla nije uspeo. Ne mogu da otvorim port." + +#: network/extra/msnftpconnection.cpp:399 +msgid "Couldn't open a local port." +msgstr "Ne mogu da otvorim port." + +#: network/extra/msnftpconnection.cpp:456 +msgid "Initiating file transfer" +msgstr "Fajl se šalje" + +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "Transfer nije uspeo." + +#: network/extra/msnftpconnection.cpp:470 +msgid "Unable to make a connection." +msgstr "Ne mogu da ostvarim vezu." + +#: network/extra/msnftpconnection.cpp:574 +msgid "Receiving file %1" +msgstr "Primam %1 fajl" + +#: network/msnconnection.cpp:385 +msgid "Invalid command syntax" +msgstr "Pogrešna komanda" + +#: network/msnconnection.cpp:389 +msgid "Invalid command parameter" +msgstr "Pogrešan parametar komande" + +#: network/msnconnection.cpp:392 +msgid "The email you have tried to add is not a MSN Messenger account" +msgstr "Email koji pokušavate da dodate nije MSN Messenger nalog" + +#: network/msnconnection.cpp:397 +msgid "Domain name missing" +msgstr "Ime domena nedostaje" + +#: network/msnconnection.cpp:401 +msgid "Already logged in" +msgstr "Već ste ulogovani" + +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" +msgstr "Adresa naloga je nepostojeća" + +#: network/msnconnection.cpp:408 +msgid "" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" +msgstr "Nalog je nepostojeći ili Vaš Passport nalog nije potvrđen još uvek" + +#: network/msnconnection.cpp:411 +msgid "Your contact list is full" +msgstr "Vaša kontakt lista je puna" + +#: network/msnconnection.cpp:416 +msgid "Invalid SBP parameter" +msgstr "Pogrešan SBP parametar" + +#: network/msnconnection.cpp:419 +msgid "This contact is already on your list" +msgstr "Ovaj kontakt već postoji u Vašoj listi" + +#: network/msnconnection.cpp:423 +msgid "This contact is not on your list" +msgstr "Ovaj kontakt nije na Vašoj listi" + +#: network/msnconnection.cpp:427 +msgid "This contact is not online" +msgstr "Kontakt nije na vezi" + +#: network/msnconnection.cpp:432 +msgid "Already in this mode" +msgstr "Već koristite ovaj mod" + +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "Kontakt ne može biti na dozvoljenoj i blokiranoj listi." + +#: network/msnconnection.cpp:440 +msgid "" +"The group name is already added to your Messenger or Hotmail contact list. " +"Please use a different name." +msgstr "" +"Ime grupe već postoji na Vašem Messenger ili Hotmail kontakt listi. " +"Koristite drugo ime." + +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "" +"Vaša kontakt lista ima previše grupa; Vi možete da imate najviše 30 grupa." + +#: network/msnconnection.cpp:448 +msgid "This group can't be changed" +msgstr "Ova grupa ne dozvoljava promene" + +#: network/msnconnection.cpp:453 +msgid "Contact is not added to this group" +msgstr "Kontakt nije u ovoj grupi" + +#: network/msnconnection.cpp:457 +msgid "This group is not empty" +msgstr "Ova grupa sadrzi kontakte" + +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "Ime grupe je predugačko; ono ne može biti duže od 61. bajta." + +#: network/msnconnection.cpp:466 +msgid "Attempted to change group \"0\"" +msgstr "Pokušavam da promenim grupu \"0\"" + +#: network/msnconnection.cpp:466 +msgid "There was an internal error in KMess: %1" +msgstr "Došlo je do greške u radu KMess-a: %1" + +#: network/msnconnection.cpp:470 +msgid "Invalid Group" +msgstr "Pogrešna grupa" + +#: network/msnconnection.cpp:474 +msgid "Empty domain" +msgstr "Bez domena" + +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "Pogrešna ADL komandni format" + +#: network/msnconnection.cpp:481 +msgid "Switchboard server failed" +msgstr "Neuspešno menjanje servera" + +#: network/msnconnection.cpp:484 +msgid "Transfer to switchboard server failed" +msgstr "Transfer do servera neuspešan" + +#: network/msnconnection.cpp:488 +msgid "Direct connection (MSNSLP) error, connection failed" +msgstr "Direktna veza (MSNSLP) nije uspela" + +#: network/msnconnection.cpp:492 +msgid "Required field missing" +msgstr "Popunite označena polja" + +#: network/msnconnection.cpp:496 +msgid "Not logged in" +msgstr "Niste na vezi" + +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "Ovom nalugu je odbijen pristup na MSN sevisu." + +#: network/msnconnection.cpp:505 +msgid "Command is disabled" +msgstr "Komanda je isključena" + +#: network/msnconnection.cpp:508 +msgid "Your account is banned." +msgstr "Vaš nalog je blokiran." + +#: network/msnconnection.cpp:512 +msgid "Challenge response failed" +msgstr "" + +#: network/msnconnection.cpp:517 +msgid "Bad command data" +msgstr "Pogrešni podaci komande" + +#: network/msnconnection.cpp:521 +msgid "You are opening chat sessions too fast" +msgstr "Previše brzo otvarate čet sesije" + +#: network/msnconnection.cpp:525 +msgid "You have too many open chat sessions" +msgstr "Imate previše otvorenih čet sesija" + +#: network/msnconnection.cpp:532 +msgid "Unexpected command sequence" +msgstr "Komanda nije odgovarajuća" + +#: network/msnconnection.cpp:536 +msgid "Bad friend name" +msgstr "Loše ime prijatelja" + +#: network/msnconnection.cpp:542 +msgid "Bad CVR data" +msgstr "Loš CVR podatak" + +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" +msgstr "Server je obavestio KMess da šalje previše podataka" + +#: network/msnconnection.cpp:555 +msgid "Authentication ticket was incorrect" +msgstr "Identifikaciona karta je nevažeća" + +#: network/msnconnection.cpp:558 +msgid "You can't start a chat with someone while you are invisible." +msgstr "Ne možete započeti čet sa nekim dok ste nevidljivi." + +#: network/msnconnection.cpp:562 +msgid "Not accepting new contacts" +msgstr "Ne prihvatam nove kontakte" + +#: network/msnconnection.cpp:566 +msgid "" +"You have a Kids Passport account, you need parental consent to chat online." +msgstr "Vi imate Kids Passport nalog, trebate dozvolu da biste četovali." + +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." +msgstr "Vas Passport nalog trebate da potvrdite prvo." + +#: network/msnconnection.cpp:573 +msgid "Bad USR ticket" +msgstr "Loša USR karta" + +#: network/msnconnection.cpp:583 +msgid "Error accessing contact list, try again later" +msgstr "Greška prilikom pribavljanja kontakt liste, probajte ponovo kasnije" + +#: network/msnconnection.cpp:592 +msgid "" +"The MSN service is temporarily unavailable, there was an internal server " +"error." +msgstr "MSN servis je trenutno nedostupan, postoji neka greška u radu servera." + +#: network/msnconnection.cpp:603 +msgid "The MSN service is temporarily unavailable, the server is too busy" +msgstr "MSN servis je trenutno nedostupan, server je prezauzet." + +#: network/msnconnection.cpp:607 +msgid "Peer notification server down" +msgstr "Server trenutno nije aktivan" + +#: network/msnconnection.cpp:611 +msgid "The server is going down" +msgstr "Server prelazi u neaktivno stanje" + +#: network/msnconnection.cpp:615 +msgid "The server is going down soon" +msgstr "Server prelazi u neaktivno stanje uskoro" + +#: network/msnconnection.cpp:620 +msgid "Write is blocking" +msgstr "Pisanje je zabranjeno" + +#: network/msnconnection.cpp:624 +msgid "Session is overloaded" +msgstr "Sesija je prepunjena" + +#: network/msnconnection.cpp:631 +msgid "The server is not available" +msgstr "Server nije dostupan" + +#: network/msnconnection.cpp:635 +msgid "Authentication failed" +msgstr "Identifikacija neuspešna" + +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "Nepoznata greska je primljena sa servera: %1
Tehnički detalji: %2" + +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +#, fuzzy +msgctxt "Error dialog box title" +msgid "MSN Error" +msgstr "MSN greška" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "Pokušavam preko HTTP fallback..." + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Identifikacija..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "Identifikovan" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Prelazim na drugi server..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Povezivanje..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "Nepoznata komanda primljena sa servera: %1" + +#: network/msnnotificationconnection.cpp:2109 +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "%1 minut" +msgstr[1] "%1 minuta" + +#: network/msnnotificationconnection.cpp:2112 +msgid "Server closes for maintenance in %1!" +msgstr "Server prelazi u neaktivno stanje za %1!" + +#: network/msnnotificationconnection.cpp:2117 +msgctxt "Server maintenance dialog box text" +msgid "The MSN Server will be going down in %1 for maintenance." +msgstr "MSN Server prelazi u neaktivno stanje zbog odrzavanja za %1!" + +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "SOAP klijent više nije ispravan." + +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess ne može proslediti Offline-IM poruke.
Detalji: %1" + +#: network/msnnotificationconnection.cpp:2589 +msgid "Authentication time limit exceeded" +msgstr "Vreme za identifikaciju je isteklo" + +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Čekanje na spisak prijatelja...." + +#: network/msnnotificationconnection.cpp:2805 +#, fuzzy +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

MSN poruka

%1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 +msgid "
Internal error reason: %1" +msgstr "
Interna greška, opis: %1" + +#: network/msnnotificationconnection.cpp:2916 +#, fuzzy +msgctxt "Connection error: dialog box" +msgid "" +"

Authentication has failed, please verify your account email and password." +"

" +msgstr "

Identifikacija nije uspela, proverite Vaš nalog i lozinku.

" + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2932 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"

Upravo ste odjavljeni!

Povezani ste na ovaj nalog preko nekog " +"drugog Messanger klijenta, ili sa neke druge lokacije.

" + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

KMess ne može da se poveže sa MSN Messenger serverom.
Postoji problem " +"sa vašom Internet vezom ili su MSN Messenger serveri trenutno nedostupni.%1

Videti MSN Messenger Service statusnu stranu?

" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

KMess ne može da se poveže sa MSN Messenger serverom.
Postoji problem " +"sa vašom Internet vezom ili su MSN Messenger serveri trenutno nedostupni.%1

Videti MSN Messenger Service statusnu stranu?

" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +#, fuzzy +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

MSN poruka

%1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

Veza sa MSN serverom je prekinuta.%1

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1 (Interna greška, opis: %2)" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 +msgid "Connection time limit exceeded" +msgstr "Vreme predviđeno za povezivanje je isteklo" + +#: network/msnsockettcp.cpp:375 +msgid "1 ping lost" +msgstr "1 ping se nije vratio" + +#: network/msnsockettcp.cpp:379 +msgid "%1 pings lost" +msgstr "%1 pinga se nisu vratila" + +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "Veza sa serverom je prekinuta" + +#: network/soap/addressbookservice.cpp:777 +#, fuzzy +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "Email koji pokušavate da dodate nije MSN Messenger nalog" + +#: network/soap/addressbookservice.cpp:787 +#, fuzzy +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "Email koji pokušavate da dodate nije MSN Messenger nalog" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Server nije dostupan" + +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:521 +#, fuzzy +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Server nije dostupan" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +#, fuzzy +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Neočekivan tip odgovora" + +#: notification/chatnotification.cpp:154 +msgid "In %1's chat:
%2" +msgstr "U %1's četova:
%2" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "%1 kaže:
'%2'" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"%1 vam je poslao poruku dok niste bili na mreži:
'%2'" + +#: notification/chatnotification.cpp:169 +msgid "%1's chat requests attention!" +msgstr "%1's zahteva Vašu pažnju!" + +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "" + +#: notification/chatnotification.cpp:181 +msgid "%1 has sent you a handwritten message!" +msgstr "%1 Vam je poslao poruku pisanu rukom!" + +#: notification/chatnotification.cpp:185 +msgid "%1 has sent you a nudge!" +msgstr "%1 Vam je poslao nudge!" + +#: notification/chatnotification.cpp:189 +msgid "%1 has sent you a wink!" +msgstr "%1 Vam je poslao namig!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 želi da koristi kamericu!" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 Vam šalje fajl!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 Vas poziva u grupni čet!" + +#: notification/chatnotification.cpp:204 +msgid "%1 has canceled the webcam session!" +msgstr "%1 je prekinuo video čet!" + +#: notification/chatnotification.cpp:205 +msgid "%1 has canceled the file transfer!" +msgstr "%1 je prekinuo slanje fajla!" + +#: notification/chatnotification.cpp:206 +msgid "%1's activity has been canceled!" +msgstr "%1više nije aktivan!" + +#: notification/chatnotification.cpp:213 +msgid "%1 has accepted to use the webcam!" +msgstr "%1 je prihvatio da koristi kamericu!" + +#: notification/chatnotification.cpp:214 +msgid "%1 has accepted the file transfer!" +msgstr "%1 je prihvatio prenos fajla!" + +#: notification/chatnotification.cpp:215 +msgid "%1 has accepted your invitation!" +msgstr "%1 je prihvatio Vaš poziv!" + +#: notification/chatnotification.cpp:222 +msgid "%1 has ended the webcam session!" +msgstr "%1 je prekinuo video čet!" + +#: notification/chatnotification.cpp:223 +msgid "The file transfer with %1 is done!" +msgstr "Transfer fajla sa %1 je završen!" + +#: notification/chatnotification.cpp:224 +msgid "%1's activity has ended!" +msgstr "%1biše nije aktivan!" + +#: notification/chatnotification.cpp:231 +msgid "%1's webcam session has failed!" +msgstr "%1nije uspeo da aktivira čet sa kamericom!" + +#: notification/chatnotification.cpp:232 +msgid "The file transfer with %1 has failed!" +msgstr "Transfer fajla sa %1 nije uspeo!" + +#: notification/chatnotification.cpp:233 +msgid "%1's activity has ended with an error!" +msgstr "%1je prekinuo aktovnost, zbog pojave greške!" + +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
je na vezi" + +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
je promenio status u odsutan" + +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
je promenio status u vracam se odmah" + +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
je promenio status u zauzet" + +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
je postao nevidljiv" + +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
je postao zaludan" + +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
se isključio sa mreže" + +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
trenutno razgovara telefonom" + +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
je otišao da ruča" + +#: notification/newemailnotification.cpp:90 +#, fuzzy +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Novi email:
'%1'
od '%2'" + +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Započet čet" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "Ostavi poruku" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Pogledaj poruku" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Pošalji email" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "Sakri" + +#: notification/systemtraywidget.cpp:78 +#, fuzzy +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Zatvaranjem glavnog prozora KMess će ostati pokrenut u sistemskoj traci. " +"Koristite opciju 'Izlaz' iz Fajl menija da bi ste zatvorili program." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Ikonica u sistemskoj traci" + +#: notification/systemtraywidget.cpp:240 +#, fuzzy +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "Grupa %1" + +#: notification/systemtraywidget.cpp:246 +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Pronađi..." + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." +msgstr "Pronađi i izseci sliku..." + +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "Postavi prethodnu sliku..." + +#: settings/accountpage.cpp:493 +msgid "Downloading of display picture failed" +msgstr "Preuzimanje slike kontakta nije uspelo" + +#: settings/accountpage.cpp:552 +msgid "" +"An error occurred when trying to change the display picture.\n" +"Make sure that you have selected an existing picture file." +msgstr "" +"Došlo je do greške prilikom pokušaja promene slike.\n" +"Budite sigurni da ste odabrali postojeći fajl slike." + +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 +msgid "Settings" +msgstr "Podešavanja" + +#: settings/accountsettingsdialog.cpp:78 +msgid "Account" +msgstr "Nalog" + +#: settings/accountsettingsdialog.cpp:79 +msgid "My Account" +msgstr "Moj nalog" + +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +#, fuzzy +msgid "Contact List" +msgstr "Kontakti" + +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 +msgid "Chatting" +msgstr "Četovanje" + +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 +msgid "Chat Logging" +msgstr "Čet logovi" + +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 +msgid "" +"The email address you have entered is not valid, and cannot be used as an " +"account: '%1'" +msgstr "" +"Email adresa koju ste naveli nije važeća i kao takva ne može da se koristi " +"kao nalog: '%1'" + +#: settings/accountsettingsdialog.cpp:214 +msgid "The email address you have entered is already in use: '%1'" +msgstr "Email adresa koju ste naveli se već koristi: '%1'" + +#: settings/accountsettingsdialog.cpp:294 +msgid "Are you sure you want to delete this account?" +msgstr "Sigurno želite da obrišete ovaj nalog?" + +#: settings/accountsmanagerpage.cpp:160 +#, fuzzy +msgid "" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Sigurno želite da obrišete '%1' nalog?
Sva podešavanja vezana za ovaj " +"nalog će biti poništena." + +#: settings/chatstylepage.cpp:378 +msgid "Hi, how are you doing? :)" +msgstr "Ćao, kako si danas? :)" + +#: settings/chatstylepage.cpp:379 +msgid "Stacy" +msgstr "Zoran:" + +#: settings/chatstylepage.cpp:380 +msgid "Great!" +msgstr "Odlično!" + +#: settings/chatstylepage.cpp:382 +msgid "I /just/ got back from my vacation in Italy!" +msgstr "/Samo/ što sam se vratio sa odmora iz Italije!" + +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "" + +#: settings/emoticonspage.cpp:119 +#, fuzzy +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "Pogrešan parametar komande" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Zameni već postojeći smešak" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Sigurno želite da obrišete ovaj nalog?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Izmeniti smešak" + +#: settings/globalsettingsdialog.cpp:46 +msgid "KMess Settings" +msgstr "KMess podešavanja" + +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 +msgid "Accounts" +msgstr "Nalozi" + +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "Obaveštenja" + +#: settings/miscellaneouspage.cpp:74 +msgid "No selectable browsers detected." +msgstr "Nijedan veb pregledač nije pronađen." + +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "Ni jedan email klijent nije pronađen." + +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" +msgstr "" +"Potrebno je da navedete konzolnu komandu za pokretanje prilagođenog veb " +"čitača!" + +#: settings/miscellaneouspage.cpp:291 +#, c-format +msgid "" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" +msgstr "" +"Konzolna komanda koju ste uneli za pokretanje veb pregledača nema " +"parametar '%u'. Bez ovog parametra otvaranje veb adresa neće raditi.
" +"Želite li da ga KMess doda za Vas?" + +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" +msgstr "" +"Potrebno je da navedete konzolnu komandu za pokretanje prilagođenog email " +"klijenta!" + +#: settings/miscellaneouspage.cpp:321 +#, c-format +msgid "" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" +msgstr "" +"Konzolna komanda koju ste uneli za pokretanje email klijneta nema " +"parametar '%u'. Bez ovog parametra pisanje novih emailova neće raditi.
" +"Želite li da ga KMess doda za Vas?" + +#: settings/miscellaneouspage.cpp:344 +msgid "You have to select a directory for the received files!" +msgstr "" +"Potrebno je da odredite direktorijum u kome će se čuvati fajlovi koji Vam " +"šalju prijatelji!" + +#: settings/miscellaneouspage.cpp:406 +msgid "Select Files Directory" +msgstr "Odaberi direktorijum za fajlove" + +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "&Pošaljite komentar programerima" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "Dobrodošli u novu test verziju KMess %1." + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "Dobrodošli u %1." + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" +"Svakog puta kada imate dobro ili loše iskustvo, kliknite na odgovarajuće " +"lice ispod naziva prozora, to opisuje šta Vam se dopada, a šta ne. Zatim " +"kliknite na dugme Pošalji." + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" +"Svakog puta kada imate prijatno iskustvo kliknite na nasmejano lice ispod " +"naziva prozora, to opisuje šta Vam se dopada. Zatim kliknite na Pošalji." + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" +"Svakog puta kada imate neprijatno iskustvo kliknite na tužno lice ispod " +"naziva prozora, to opisuje šta Vam se ne dopada. Zatim kliknite na Pošalji." + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" +"Ukoliko imate neko neprijatno iskustvo sa programom, kliknite na slomljen " +"objekat u gornjem desnom uglu prozora, opišite ga i kliknite na dugme Pošalji" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "Dopada mi se novi slikovni prikaz. Dosta osvežava." + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "Ne dopada mi se strana dobrodošlice. Oduzima previše vremena." + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" +"Aplikacija sadrži grešku kada kliknem na dugme Dodaj. Ništa se ne " +"dešava." + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "Dodao sam nove mogućnosti dozvoli mi da pošaljem email." + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "Pomognite nam da poboljšamo KMess, Vaši komentari su nam važni." + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "Primer" +msgstr[1] "Primeri" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "Pomognite da unapredimo KMess" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "Pošaljite komentar programerima" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Molimo Vas, pišite nam na %1 (možda želite da koristite " +"onjaln alat za prevođenje poruke).
" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" +"Molimo Vas, pišite nam na %1 ili %2 (možda želite da koristite onjaln alat za prevođenje poruke).
" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" +"Komentare koje nam šaljete u vidu poboljšanja KMessa, pokušajte da šaljete " +"istu količinu negativnih i pozitivnih komentara.
" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" +"Molimo vas ne pitajte za dodavanje nove opcije: ovakvi zahtevi biće " +"ignorisani.
" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" +"

Možete dostaviti programerima kraći opis Vaše mišljenje o %1.
%2 %3%" +"4

" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"Email adresa koju ste naveli nije važeća i kao takva ne može se koristiti: '%" +"1' " + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" +"

Vaš komentar je uspešno poslat. On će nam pomoći da unapredimo aplikaciju!" +"

Hvala Vam na izdvojenom vremenu.

" + +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Komentar je poslat" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" +"

Došlo je do greške prilikom pokušaja slanja komentara.

Molimo Vas, " +"probajte ponovo kasnije.

" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "Greška prilikom slanja komentara" + +#, fuzzy +#~ msgid "Conversations Filter" +#~ msgstr "Čet je započet u: %2" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Izaberite nalog koji želite da izmenite, zatim kliknite ovde" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Nudge za %1 ne može biti poslat." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "Namig za %1 ne može biti poslat." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Crtež za %1 ne može biti poslat." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Poruka '%1' za %2 ne može biti poslata." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Koristi" + +#~ msgid "&Copy..." +#~ msgstr "&Kopiraj" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Dodaj nov" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "Email adresa: %1" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Klijent: %1" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Blokirani" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Poslednju put viđen: %1" + +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Poslednja poruka: %1" + +#~ msgid "Contact List Alerts" +#~ msgstr "Dogadjaji za kontakt listu" + +#~ msgid "&Show winks from contacts" +#~ msgstr "&Prikaži namige od kontakta" + +#~ msgid "Enable in the contact list" +#~ msgstr "Omogućiti ih u kontakt listi" + +#~ msgid "Enable in the chat windows" +#~ msgstr "Omogućiti ih u čet prozorima" + +#~ msgid "Alerts" +#~ msgstr "Upozorenja" + +#~ msgid "Alerts and Notifications" +#~ msgstr "Upozorenja i obaveštenja" + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "Možete izabrati grupu za kontakt" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Bez grupe" + +#~ msgid "Now listening to: %1" +#~ msgstr "Trenutno slušam: %1" + +#~ msgid "&Listening Music" +#~ msgstr "&Slušanje muzike" + +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "KMess se ne može povezati sa udaljenim serverom.
Deteljnije: %1" + +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "Identifikacija neuspešna. KMess ne može proslediti Passport korisničko " +#~ "ime.
Detalji: %1" + +#~ msgid "SOAP connection error: %1" +#~ msgstr "SOAP greška: %1" + +#~ msgid "Close all tabs" +#~ msgstr "Zatvori sve jezičke" + +#~ msgid "&Send email" +#~ msgstr "Pošalji email" + +#~ msgid "Save complete" +#~ msgstr "Čuvanje završeno" + +#~ msgid "C&lose all tabs" +#~ msgstr "Zatvori sve jezičke" + +#~ msgid "Connect" +#~ msgstr "Poveži se" + +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: account not found." +#~ msgstr "Povezivanje nije uspelo: nalog ne postoji." + +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: no password has been entered." +#~ msgstr "Povezivanje nije uspelo: lozinka nije ukucana." + +#~ msgid "Rename group" +#~ msgstr "Izmeni naziv grupe" + +#~ msgid "Account &Settings..." +#~ msgstr "Podeša&vanje naloga..." + +#~ msgctxt "Server error dialog box" +#~ msgid "

MSN server message

%1

" +#~ msgstr "

MSN serverska poruka

%1

" + +#~ msgctxt "Server-reported client error dialog box" +#~ msgid "

Internal error in KMess

%1

" +#~ msgstr "

Došlo je do greške pri radu KMess-a

%1

" + +#~ msgid "" +#~ "Error in the fallback Web connection. It is possible you need to " +#~ "authenticate to a proxy server or a web page." +#~ msgstr "Došlo je do greške. Proverite podešavanja proxy servera." diff --git a/po/sv.po b/po/sv.po index e07540e..687ae14 100644 --- a/po/sv.po +++ b/po/sv.po @@ -1,507 +1,841 @@ # sv.po, translation of kmess.po to Swedish # Christian Lundgren , 2005. +# Mattias Newzella , 2009. msgid "" msgstr "" "Project-Id-Version: sv\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2005-07-14 12:08+0200\n" -"Last-Translator: Christian Lundgren \n" -"Language-Team: \n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-01-12 18:58+0100\n" +"Last-Translator: Mattias Newzella \n" +"Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.10.1\n" +"X-Generator: Lokalize 0.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) +#: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Tecknade uttryckssymboler" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "Klicka här för att visa den här kontaktens profil." + +# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Inga meddelanden ännu" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Tecknade uttryckssymboler" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Egna uttry&ckssymboler" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Vinka" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "Klicka här för att visa den här kontaktens profil." # chat/chatviewinterface.cpp:99 rc.cpp:36, no-c-format -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 -#: rc.cpp:3 +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" -msgstr "N&y Rad" +msgstr "N&y rad" # chat/chatviewinterface.cpp:98 rc.cpp:33, no-c-format -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "Sk&icka" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "Kontakter" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Chatta" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Dölj verk&tygsrad" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +#, fuzzy +msgid "Click here to display the menu for this contact" msgstr "Klicka här för att visa den här kontaktens profil." -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +#, fuzzy +msgid "Click here to open your account settings" +msgstr "Klicka här för att byta namn på den valda uttryckssymbolen." + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "Rensa &cache" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "T&ypsnittsfärg" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 #, fuzzy +msgid "Initial groups" +msgstr "Initial grupp" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" -msgstr "Skriv in e-postadressen till den person du vill lägga till:" +msgstr "Ange e-postadressen till personen du vill lägga till i kontaktlistan" -# initialviewinterface.cpp:235 rc.cpp:20, no-c-format -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "E-postadress" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "E-postadress:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 #, fuzzy -msgid "Initial group" -msgstr "Byt &namn på Grupp" +msgid "Enter a shortcut for the emoticon:" +msgstr "Ange genväg för den här uttryckssymbolen:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "Skriv in en genväg för den här uttryckssymbolen:" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "Välj en bildfil:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 -#, fuzzy +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "" -"Skriv in meddelandet som ska skickas automatiskt\n" -" då personer försöker kontakta dig:" +"Ange meddelandet som ska skickas automatiskt då personer försöker kontakta " +"dig." -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 #, fuzzy -msgid "&Automatic away message" -msgstr "Specifiera ett Frånvarandemeddelande" +msgid "&Specify an automatic away message:" +msgstr "&Automatiskt frånvaromeddelande" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "Sök efter kontakt" + +# rc.cpp:127, no-c-format +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Chattloggning" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "Använ&d inte" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" msgstr "" +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +#, fuzzy +msgid "to" +msgstr "Auto" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Starta eller stoppa en &konversation" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +#, fuzzy +msgid "What would you like to do?" +msgstr "Vad vill du göra?" + # dialogs/contactaddeduserdialoginterface.cpp:74 rc.cpp:64, no-c-format -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 #, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "Lägg till den här kont&akten till din \"Vänner\"-lista" +msgid "&Add this person to these groups of my contact list:" +msgstr "Lägga till den här kont&akten i min \"Vänner\"-lista" # dialogs/contactaddeduserdialoginterface.cpp:75 rc.cpp:67, no-c-format -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "" -"I&nte lägga till den här kontakten, men tillåt den att se din anslutna status" +"Inte lägga till den här kontakten, men tillåt den att se min " +"anslutningsstatus" # dialogs/contactaddeduserdialoginterface.cpp:76 rc.cpp:70, no-c-format -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "" -"Blockera den här personen från att kontakta dig och se din onlinestatus." +"&Blockera den här personen från att kontakta mig och se min anslutningsstatus" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "Kontaktegenskaper för %1" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" -msgstr "" +msgstr "&Information" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 #, fuzzy -msgid "Restore" -msgstr "Borttagen" +msgid "Click this button to restore the display picture of this contact" +msgstr "Klicka här för att visa den här kontaktens profil." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 #, fuzzy -msgid "Use alternative name for this person" -msgstr "Använd ett alternativt namn för den här personen" +msgid "&Restore" +msgstr "Återställ" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "" -"Visa poppupp-fönster när den här personen blir ansluten eller frånkopplad" +msgid "&Groups:" +msgstr "Grupp" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" +msgstr "Använd alternativt namn för den här personen" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +#, fuzzy +msgid "Show a &popup when the contact goes online/offline" +msgstr "Visa ett poppupp-fönster när kontakten blir ansluten eller frånkopplad" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "Ljud:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" +msgstr "&Bilder" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Klicka här för att byta namn på den valda uttryckssymbolen." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Visningsbild" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +msgid "&Clear Cache" +msgstr "Rensa &cache" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +#, fuzzy +msgid "&Notes" +msgstr "Anteckningar" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "Uttryckssymbol&er" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 #, fuzzy -msgid "&Clear Cache" -msgstr "Rensa flik" +msgid "Click here to delete the selected emoticon" +msgstr "Klicka här för att byta namn på den valda uttryckssymbolen." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "Ta &bort" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 #, fuzzy -msgid "Notes" -msgstr "Anteckning" +msgid "Available Contacts" +msgstr "Ti&llåt kontakt" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "Kontakten finns inte på din lista" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "Kontakter" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "Ansluter till %1, port %2" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +#, fuzzy +msgid "Format" +msgstr "Get" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "Kontakter" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +#, fuzzy +msgid "Select All" +msgstr "Välj &alla" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +#, fuzzy +msgid "Deselect All" +msgstr "Välj &alla" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "Förvirrad" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Nätverksfönster" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" -msgstr "" +msgstr "Kommando till aktuell flik" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "Kommando:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" -msgstr "" +msgstr "Typ:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "Stjärna" +msgstr "Standard" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" -msgstr "" +msgstr "MIME" # chat/chatviewinterface.cpp:98 rc.cpp:33, no-c-format -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" -msgstr "Sk&icka" +msgstr "Skicka" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" -msgstr "" +msgstr "Öppna" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" +msgstr "Avbryt" + +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 #, fuzzy -msgid "Email address:" -msgstr "E-postadress " +msgid "C&lean Up" +msgstr "R&ensa upp" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "Förvirrad" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Ange e-postadressen till personen du vill lägga till i kontaktlistan" # rc.cpp:17 rc.cpp:273, no-c-format -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 -#, fuzzy +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" -msgstr "Lösenord" +msgstr "Lösenord:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +#, fuzzy +msgid "Status at login:" msgstr "Status vid inloggning" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 #, fuzzy -msgid " Account options " -msgstr "Kontoin&ställningar" +msgid "If enabled, KMess will save your account" +msgstr "Om aktiverat, kommer KMess automatiskt logga in med det här kontot." -# initialviewinterface.cpp:223 rc.cpp:13, no-c-format -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" -msgstr "Kom ihåg den här profilen" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +#, fuzzy +msgid "Remem&ber account" +msgstr "Registrera nytt konto" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +# rc.cpp:17 rc.cpp:273, no-c-format +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "Kom ihåg löseno&rd" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "A&nslut" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Skriv in ditt personliga meddelande här" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 #, fuzzy -msgid "Your Account Information" -msgstr "Kontoin&ställningar" +msgid "New Account" +msgstr "Nytt k&onto" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." -msgstr "Skriv in namnet på andra kontakter ska se när du är ansluten." +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +#, fuzzy +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "A&nslut" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +#, fuzzy +msgctxt "@title:menu" +msgid "&View" +msgstr "&Visa" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Åtgärder" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "Get" + +# settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, +# +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Konto" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "Din kontoinformation" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." +msgstr "Ange namnet som andra kontakter ska se när du är ansluten." # settings/accountswidget.cpp:98 rc.cpp:88, no-c-format -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 -#, fuzzy +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 msgid "&Friendly name:" msgstr "&Visningsnamn:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 -msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" -msgstr "" -"Skriv in e-postadressen för ditt MSN Passport-konto. Du kan registrera ett " -"nytt konto på http://register.passport.com/" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 #, fuzzy -msgid "&Email address:" -msgstr "E-postadress " +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"Ange e-postadressen för ditt MSN Passport-konto. Du kan registrera ett nytt " +"konto på http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 +msgid "&Email address:" +msgstr "&E-postadress:" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -"Skriv in lösenordet för ditt MSN Passport-konto. Du kan registrera ett nytt " +"Ange lösenordet för ditt MSN Passport-konto. Du kan registrera ett nytt " "konto på http://register.passport.com/" # rc.cpp:17 rc.cpp:273, no-c-format -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" -msgstr "Lösenord" +msgstr "&Lösenord:" # rc.cpp:17 rc.cpp:273, no-c-format -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" -msgstr "Lösenord" +msgid "&Remember password" +msgstr "Kom ihåg löseno&rd" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "Visningsbild" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." -msgstr "Ändra..." +msgstr "Ä&ndra..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" -msgstr "" +msgstr "Använ&d inte" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." @@ -512,356 +846,659 @@ msgstr "" "på det här systemet.\n" "\n" "Det är inte rekommenderat att aktivera det alternativet om du använder KMess " -"som en gäst eller om du använder ett offentligt system (så som ett Internet " -"café)." +"som en gäst eller om du använder ett offentligt system (som t ex ett " +"Internetcafé)." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 -#, fuzzy +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "Kom ihåg inställningarna för det här kontot" +msgstr "Ko&m ihåg inställningarna för det här kontot" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." -msgstr "Om aktiverat, kommer KMess automatiskt logga in med det här kontot" +msgstr "Om aktiverat, kommer KMess automatiskt logga in med det här kontot." # settings/accountswidget.cpp:102 rc.cpp:100, no-c-format -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" -msgstr "Logga in med det här konto automatiskt vid start" +msgid "Log in &with this account automatically" +msgstr "L&ogga in med det här kontot automatiskt" # settings/chatloggingwidget.cpp:119 rc.cpp:130, no-c-format -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "Logga &alla chattar" +msgstr "Logg&a in som" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -"Du behöver ett passportkonto för att ansluta till MSN Messenger nätverket. " -"Du kan registrera din nuvarande e-postadress på register.passport.com eller " -"använda ett Hotmail-konto för att ansluta." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 +#, fuzzy msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -"Du kan inte ändra ditt visningsnamn eftersom din passport e-postadress inte " +"Du kan inte ändra ditt visningsnamn eftersom din passport-e-postadress inte " "är verifierad." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "Begär e-postbekräftelse" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 -#, fuzzy +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" -msgstr "Gå till accountservices.passport.net" +msgstr "https://accountservices.passport.net/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "Gå till accountservices.passport.net" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 +#, fuzzy msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"Du behöver ett passportkonto för att ansluta till MSN Messenger-nätverket. " +"Du kan registrera din nuvarande e-postadress på register.passport.com eller " +"använda ett Hotmail-konto för att ansluta." + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +#, fuzzy +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" "För att ansluta till MSN Messenger-tjänsten, behöver du registrera en e-" "postadress som ett Passportkonto." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "Registrera nytt konto" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 -#, fuzzy +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" -msgstr "Gå till register.passport.com" +msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "Gå till register.passport.com" -# settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 #, fuzzy +msgid "&Status Options" +msgstr "Status vid inloggning" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Om aktiverad, kommer din status att ändras automatiskt till \"Frånvarande-" +"Overksam\" om du inte använder datorn på ett par minuter. Om det här " +"alternativet inte finns tillgängligt byggdes KMess utan stöd för den här " +"funktionen." + +# settings/alertswidget.cpp:108 rc.cpp:106, no-c-format +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Ändra status till \"Fr&ånvarande-Overksam\" när overksam" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"Kontrollerar antalet minuter innan KMess ändrar statusen till \"Frånvarande-" +"Overksam\"." + +# settings/alertswidget.cpp:109 rc.cpp:109, no-c-format +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Bli overksam efter" + +# settings/alertswidget.cpp:110 rc.cpp:112, no-c-format +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "minuter" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +#, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "&Dölj meddelanden när min status är Upptagen" + +# settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 msgid "Saved accounts:" -msgstr "Konton" +msgstr "Sparade konton:" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "Klicka" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -"Klicka här för att lägga till en ny egen uttryckssymbol för att skicka till " -"dina kontakter" # settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, -# -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." -msgstr "Konto" +msgid "&Add Account..." +msgstr "L&ägg till konto..." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "Välj en uttryckssymbol och klicka är för att ta bort den" +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" +msgstr "Välj en uttryckssymbol och klicka här för att ta bort den." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" -msgstr "" +msgstr "R&edigera" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 #, fuzzy +msgid "Select an account and click here to delete it" +msgstr "Välj en uttryckssymbol och klicka här för att ta bort den." + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" -msgstr "Borttagen" +msgstr "Ta bo&rt" -# settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Popupnotifikationer" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 -#, fuzzy -msgid "Contact Events" -msgstr "Kontakter" - -# settings/alertswidget.cpp:114 rc.cpp:124, no-c-format -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "Visa notifikationer när dina kontaker:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" msgstr "" -"Om aktiverad, ett popupmeddelande visas när en av dina kontakter ansluter " -"till MSN." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +# rc.cpp:127, no-c-format +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "&Go online" -msgstr "Koppla ifrån" +msgid "Enable chat logging" +msgstr "Chattloggning" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "" -"Om aktiverad, ett popupmeddelande visas när en av dina kontakter startar en " -"konversation med dig." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "Starta en &chatt med dig" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" -"Om aktiverad, ett popupmeddelande visas varje gång en av dina kontakter " -"skickar ett meddelande till dig." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "Skicka ett m&eddelande till dig" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" -"Om aktiverad, ett popupmeddelande visas också när dina kontakter ändrar sin " -"MSN status." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "Ändra deras &status" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" -"Om aktiverad, ett popupmeddelande visas också när en av dina kontakter " -"kopplar ifrån." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "Koppla ifrån" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " msgstr "" -# initialviewinterface.cpp:235 rc.cpp:20, no-c-format -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 #, fuzzy -msgid "Email Events" -msgstr "E-postadress" +msgid "Save chats to file" +msgstr "Spara chatt till &fil" -# settings/emailwidget.cpp:113 rc.cpp:222, no-c-format -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "Visa meddelande när ett e-postmeddelande mottas i \"andra mappar\"" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" -"Om aktiverad, kommer ett popupmeddelande också visas när e-post tas emot i " -"andra mappar. Det här alternativet är bara tillgängligt för Hotmail-konton." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "Kontrollerar antalet sekunder innan popupmeddelanden döljs" +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" -# settings/alertswidget.cpp:112 rc.cpp:118, no-c-format -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Dölj popups efter" - -# settings/alertswidget.cpp:113 rc.cpp:121, no-c-format -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "sekunder" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 #, fuzzy -msgid "Other Alerts" -msgstr "Meddelanden" +msgid "Plain Text" +msgstr "Hitta &text" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 #, fuzzy -msgid "&Show winks from contacts" -msgstr "Visa Frånk&opplade Kontakter" +msgid "Separate logged chats by:" +msgstr "Separera sparade chattar genom:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +# settings/chatloggingwidget.cpp:123 rc.cpp:142, no-c-format +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "År" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +# settings/chatloggingwidget.cpp:126 rc.cpp:151, no-c-format +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Spara direkt i specificerad katalog" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "Välj katalogen i ditt system där du vill spara chattloggar." + +# settings/chatloggingwidget.cpp:120 rc.cpp:133, no-c-format +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "Spara chattfiler i katalog:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "St&il" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"Tillåter dig att ändra temat KMess använder för att visa alla " +"chattmeddelanden." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "&Chattstil:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "Chattinställningar" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Aktiverar synlighet för uttryckssymboler i chattkonversationer." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "Vi&sa uttryckssymboler" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "Visa &uttryckssymboler" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +#, fuzzy +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Det här alternativet aktiverar gruppering av meddelanden från samma kontakt. " +"När kontakten skriver flera meddelanden för att förklara någonting grupperar " +"KMess de meddelandena som ett enda meddelande. Det exakta utseendet beror på " +"den valda chattstilen." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "&Gruppera följ-uppmeddelanden från samma kontakt" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Aktiverar synligheten för tidsstämplar i varje chattmeddelande." + +# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Visa tid i c&hattmeddelanden" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +msgid "Show &date" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +#, fuzzy +msgid "Show s&econds" +msgstr "Vi&sa uttryckssymboler" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "&Text" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" +"Det här teckensnittet och den här färgen används i dina chattmeddelanden." + +# settings/chattingwidget.cpp:185 rc.cpp:157, no-c-format +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "Ditt &meddelandeteckensnitt:" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"Tillåter att åsidosätta teckensnittet och färgen för dina kontakters " +"meddelanden med det valda teckensnittet och den valda färgen nedan." + +# settings/chattingwidget.cpp:188 rc.cpp:162, no-c-format +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "&Tvinga kontakters meddelanden att använda det här teckensnittet:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Kontakthändelser" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +#, fuzzy +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Aktiverar användandet av teckensnittseffekter. Att skriva *fet*, /kursiv/ " +"och _understruken_ gör att de orden kommer visas med fet, kursiv och " +"understruket teckensnittet respektive." + +# settings/chattingwidget.cpp:192 rc.cpp:170, no-c-format +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Använd teckensnittet&effekter i meddelanden, som *fet*, /kursiv/ och " +"_understruken_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +#, fuzzy +msgid "Enable MSN Plus formatting" +msgstr "MSN Plus-formatering" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -872,1614 +1509,1940 @@ msgid "" msgstr "" "

När kontakter vill ha din uppmärksamhet kan de skicka en knuff. Som " "standard skakar chattfönstret när en knuff tas emot eller skickas. " -"Avaktivera det här alternativet om skakeffektern är allt för påträngande.\n" "

När det är alternativet är aktiverat, kommer KMess ändå begränsa " -"skakeffekten.Kontakter kan skicka flera knuffar samtidigt, men KMess skakar " +"skakeffekten. Kontakter kan skicka flera knuffar samtidigt, men KMess skakar " "bara chattfönstret vid den första knuffen.

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" -msgstr "Skaka chattfönstret när en knuff tas emot eller skickas" +msgstr "Skaka chattf&önstret när en knuff tas emot eller skickas" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +# settings/imagewidgetinterface.cpp:104 rc.cpp:228, no-c-format +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Visa inte en visningsbild" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "G&ruppera meddelanden i samma fönster:" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "Alltid" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "För kontakter i samma grupp" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "Aldrig" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Visningsbild:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +#, fuzzy +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" "Om aktiverad, kommer ett popupmeddelande visas när e-post tas emot i din " "inkorg. Antalet olästa e-postmeddelanden visas ovanför kontaktlistan. Det " "här alternativet är bara tillgängligt för Hotmail-konton." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" -msgstr "" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +#, fuzzy +msgid "Display a count of &unread mail" +msgstr "Visa antal olästa e-postbrev" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 +#, fuzzy msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" "Om aktiverat, kommer KMess att informera kontakter om vad du lyssnar på. Den " "här informationen hämtas från den nuvarande aktiva ljudspelarapplikationen." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" -msgstr "Informera kontakter om vilken sång jag lyssnar på." +msgid "Show contacts w&hich song I am listening to" +msgstr "Informera &kontakter om vilken låt jag lyssnar på" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 #, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Om aktiverad, din status kommer att ändras automatiskt till \"Frånvarande-" -"Inaktiv\" när du inte använder datorn på ett par minuter." +msgid "List Formatting" +msgstr "MSN Plus-formatering" -# settings/alertswidget.cpp:108 rc.cpp:106, no-c-format -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Ändra status till \"Frånvarande-Inaktiv\" vid inaktivitet" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"Kontrollerar antalet minuter innan KMess ändrar statusen till \"Frånvarande-" -"Inaktiv\"." - -# settings/alertswidget.cpp:109 rc.cpp:109, no-c-format -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Bli inaktiv efter" - -# settings/alertswidget.cpp:110 rc.cpp:112, no-c-format -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "minuter" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" -"Om aktiverad, kommer chattkonversationer att sparas i en specific katalog." - -# settings/chatloggingwidget.cpp:119 rc.cpp:130, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "Logga &alla chattar" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "Välj katalogen i ditt system där du vill spara chattloggar." - -# settings/chatloggingwidget.cpp:120 rc.cpp:133, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 #, fuzzy -msgid "Save chat files in this directory:" -msgstr "Spara chattfiler i följande katalog:" +msgid "Enable MSN &Plus formatting" +msgstr "MSN Plus-formatering" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" -"KMess skapar automatiskt underkataloger när du väljer att organisera " -"chattkatalogen efter år, månad eller dag." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -# settings/chatloggingwidget.cpp:123 rc.cpp:142, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "År" - -# settings/chatloggingwidget.cpp:124 rc.cpp:145, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Månad" - -# settings/chatloggingwidget.cpp:125 rc.cpp:148, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Dag" - -# settings/chatloggingwidget.cpp:126 rc.cpp:151, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Spara alla chattloggar i följande katalog" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" -"Tillåter dig att ändra temat KMess använder för att visa alla " -"chattmeddelanden." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Chattstil:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Inställningar" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Aktiverar synlighet för uttryckssymboler i chattkonversationer." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "Visa &Uttryckssymboler" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Aktiverar synligheten för tidsstämplar i varje chattmeddelande" - -# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Visa tid i c&hattmeddelanden" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Det här alternativet aktiverar gruppering av meddelanden från samma kontakt. " -"När kontakten skriver flera meddelanden för att förklara någonting grupperar " -"KMess de meddelandena som ett enda meddelande. Det exakta utseendet beror på " -"den valda chattstilen." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "&Gruppera följ-uppmeddelanden från samma kontakt" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Frånvarande" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Din kontaktlista har för många grupper" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Nörd" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "Det här typsnittet och den här färgen används i dina chattmeddelanden." - -# settings/chattingwidget.cpp:185 rc.cpp:157, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "Ditt meddelandetypsnitt:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"Tillåter att åsidosätta typsnittet och färgen för dina kontakters " -"meddelanden med det valda typsnittet och den valda färgen nedan." - -# settings/chattingwidget.cpp:188 rc.cpp:162, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Tvinga kontakters meddelanden att använda det här typsnittet:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Aktiverar användandet av typsnittseffekter. Att skriva *fet*, /kursiv/ och " -"_understruken_ gör att de orden kommer visas med fet, kursiv och " -"understruket typsnitt respektive." - -# settings/chattingwidget.cpp:192 rc.cpp:170, no-c-format -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"Använd typsnitteffekter i meddelanden, dvs. *fet*, /kursiv/ och " -"_understruken_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Väntar på kontaktlista..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" -msgstr "Visa &Uttryckssymbolteman" +msgstr "Visa &uttryckssymbolteman" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" -msgstr "Tillgängliga uttryckssymbolstilar" +msgstr "Tillgängliga uttryckssymbolstilar:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" msgstr "Egna uttry&ckssymboler" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" msgstr "Egna uttryckssymboler för det här kontot:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "Lägg till ny..." - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "Klicka här för att döpa om den valda uttryckssymbolen" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 -msgid "Re&name" -msgstr "Döp om" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "Ta bort" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 #, fuzzy -msgid "Web Browser" -msgstr "Vissen ros" +msgid "Click here to add a new custom emoticon" +msgstr "" +"Klicka här för att lägga till en ny egen uttryckssymbol för att skicka till " +"dina kontakter." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "Lägg till &ny..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +#, fuzzy +msgid "Click here to rename the selected emoticon" +msgstr "Klicka här för att byta namn på den valda uttryckssymbolen." + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 +msgid "Re&name" +msgstr "Byt &namn" + +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 +msgid "Web Browser" +msgstr "Webbläsare" + +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" +"Välj det här alternativet för att använda webbläsaren som används av resten " +"av KDE." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "&Använd KDE:s förvalda webbläsare" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" +"Välj det här alternativet för att välja från en lista över installerade " +"webbläsare." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "A&nvänd en installerad webbläsare:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" +"Välj det här alternativet för att ange sökvägen till din favoritwebbläsare." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "An&ge ett eget kommando:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." -msgstr "" +msgstr "Använd \"%u\" för att infoga URL:en i kommandoraden." # settings/emailwidget.cpp:108 rc.cpp:207, no-c-format -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" msgstr "E-postklient" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +#, fuzzy +msgid "Use &Live Mail if the account supports it" +msgstr "Använd Live Mail om kontot stödjer det" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" +"Välj det här alternativet för att använda e-postklienten som används av " +"resten av KDE." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +#, fuzzy +msgid "Use the &KDE default email client" +msgstr "&Använd KDE:s förvalda e-postklient" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +#, fuzzy +msgid "Use an &installed email client:" +msgstr "A&nvänd en installerad e-postklient:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." -msgstr "" +msgstr "Använd \"%u\" för att infoga e-postadressen i kommandoraden." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "Filöverföringar" # settings/chatloggingwidget.cpp:120 rc.cpp:133, no-c-format -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" -msgstr "Spara chattfiler i följande katalog:" +msgstr "&Spara alla mottagna filer i katalog:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" +msgstr "&Använd portar mellan" + +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 +msgid "and" +msgstr "och" + +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 +msgid "for file transfers" +msgstr "för filöverföringar" + +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "Ditt namn" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 #, fuzzy -msgid "and" -msgstr "Ledsen" +msgid "Your comment is about:" +msgstr "Ditt konto är avstängt." -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 -#, fuzzy -msgid "for file transfers" -msgstr "Filöverföringar" +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Jag är inte vid datorn" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Ditt namn" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "du@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Ta bo&rt" + +#: accountsmanager.cpp:404 +#, fuzzy +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Trött" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "" "Du kan inte starta den här inbjudan eftersom det är flera kontakter i den " -"härchatten." +"här chatten." -#: chat/chat.cpp:158 -#, fuzzy +#: chat/chat.cpp:142 msgid "%1 has joined the chat." -msgstr "%1 har gått med i chatten." +msgstr "%1 har gått med i chatten." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "Konversationen blev inaktiv, %1 har lämnat chatten." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "Konversationen blev overksam, %1 har lämnat chatten." -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." -msgstr "%1 har lämnat chatten." +msgstr "%1 har lämnat chatten." -#: chat/chat.cpp:364 -#, fuzzy +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr "%1 och %2 - Chatt" +msgstr "%1 och %2" -#: chat/chat.cpp:371 -#, fuzzy +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." -msgstr "%1 och flera - Chatt" +msgstr "%1 och flera" -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr " (Det här meddelande skickades automatiskt)" +msgstr "%1 (Det här meddelandet skickades automatiskt)" -#: chat/chat.cpp:934 -#, fuzzy -msgid "You received a wink from %1." -msgstr "Du har tagit emot en blinkning från %1" - -#: chat/chat.cpp:971 +#: chat/chat.cpp:830 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -"Blinkningen kunde inte visas. Kontrollera att du har 'cabextract' " + +#: chat/chat.cpp:941 +#, fuzzy +msgid "You have sent a wink" +msgstr "Du har tagit emot en blinkning från %1" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 har blivit osynlig" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "" +"%1 har skickat ett meddelande när du var nerkopplad:
\"%2\"" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" +"%1 har skickat ett meddelande när du var nerkopplad:
\"%2\"" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "%1 har skickat dig ett handskrivet meddelande." + +#: chat/chat.cpp:1194 +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" + +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" +"Blinkningen kunde inte visas. Kontrollera att du har \"cabextract\" " "installerat." -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "Blinkningen kunde inte visas. Kunde inte läsa data" - -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1230 #, fuzzy -msgid "You have received a wink from %1" -msgstr "Du har tagit emot en blinkning från %1" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Blinkningen kunde inte visas. Kontrollera att du har \"cabextract\" " +"installerat." -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1241 #, fuzzy -msgid "You received a nudge from %1!" -msgstr "Du tog emot en knuff från %1!" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "Blinkningen kunde inte visas. Kunde inte läsa data." -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1252 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "Meddelandet '%1' kunde inte skickas." +msgid "%1 has sent you a wink!" +msgstr "%1 har skickat en blinkning." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 har gått med i chatten." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 har gått med i chatten." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 har skickat en knuff." + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "%1 kontakter" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "Du tog emot en knuff från %1." + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Du har tagit emot en blinkning från %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 har gått med i chatten." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "" +"%1 har skickat ett meddelande när du var nerkopplad:
\"%2\"" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "Meddelandet \"%1\" kunde inte skickas." + +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" -msgstr "Du har skickat en knuff till %1!" +msgstr "Du har skickat en knuff till %1." -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" -msgstr "Du har skickat en knuff!" +msgstr "Du har skickat en knuff." -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 skickar en blinkning: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 säger:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Starta röstkonversation. Lyssnar på %1" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "Lägg till denna uttryckssymbol: %1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "Bjud &in" +# initialviewinterface.cpp:208 rc.cpp:7, no-c-format +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Anslut" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 +#, fuzzy msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -"Kunde inte spara chattlogg. Konstrollera att du har rättighet att skrivatill " -"katalogen där loggar sparas." +"Kunde inte spara chattlogg. Konstrollera att du har rättighet att skriva " +"till katalogen där loggar sparas." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 +#, fuzzy msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -"Filen '%1' finns redan.\n" +"Filen \"%1\" finns redan.\n" "vill du skriva över den?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" -msgstr "Skriv över Fil" +msgstr "Skriv över fil" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "Skri&v över" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." -msgstr "Lägg till &Uttryckssymbol..." +msgstr "Lägg till &uttryckssymbol..." -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Lägg till &uttryckssymbol..." + +#: chat/chatview.cpp:833 msgid "Send &Email" -msgstr "Skicka &E-post" +msgstr "Skicka &e-post" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "Kopiera &E-post" +#: chat/chatview.cpp:837 +#, fuzzy +msgid "Add &Contact" +msgstr "&Lägg till kontakt" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "Kopiera &adress" + +#: chat/chatview.cpp:847 msgid "Visit &Link" -msgstr "Besök &Länk" +msgstr "Besök &länk" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" -msgstr "Kopiera &Adress" +msgstr "Kopiera &adress" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +#, fuzzy +msgid "&Copy Text" msgstr "&Kopiera text" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" -msgstr "Välj &Alla" +msgstr "Välj &alla" -#: chat/chatview.cpp:1314 -msgid "Find &Text" -msgstr "" - -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" -msgstr "Spara chatt till &Fil" - -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Chatta" - -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "Skicka en &Fil" - -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "Starta Sa&mmanträde" - -#: chat/chatwindow.cpp:494 -msgid "Send a &Nudge!" -msgstr "Skicka en K&nuff" - -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "Spara chatt" - -#: chat/chatwindow.cpp:496 +#: chat/chatview.cpp:869 #, fuzzy -msgid "&Emoticons" -msgstr "Uttryckssymboler" +msgid "Find &Text..." +msgstr "Hitta &text" -#: chat/chatwindow.cpp:498 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "Close &All Tabs" -msgstr "Stäng flik" +msgid "C&lear Chat" +msgstr "Rensa f&lik" -#: chat/chatwindow.cpp:504 +#: chat/chatview.cpp:871 #, fuzzy -msgid "Meeting" -msgstr "Inställningar" +msgid "Save Chat to &File..." +msgstr "Spara chatt till &fil" -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Kontakter" -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "Starta eller Stoppa en &Konversation" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "Ändra &Typsnitt" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Ändra T&ypsnittsfärg" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "A&nslut" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Ändra T&ypsnittsfärg" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Uttryckssymboler" -#: chat/chatwindow.cpp:658 -msgid "My emoticons" +#: chat/chatwindow.cpp:121 +#, fuzzy +msgid "My Emoticons" msgstr "Mina uttryckssymboler" -#: chat/chatwindow.cpp:738 +#: chat/chatwindow.cpp:328 #, fuzzy -msgid "&Settings" -msgstr "Inställningar" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "Visa &Uttryckssymboler" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "Sidopanel" - -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Sidopanel" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Visa eller göm kontaktpanelen" - -#: chat/chatwindow.cpp:851 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" +"Det finns flera flikar öppna i det här chattfönstret. Vill du stänga " +"endast den aktuella fliken eller alla flikar?

Observera att du " +"kan stänga alla flikar på en gång genom att trycka Shift+Esc." -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" +#: chat/chatwindow.cpp:331 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" msgid "Closing a Chat Tab" +msgstr "Stänga en chattflik" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "Stäng &alla flikar" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "Stäng aktuell flik" + +#: chat/chatwindow.cpp:409 +#, fuzzy +msgid "&Invite..." +msgstr "Bjud &in" + +#: chat/chatwindow.cpp:410 +#, fuzzy +msgid "Send a &File..." +msgstr "Skicka en &fil" + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" msgstr "" -#: chat/chatwindow.cpp:855 +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "Starta ett &möte" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "Skicka en k&nuff" + +#: chat/chatwindow.cpp:414 #, fuzzy -msgid "Close all tabs" -msgstr "Stäng flik" +msgid "Save Chat..." +msgstr "Spara chatt" -#: chat/chatwindow.cpp:856 +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "Stäng &alla flikar" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "Ändra &teckensnit" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Ändra t&ypsnittsfärg" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "Visa &uttryckssymboler" + +# settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format +#: chat/chatwindow.cpp:429 #, fuzzy -msgid "Close current tab" -msgstr "Stäng flik" +msgid "Show S&tatus Messages" +msgstr "Visa tid i c&hattmeddelanden" -#: chat/chatwindow.cpp:1467 +#: chat/chatwindow.cpp:435 #, fuzzy -msgid "Show Side&bar" -msgstr "Sidopanel" +msgid "&Panels" +msgstr "Avbryt" -#: chat/chatwindow.cpp:1468 +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "Använd &stavningskontroll" + +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Möte" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Knuff" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Skicka en &fil" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 #, fuzzy -msgid "Show the contact sidebar" -msgstr "Visa eller göm kontaktpanelen" +msgid "Enable or disable the contacts panel" +msgstr "Aktivera i kontaktlistan" -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 skriver." - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 och %2 skriver." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1,%2 och %3 andra skriver." - -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 #, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kontakter" + +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Uttryckssymboler" + +#: chat/chatwindow.cpp:477 +msgid "Enable or disable the Custom Emoticons panel" +msgstr "" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Mina uttryckssymboler" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Teckensnitt" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "T&ypsnittsfärg" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "" + +#: chat/chatwindow.cpp:561 +#, fuzzy +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Starta eller stoppa en &konversation" + +#: chat/chatwindow.cpp:977 +msgid "" +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." +msgstr "" + +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" + +#: chat/chatwindow.cpp:1091 +#, fuzzy +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Kommando:" + +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Chatt" -#: chat/chatwindow.cpp:1615 -#, fuzzy +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - Chatt" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "&Skicka e-post" - -#: chat/contactframe.cpp:285 kmessview.cpp:561 -msgid "&View Profile" -msgstr "&Visa Profil" - -#: chat/contactframe.cpp:286 -msgid "Ed&it Notes" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr "%1 skriver." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr "%1 och %2 skriver." + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 och %3 andra skriver." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" +msgstr "Skicka &e-post" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 +msgid "&View Profile" +msgstr "&Visa profil" + +#: chat/contactframe.cpp:307 +msgid "Ed&it Notes" +msgstr "Red&igera anteckningar" + +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&Lägg till kontakt" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" -msgstr "Ti&llåt Kontakt" +msgstr "Ti&llåt kontakt" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" -msgstr "Ta bo&rt Kontakt" +msgstr "Ta bo&rt kontakt" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&Blockera kontakt" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" -msgstr "&Avblockera Kontakt" +msgstr "&Avblockera kontakt" # settings/accountswidget.cpp:98 rc.cpp:88, no-c-format -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" -msgstr "&Visningsnamn:" +msgstr "&Visningsnamn" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" -msgstr "&Personligt Meddelande" +msgstr "&Personligt meddelande" # initialviewinterface.cpp:235 rc.cpp:20, no-c-format -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" msgstr "&E-postadress" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" msgstr "&Kopiera.." -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Blockerad" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" -msgstr "Kontakten är inte ansluten" +msgstr "Kontakten är %1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 -#, fuzzy +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" -msgstr "Lägg till en kontakt" +msgstr "Lägg till i chatt" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Infoga en uttryckssymbol" +msgid "Add New" +msgstr "Lägg till &ny..." -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" -msgstr "" +msgstr "Redigera" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 -#, fuzzy +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" -msgstr "Borttagen" +msgstr "Ta bort" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" -msgstr "" +msgstr "Windows-mobil" -#: contact/contactbase.cpp:284 -#, fuzzy +#: contact/contactbase.cpp:308 msgid "Web Messenger" -msgstr "Webbdesign" +msgstr "Web Messenger" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" -msgstr "" +msgstr "Office Communicator" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 -msgid "MSN Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:320 #, fuzzy +msgid "Windows Media Center" +msgstr "Windows Live Messenger" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1-kompatibel" + +#: contact/contactbase.cpp:349 msgid "Windows Live Messenger %1" -msgstr "Webbdesign" +msgstr "Windows Live Messenger %1" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" -msgstr "" +msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1-kompatibel" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger %1-kompatibel" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Ansluten" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Frånkopplad" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "Tillåten" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Borttagen" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 och %2 - Chatt" - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Frånvarande" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Strax tillbaka" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Upptagen" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Osynlig" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Frånvarande" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Frånvarande med autosvar" + +#: contact/msnstatus.cpp:160 msgid "Idle" -msgstr "Inaktiv" +msgstr "Overksam" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Strax tillbaka" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Talar i Telefon" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "På lunch" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Osynlig" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Frånkopplad" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Min status" + +#: contact/msnstatus.cpp:215 #, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Koppla från" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" msgstr "Lägg till en kontakt" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Ta bort grupp" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" msgstr "Lägg till ny &Uttryckssymboler" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "Uttryckssymboler" +msgstr "Redigera uttryckssymbol" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +#, fuzzy +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "Uttryckssymbolen \"%1\" finns redan, vill du ersätta den?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "Specifiera ett Frånvarandemeddelande" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" +msgstr "&Automatiskt frånvaromeddelande" -#: dialogs/contactaddeduserdialog.cpp:33 -msgid "You have been added by someone" +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "&Chattstil:" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." msgstr "" +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "Kunde inte öppna en lokal port." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "Någon har lagt till dig" + # dialogs/contactaddeduserdialoginterface.cpp:72 rc.cpp:60, no-c-format -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "" -"%1\n" -"har lagt till dig till hans eller hennes kontaktlista. Vill du:" +"%1 (%2)\n" +" har lagt till dig till hans eller hennes kontaktlista." -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "Kontaktegenskaper för %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Ansluten" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" -msgstr "" +msgstr "Inte sedd ännu" # settings/chattingwidget.cpp:191 rc.cpp:167, no-c-format -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "Visa tid i c&hattmeddelanden" +msgstr "Inga meddelanden ännu" -#: dialogs/contactpropertiesdialog.cpp:381 -msgid "Last seen: %1" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:382 -msgid "Last message: %1" -msgstr "" - -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:419 #, fuzzy -msgid "Email: %1" -msgstr "E-post" +msgctxt "Contact props dialog info" +msgid "Last seen: %1" +msgstr "Senast sedd: %1" + +#: dialogs/contactpropertiesdialog.cpp:420 +#, fuzzy +msgctxt "Contact props dialog info" +msgid "Last message: %1" +msgstr "Senaste meddelande: %1" + +#: dialogs/contactpropertiesdialog.cpp:421 +#, fuzzy +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-postadress:" # settings/emailwidget.cpp:108 rc.cpp:207, no-c-format -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" -msgstr "E-postklient" +msgstr "Klient: %1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Klicka här för att visa den här kontaktens profil." + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kontakter" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Kontakter" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "Kontaktegenskaper för %1" + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "Ansluter till %1, port %2" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "" + +#: dialogs/listexportdialog.cpp:159 +#, fuzzy +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" +"Filen \"%1\" finns redan.\n" +"vill du skriva över den?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "" + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "Sp&ara flik" #: dialogs/networkwindow.cpp:79 #, fuzzy -msgid "S&ave tab" -msgstr "Spara flik" +msgid "C&lear Tab" +msgstr "Rensa f&lik" #: dialogs/networkwindow.cpp:80 #, fuzzy -msgid "C&lear tab" -msgstr "Rensa flik" +msgid "C&lose All Tabs" +msgstr "Stäng &alla flikar" -#: dialogs/networkwindow.cpp:1054 -#, fuzzy +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." -msgstr "Inga anslutningar är närvarande. Kan inte öppna Nätverksfönstret." +msgstr "" +"Inga anslutningar är närvarande.\n" +"Kan inte öppna nätverksfönstret." -#: dialogs/networkwindow.cpp:1100 -#, fuzzy +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "" -"Kunde inte spara Nätverksfönstrets logg. Kontrollera att du har rättighet " -"attskriva till katalogen där loggen sparas." +"Kunde inte spara nätverksfönstrets logg. Kontrollera att du har rättighet " +"att skriva till katalogen där loggen sparas." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." -msgstr "Kan inte stänga huvudanslutningsfliken" +msgstr "Kan inte stänga huvudanslutningsfliken." -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 -#, fuzzy +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" -msgstr "Kan inte stänga huvudanslutningsfliken" +msgstr "Kan inte skicka kommandon till den här sortens anslutning." -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" -msgstr "" +msgstr "Avbruten" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" -msgstr "" +msgstr "Misslyckades." -#: dialogs/transferentry.cpp:217 -#, fuzzy +#: dialogs/transferentry.cpp:225 msgid "Completed" -msgstr "Dator" +msgstr "Klar" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 byte" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." -msgstr "" +msgstr "%1 av %2 mottagna." -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." -msgstr "" +msgstr "%1 av %2 skickade." -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "oändlig" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 #, fuzzy -msgid "Cl&ean Up" -msgstr "Rensa &upp" +msgid "&Use" +msgstr "Använd" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "Ta bo&rt" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Välj eller ta bort avatar" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Visningsbild" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Är du säker på att du vill ta bort det här kontot?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." msgstr "" "Kunde inte spara uttryckssymboltema. Kontrollera att du har rättighet att " -"skrivatill temakatalogen '%1'." +"skriva till temakatalogen \"%1\"." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Leende" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "Vinka" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Lipa" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "Stort leende" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Ledsen" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "Gråter" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "Arg" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Förvirrad" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "Generad" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "Missnöjd" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "Het" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "Visa tänderna" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "Nörd" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "Sjuk" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Överraskad" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" -msgstr "Party" +msgstr "Fest" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "Trött" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "Tänker" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Berätta inte för någon" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "Skvaller" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "Rullande ögon" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "Sarkastisk" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "Jag vet inte" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Strax tillbaka" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Ängel" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Vänsterkram" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Pojke" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Rött hjärta" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Röd ros" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +#, fuzzy +msgid "Thumbs up" msgstr "Tummen upp" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Hundansikte" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Sol" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Djävul" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Högerkram" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Flicka" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Brustet hjärta" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "Vissen ros" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Tummen ner" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Kattansikte" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "Sovande halvmåne" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Röda läppar" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Klappande" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "Korsade fingrar" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" -msgstr "" +msgstr "Auto" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Flygplan" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Sköldpadda" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "Snigel" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Svart får" +#: emoticontheme.cpp:869 +#, fuzzy +msgid "Sheep" +msgstr "Trött" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Get" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "Vampyrfladdermus" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" -msgstr "" +msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Ölglas" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "Martiniglas" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "Kaffekopp" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Födelsedagstårta" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Tallrik" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Skål" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Stjärna" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Regnbåge" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Stormmoln" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Blixt" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Paraply" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Ö med en palm" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" -msgstr "Telefon mottagare" +msgstr "Telefonmottagare" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Mobiltelefon" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "E-post" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Klocka" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "Kamera" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "Filmremsa" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Anteckning" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Handbojor" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Pengar" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "Glödlampa" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +#, fuzzy +msgid "Cigarette" msgstr "Cigarett" -#: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "Fotboll" +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Paket med rosett" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Dator" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "KMess-ikon" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "" + +#: initialview.cpp:384 #, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." -msgstr "Servern är inte tillgängligt" +msgstr "Internetanslutning inte tillgänglig." -# initialviewinterface.cpp:208 rc.cpp:7, no-c-format -#: initialview.cpp:377 -msgid "Connect" -msgstr "Anslut" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "&Koppla från" +msgctxt "Button label" +msgid "&Connect" +msgstr "A&nslut" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +#, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "Avbryt" + +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:657 +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." msgstr "" -#: kmess.cpp:223 +# settings/emailwidget.cpp:112 rc.cpp:219, no-c-format +#: kmess.cpp:220 #, fuzzy +msgid "Contact Information" +msgstr "Visa e-postinformation" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Kontakten finns redan på din lista" + +#: kmess.cpp:250 msgid "New Group" -msgstr "Ny &Grupp" +msgstr "Ny grupp" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Lägg till en grupp" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" -msgstr "Skriv in det nya namnet för gruppen:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" +msgstr "Ange det nya namnet för gruppen:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" @@ -2487,350 +3450,465 @@ msgstr "" "Är du säker på att du vill ta bort kontakten %1 från din " "kontaktlista?" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" msgstr "Ta bort kontakt" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" msgstr "Ta bort och blockera" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" +"Gruppen \"%1\" är inte tom: ta bort alla kontakter från den och " +"försök igen." -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 +#, fuzzy msgctxt "dialog title" -msgid "Group removal" -msgstr "" +msgid "Group Removal" +msgstr "Ta bort grupp" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "" -"Är du säker på att du vill ta bort gruppen%1 från din " +"Är du säker på att du vill ta bort gruppen %1 från din " "kontaktlista?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" -msgstr "Borttagen" +msgstr "Ta bort" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Det här är en speciell grupp som inte kan ändras" -#: kmess.cpp:671 -msgid "Rename group" -msgstr "Byt namn på grupp" +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "Byt &namn på grupp" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Ange det nya namnet för gruppen:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" +"

Kan inte logga in automatiskt med kontot \"%1\":
Du måste " +"först spara kontolösenordet.

" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" -msgstr "Autentisering misslyckades" +msgid "Autologin Failed" +msgstr "Automatisk inloggning misslyckades" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Ansluter..." + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Frånkopplad" -#: kmess.cpp:1408 -#, fuzzy -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" msgstr "" -"

KMess kommer inte kunna spela upp ljud och notifikationer.

" -"KMess-filen 'eventsrc' kunde inte hittas i någon av följande kataloger: %1

Vänligen verifiera din installation, och kopiera den saknade filen till " -"en av de listade katalogerna.

" + +#: kmess.cpp:1475 +#, fuzzy +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" +"

KMess kommer inte kunna spela upp ljud och meddelanden.

KMess-" +"filen \"kmess.nottifyrc\" kunde inte hittas i någon av följande kataloger: %" +"1

Verifiera din installation och kopiera den saknade filen till en av " +"de listade katalogerna.

" # settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, -#: kmess.cpp:1412 -msgid "Error with notifications" -msgstr "Fel med notifikationer" - -#: kmess.cpp:1589 +#: kmess.cpp:1481 #, fuzzy -msgctxt "Main window caption" +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "Fel med meddelanden" + +#: kmess.cpp:1759 +#, fuzzy +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess-ikon" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Åtgärder" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Ny &Kontakt" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Ny &Grupp" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "Sök &efter Kontakt" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "Sök genom &Intresse" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "Sök &efter Kontakt" +msgstr "KMess - %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Nytt K&onto" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "Kontoin&ställningar" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "A&nslut" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&Koppla från" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" -msgstr "Visa Min &Profil" +msgstr "Visa min &profil" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Min Status" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Frånvarande med autosvar" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" -msgstr "Vis&a Tillåtna Kontakter" +msgstr "Vis&a tillåtna kontakter" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" -msgstr "Visa Frånk&opplade Kontakter" +msgstr "Visa frånk&opplade kontakter" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" -msgstr "Visa Bo&rttagna Kontakter" +msgstr "Visa bo&rttagna kontakter" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 #, fuzzy +msgid "Show &History Box" +msgstr "&Chattstil:" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Visa sido&panel" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" -msgstr "Visa &Uttryckssymboler" +msgstr "Visa tomma grupp&er" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" -msgstr "Visningsbild" +msgid "&Display Pictures Size" +msgstr "Visa bildstorlek" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -#, fuzzy -msgid "Small" -msgstr "Leende" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" -msgstr "&Sortera Kontakter efter" +msgstr "&Sortera kontakter efter" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "Visa överföringsföns&ter" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "Ny &kontakt" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "Ny &grupp" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "&Sortera kontakter efter" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "Sök efter kontakt" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "Sök genom &intresse" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "&Chattstil:" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "Nytt k&onto" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Lipa" + +#: kmessinterface.cpp:190 +#, fuzzy +msgid "Configure &KMess..." +msgstr "Ställ in &KMess" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +#, fuzzy +msgid "Do Not Display" +msgstr "Visa inte" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "Liten" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "Mellan" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "Stor" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "Grupp" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Ansluten/Frånkopplad" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "Blandad" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "Visa Överföringsföns&ter" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." +msgstr "Visa &nätverksfönster" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "Visa &Nätverksfönster" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "Lyssnar nu till %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "[%1] loggad med %2" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr "" +msgstr "[%1] %2 ansluter" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr "" +msgstr "[%1] %2 kopplar ner" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "Cha&tta" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "Egenska&per" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" msgstr "Ta bo&rt från grupp" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "Lyssnar på %1" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" -msgstr "&Kopiera till Grupp" +msgstr "&Kopiera till grupp" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" -msgstr "&Flytta till Grupp" +msgstr "&Flytta till grupp" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" -msgstr "Flytta Grupp &Ner" +msgstr "Flytta ner &grupp" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" -msgstr "Flytta Grupp &Upp" +msgstr "Flytta &upp grupp" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" -msgstr "Ta bort Grupp" +msgstr "Ta &bort grupp" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" -msgstr "Byt &namn på Grupp" +msgstr "Byt &namn på grupp" -#: kmessview.cpp:1053 +# dialogs/contactaddeduserdialoginterface.cpp:74 rc.cpp:64, no-c-format +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "E-post" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Lägga till den här kont&akten i min \"Vänner\"-lista" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +# initialviewinterface.cpp:235 rc.cpp:20, no-c-format +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-postadress" + +# settings/emailwidget.cpp:108 rc.cpp:207, no-c-format +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "Klient: %1" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" +#: kmessview.cpp:1156 +#, fuzzy +msgid "No" +msgstr "Anteckning" -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Blockerad" -#: kmessview.cpp:1085 +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "Senast sedd: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Senaste meddelande: %1" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" -msgstr "" +msgstr "Grupp %1" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "Kontakter" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Kontakten är inte ansluten" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 kontakter, %2 anslutna" +msgstr[1] "%1 kontakter, %2 anslutna" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 #, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 kontakter" +msgstr[1] "%1 kontakter" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" -msgstr "Skriv in ditt personliga meddelande här" +msgstr "<Ange ditt personliga meddelande här>" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1 nytt e-postmeddelande" +msgstr[1] "%1 nya e-postmeddelanden" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" -msgstr "" +msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" +msgstr "En MSN Messenger-klient för KDE" + +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" msgstr "" -#: main.cpp:70 +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" +msgstr "Utvecklare och projektgrundare" + +#: main.cpp:61 +msgid "Michael Curtis" msgstr "" -#: main.cpp:71 +#: main.cpp:61 msgid "Developer" +msgstr "Utvecklare" + +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" msgstr "" -#: main.cpp:72 -#, fuzzy +#: main.cpp:62 msgid "Project support" -msgstr "P4-Kontextfält stöd" +msgstr "Projektstöd" -#: main.cpp:73 main.cpp:74 main.cpp:75 -#, fuzzy +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" -msgstr "GnomeMeeting utvecklare" +msgstr "Nuvarande utvecklare" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." @@ -2838,255 +3916,608 @@ msgstr "" "Tysk översättning, testning, dokumentation, webbmaster, projektledning, " "etc..." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "Webbdesign" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "Huvud- och gul/blå/violet-uttryckssymbolset och Italiensk översättning" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Tecknade uttryckssymboler" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Standardljudtema" -#: main.cpp:83 -msgid "KMess icon in Oxygen style" +#: main.cpp:74 +msgid "Michael Anderton" msgstr "" -#: main.cpp:87 +#: main.cpp:74 +msgid "KMess icon in Oxygen style" +msgstr "KMess-ikon i Oxygen-stil" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arabisk översättning, internationalisering av filsparningsfix." -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "Mer Arabiska översättningar" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Brasiliansk Portugisisk översättning" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Brasiliansk Portugisisk översättning" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Katalansk översättning" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" "Förenklad Kinesisk översättning, filöverföringsbuggfix, proxyanslutnings kod" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "Mer Förenklad Kinesisk översättning" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "Traditionell Kinesisk översättning" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Traditionell Kinesisk översättning" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 msgid "Danish translation" msgstr "Dansk översättning" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 msgid "More Danish translation" msgstr "Mer Dansk översättning" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "Holländsk översättning" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "Mer Holländsk översättning" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Mer italiensk översättning" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Mer fransk översättning" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 msgid "Estonian translation" msgstr "Estländsk översättning" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 msgid "Finnish translation" msgstr "Finsk översättning" -#: main.cpp:104 main.cpp:105 -msgid "More Finnish translation" -msgstr "Mer Finsk översättning" +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" -#: main.cpp:107 +#: main.cpp:105 main.cpp:106 +msgid "More Finnish translation" +msgstr "Mer finsk översättning" + +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "Fransk översättning" -#: main.cpp:108 -msgid "More French translation, MSN6 emoticon definitions" -msgstr "Mer Fransk översättning, MSN6 uttryckssymbolsdefinitioner" +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" #: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "Mer fransk översättning, MSN6-uttryckssymbolsdefinitioner" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" -msgstr "Mer Fransk översättning" +msgstr "Mer fransk översättning" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "Ungersk översättning" -#: main.cpp:112 main.cpp:113 -msgid "More Italian translation" -msgstr "Mer Italiensk översättning" +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" #: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Ungersk översättning" + +#: main.cpp:115 main.cpp:116 +msgid "More Italian translation" +msgstr "Mer italiensk översättning" + +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "Koreansk översättning" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 msgid "Norsk Bokmål translation" msgstr "Norsk Bokmal översättning" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Slovensk översättning" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "Slovensk översättning" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "Slovensk översättning" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "Spansk översättning" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 -msgid "More Spanish translation" -msgstr "Mer Spansk översättning" - -#: main.cpp:123 -msgid "Swedish translation" -msgstr "Svensk översättning" - #: main.cpp:125 -msgid "Thai translation" -msgstr "Thailändsk översättning" +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 +msgid "More Spanish translation" +msgstr "Mer spansk översättning" #: main.cpp:126 -msgid "Turkish translation" -msgstr "Turkisk översättning" +msgid "Alejandro Araiza Alvarado" +msgstr "" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "Mer Turkisk översättning" +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "Svensk översättning" + +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Filöverföringar" - -#: main.cpp:134 -msgid "P4-Context field support" -msgstr "P4-Kontextfält stöd" +msgid "More Swedish translation" +msgstr "Svensk översättning" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Xinerama fixar" +msgid "Rachan Hongpairote" +msgstr "" + +#: main.cpp:135 +msgid "Thai translation" +msgstr "Thailändsk översättning" #: main.cpp:136 -msgid "Original file receive code" -msgstr "Ursprunglig filmottagningskod" +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Turkisk översättning" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" msgstr "" +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "Mer turkisk översättning" + #: main.cpp:138 -#, fuzzy -msgid "KWallet support" -msgstr "P4-Kontextfält stöd" - -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +msgid "Uğur Çetin" msgstr "" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +#, fuzzy +msgid "MSNP12 support, various patches" +msgstr "MSNP12-stöd, diverse programfixar." + #: main.cpp:142 #, fuzzy -msgid "Various internationalization fixes" -msgstr "Olika internationaliserings fixar." +msgid "Guido Solinas" +msgstr "Anslut" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" #: main.cpp:143 -msgid "Various internationalization fixes." -msgstr "Olika internationaliserings fixar." +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +msgid "File transfer thumbnails" +msgstr "" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "P4-Kontextfältstöd" #: main.cpp:145 -msgid "GnomeMeeting developer" -msgstr "GnomeMeeting utvecklare" +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Xinerama-fixar" #: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "Ursprunglig filmottagningskod" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "KWallet-stöd" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +#, fuzzy +msgid "IRC-like commands in the chat window" +msgstr "Aktivera i chattfönster" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "&Chattstil:" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +msgid "Various internationalization fixes" +msgstr "Diverse internationaliseringsfixar" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 +msgid "Various internationalization fixes." +msgstr "Olika internationaliseringsfixar." + +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 +msgid "GnomeMeeting developer" +msgstr "GnomeMeeting-utvecklare" + +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Kille med en påse över sitt huvud" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Inspiration och blandad kod" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "Äldre popup-ballongkod, ursprunglig p2p-kod, msn-utmaningshanterare" +msgstr "Äldre popup-ballongkod, ursprunglig p2p-kod, MSN-utmaningshanterare" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" -msgstr "Inaktivitetsklockskod" +msgstr "Overksamhetsklockkod" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" msgstr "Ditt namn här?" -#: main.cpp:156 -#, fuzzy +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -"Du är välkommen att skicka dina buggfixar och patchar till KMess " +"Du är välkommen att skicka dina buggfixar och programfixar till KMess " "hjälpforum!\n" -"Om du känner att ditt namn saknas här, vänligen kontakta oss också!" +"Om du tycker att ditt namn saknas här, vänligen kontakta oss." -#: main.cpp:159 -#, fuzzy +#: main.cpp:171 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Ditt namn" # settings/accountswidget.cpp:99 rc.cpp:91, no-c-format -#: main.cpp:160 -#, fuzzy +#: main.cpp:172 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" -msgstr "Din e-postadress:" +msgstr "Din e-postadress" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Logga in automatiskt med angiven e-postadress" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "Tillåten" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Borttagen" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "Kontakten avbröt sessionen." @@ -3104,140 +4535,126 @@ msgstr "Du har nekat inbjudan." #: network/applications/application.cpp:540 #, fuzzy -msgid "Do you want to
accept or cancel?" -msgstr "Vill du acceptera eller avbryta?" +msgid "Do you want to accept or cancel?" +msgstr "Vill du acceptera eller avbryta?" #: network/applications/application.cpp:581 #, fuzzy -msgid "Click to cancel." -msgstr "Klicka för att avbryta." +msgid "Click to cancel." +msgstr "Klicka för att avbryta." -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Vill du acceptera filen: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "Kontakten vill skicka dig en fil: "%1" (%2)." -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "Överföringen av %1 misslyckades. Kunde inte öppna filen." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"Filen "%1" finns redan.\n" +"Vill du skriva över den?" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "" +"Överföringen av filen "%1" misslyckades. Kunde inte spara filen." + +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "Överföringen av %1 misslyckades. Kunde inte öppna filen." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Överföringen accepterad." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "Ansluter till %1, port %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "Överföringen avbröts" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Kontakten har avbrutit överföringen av filen "%1"." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "Du har avbrutit överförningen av filen "%1"." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "Du har accepterat överföringen av filen "%1"." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Anslutning upprättad" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" -msgstr "Lyckades överföra filen: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "Lyckades överföra filen "%1"." -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "Överföringen av %1 misslyckades. Filen finns inte." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "Lyckades ta emot filen "%1"." -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "Överföringen av %1 misslyckades. Kunde inte läsa filen." +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." +msgstr "Överföringen av filen "%1" misslyckades. Filen finns inte." -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "Skickar fil %1" - -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 -msgid "Negotiating options to connect" +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "" +"Överföringen av filen "%1" misslyckades. Filen kunde inte läsas." + +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "Skickar fil "%1" (%2)." + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Kontakten har accepterat överföringen av fil "%1"." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 +msgid "Negotiating options to connect" +msgstr "Förhandlar alternativ för att ansluta" #: network/applications/filetransferp2p.cpp:129 #: network/applications/filetransferp2p.cpp:143 #: network/applications/filetransferp2p.cpp:160 #: network/extra/msnftpconnection.cpp:132 msgid "The file transfer invitation was cancelled. Bad data was received." -msgstr "Filöverföringsinbjudan avbröts. Felaktig data mottogs." +msgstr "Filöverföringsinbjudan avbröts. Felaktig data mottogs." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"Filen '%1' finns redan.\n" -"vill du skriva över den?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "Överföringen av %1 misslyckades. Kunde inte öppna filen." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." -msgstr "" +msgstr "Du har accepterat överföringen av filen "%1"." -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Kontakten avbröt överföringen." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Du har avbrutit konversationen." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" -msgstr "" - -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Lyckades överföra filen: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Lyckades överföra filen: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "Överföringen av %1 misslyckades. Filen finns inte." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "Överföringen av %1 misslyckades. Filen kunde inte läsas" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Skickar fil %1 (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Kontakten avbröt överföringen." +msgstr "Filen kunde inte skrivas" #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "Du är inbjuden till att starta ett sammanträde (med GnomeMeeting)." +msgstr "Du är inbjuden till att starta ett möte (med GnomeMeeting)." #: network/applications/gnomemeeting.cpp:118 msgid "Starting GnomeMeeting. Connecting to %1." @@ -3245,32 +4662,32 @@ msgstr "Startar GnomeMeeting. Ansluter till %1." #: network/applications/gnomemeeting.cpp:161 msgid "Inviting the contact to a meeting." -msgstr "Bjuder in kontakten till ett sammanträde." +msgstr "Bjuder in kontakten till ett möte." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "Inbjudan nekades. Stöd saknas hos den andra klienten." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." -msgstr "Inbjudan avbröts. Ett internt fel inträffade." +msgstr "Inbjudan avbröts. Ett internt fel inträffade." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "" -"Inbjudan avbröts. Tidsgränsen överskriden i väntan på att användaren skulle " +"Inbjudan avbröts. Tidsgränsen överskriden i väntan på att användaren skulle " "acceptera." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." -msgstr "Inbjudan avbröts. Tidsgränsen överskriden i väntan på data." +msgstr "Inbjudan avbröts. Tidsgränsen överskriden i väntan på data." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." -msgstr "Inbjudan avbröts. Växeln stängde anslutningen till chatten." +msgstr "Inbjudan avbröts. Växeln stängde anslutningen till chatten." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Inbjudan avbröts." @@ -3280,91 +4697,64 @@ msgstr "Du är inbjuden till att dela den här personens skrivbord." #: network/applications/msnremotedesktop.cpp:159 msgid "Starting KRDC. Connecting to %1." -msgstr "Startar KRDC. Ansluter till %1." +msgstr "Startar KRDC. Ansluter till %1." -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kontakten avbröt inbjudan. Ett internt fel inträffade." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "Kontakten initierade en MSN6-funktion som KMess inte kan hantera ännu." -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "Överföringen misslyckades." - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "" -"Inbjudan avbröts. Kontakten skickade felaktig data, eller så stöds det inte " +"Inbjudan avbröts. Kontakten skickade felaktig data, eller så stöds det inte " "av KMess." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"Överföringen misslyckades. Kontakten skickade felaktig data, eller så stöds " -"det inte av KMess." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "" -"Överföringen misslyckades. Tidsgränsen överskriden i väntan på att " -"användaren skulle acceptera." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "Överföringen misslyckades. Ett internet fel inträffade." - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "Överföringen misslyckades. Kunde inte öppna datakällan." - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "Kontakten initierade en MSN6 funktion som KMess inte kan hantera ännu." - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." -msgstr "Överföringen misslyckades. Förberedning av data misslyckades." +msgstr "Överföringen misslyckades. Förberedning av data misslyckades." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." -msgstr "Inbjudan avbröts. Meddelande var inte avsett för oss." +msgstr "Inbjudan avbröts. Meddelandet var inte avsett för oss." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" -"Överföringen misslyckades. Kontakten skickade felaktig data, eller så stöds " +"Överföringen misslyckades. Kontakten skickade felaktig data, eller så stöds " "det inte av KMess." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kontakten avbröt inbjudan. Ett internt fel inträffade." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "Väntar på anslutning vid %1, port %2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "Återgår till indirekt filöverföring (det kan gå sakta)." -#: network/applications/p2papplication.cpp:3113 -#, fuzzy +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" -msgstr "Väntar på kontaktlista..." +msgstr "Väntar på anslutning" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." @@ -3372,7 +4762,7 @@ msgstr "" "Inbjudan avbröts. En tidsgräns överskreds i väntan på att användaren skulle " "acceptera." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." @@ -3380,10 +4770,36 @@ msgstr "" "Inbjudan avbröts. En tidsgräns överskreds i väntan på att en anslutning " "skulle lyckas eller misslyckas." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." -msgstr "Inbjudan avbröts. Tidsgränsen överskriden i väntan på data." +msgstr "Inbjudan avbröts. Tidsgränsen överskriden i väntan på data." + +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Överföringen misslyckades." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Överföringen misslyckades. Kontakten skickade felaktig data, eller så stöds " +"det inte av KMess." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "" +"Överföringen misslyckades. Tidsgränsen överskriden i väntan på att " +"användaren skulle acceptera." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Överföringen misslyckades. Ett internet fel inträffade." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "Överföringen misslyckades. Kunde inte öppna datakällan." #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." @@ -3403,875 +4819,1726 @@ msgstr "Du har avbrutit röstkonversationen." #: network/applications/voiceconversation.cpp:205 msgid "The invitation was cancelled. The audio device couldn't be opened." -msgstr "Inbjudan avbröts. Ljudenheten kunde inte öppnas." +msgstr "Inbjudan avbröts. Ljudenheten kunde inte öppnas." #: network/applications/voiceconversation.cpp:218 msgid "Start voice conversation. Connecting to %1." -msgstr "Starta röstkonversation. Ansluter till %1." +msgstr "Starta röstkonversation. Ansluter till %1." #: network/applications/voiceconversation.cpp:224 msgid "Start voice conversation. Listening on %1." -msgstr "Starta röstkonversation. Lyssnar på %1" +msgstr "Starta röstkonversation. Lyssnar på %1" #: network/applications/voiceconversation.cpp:289 msgid "Inviting the contact to a voice conversation." msgstr "Bjuder in kontakten till en röstkonversation." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." -msgstr "Kontakten bjuder in dig till '%1', men det är inte implementerat ännu." +msgstr "" +"Kontakten bjuder in dig till \"%1\", men det är inte implementerat ännu." -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Filöverföringsinbjudan avbröts. Felaktig data mottogs." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "Överföringen av %1 avbröts." +#: network/applications/webcamtransferp2p.cpp:138 +#, fuzzy +msgid "You are invited to view this person's webcam." +msgstr "Du är inbjuden till att dela den här personens skrivbord." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "webbkamera" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" -msgstr "" +msgstr "Misslyckades" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "Överföringen av %1 misslyckades. Kunde inte öppna en lokal port." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Skickar fil %1" -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:398 #, fuzzy -msgid "Couldn't open a local port." -msgstr "Överföringen av %1 misslyckades. Kunde inte öppna en lokal port." +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "Överföringen av %1 misslyckades. Kunde inte öppna en lokal port." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:399 +msgid "Couldn't open a local port." +msgstr "Kunde inte öppna en lokal port." + +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Initierar filöverföring" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" -msgstr "Överföringen av %1 misslyckades. En anslutning kunde inte upprättas" - -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:469 #, fuzzy -msgid "Unable to make a connection." -msgstr "Kunde inte skapa en ansluting: %1" +msgid "The transfer of %1 failed. A connection could not be made." +msgstr "Överföringen av %1 misslyckades. En anslutning kunde inte upprättas" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:470 +msgid "Unable to make a connection." +msgstr "Kunde inte skapa en ansluting." + +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "Tar emot %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"KMess kunde inte nå webbtjänsten.\n" -"Detaljer: %1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Du har blivit frånkopplad för att du \n" -"anslöt från en annan MSN Messenger-klient \n" -"eller från en annan plats" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Fick synkronisering" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Autentiserar" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "Väntar på kontaktlista..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "" -"Autentisering misslyckades, vänligen kontrollera ditt kontonamn och lösenord" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Ansluter..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess mottog ett okänt kommando från servern: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" -msgstr "" +msgstr "Ogiltig kommandosyntax" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" -msgstr "" +msgstr "Ogiltig kommandoparameter" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" "E-postadressen du har försökt lägga till är inte ett MSN Messenger-konto" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" -msgstr "" +msgstr "Domännamn saknas" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" -msgstr "" +msgstr "Redan inloggad" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" -msgstr "Det givna kontonamnet är inkorrekt" +#: network/msnconnection.cpp:404 +#, fuzzy +msgid "The given account name is invalid" +msgstr "Det angivna kontonamnet är inkorrekt" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 +#, fuzzy msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" "Det kontonamnet är inkorrekt, eller så har inte ditt passportkonto blivit " "bekräftat ännu." -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" -msgstr "Din kontaktlista är full." +msgstr "Din kontaktlista är full" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" -msgstr "" +msgstr "Ogiltig SBP-parameter" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" -msgstr "Kontakten finns redan på din lista." +msgstr "Kontakten finns redan på din lista" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "Kontakten finns inte på din lista" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "Kontakten är inte ansluten" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" +msgstr "Redan i det här läget" + +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Kontakten finns inte på din lista" - -#: network/msnnotificationconnection.cpp:2247 -#, fuzzy +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." -msgstr "Gruppnamnet används redan i din Messenger- eller Hotmail-kontaktlista" +msgstr "" +"Gruppnamnet är redan tillagt i din Messenger- eller Hotmail-kontaktlista. " +"Använd ett annat namn." -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:444 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "Din kontaktlista har för många grupper" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "Den här gruppen kan inte ändras" -#: network/msnnotificationconnection.cpp:2260 -#, fuzzy +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" -msgstr "Din kontaktlista har för många grupper" +msgstr "Kontakten är inte tillagd till den här gruppen" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "Den här gruppen är inte tom" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "Gruppnamnet är för långt" - -#: network/msnnotificationconnection.cpp:2273 -msgid "Attempted to change group \"0\"" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 +msgid "Attempted to change group \"0\"" +msgstr "Försökte ändra grupp \"0\"" + +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "Ett internt fel inträffade i KMess: %1" -#: network/msnnotificationconnection.cpp:2277 -#, fuzzy +#: network/msnconnection.cpp:470 msgid "Invalid Group" -msgstr "Byt &namn på Grupp" +msgstr "Ogiltig grupp" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" +msgstr "Tom domän" + +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "Växelserver misslyckades" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "Överföring till växelserver misslyckades" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Direktanslutningsfel (MSNSLP), anslutning misslyckades" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" -msgstr "" +msgstr "Fält som krävs saknas" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" +msgstr "Inte inloggad" + +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." msgstr "" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Egna uttryckssymboler för det här kontot:" - -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" -msgstr "" +msgstr "Kommandot är inaktiverat" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "Ditt konto är avstängt." -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "Överföringen misslyckades." -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" -msgstr "" +msgstr "Dålig kommandodata" -#: network/msnnotificationconnection.cpp:2323 -#, fuzzy +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" -msgstr "Du öppnar sessioner för snabbt" +msgstr "Du öppnar chattsessioner för snabbt" -#: network/msnnotificationconnection.cpp:2327 -#, fuzzy +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" -msgstr "Du har för många sessioner öppna" +msgstr "Du har för många chattsessioner öppna" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" -msgstr "" +msgstr "Oväntad kommandosekvens" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "Felaktigt namn på vän" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" -msgstr "" +msgstr "Dålig CVR-data" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +#, fuzzy +msgid "The server reports KMess is flooding it with too much data" msgstr "Servern rapporterar att KMess översvämmar den med för mycket data" -#: network/msnnotificationconnection.cpp:2357 -#, fuzzy +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" -msgstr "Autentisering misslyckades" +msgstr "Autentiseringsbiljett var felaktig" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." -msgstr "Du kan inte starta en chatt med någon då du är osynlig" +msgstr "Du kan inte starta en chatt med någon då du är osynlig." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" -msgstr "" +msgstr "Accepterar inte nya kontakter" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 #, fuzzy msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" "Du har ett barnpassportkonto, du måste ha föräldrars tillåtelse för att " "chatta online." -#: network/msnnotificationconnection.cpp:2371 +#: network/msnconnection.cpp:569 #, fuzzy -msgid "Your passport account needs to be verified first." -msgstr "Ditt passportkonto måste bli bekräftat först." +msgid "Your Passport account needs to be verified first." +msgstr "Ditt passportkonto måste först bli verifierat." -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" -msgstr "" +msgstr "Dålig USR-biljett" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "Fel vid försök att hämta kontaktlistan, försök igen senare" -#: network/msnnotificationconnection.cpp:2399 -#, fuzzy +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." -msgstr "Ett internt serverfel inträffade" - -#: network/msnnotificationconnection.cpp:2410 -msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" +"MSN-tjänsten är temporärt otillgänglig, ett internt serverfel inträffade." -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:603 +msgid "The MSN service is temporarily unavailable, the server is too busy" +msgstr "MSN-tjänsten är temporärt otillgänglig, servern är för upptagen" + +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Motpartsnotifieringsservern är nere" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "Servern går ner" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "Servern gå ner snart" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "Skriv är blockat" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "Sessionen är överbelastad" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" -msgstr "Servern är inte tillgängligt" +msgstr "Servern är inte tillgänglig" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Autentisering misslyckades" -#: network/msnnotificationconnection.cpp:2449 +#: network/msnconnection.cpp:642 #, fuzzy -msgid "Unknown error code received from the server: %1" -msgstr "KMess mottog ett okänt kommando från servern: %1" +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "Okänd felkod mottagen från servern: %1" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 #, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" -msgstr "KMess - MSN fel" +msgid "MSN Error" +msgstr "MSN-fel" -# settings/alertswidget.cpp:110 rc.cpp:112, no-c-format -#: network/msnnotificationconnection.cpp:2596 -#, fuzzy -msgctxt "Time left before server maintenance" -msgid "1 minute" -msgid_plural "%1 minutes" -msgstr[0] "minuter" -msgstr[1] "minuter" - -#: network/msnnotificationconnection.cpp:2599 -#, fuzzy -msgid "Server closes for maintenance in %1!" -msgstr "Varning: Serven stänger ner för underhåll om %1 minuter!" - -#: network/msnnotificationconnection.cpp:2604 -#, fuzzy -msgctxt "Server maintenance dialog box text" -msgid "The MSN Server will be going down in %1 for maintenance." -msgstr "" -"MSN Servern har rapporterat att den kommer gå ner inom en minut för " -"underhåll." - -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -#, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" -msgstr "" -"KMess kunde inte bearbeta Offline-IM meddelanden.\n" -"\n" -"Detaljer: %1" +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "Autentiserar..." -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:1370 #, fuzzy -msgid "Authentication time limit exceeded" +msgid "Authenticated" msgstr "Autentisering misslyckades" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "Byter till en annan server..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Ansluter..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "Tog emot ett okänt kommando från servern: %1" + +# settings/alertswidget.cpp:110 rc.cpp:112, no-c-format +#: network/msnnotificationconnection.cpp:2109 #, fuzzy +msgctxt "Time left before server maintenance" +msgid "%1 minute" +msgid_plural "%1 minutes" +msgstr[0] "1 minut" +msgstr[1] "%1 minuter" + +#: network/msnnotificationconnection.cpp:2112 +msgid "Server closes for maintenance in %1!" +msgstr "Serven stänger ner för underhåll om %1." + +#: network/msnnotificationconnection.cpp:2117 +msgctxt "Server maintenance dialog box text" +msgid "The MSN Server will be going down in %1 for maintenance." +msgstr "MSN-servern kommer gå ner om %1 för underhåll." + +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "" + +#: network/msnnotificationconnection.cpp:2318 +#, fuzzy +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess kunde inte bearbeta Offline-IM-meddelanden.
Detaljer: %1" + +#: network/msnnotificationconnection.cpp:2589 +msgid "Authentication time limit exceeded" +msgstr "Autentiseringstidgräns överskriden" + +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Väntar på kontaktlista..." + +#: network/msnnotificationconnection.cpp:2805 +#, fuzzy +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

MSN-meddelande

%1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" -msgstr "Ett internt fel inträffade i KMess: %1" +msgstr "
Internt fel. Anledning: %1" -#: network/msnnotificationconnection.cpp:3242 +#: network/msnnotificationconnection.cpp:2916 #, fuzzy -msgctxt "Login error message, with more details for developer versions" +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" -msgstr "" -"KMess kunde inte ansluta till MSN Messenger servrarna. MSN Messenger " -"servrarna kan vara temporärt otillgängliga eller så är det ett problem med " -"din Internetanslutning." +msgstr "Autentisering misslyckades, kontrollera ditt kontonamn och lösenord." -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -#, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "Anslutningen till servern förlorades." - -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:2932 #, fuzzy +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" -"Autentisering misslyckades, KMess kunde inte bearbeta passportinloggningen.\n" -"\n" -"Detaljer: %1" +"

Du har blivit frånkopplad.

Du anslöt med det här kontot från en " +"annan MSN Messenger-klient eller från en annan plats.

" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "Serverfel" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnnotificationconnection.cpp:2947 #, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

KMess kunde inte ansluta till MSN Messenger-servrarna. MSN Messenger-" +"servrarna kan vara temporärt otillgängliga eller så är det ett problem med " +"din Internetanslutning.%1

Visa statussida för MSN Messenger-tjänsten?" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

KMess kunde inte ansluta till MSN Messenger-servrarna. MSN Messenger-" +"servrarna kan vara temporärt otillgängliga eller så är det ett problem med " +"din Internetanslutning.%1

Visa statussida för MSN Messenger-tjänsten?" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +#, fuzzy +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

MSN-meddelande

%1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

Anslutningen till MSN-servern förlorades.%1

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 +#, fuzzy +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "
Internt fel. Anledning: %1" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" msgstr "Anslutning överskred tidsgräns" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "1 ping förlorad" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "%1 ping förlorade" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." +#: network/msnsockettcp.cpp:395 +#, fuzzy +msgid "The connection to the server was lost" msgstr "Anslutningen till servern förlorades." -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Personen är frånkopplad eller osynlig." +#: network/soap/addressbookservice.cpp:777 +#, fuzzy +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "" +"E-postadressen du har försökt lägga till är inte ett MSN Messenger-konto" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "Kontakten initierade en MSN7 funktion som KMess inte kan hantera ännu." +#: network/soap/addressbookservice.cpp:787 +#, fuzzy +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" +"E-postadressen du har försökt lägga till är inte ett MSN Messenger-konto" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "Meddelandet \"%1\" mottogs inte!" - -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "Kunde inte skapa en ansluting: %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Servern är inte tillgänglig" + +#: network/soap/httpsoapconnection.cpp:471 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "För många omdirigeringar av inloggningstjänsten" -#: notification/chatnotification.cpp:163 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "In %1's chat: %2" -msgstr "I %1s chatt: %2" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Servern är inte tillgänglig" -#: notification/chatnotification.cpp:167 -#, fuzzy -msgid "%1 says:
'%2'" -msgstr "%1 säger:
'%2'" - -#: notification/chatnotification.cpp:171 -#, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" msgstr "" -"%1 har skickat ett meddelande medans du var frånkopplad:
'%2'" -#: notification/chatnotification.cpp:178 +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 #, fuzzy +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "Oväntad kommandosekvens" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" +msgstr "I %1s chatt: %2" + +#: notification/chatnotification.cpp:158 +#, fuzzy +msgid "%1 says:
'%2'" +msgstr "%1 säger:
\"%2\"" + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" +msgstr "" +"%1 har skickat ett meddelande när du var nerkopplad:
\"%2\"" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" -msgstr "%1s chatt begär uppmärksamhet!" +msgstr "%1s chatt begär uppmärksamhet." -#: notification/chatnotification.cpp:183 +#: notification/chatnotification.cpp:174 #, fuzzy -msgid "%1:
%2" -msgstr "%1 säger:
'%2'" +msgid "%1:
%2" +msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr "%1 har skickat en knuff!" +msgstr "%1 har skickat dig ett handskrivet meddelande." -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr "%1 har skickat en knuff!" +msgstr "%1 har skickat en knuff." -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr "%1 har skickat en blinkning!" +msgstr "%1 har skickat en blinkning." + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1 vill använda webbkameran." + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 skickar en fil." + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 har skickat en inbjudan." #: notification/chatnotification.cpp:204 -#, fuzzy -msgid "%1 wants to use the webcam!" -msgstr "%1 vill använda webbkameran!" +msgid "%1 has canceled the webcam session!" +msgstr "%1 har avbrutit webbkamerasessionen." #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 skickar en fil!" +msgid "%1 has canceled the file transfer!" +msgstr "%1 har avbrutit filöverföringen." #: notification/chatnotification.cpp:206 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "%1 har skickat en inbjudan!" +msgid "%1's activity has been canceled!" +msgstr "%1s aktivitet har avbrutits." #: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "%1 har avbrutit webbkamerasessionen!" +msgid "%1 has accepted to use the webcam!" +msgstr "%1 har accepterat att använda webbkameran." #: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "%1 har avbrutit filöverföringen!" +msgid "%1 has accepted the file transfer!" +msgstr "%1 har accepterat filöverföringen." #: notification/chatnotification.cpp:215 -#, fuzzy -msgid "%1's activity has been canceled!" -msgstr "%1s aktivitet har avbrutits!" +msgid "%1 has accepted your invitation!" +msgstr "%1 har accepterat din inbjudan." #: notification/chatnotification.cpp:222 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1 har accepterat att använda webbkameran!" +msgid "%1 has ended the webcam session!" +msgstr "%1 har avslutat webbkamerasessionen." #: notification/chatnotification.cpp:223 -#, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "%1 har accepterat filöverföringen!" +msgid "The file transfer with %1 is done!" +msgstr "Filöverföringen med %1 är klar." #: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1 har accepterat din inbjudan!" +msgid "%1's activity has ended!" +msgstr "%1s aktivitet har avslutats." #: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "%1 har avslutat webbkamerasessionen!" +msgid "%1's webcam session has failed!" +msgstr "%1s webbkamerasession har misslyckats." #: notification/chatnotification.cpp:232 -#, fuzzy -msgid "The file transfer with %1 is done!" -msgstr "Filöverföringen med %1 är klar!" +msgid "The file transfer with %1 has failed!" +msgstr "Filöverföringen med %1 har misslyckats." #: notification/chatnotification.cpp:233 -#, fuzzy -msgid "%1's activity has ended!" -msgstr "%1s aktivitet har avslutats!" - -#: notification/chatnotification.cpp:240 -#, fuzzy -msgid "%1's webcam session has failed!" -msgstr "%1s webbkamerasession har misslyckats!" - -#: notification/chatnotification.cpp:241 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "Filöverföringen med %1 har misslyckats!" - -#: notification/chatnotification.cpp:242 -#, fuzzy msgid "%1's activity has ended with an error!" -msgstr "%1s aktivitet har avslutats med ett fel!" +msgstr "%1s aktivitet har avslutats med ett fel." -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" -msgstr "%1 är nu ansluten" +msgid "%1
is now online" +msgstr "%1 är nu ansluten" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" -msgstr "%1 är nu frånvarande" +msgid "%1
has gone away" +msgstr "%1 är nu frånvarande" -#: notification/contactstatusnotification.cpp:72 +#: notification/contactstatusnotification.cpp:93 #, fuzzy -msgid "%1 will be right back" -msgstr "%1 är strax tillbaka" +msgid "%1
will be right back" +msgstr "%1 är strax tillbaka" -#: notification/contactstatusnotification.cpp:73 +#: notification/contactstatusnotification.cpp:94 #, fuzzy -msgid "%1 is now busy" -msgstr "%1 är nu upptagen" +msgid "%1
is now busy" +msgstr "%1 är nu upptagen" -#: notification/contactstatusnotification.cpp:74 +#: notification/contactstatusnotification.cpp:95 #, fuzzy -msgid "%1 has become invisible" -msgstr "%1 har blivit osynlig" +msgid "%1
has become invisible" +msgstr "%1 har blivit osynlig" -#: notification/contactstatusnotification.cpp:75 +#: notification/contactstatusnotification.cpp:96 #, fuzzy -msgid "%1 has gone idle" -msgstr "%1 har blivit inaktiv" +msgid "%1
has gone idle" +msgstr "%1 har blivit overksam" -#: notification/contactstatusnotification.cpp:76 +#: notification/contactstatusnotification.cpp:97 #, fuzzy -msgid "%1 has logged out" -msgstr "%1 har loggat ut" +msgid "%1
has logged out" +msgstr "%1 har loggat ut" -#: notification/contactstatusnotification.cpp:77 +#: notification/contactstatusnotification.cpp:98 #, fuzzy -msgid "%1 is on the phone" -msgstr "%1 pratar i telefon" +msgid "%1
is on the phone" +msgstr "%1 pratar i telefon" -#: notification/contactstatusnotification.cpp:78 +#: notification/contactstatusnotification.cpp:99 #, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 är på lunch" +msgid "%1
is out for lunch" +msgstr "%1 är på lunch" -#: notification/newemailnotification.cpp:78 +#: notification/newemailnotification.cpp:90 #, fuzzy -msgid "New email:
'%1'
by '%2'" -msgstr "Nytt e-post:
'%1'
by '%2'" +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "Ny e-post:
\"%1\"
av \"%2\"" -#: settings/accountpage.cpp:69 -msgid "Browse..." +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Starta ett &möte" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "&Personligt meddelande" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Web Messenger" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Djävul" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "Skicka &e-post" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -#: settings/accountpage.cpp:70 +#: notification/systemtraywidget.cpp:78 #, fuzzy -msgid "Browse and crop picture..." +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Om du stänger huvudfönstret kommer KMess fortsätta att köras i " +"systempanelen. Använd \"Avsluta\" från \"Arkiv\"-menyn för att avsluta " +"programmet." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Docka i systempanelen" + +#: notification/systemtraywidget.cpp:240 +#, fuzzy +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "- %1 (%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "Bläddra..." + +#: settings/accountpage.cpp:81 +#, fuzzy +msgid "Browse and Crop Picture..." msgstr "Bläddra och beskär bild..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." -msgstr "" - -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:82 #, fuzzy +msgid "Set Previous Image..." +msgstr "Ange föregående bild..." + +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" msgstr "Nerladdning av visningsbild misslyckades" -#: settings/accountpage.cpp:507 -#, fuzzy +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" "Ett fel inträffade vid försök att ändra visningsbild.\n" -"Kontrollera så du valt en korrekt bildfil" +"Kontrollera så du valt en befintlig bildfil." -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "Ta bo&rt Kontakt" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Inställningar" # settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, # -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "Konto" # settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, -# -#: settings/accountsettingsdialog.cpp:76 -#, fuzzy +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" -msgstr "Konto" +msgstr "Mitt konto" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Meddelanden" - -# settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "KMess Notifikation" +msgid "Contact List" +msgstr "Kontakter" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Chattar" # rc.cpp:127, no-c-format -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Chattloggning" -#: settings/accountsettingsdialog.cpp:193 -#, fuzzy +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" -msgstr "Kontaktadressen du skrivit in är inte giltig: '%1'" +msgstr "" +"E-postadressen du har angivit är inte giltig och kan inte används som ett " +"konto: \"%1\"" -#: settings/accountsettingsdialog.cpp:201 -#, fuzzy +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" -msgstr "Kontaktadressen du skrivit in är inte giltig: '%1'" +msgstr "E-postadressen du har angivit används redan: \"%1\"" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Är du säker på att du vill ta bort det här kontot?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." -msgstr "Är du säker på att du vill ta bort det här kontot?" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "" +"Är du säker på att du vill ta bort kontot \"%1\"?
Alla inställningar för " +"kontot kommer att försvinna." -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "Hej, hur mår du? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" -msgstr "" +msgstr "Sandra" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "Bra!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "Jag kom /precis/ tillbaka från min semester i Italien!" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 #, fuzzy +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "Ogiltig kommandoparameter" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "Ersätt befintlig uttryckssymbol" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Är du säker på att du vill ta bort det här kontot?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "Redigera uttryckssymbol" + +#: settings/globalsettingsdialog.cpp:46 msgid "KMess Settings" -msgstr "Inställningar" +msgstr "KMess-inställningar" # settings/settingsdialog.cpp:80 settings/accountswidget.cpp:97 rc.cpp:85, -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Konton" # settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" -msgstr "E-postnotifikation" +msgid "Notifications" +msgstr "Meddelande" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." -msgstr "" +msgstr "Inga valbara webbläsare identifierade." -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." -msgstr "" +#: settings/miscellaneouspage.cpp:101 +#, fuzzy +msgid "No selectable email clients detected." +msgstr "Inga valbara e-postklienter identifierade." -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" -msgstr "" +#: settings/miscellaneouspage.cpp:286 +#, fuzzy +msgid "You have to specify a console command to launch a custom browser!" +msgstr "Du måste välja ett kommando som ska köras som egen webbläsare." -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" -msgstr "" +#: settings/miscellaneouspage.cpp:316 +#, fuzzy +msgid "You have to specify a console command to launch a custom email client!" +msgstr "Du måste välja ett kommando som ska köras som egen e-postklient." -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" -msgstr "" +msgstr "Du måste välja en katalog för mottagna filer." # settings/chatloggingwidget.cpp:120 rc.cpp:133, no-c-format -#: settings/miscellaneouspage.cpp:404 -#, fuzzy +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" -msgstr "Spara chattfiler i följande katalog:" +msgstr "Välj filkatalog" -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." -msgstr "" -"Att stänga huvudfönstret kommer hålla KMess körandes i systempanelen. Använd " -"'Avsluta' från 'Arkiv'-menyn för att avsluta applikationen." - -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Docka i Systempanelen" - -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 -msgid "- %1 (%2)" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." msgstr "" +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +#, fuzzy +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" +"E-postadressen du har angivit är inte giltig och kan inte används som ett " +"konto: \"%1\"" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Kontakthändelser" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Välj en uttryckssymbol och klicka här för att ta bort den." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "Meddelandet \"%1\" kunde inte skickas." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "Meddelandet \"%1\" kunde inte skickas." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "Meddelandet \"%1\" kunde inte skickas." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "Meddelandet \"%1\" kunde inte skickas." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Använd" + +#~ msgid "&Copy..." +#~ msgstr "&Kopiera.." + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Infoga ny" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "E-postadress:" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "Klient: %1" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Blockerad" + +#~ msgctxt "Last time the contact was seen online" +#~ msgid "Last seen: %1" +#~ msgstr "Senast sedd: %1" + +#~ msgctxt "Last time a message was received" +#~ msgid "Last message: %1" +#~ msgstr "Senaste meddelande: %1" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "Kontakthändelser" + +#~ msgid "&Show winks from contacts" +#~ msgstr "Vi&sa blinkningar från kontakter" + +#~ msgid "Enable in the contact list" +#~ msgstr "Aktivera i kontaktlistan" + +#~ msgid "Enable in the chat windows" +#~ msgstr "Aktivera i chattfönster" + +#~ msgid "Alerts" +#~ msgstr "Meddelanden" + +# settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, +#~ msgid "Alerts and Notifications" +#~ msgstr "Meddelanden" + +#~ msgid "Optionally, you can choose the group where to place the new contact" +#~ msgstr "Du kan välja gruppen där den nya kontakten ska placeras" + +#~ msgid "KSqueezedTextLabel" +#~ msgstr "KSqueezedTextLabel" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Ingen grupp" + +#, fuzzy +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "KMess kunde inte nå webbtjänsten.
Detaljer: %1" + +#, fuzzy +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "Autentisering misslyckades, KMess kunde inte bearbeta " +#~ "passportinloggningen.
Detaljer: %1" + +#~ msgid "Size pen" +#~ msgstr "Pennstorlek" + +#~ msgid "" +#~ "\n" +#~ " \n" +#~ "
\n" +#~ "
\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::RichText\n" +#~ " \n" +#~ " \n" +#~ " true\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Vertical\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Vertical\n" +#~ " \n" +#~ " \n" +#~ " QSizePolicy::Minimum\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " 250\n" +#~ " 10\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Horizontal\n" +#~ " \n" +#~ " \n" +#~ " QSizePolicy::Expanding\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " 10\n" +#~ " 20\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Groups:" +#~ msgstr "" +#~ "\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::RichText\n" +#~ " \n" +#~ " \n" +#~ " true\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Vertical\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Vertical\n" +#~ " \n" +#~ " \n" +#~ " QSizePolicy::Minimum\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " 250\n" +#~ " 10\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Qt::Horizontal\n" +#~ " \n" +#~ " \n" +#~ " QSizePolicy::Expanding\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " 10\n" +#~ " 20\n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " \n" +#~ " Grupper:" + +#~ msgid "" +#~ "Groups:\n" +#~ " " +#~ msgstr "" +#~ "Grupper:\n" +#~ " " + +#~ msgid "More options..." +#~ msgstr "Fler alternativ..." + +#~ msgid " Account options " +#~ msgstr " Kontoinställningar" + +# initialviewinterface.cpp:223 rc.cpp:13, no-c-format +#~ msgid "Remem&ber this profile" +#~ msgstr "Kom ihå&g den här profilen" + +#~ msgid "Also r&emember the password" +#~ msgstr "Kom också ihåg lös&enordet" + +#~ msgid "Enter your personal message here" +#~ msgstr "Ange ditt personliga meddelande här" + +#~ msgid "Click" +#~ msgstr "Klicka" + +# settings/settingsdialog.cpp:85 settings/emailwidget.cpp:111 rc.cpp:216, +#~ msgid "Popup Notifications" +#~ msgstr "Popuppmeddelanden" + +# settings/alertswidget.cpp:114 rc.cpp:124, no-c-format +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Visa meddelanden när dina kontakter:" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "" +#~ "Om aktiverad, kommer ett popupmeddelande visas när en av dina kontakter " +#~ "ansluter till MSN." + +#~ msgid "&Go online" +#~ msgstr "&Ansluter" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "" +#~ "Om aktiverad, kommer ett popupmeddelande visas när en av dina kontakter " +#~ "startar en konversation med dig." + +#~ msgid "Start a &chat with you" +#~ msgstr "Startar en &chatt med dig" + +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "" +#~ "Om aktiverad, ett popupmeddelande visas varje gång en av dina kontakter " +#~ "skickar ett meddelande till dig." + +#~ msgid "S&end you a message" +#~ msgstr "Skickar ett m&eddelande till dig" + +#~ msgid "" +#~ "If enabled, a popup message is also shown when your contacts change their " +#~ "MSN status." +#~ msgstr "" +#~ "Om aktiverad, ett popupmeddelande visas också när dina kontakter ändrar " +#~ "sin MSN-status." + +#~ msgid "Change their &status" +#~ msgstr "Ändrar deras &status" + +#~ msgid "" +#~ "If enabled, a popup message is also shown when one of your contacts goes " +#~ "offline." +#~ msgstr "" +#~ "Om aktiverad, ett popupmeddelande visas också när en av dina kontakter " +#~ "kopplar ifrån." + +#~ msgid "Go o&ffline" +#~ msgstr "Kopplar i&från" + +# initialviewinterface.cpp:235 rc.cpp:20, no-c-format +#~ msgid "Email Events" +#~ msgstr "E-posthändelser" + +# settings/emailwidget.cpp:113 rc.cpp:222, no-c-format +#~ msgid "Show notifications when email is received:" +#~ msgstr "Visa meddelande när e-post tas emot:" + +#~ msgid "In the Inbox" +#~ msgstr "I inkorgen" + +#~ msgid "" +#~ "If enabled, a popup message also appears when e-mail is received in other " +#~ "folders. This option is only available for Hotmail accounts." +#~ msgstr "" +#~ "Om aktiverad, kommer ett popupmeddelande också visas när e-post tas emot " +#~ "i andra mappar. Det här alternativet är bara tillgängligt för Hotmail-" +#~ "konton." + +#~ msgid "In other folders" +#~ msgstr "I andra mappar" + +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "Kontrollerar antalet sekunder innan popupmeddelanden döljs." + +# settings/alertswidget.cpp:112 rc.cpp:118, no-c-format +#~ msgid "Hide popups after" +#~ msgstr "Dölj popups efter" + +# settings/alertswidget.cpp:113 rc.cpp:121, no-c-format +#~ msgid "seconds" +#~ msgstr "sekunder" + +#~ msgid "Other Alerts" +#~ msgstr "Andra händelser" + +#~ msgid "" +#~ "If enabled, chat conversations will be saved in a specified directory." +#~ msgstr "" +#~ "Om aktiverad, kommer chattkonversationer att sparas i en specifik katalog." + +# settings/chatloggingwidget.cpp:119 rc.cpp:130, no-c-format +#~ msgid "Log &all chats" +#~ msgstr "Logga &alla chattar" + +#~ msgid "" +#~ "KMess automatically creates subdirectories when you choose the organize " +#~ "the chat folder by year, month or day." +#~ msgstr "" +#~ "KMess skapar automatiskt underkataloger när du väljer att organisera " +#~ "chattkatalogen efter år, månad eller dag." + +#~ msgid "Log Structure" +#~ msgstr "Loggstruktur" + +# settings/chatloggingwidget.cpp:124 rc.cpp:145, no-c-format +#~ msgid "Month" +#~ msgstr "Månad" + +# settings/chatloggingwidget.cpp:125 rc.cpp:148, no-c-format +#~ msgid "Day" +#~ msgstr "Dag" + +#~ msgid "You received a wink from %1." +#~ msgstr "Du har tagit emot en blinkning från %1." + +#~ msgid "Copy E&mail" +#~ msgstr "Kopiera &e-post" + +#~ msgid "&Help" +#~ msgstr "&Hjälp" + +#~ msgid "&Settings" +#~ msgstr "In&ställningar" + +#~ msgid "Hide Side&bar" +#~ msgstr "D&ölj sidopanel" + +#~ msgid "Hide the contact sidebar" +#~ msgstr "Dölj kontaktpanelen" + +#~ msgid "Close all tabs" +#~ msgstr "Stäng alla flikar" + +#~ msgid "Show the contact sidebar" +#~ msgstr "Visa kontaktpanelen" + +#~ msgid "&Send email" +#~ msgstr "&Skicka e-post" + +#~ msgid "Specify an Away message" +#~ msgstr "Specifiera ett frånvaromeddelande" + +#~ msgid "Email: %1" +#~ msgstr "E-post: %1" + +#~ msgid "Black sheep" +#~ msgstr "Svart får" + +#~ msgid "Soccer ball" +#~ msgstr "Fotboll" + +#~ msgctxt "Clickable label on login screen" +#~ msgid "Less options..." +#~ msgstr "Färre alternativ..." + +#~ msgctxt "Clickable label on login screen" +#~ msgid "More options..." +#~ msgstr "Fler alternativ..." + +#~ msgid "Rename group" +#~ msgstr "Byt namn på grupp" + +#~ msgid "Search in Contact List" +#~ msgstr "Sök i kontaktlistan" + +#~ msgid "Account &Settings" +#~ msgstr "Kontoin&ställningar" + +#~ msgid "Co&nnect" +#~ msgstr "A&nslut" + +#~ msgid "Now listening to %1" +#~ msgstr "Lyssnar nu på %1" + +#~ msgid "&Listening Music" +#~ msgstr "&Lyssna på musik" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "E-post: %1" + +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Vill du acceptera filen: %1 (%2)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "Överföringen avbröts" + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Lyckades överföra filen: %1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "Överföringen av %1 misslyckades. Filen finns inte." + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "Överföringen av %1 misslyckades. Kunde inte läsa filen." + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "Överföringen av %1 avbröts." + +#~ msgid "Got synchronization" +#~ msgstr "Fick synkronisering" + +#~ msgid "Contact is in the opposite list" +#~ msgstr "Kontakten finns i motsvarande lista" + +#~ msgid "The group name is too long" +#~ msgstr "Gruppnamnet är för långt" + +#~ msgid "No permissions given for this account" +#~ msgstr "Inga behörigheter angivna för det här kontot" + +#~ msgid "Lost reference to SOAP client" +#~ msgstr "Förlorade referens till SOAP-klient" + +#~ msgctxt "Server error dialog box" +#~ msgid "

MSN server message

%1

" +#~ msgstr "

MSN-servermeddelande

%1

" + +#~ msgctxt "Server-reported client error dialog box" +#~ msgid "

Internal error in KMess

%1

" +#~ msgstr "

Internt fel i KMess

%1

" + +#~ msgid "SSL Error" +#~ msgstr "SSL-fel" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Personen är frånkopplad eller osynlig." + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "" +#~ "Kontakten initierade en MSN7-funktion som KMess inte kan hantera ännu." + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "Meddelandet \"%1\" mottogs inte." + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "Kunde inte skapa en ansluting: %1" + +#~ msgid "Unable to parse SOAP response" +#~ msgstr "Kunde inte behandla SOAP-svar" + #~ msgid "Click to send an email to this contact." #~ msgstr "Klicka för att skicka ett e-postmeddelande till den här kontakten." #~ msgid "Picture:" #~ msgstr "Bild:" -# settings/emailwidget.cpp:112 rc.cpp:219, no-c-format -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "Visa e-postinformation" - #~ msgid "Logging in..." #~ msgstr "Loggar in..." @@ -4306,10 +6573,6 @@ msgstr "" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "Du har %1 nya e-postmeddelanden i din inkorg." -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "Anslut" - #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "Överföringen av %1 misslyckades. Kunde inte öppna fil" @@ -4335,13 +6598,6 @@ msgstr "" #~ msgid "Your password:" #~ msgstr "Ditt lösenord:" -#~ msgid "Display picture:" -#~ msgstr "Visningsbild:" - -# settings/imagewidgetinterface.cpp:104 rc.cpp:228, no-c-format -#~ msgid "Don't show a displa&y picture" -#~ msgstr "Visa inte en visningsbild" - #~ msgid "Status to set at login:" #~ msgstr "Status att sätta vid inloggning:" diff --git a/po/th.po b/po/th.po index 95d9156..44e9332 100644 --- a/po/th.po +++ b/po/th.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: th\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2003-02-11 11:29+0700\n" "Last-Translator: Rachan Hongpairote \n" "Language-Team: THAI \n" @@ -16,83 +16,186 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 0.9.6\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 #, fuzzy +msgid "Standard text mode" +msgstr "การ์ตูนไอคอนแสดงอารมณ์" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "แสดงเวลาบนข้อความ" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "การ์ตูนไอคอนแสดงอารมณ์" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "การ์ตูนไอคอนแสดงอารมณ์" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "วิงค์" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +#, fuzzy msgid "Ne&w Line" msgstr "บรรทัดใหม่" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 #, fuzzy msgid "S&end" msgstr "ส่ง" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 #, fuzzy -msgid "Contacts" -msgstr "ผู้ติดต่อ" +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&สนทนา" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "แสดง/ซ่อน &แถบผู้ติดต่อ" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "ยกเลิกแท็บ" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "เปลี่ยนสีฟ&อนต์" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "เ&ปลี่ยนชื่อกลุ่ม" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 #, fuzzy msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "ใส่อีเมล์ของบุคคลที่ต้องการจะเพิ่ม: " -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Email address" +msgid "Email address:" msgstr "อีเมล์:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 #, fuzzy -msgid "Initial group" -msgstr "เ&ปลี่ยนชื่อกลุ่ม" +msgid "Enter a shortcut for the emoticon:" +msgstr "บันทึกชื่อใหม่สำหรับกลุ่มนี้: " -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -100,720 +203,1235 @@ msgstr "" "บันทึกข้อความที่ซึ่งจะถูกส่งโดยอัตโนมัติ \n" "ถึงคนที่พยายามส่งข้อความถึงคุณ" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 #, fuzzy -msgid "&Automatic away message" +msgid "&Specify an automatic away message:" msgstr "เจาะจงข้อความเมื่อไม่อยู่" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "ค้น&หารายชื่อ" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "เข้าสู่วงสนทนา" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "to" +msgstr "อัตโนมัติ" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "เริ่ม หรือ หยุด การสนทนา" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "ไม่เพิ่มผู้ติดต่อ แต่ให้เห็นสถานะออนไลน์" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "บล๊อคคนนี้จากผู้ติดต่อที่คุณเห็นในสถานะออนไลน์" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "คุณสมบัติคอนเท็กท์สำหรับ %1" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +#, fuzzy msgid "&Information" +msgstr "แสดงข้อมูลอีเมล์ในรายชื่อผู้ติดต่อ" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 #, fuzzy -msgid "Restore" +msgid "&Restore" msgstr "เอาออก" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Use alternative name for this person" +msgid "&Groups:" +msgstr "กลุ่ม" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" msgstr "เลือกชื่อสำหรับบุคคลนี้" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 #, fuzzy -msgid "Show a popup when the contact goes online/offline" +msgid "Show a &popup when the contact goes online/offline" msgstr "แสดงหน้าต่างป๊อปอัพเมื่อบุคคลนี้ออนไลน์หรือออฟไลน์" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "เสียง: " -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "แสดงรูปภาพ" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 #, fuzzy msgid "&Clear Cache" msgstr "ยกเลิกแท็บ" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 #, fuzzy -msgid "Notes" +msgid "&Notes" msgstr "โน้ต" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "ไอคอนแสดงอารมณ์" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +#, fuzzy +msgid "Remo&ve" +msgstr "เอาออก" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "&ผู้ติดต่อรับอนุญาต" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "ผู้ติดต่อ" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "การเชื่อมต่อไปยัง %1, พอร์ต %2" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +#, fuzzy +msgid "Format" +msgstr "แพะ" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "ผู้ติดต่อ" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +#, fuzzy +msgid "Select All" +msgstr "เลือกทั้งหมด" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +#, fuzzy +msgid "Deselect All" +msgstr "เลือกทั้งหมด" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "สับสน" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "หน้าต่างเน็ทเวิร์ก" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +#, fuzzy msgid "Command to Current Tab" -msgstr "" +msgstr "ปิดแท็บ" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 #, fuzzy msgid "Standard" msgstr "ดาว" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "ส่ง" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "อีเมล์:" +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "ล้างออก" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "สับสน" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "ใส่อีเมล์ของบุคคลที่ต้องการจะเพิ่ม: " + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "รหัสผ่าน:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 -#, fuzzy -msgid " Account options " -msgstr "&ตั้งค่าเอคเค้าท์" +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "" + +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 #, fuzzy -msgid "Remem&ber this profile" +msgid "Remem&ber account" msgstr "จดจำข้อมูลโปรไฟล์นี้ไว้" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "รหัสผ่าน:" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&เชื่อมต่อ" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 #, fuzzy -msgid "Enter your personal message here" -msgstr "(ใส่ข้อความที่นี่)" +msgid "New Account" +msgstr "&เอคเค้าท์ใหม่" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&เชื่อมต่อ" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "เ&อคชั่น" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "แพะ" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "เอคเค้าท์" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr "&ตั้งค่าเอคเค้าท์" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +msgid "Enter the name other contacts should see when you are online." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "ชื่อเล่น: " -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "อีเมล์:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "รหัสผ่าน:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "รหัสผ่าน:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 #, fuzzy msgid "Display Picture" msgstr "แสดงรูปภาพ" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 +#, fuzzy msgid "C&hange..." -msgstr "" +msgstr "เ&ชื้อเชิญ" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 +#, fuzzy msgid "Re&member the settings of this account" -msgstr "" +msgstr "จดจำข้อมูลโปรไฟล์นี้ไว้" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "การเข้าสู่ระบบด้วยเอคเค้าท์นี้ จะทำโดยอัตโนมัติเมื่อเรียกโปรแกรม" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "บันทึกทุกการสนทนา" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 +#, fuzzy msgid "Register new account" -msgstr "" +msgstr "จดจำข้อมูลโปรไฟล์นี้ไว้" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "เปลี่ยนสถานะเป็น ว่าง - ไม่อยู่หน้าคอมฯ เมื่อไม่แอคทีฟ" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +#, fuzzy +msgid "Become idle after" +msgstr "เปลี่ยนเป็นว่างหลังจาก " + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "นาที" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 #, fuzzy msgid "Saved accounts:" msgstr "เอคเค้าท์" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -#, fuzzy -msgid "Click" -msgstr "(บล๊อค)" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." +msgid "&Add Account..." msgstr "เอคเค้าท์" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +msgid "Select an account and click here to modify it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "เอาออก" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "อีเมล์แจ้งเตือน" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "เข้าสู่วงสนทนา" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "ส่&งไฟล์" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "บันทึกการสนทนา" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "ปี" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "บันทึกทุกการสนทนาในไดเรคทอรี่หลัก" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "บันทึกทุกการสนทนาในไดเรคทอรี่หลัก" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "บันทึกการสนทนาในไดเรคทอรี่: " + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "รูปแบบข้อความสนทนา" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "กำหนดค่า" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "ค้น&หารายชื่อ" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "แสดง&ไอคอนแสดงอารมณ์" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "แสดง&ไอคอนแสดงอารมณ์" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "แสดงเวลาบนข้อความ" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "ผู้ติดต่อ" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "Show notifications when your contacts:" -msgstr "แสดงบอกเมื่อผู้ติดต่อออฟไลน์" +msgid "Show s&econds" +msgstr "แสดง&ไอคอนแสดงอารมณ์" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +#, fuzzy +msgid "&Text" +msgstr "ก๊อปปี้ข้อความเท็กซ์" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +#, fuzzy +msgid "Your &message font:" +msgstr "ฟอนต์ของข้อความ: " + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 #, fuzzy -msgid "&Go online" -msgstr "ออฟไลน์" +msgid "&Force messages from your contacts to use this font:" +msgstr "บังคับข้อความของผู้ติดต่อให้ใช้ฟอนต์: " -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "ยกเลิกแท็บ" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -#, fuzzy -msgid "S&end you a message" -msgstr "เจาะจงข้อความหากไม่อยู่" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -#, fuzzy -msgid "Go o&ffline" -msgstr "ออฟไลน์" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "อีเมล์:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "แสดงการเตือนเมื่อได้รับอีเมล์" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "ซ่อนหน้าต่างหลังจาก" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "วินาที" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "แจ้งเตือน" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "แสดงรายชื่อที่ออฟไลน์" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -823,1126 +1441,1413 @@ msgid "" "window with the first nudge.

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 -msgid "" -"If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 -msgid "Inform contacts w&hich song I am listening to" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 #, fuzzy -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "เปลี่ยนสถานะเป็น ว่าง - ไม่อยู่หน้าคอมฯ เมื่อไม่แอคทีฟ" +msgid "Display your own &display picture in the chat window" +msgstr "รูปภาพ: " -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 #, fuzzy -msgid "Become idle after" -msgstr "เปลี่ยนเป็นว่างหลังจาก " - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "นาที" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -#, fuzzy -msgid "Log &all chats" -msgstr "บันทึกทุกการสนทนา" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "บันทึกการสนทนาในไดเรคทอรี่: " - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "ปี" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -#, fuzzy -msgid "Month" -msgstr "เดือน" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "วัน" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "บันทึกทุกการสนทนาในไดเรคทอรี่หลัก" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "รูปแบบข้อความสนทนา" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "กำหนดค่า" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "แสดง&ไอคอนแสดงอารมณ์" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "แสดงเวลาบนข้อความ" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 msgid "G&roup chats in the same window:" -msgstr "" +msgstr "รายชื่อผู้ติดต่อ ตอนนี้เต็มแล้ว" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 #, fuzzy msgid "Always" msgstr "ไม่อยู่" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 #, fuzzy msgid "For contacts in the same group" msgstr "รายชื่อผู้ติดต่อ ตอนนี้เต็มแล้ว" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 #, fuzzy msgid "Never" msgstr "น่าเบื่อ" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 #, fuzzy -msgid "Your &message font:" -msgstr "ฟอนต์ของข้อความ: " +msgid "Display Options" +msgstr "รูปภาพ: " -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "บังคับข้อความของผู้ติดต่อให้ใช้ฟอนต์: " +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." +"If enabled, KMess informs contacts what you're listening to. This " +"information is retrieved from the currently active audio player." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "ค้น&หารายชื่อ" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "" + +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "" + +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 #, fuzzy msgid "&Emoticon Themes" msgstr "แสดง&ไอคอนแสดงอารมณ์" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 #, fuzzy msgid "Available emoticon styles:" msgstr "แสดง&ไอคอนแสดงอารมณ์" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 #, fuzzy msgid "&Custom Emoticons" msgstr "การ์ตูนไอคอนแสดงอารมณ์" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 +#, fuzzy msgid "Custom emoticons for this account:" +msgstr "จดจำข้อมูลโปรไฟล์นี้ไว้" + +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "เอคเค้าท์" + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 #, fuzzy msgid "Re&name" msgstr "ชื่อคุณ" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -#, fuzzy -msgid "Remo&ve" -msgstr "เอาออก" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 #, fuzzy msgid "Web Browser" msgstr "กุหลาบแดง" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "เจาะจงข้อความเมื่อไม่อยู่" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "เมล์ไคลเอนต์" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 #, fuzzy msgid "File Transfers" msgstr "ไฟล์ส่งออก" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "บันทึกการสนทนาในไดเรคทอรี่: " -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 #, fuzzy msgid "and" msgstr "เสียใจ" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "ไฟล์ส่งออก" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "ชื่อคุณ" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "ชื่อคุณ" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "ตอนนี้ไม่อยู่หน้าคอมฯ" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "ชื่อคุณ" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "&ลบผู้ติดต่อ" + +#: accountsmanager.cpp:404 +#, fuzzy +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "ง่วงนอน" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "คุณไม่สามารถทำการเชื้อเชิญเพราะว่ามีหลายคอนเท็กท์ในห้องสนทนานี้" -#: chat/chat.cpp:158 +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "%1 เข้าร่วมวงสนทนา" -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "การสนทนาว่างลง, %1 ออกจากการสนทนา" -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "%1 ออกจากการสนทนา" -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr "%1 และ %2 กำลังพิมพ์" -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." msgstr "" -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr "(ข้อความนี้ถูกส่งโดยอัตโนมัติ)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" + +#: chat/chat.cpp:941 #, fuzzy -msgid "You received a wink from %1." +msgid "You have sent a wink" msgstr "คุณได้รับวิงค์จาก %1" -#: chat/chat.cpp:971 +#: chat/chat.cpp:966 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "ไม่สามารถแสดงวิงค์ได้ ให้เช็คว่าได้ติดตั้ง cabextract ไว้เรียบร้อยแล้ว" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr " ออนไลน์" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr " ออนไลน์" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr " ออนไลน์" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr " ออนไลน์" + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." msgstr "ไม่สามารถแสดงวิงค์ได้ เพราะไม่สามารถอ่านข้อมูลได้" -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1220 #, fuzzy -msgid "You have received a wink from %1" -msgstr "คุณได้รับวิงค์จาก %1" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "ไม่สามารถแสดงวิงค์ได้ ให้เช็คว่าได้ติดตั้ง cabextract ไว้เรียบร้อยแล้ว" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1230 #, fuzzy -msgid "You received a nudge from %1!" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "ไม่สามารถแสดงวิงค์ได้ ให้เช็คว่าได้ติดตั้ง cabextract ไว้เรียบร้อยแล้ว" + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "ไม่สามารถแสดงวิงค์ได้ เพราะไม่สามารถอ่านข้อมูลได้" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr " ออนไลน์" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 เข้าร่วมวงสนทนา" + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 เข้าร่วมวงสนทนา" + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr " ออนไลน์" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "&ผู้ติดต่อรับอนุญาต" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." msgstr "คุณได้รับ nudge จาก %1 !" -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1381 #, fuzzy -msgid "The message '%1' could not be sent." +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "คุณได้รับวิงค์จาก %1" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 เข้าร่วมวงสนทนา" + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr " ออนไลน์" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "ไม่สามารถส่งข้อความ '%1'" -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "คุณได้ทำการส่ง nudge ไปให้ %1 !" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "ส่ง nudge" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 กำลังส่งวิงค์ %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 #, fuzzy msgid "%1 says:" msgstr "%1 พูด: " -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "ส่&งไฟล์" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "เพิ่มไอคอนแสดงอารมณ์" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "เ&ชื้อเชิญ" +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "เชื่อมต่อ" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 +#, fuzzy msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "ไม่สามารถทำการบันทึกล็อคไฟล์ กรุณาตรวจสอบสิทธิ์การบันทึกในแฟ้มที่ต้องการเก็บ" -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 +#, fuzzy msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" "ไฟล์ '%1' มีอยู่แล้ว\n" "ต้องการเขียนทับหรือไม่ ?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "เขียนทับไฟล์" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 #, fuzzy msgid "Add this &Emoticon..." msgstr "เพิ่ม&ไอคอนแสดงอารมณ์" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "เพิ่ม&ไอคอนแสดงอารมณ์" + +#: chat/chatview.cpp:833 #, fuzzy msgid "Send &Email" msgstr "&ส่งอีเมล์" -#: chat/chatview.cpp:1286 +#: chat/chatview.cpp:837 #, fuzzy -msgid "Copy E&mail" -msgstr "ก๊อปปี้อีเมล์" +msgid "Add &Contact" +msgstr "&เพิ่มผู้ติดต่อ" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "อีเมล์:" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "เข้าไปที่ลิงก์" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "ก๊อปปี้เอ็ดเดรส" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +#, fuzzy +msgid "&Copy Text" msgstr "ก๊อปปี้ข้อความเท็กซ์" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "เลือกทั้งหมด" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 #, fuzzy -msgid "Save chat to &File" +msgid "C&lear Chat" +msgstr "ยกเลิกแท็บ" + +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "ส่&งไฟล์" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&สนทนา" - -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "ส่&งไฟล์" - -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "เริ่มต้นการประชุม" - -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:108 #, fuzzy -msgid "Send a &Nudge!" -msgstr "ส่ง Nudge !" +msgid "Contacts" +msgstr "ผู้ติดต่อ" -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "บันทึกการสนทนา" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "ไอคอนแสดงอารมณ์" - -#: chat/chatwindow.cpp:498 -#, fuzzy -msgid "Close &All Tabs" -msgstr "ปิดแท็บ" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "กำหนดค่า" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "เริ่ม หรือ หยุด การสนทนา" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "เปลี่ยน&ฟอนต์" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "เปลี่ยนสีฟ&อนต์" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&เชื่อมต่อ" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "เปลี่ยนสีฟ&อนต์" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 #, fuzzy msgid "Emoticons" msgstr "ไอคอนแสดงอารมณ์" -#: chat/chatwindow.cpp:658 +#: chat/chatwindow.cpp:121 #, fuzzy -msgid "My emoticons" +msgid "My Emoticons" msgstr "ไอคอนแสดงอารมณ์ของฉัน" -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "กำหนดค่า" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" -#: chat/chatwindow.cpp:742 +#: chat/chatwindow.cpp:331 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "ปิดแท็บ" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "ปิดแท็บ" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "ปิดแท็บ" + +#: chat/chatwindow.cpp:409 +#, fuzzy +msgid "&Invite..." +msgstr "เ&ชื้อเชิญ" + +#: chat/chatwindow.cpp:410 +#, fuzzy +msgid "Send a &File..." +msgstr "ส่&งไฟล์" + +#: chat/chatwindow.cpp:411 +#, fuzzy +msgid "Webcam Chat" +msgstr "บันทึกการสนทนา" + +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "เริ่มต้นการประชุม" + +#: chat/chatwindow.cpp:413 +#, fuzzy +msgid "Send a &Nudge!" +msgstr "ส่ง Nudge !" + +#: chat/chatwindow.cpp:414 +#, fuzzy +msgid "Save Chat..." +msgstr "บันทึกการสนทนา" + +#: chat/chatwindow.cpp:415 +#, fuzzy +msgid "Close &All Tabs" +msgstr "ปิดแท็บ" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "เปลี่ยน&ฟอนต์" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "เปลี่ยนสีฟ&อนต์" + +#: chat/chatwindow.cpp:428 msgid "Show &Emoticons" msgstr "แสดง&ไอคอนแสดงอารมณ์" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 +#: chat/chatwindow.cpp:429 #, fuzzy -msgid "Hide Side&bar" -msgstr "แสดง/ซ่อน &แถบผู้ติดต่อ" +msgid "Show S&tatus Messages" +msgstr "แสดงเวลาบนข้อความ" -#: chat/chatwindow.cpp:744 +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 #, fuzzy -msgid "Hide &Toolbar" -msgstr "แสดง/ซ่อน &แถบผู้ติดต่อ" +msgid "Meeting" +msgstr "กำหนดค่า" -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "ส่&งไฟล์" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 #, fuzzy -msgid "Hide the contact sidebar" -msgstr "แสดงหรือซ่อนแถบผู้ติดต่อ" +msgid "Enable or disable the contacts panel" +msgstr "ค้น&หารายชื่อ" -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "ผู้ติดต่อ" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "ค้น&หารายชื่อ" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "ไอคอนแสดงอารมณ์" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "ค้น&หารายชื่อ" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "ไอคอนแสดงอารมณ์ของฉัน" + +#: chat/chatwindow.cpp:491 +#, fuzzy +msgid "&Font" +msgstr "&เชื่อมต่อ" + +#: chat/chatwindow.cpp:492 +#, fuzzy +msgid "Font &Color" +msgstr "เปลี่ยนสีฟ&อนต์" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "ยกเลิกแท็บ" + +#: chat/chatwindow.cpp:561 +#, fuzzy +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "เริ่ม หรือ หยุด การสนทนา" + +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" msgstr "" -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "ปิดแท็บ" +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "ปิดแท็บ" +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "แสดง/ซ่อน &แถบผู้ติดต่อ" +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "แสดงหรือซ่อนแถบผู้ติดต่อ" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" -#: chat/chatwindow.cpp:1565 -#, fuzzy -msgid "%1 is typing." -msgstr "%1 กำลังพิมพ์" - -#: chat/chatwindow.cpp:1575 -#, fuzzy -msgid "%1 and %2 are typing." -msgstr "%1 และ %2 กำลังพิมพ์" - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 และ %3 อื่น ๆ กำลังพิมพ์" - -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "สนทนา" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "สนทนา" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr "%1 กำลังพิมพ์" + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr "%1 และ %2 กำลังพิมพ์" + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 และ %3 อื่น ๆ กำลังพิมพ์" + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "เริ่มต้นการประชุม" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" msgstr "&ส่งอีเมล์" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 #, fuzzy msgid "&View Profile" msgstr "&แสดงโปรไฟล์" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "&เพิ่มผู้ติดต่อ" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 #, fuzzy msgid "A&llow Contact" msgstr "&ผู้ติดต่อรับอนุญาต" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 #, fuzzy msgid "&Delete Contact" msgstr "&ลบผู้ติดต่อ" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "&บล๊อคผู้ติดต่อ" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "&ยกเลิกการบล๊อคผู้ติดต่อ" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 #, fuzzy msgid "&Friendly Name" msgstr "ชื่อเล่น: " -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 #, fuzzy msgid "&Email Address" msgstr "อีเมล์:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" msgstr "ก๊อปปี้" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 #, fuzzy msgid "Blocked" msgstr "(บล๊อค)" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "เพิ่มผู้ติดต่อ" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "เพิ่มไอคอนแสดงอารมณ์" +msgid "Add New" +msgstr "เอคเค้าท์" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 #, fuzzy msgid "Remove" msgstr "เอาออก" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 msgid "Web Messenger" msgstr "" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 msgid "Windows Live Messenger %1" msgstr "" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +msgid "Windows Live Messenger compatible" +msgstr "" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "ออนไลน์" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "ออฟไลน์" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "อนุญาต" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "เอาออก" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 และ %2 กำลังพิมพ์" - -#: contactlistviewdelegate.cpp:150 -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "ไม่อยู่" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "เดี๋ยวกลับมาใหม่" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "กำลังยุ่ง" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "ไม่แสดง" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "ไม่อยู่" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "ว่าง" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "เดี๋ยวกลับมาใหม่" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "กำลังคุยโทรศัพท์" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "ไปกินข้าว" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "ไม่แสดง" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "ออฟไลน์" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&สถานะ" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "&ยกเลิกการเชื่อมต่อ" + +#: dialogs/addcontactdialog.cpp:49 #, fuzzy msgid "Add a Contact" msgstr "เพิ่มผู้ติดต่อ" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "&ลบกลุ่ม" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 #, fuzzy msgid "Add New Emoticon" msgstr "แสดง&ไอคอนแสดงอารมณ์" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "ไอคอนแสดงอารมณ์" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +#, fuzzy +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "ไอคอนแสดงอารมณ์ \"%1\" มีอยู่แล้ว ต้องการทับหรือไม่?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "เจาะจงข้อความเมื่อไม่อยู่" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "รูปแบบข้อความสนทนา" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "ผิดพลาด ไม่สามารถเปิดไฟล์ " + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "ได้มีการเพิ่มคุณเข้าไปยังรายชื่อผู้ติดต่อ คุณต้องการที่จะ " -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "คุณสมบัติคอนเท็กท์สำหรับ %1" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "เชื่อมต่อ" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "แสดงเวลาบนข้อความ" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "อีเมล์" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "อีเมล์:" -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "เมล์ไคลเอนต์" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "ผู้ติดต่อ" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "ผู้ติดต่อ" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "คุณสมบัติคอนเท็กท์สำหรับ %1" + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "การเชื่อมต่อไปยัง %1, พอร์ต %2" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "" + +#: dialogs/listexportdialog.cpp:159 +#, fuzzy +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" +"ไฟล์ '%1' มีอยู่แล้ว\n" +"ต้องการเขียนทับหรือไม่ ?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "ค้น&หารายชื่อ" + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "บันทึกแท็บ" + #: dialogs/networkwindow.cpp:79 #, fuzzy -msgid "S&ave tab" -msgstr "บันทึกแท็บ" +msgid "C&lear Tab" +msgstr "ยกเลิกแท็บ" #: dialogs/networkwindow.cpp:80 #, fuzzy -msgid "C&lear tab" -msgstr "ยกเลิกแท็บ" +msgid "C&lose All Tabs" +msgstr "ปิดแท็บ" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 #, fuzzy msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "ไม่มีการเชื่อมต่อในขณะนี้ ไม่สามารถเปิดหน้าต่างเน็ทเวิร์กได้" -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 #, fuzzy msgid "" "Could not save the Network Window log. Make sure you have permission to " @@ -1950,86 +2855,101 @@ msgid "" msgstr "" "ไม่สามารถบันทึกล๊อคไฟล์เกี่ยวกับระบบเน็ทเวิร์กได้ ให้แน่ใจว่าคุณมีสิทธิ์ในการเขียนทับแฟ้มที่กำลังจะบันทึก" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "ไม่สามารถปิดหน้าต่างการเชื่อมต่อหลักได้" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 #, fuzzy msgid "Cannot send commands to this kind of connection!" msgstr "ไม่สามารถปิดหน้าต่างการเชื่อมต่อหลักได้" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "คอมพิวเตอร์" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 #, fuzzy -msgid "Cl&ean Up" -msgstr "ล้างออก" +msgid "&Use" +msgstr "สับสน" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "&ลบผู้ติดต่อ" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "แสดงรูปภาพ" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "แสดงรูปภาพ" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -2037,994 +2957,1502 @@ msgstr "" "ไม่สามารถบันทึกรูปแบบไอคอนแสดงอารมณ์ ให้แน่ใจว่าคุณมีสิทธิ์ในการเขียนทับแฟ้มรูปแบบ (theme) '%" "1'." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 #, fuzzy msgid "Smile" msgstr "ยิ้ม" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "วิงค์" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "แลบลิ้น" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "ยิ้มปากกว้าง" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 #, fuzzy msgid "Sad" msgstr "เสียใจ" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "ร้องไห้" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "โกรธ" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "สับสน" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "เขิน" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 #, fuzzy msgid "Disappointed" msgstr "ยกเลิก" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "น่าเบื่อ" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "ป่วย" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "ประหลาดใจ" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "ปาร์ตี้" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "ง่วงนอน" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "กำลังคิด" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "ห้ามบอกคนอื่น" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 #, fuzzy msgid "Secret telling" msgstr "บอกความลับ" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "กรอกตาไปมา" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "ไม่ทราบ" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 #, fuzzy msgid "Be right back" msgstr "เดี๋ยวกลับมาใหม่" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "นางฟ้า" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "กอด" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "ผู้ชาย" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "หัวใจเต้นแรง" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "กุหลาบแดง" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "หน้าหมา" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 #, fuzzy msgid "Sun" msgstr "อาทิตย์" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "ปีศาจ" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "กอด" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "ผู้หญิง" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "อกหัก" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "หน้าแมว" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "ปากแดง" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 #, fuzzy msgid "Clapping" msgstr "ปรบมือ" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "อัตโนมัติ" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "เครื่องบิน" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "เต่า" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 #, fuzzy msgid "Snail" msgstr "หอยทาก" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "แกะดำ" +#: emoticontheme.cpp:869 +#, fuzzy +msgid "Sheep" +msgstr "ง่วงนอน" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "แพะ" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "ค้างคาวดูดเลือด" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "พิชซ่า" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "ถังเบียร์" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "แก้วมาตินี่" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "แก้วกาแฟ" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "เค้กวันเกิด" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "จาน" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "ถ้วย" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "ดาว" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "รุ้ง" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "เมฆฝน" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "ฟ้าแลบ" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "ร่ม" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "ต้นปาร์มบนเกาะ" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "เครื่องรับโทรศัพท์" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "โทรศัพท์มือถือ" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "อีเมล์" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 #, fuzzy msgid "Clock" msgstr "นาฬิกา" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 #, fuzzy msgid "Camera" msgstr "กล้อง" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "แผ่นฟิมล์" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "โน้ต" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "กุญแจมือ" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 #, fuzzy msgid "Money" msgstr "เงิน" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "หลอดไฟ" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +#, fuzzy +msgid "Cigarette" msgstr "บุหรี่" -#: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "ลูกฟุตบอล" +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "คอมพิวเตอร์" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "ไอคอน KMess" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" -#: initialview.cpp:377 -msgid "Connect" -msgstr "เชื่อมต่อ" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "&ยกเลิกการเชื่อมต่อ" +msgctxt "Button label" +msgid "&Connect" +msgstr "&เชื่อมต่อ" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: kmess.cpp:223 +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "อีเมล์:" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "แสดงข้อมูลอีเมล์ในรายชื่อผู้ติดต่อ" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "&กลุ่มใหม่" -#: kmess.cpp:226 +#: kmess.cpp:253 #, fuzzy -msgid "Add a group" +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "&เพิ่มกลุ่ม" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "บันทึกชื่อใหม่สำหรับกลุ่มนี้: " -#: kmess.cpp:569 +#: kmess.cpp:577 #, fuzzy msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "คุณแน่ใจที่จะทำการลบกลุ่มนี้ ?" -#: kmess.cpp:571 +#: kmess.cpp:579 #, fuzzy -msgid "Remove contact" +msgid "Remove Contact" msgstr "&ลบผู้ติดต่อ" -#: kmess.cpp:573 +#: kmess.cpp:581 #, fuzzy -msgid "Remove and block" +msgid "Remove and Block" msgstr "เอาออกและบล๊อค" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "คุณแน่ใจที่จะทำการลบกลุ่มนี้ของจากรายชื่อ ?" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "เอาออก" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "นี่เป็นกลุ่มพิเศษและไม่สามารถเปลี่ยนแปลงได้" -#: kmess.cpp:671 +#: kmess.cpp:677 #, fuzzy -msgid "Rename group" +msgid "Rename Group" msgstr "เ&ปลี่ยนชื่อกลุ่ม" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "บันทึกชื่อใหม่สำหรับกลุ่มนี้: " + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "การขอ Authentication ไม่สำเร็จ" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "เชื่อมต่อ" + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "ยกเลิกการเชื่อมต่อ" -#: kmess.cpp:1408 -msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" msgstr "" -#: kmess.cpp:1412 +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" +msgid "" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" +msgstr "" + +#: kmess.cpp:1481 #, fuzzy -msgid "Error with notifications" +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "เกิดข้อผิดพลาดกับระบบแจ้งเตือน" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "ไอคอน KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "เ&อคชั่น" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "ผู้ติ&ดต่อใหม่" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "&กลุ่มใหม่" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "ค้น&หารายชื่อ" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "ค้นหาจากสิ่งที่&สนใจ" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "ค้น&หารายชื่อ" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "&เอคเค้าท์ใหม่" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "&ตั้งค่าเอคเค้าท์" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "เชื่อ&มต่อ" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "&ยกเลิกการเชื่อมต่อ" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "แสดง&โปรไฟล์" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&สถานะ" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "แสดงรายชื่อที่อนุญาต" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 #, fuzzy msgid "Show &Offline Contacts" msgstr "แสดงรายชื่อที่ออฟไลน์" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "&แสดงและลบรายชื่อ" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &History Box" +msgstr "รูปแบบข้อความสนทนา" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "แสดง/ซ่อน &แถบผู้ติดต่อ" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "แสดง&ไอคอนแสดงอารมณ์" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "แสดงรูปภาพ" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "&เรียงรายชื่อโดย" + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "แสดงหน้าต่างส่งไฟล์" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "ผู้ติ&ดต่อใหม่" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "&กลุ่มใหม่" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "ค้น&หารายชื่อ" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "ค้น&หารายชื่อ" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "ค้นหาจากสิ่งที่&สนใจ" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "รูปแบบข้อความสนทนา" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "&เอคเค้าท์ใหม่" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "&เอคเค้าท์ใหม่" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "ยิ้ม" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "&เรียงรายชื่อโดย" - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "กลุ่ม" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "ออนไลน์ / ออฟไลน์" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "แสดงหน้าต่างส่งไฟล์" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "แสดงหน้าต่างเน็ทเวิร์ก" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" msgstr "" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" msgstr "" -#: kmessview.cpp:559 +#: kmessview.cpp:590 #, fuzzy msgid "Cha&t" msgstr "สนทนา" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&พรอฟเพอรตี้" -#: kmessview.cpp:569 +#: kmessview.cpp:600 #, fuzzy -msgid "&Remove from group" +msgid "&Remove From Group" msgstr "&ลบออกจากกลุ่ม" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "ส่งไฟล์" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 #, fuzzy msgid "&Copy to Group" msgstr "ย้ายไปยัง&กลุ่ม" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "ย้ายไปยัง&กลุ่ม" -#: kmessview.cpp:646 +#: kmessview.cpp:683 #, fuzzy msgid "Move Group &Down" msgstr "ย้ายไปยัง&กลุ่ม" -#: kmessview.cpp:647 +#: kmessview.cpp:684 #, fuzzy msgid "Move Group &Up" msgstr "ย้ายไปยัง&กลุ่ม" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "&ลบกลุ่ม" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "เ&ปลี่ยนชื่อกลุ่ม" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "อีเมล์" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "อีเมล์:" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "เมล์ไคลเอนต์" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +#: kmessview.cpp:1156 +#, fuzzy +msgid "No" +msgstr "โน้ต" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "(บล๊อค)" + +#: kmessview.cpp:1179 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "" -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "แสดงเวลาบนข้อความ" -#: kmessview.cpp:1085 +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "ผู้ติดต่อ" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "ผู้ติดต่อ" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "ผู้ติดต่อ" +msgstr[1] "ผู้ติดต่อ" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "ผู้ติดต่อ" +msgstr[1] "ผู้ติดต่อ" + +#: kmessview.cpp:1631 #, fuzzy msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "(ใส่ข้อความที่นี่)" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 และ %2 กำลังพิมพ์" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 msgid "Project support" msgstr "" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "นักพัฒนา Gnome Meeting" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 #, fuzzy msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "แปลเป็นภาษาเยอรมัน, ทดสอบ, เอกสาร" -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" msgstr "" -#: main.cpp:81 +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "การ์ตูนไอคอนแสดงอารมณ์" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "รูปแบบเสียงมาตรฐาน" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "แปลเป็นอารบิก" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 #, fuzzy msgid "More Arabic translation" msgstr "แปลเป็นภาษาตุรกี" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "แปลเป็นภาษาบลาซิล โปรตุเกส" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "แปลเป็นภาษาบลาซิล โปรตุเกส" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 #, fuzzy msgid "Catalan translation" msgstr "แปลเป็นคาตาลาน" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 #, fuzzy msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "แปลเป็นจืน" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 #, fuzzy msgid "More Simplified Chinese translation" msgstr "แปลเป็นจืน" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 #, fuzzy msgid "Traditional Chinese translation" msgstr "แปลเป็นภาษาจีน" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "แปลเป็นภาษาจีน" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 #, fuzzy msgid "Danish translation" msgstr "แปลเป็นภาษาเดนมาร์ก" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 #, fuzzy msgid "More Danish translation" msgstr "แปลเป็นภาษาเดนมาร์ก" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "แปลเป็นภาษาดัชท์" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 #, fuzzy msgid "More Dutch translation" msgstr "แปลเป็นภาษาดัชท์" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "แปลเป็นภาษาตุรกี" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "แปลเป็นภาษาฝรั่งเศส" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 #, fuzzy msgid "Estonian translation" msgstr "แปลเป็นภาษาเอสโทเนีย" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 #, fuzzy msgid "Finnish translation" msgstr "แปลเป็นภาษาฟินแลนด์" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 #, fuzzy msgid "More Finnish translation" msgstr "แปลเป็นภาษาฟินแลนด์" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "แปลเป็นภาษาฝรั่งเศส" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 #, fuzzy msgid "More French translation, MSN6 emoticon definitions" msgstr "แปลเป็นภาษาฝรั่งเศส" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 #, fuzzy msgid "More French translation" msgstr "แปลเป็นภาษาฝรั่งเศส" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 #, fuzzy msgid "Hungarian translation" msgstr "แปลเป็นภาษาฮังกาเลี่ยน" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "แปลเป็นภาษาฮังกาเลี่ยน" + +#: main.cpp:115 main.cpp:116 #, fuzzy msgid "More Italian translation" msgstr "แปลเป็นภาษาอิตาเลี่ยน" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 #, fuzzy msgid "Korean translation" msgstr "แปลเป็นภาษาเกาหลี" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 #, fuzzy msgid "Norsk Bokmål translation" msgstr "แปลเป็นภาษา Norsk Bokml" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "แปลเป็นภาษาสโลวาเกีย" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "แปลเป็นภาษาสโลวาเกีย" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 #, fuzzy msgid "Slovenian translation" msgstr "แปลเป็นภาษาสโลวาเกีย" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "แปลเป็นภาษาสเปน" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 #, fuzzy msgid "More Spanish translation" msgstr "แปลเป็นภาษาสเปนอื่น ๆ" -#: main.cpp:123 +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 #, fuzzy msgid "Swedish translation" msgstr "แปลเป็นภาษาสวีเดน" -#: main.cpp:125 -#, fuzzy -msgid "Thai translation" -msgstr "แปลเป็นภาษาไทย" - -#: main.cpp:126 -msgid "Turkish translation" -msgstr "แปลเป็นภาษาตุรกี" - -#: main.cpp:127 main.cpp:128 -#, fuzzy -msgid "More Turkish translation" -msgstr "แปลเป็นภาษาตุรกี" - -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" - -#: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "ไฟล์ส่งออก" +msgid "More Swedish translation" +msgstr "แปลเป็นภาษาสวีเดน" -#: main.cpp:134 -msgid "P4-Context field support" +#: main.cpp:135 +msgid "Rachan Hongpairote" msgstr "" #: main.cpp:135 -msgid "Xinerama fixes" +#, fuzzy +msgid "Thai translation" +msgstr "แปลเป็นภาษาไทย" + +#: main.cpp:136 +msgid "Gorkem Cetin" msgstr "" #: main.cpp:136 -msgid "Original file receive code" -msgstr "ได้รับรหัสไฟล์ต้นฉบับ" +msgid "Turkish translation" +msgstr "แปลเป็นภาษาตุรกี" #: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Barbaros Ulutas" msgstr "" +#: main.cpp:137 main.cpp:138 +#, fuzzy +msgid "More Turkish translation" +msgstr "แปลเป็นภาษาตุรกี" + #: main.cpp:138 -msgid "KWallet support" +msgid "Uğur Çetin" msgstr "" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy -msgid "Various internationalization fixes" -msgstr "แปลเป็นอารบิก" +msgid "Guido Solinas" +msgstr "ออนไลน์" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" #: main.cpp:143 -msgid "Various internationalization fixes." +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "ไฟล์ส่งออก" + +#: main.cpp:144 +msgid "P4-Context field support" msgstr "" #: main.cpp:145 -msgid "GnomeMeeting developer" -msgstr "นักพัฒนา Gnome Meeting" +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "" #: main.cpp:146 -msgid "Guy with a bag over his head" +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "ได้รับรหัสไฟล์ต้นฉบับ" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" msgstr "" #: main.cpp:149 -msgid "Inspiration and assorted code" +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" msgstr "" #: main.cpp:150 -msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" msgstr "" #: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "รูปแบบข้อความสนทนา" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy +msgid "Various internationalization fixes" +msgstr "แปลเป็นอารบิก" + +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 +msgid "Various internationalization fixes." +msgstr "" + +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 +msgid "GnomeMeeting developer" +msgstr "นักพัฒนา Gnome Meeting" + +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 +msgid "Guy with a bag over his head" +msgstr "" + +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 +msgid "Inspiration and assorted code" +msgstr "" + +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 +msgid "Old popup balloons code, initial p2p code, msn challenge handler" +msgstr "" + +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "Your name here?" msgstr "ชื่อคุณที่นี่" -#: main.cpp:156 +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "ชื่อคุณ" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "อีเมล์:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "ล๊อคอินโดยอัตโนมัติด้วยอีเมล์นี้" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "อนุญาต" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "เอาออก" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 #, fuzzy msgid "The contact cancelled the session." msgstr "รายชื่อได้ถูกยกเลิกเซสซั่น" @@ -3046,70 +4474,115 @@ msgstr "คุณได้ทำการยกเลิก" #: network/applications/application.cpp:540 #, fuzzy -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "คุณต้องการให้ ยอมรับ หรือ ยกเลิก?" #: network/applications/application.cpp:581 #, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "คลิ๊กที่ ยกเลิก." -#: network/applications/filetransfer.cpp:134 -#, fuzzy -msgid "Do you want to accept the file: %1 (%2)" -msgstr "คุณต้องการที่จะยอมรับไฟล์: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open file." +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"ไฟล์ '%1' มีอยู่แล้ว\n" +"ต้องการเขียนทับหรือไม่ ?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "การส่งไฟล์ %1 ผิดพลาด ไม่สามารถเปิดไฟล์ " -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "การส่งไฟล์ %1 ผิดพลาด ไม่สามารถเปิดไฟล์ " + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "ยอมรับการส่งไฟล์" -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 #, fuzzy msgid "Connecting to %1, port %2" msgstr "การเชื่อมต่อไปยัง %1, พอร์ต %2" -#: network/applications/filetransfer.cpp:339 +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 #, fuzzy -msgid "The transfer was cancelled" -msgstr "การส่งไฟล์ถูกยกเลิก" +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "ยกเลิกการส่งไฟล์" -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "คุณได้ทำการยกเลิกเซสซั่น" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "คุณได้ทำการยกเลิกเซสซั่น" + +#: network/applications/filetransfer.cpp:490 #, fuzzy msgid "Connection established" msgstr "การเชื่อมต่อได้เริ่มต้น" -#: network/applications/filetransfer.cpp:456 +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 #, fuzzy -msgid "Successfully transferred file: %1" +msgid "Successfully sent file "%1"." msgstr "การส่งไฟล์สำเร็จ" -#: network/applications/filetransfer.cpp:620 +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 #, fuzzy -msgid "The transfer of %1 failed. The file does not exist." -msgstr "การส่งไฟล์ %1 ผิดพลาด ไม่มีไฟล์ " +msgid "Successfully received file "%1"." +msgstr "การส่งไฟล์สำเร็จ" -#: network/applications/filetransfer.cpp:624 +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 #, fuzzy -msgid "The transfer of %1 failed. The file could not be read." -msgstr "เกิดการผิดพลาดในการส่งไฟล์ %1 ไฟล์ไม่สามารถอ่านได้" +msgid "The transfer of file "%1" failed. The file does not exist." +msgstr "การส่งไฟล์ %1 เกิดความผิดพลาด ไม่มีไฟล์นี้อยู่" -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 #, fuzzy -msgid "Sending file %1" -msgstr "กำลังส่งไฟล์ %1" +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "การส่งไฟล์ %1 เกิดความผิดพลาด ไม่สามารถอ่านได้" -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy +msgid "Sending file "%1" (%2)." +msgstr "กำลังส่งไฟล์ %1 (%2)" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "ยกเลิกการส่งไฟล์" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3123,72 +4596,14 @@ msgstr "" "คุณได้มีการเชื่อมต่อ\n" "จากเครื่องอื่นแล้ว" -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"ไฟล์ '%1' มีอยู่แล้ว\n" -"ต้องการเขียนทับหรือไม่ ?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "การส่งไฟล์ %1 ผิดพลาด ไม่สามารถเปิดไฟล์ " - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "ยกเลิกการส่งไฟล์" - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "คุณได้ทำการยกเลิกเซสซั่น" - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "การส่งไฟล์สำเร็จ" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "การส่งไฟล์สำเร็จ" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "การส่งไฟล์ %1 เกิดความผิดพลาด ไม่มีไฟล์นี้อยู่" - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "การส่งไฟล์ %1 เกิดความผิดพลาด ไม่สามารถอ่านได้" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "กำลังส่งไฟล์ %1 (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "ยกเลิกการส่งไฟล์" - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "" @@ -3201,32 +4616,32 @@ msgstr "เริ่ม GnomeMeeting เชื่อมต่อไปยัง msgid "Inviting the contact to a meeting." msgstr "" -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "" -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 #, fuzzy msgid "The invitation was aborted. An internal error occured." msgstr "" "คุณได้มีการเชื่อมต่อ\n" "จากเครื่องอื่นแล้ว" -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 #, fuzzy msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "ผิดพลาด ไม่สามารถสร้างซอคเก็ต" -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "" -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "" @@ -3238,102 +4653,102 @@ msgstr "" msgid "Starting KRDC. Connecting to %1." msgstr "" -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." msgstr "" -#: network/applications/p2papplicationbase.cpp:609 -#, fuzzy -msgid "The transfer failed." -msgstr "การส่งไฟล์ไม่สำเร็จ" - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "" -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "การส่งไฟล์ไม่สำเร็จ" - -#: network/applications/p2papplicationbase.cpp:996 -#, fuzzy -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "การส่งไฟล์ผิดพลาด หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "" - -#: network/applications/p2papplicationbase.cpp:1176 -#, fuzzy -msgid "The transfer failed. Couldn't open data source." -msgstr "การส่งไฟล์ไม่สำเร็จ ไม่สามารถติดต่อ data source" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "" - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "" -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." msgstr "" -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 #, fuzzy msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "การส่งไฟล์ไม่สำเร็จ" -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "" + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "การเชื้อเชิญถูกยกเลิก หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 #, fuzzy msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "การเชื้อเชิญถูกยกเลิก หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "" +#: network/applications/p2papplicationbase.cpp:769 +#, fuzzy +msgid "The transfer failed." +msgstr "การส่งไฟล์ไม่สำเร็จ" + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "การส่งไฟล์ไม่สำเร็จ" + +#: network/applications/p2papplicationbase.cpp:1170 +#, fuzzy +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "การส่งไฟล์ผิดพลาด หมดเวลาในขณะนี้รอยูสเซอร์ยอมรับ" + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "" + +#: network/applications/p2papplicationbase.cpp:1350 +#, fuzzy +msgid "The transfer failed. Couldn't open data source." +msgstr "การส่งไฟล์ไม่สำเร็จ ไม่สามารถติดต่อ data source" + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "" @@ -3364,821 +4779,1480 @@ msgstr "" msgid "Inviting the contact to a voice conversation." msgstr "" -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 #, fuzzy msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr ", ยังไม่ได้ทำการอิมพลีเมนต์" -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "" +"คุณได้มีการเชื่อมต่อ\n" +"จากเครื่องอื่นแล้ว" + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:119 -#, fuzzy -msgid "The transfer of %1 was cancelled." -msgstr "การส่งไฟล์ %1 ถูกยกเลิก" +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 +#: network/extra/msnftpconnection.cpp:204 #, fuzzy -msgid "The transfer of %1 failed. Couldn't open a local port." +msgid "Sending file %1" +msgstr "กำลังส่งไฟล์ %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "ผิดพลาด ไม่สามารถเปิดไฟล์ " -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy msgid "Couldn't open a local port." msgstr "ผิดพลาด ไม่สามารถเปิดไฟล์ " -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "" -#: network/extra/msnftpconnection.cpp:478 +#: network/extra/msnftpconnection.cpp:469 #, fuzzy -msgid "The transfer of %1 failed. A connection could not be made" +msgid "The transfer of %1 failed. A connection could not be made." msgstr "การส่งไฟล์ %1 ไม่สำเร็จ ไม่สามารถทำการเชื่อมต่อได้" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 #, fuzzy msgid "Unable to make a connection." msgstr "ไม่สามารถปิดหน้าต่างการเชื่อมต่อหลักได้" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 #, fuzzy msgid "Receiving file %1" msgstr "กำลังรับไฟล์ %1" -#: network/msnconnection.cpp:589 -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:1317 -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "ทำการซิงโครไนท์" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "การขอ Authentication ไม่สำเร็จ" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -msgid "Authentication failed, please verify your account name and password." -msgstr "" - -#: network/msnnotificationconnection.cpp:1993 -#, fuzzy -msgid "Connecting..." -msgstr "เชื่อมต่อ" - -#: network/msnnotificationconnection.cpp:2167 -msgid "Unknown command received from the server: %1" -msgstr "" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 +#: network/msnconnection.cpp:404 #, fuzzy -msgid "The account name given is invalid" +msgid "The given account name is invalid" msgstr "ชื่อผู้ใช้ที่ให้ ไม่ถูกต้อง" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "รายชื่อผู้ติดต่อ ตอนนี้เต็มแล้ว" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 #, fuzzy msgid "This contact is already on your list" msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 #, fuzzy msgid "This contact is not on your list" msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "" -#: network/msnnotificationconnection.cpp:2251 +#: network/msnconnection.cpp:444 #, fuzzy -msgid "Your contact list has too many groups" +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "รายชื่อผู้ติดต่อ ตอนนี้เต็มแล้ว" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 #, fuzzy msgid "This group can't be changed" msgstr "นี่เป็นกลุ่มพิเศษและไม่สามารถเปลี่ยนแปลงได้" -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "รายชื่อผู้ติดต่อ ตอนนี้เต็มแล้ว" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 #, fuzzy msgid "There was an internal error in KMess: %1" msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "เ&ปลี่ยนชื่อกลุ่ม" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 #, fuzzy msgid "Transfer to switchboard server failed" msgstr "ส่งคำขอไปยังเครื่องเซิร์ฟเวอร์" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -msgid "No permissions given for this account" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "การส่งไฟล์ไม่สำเร็จ" -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" msgstr "" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "คุณได้ทำการยกเลิกเซสซั่น" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 #, fuzzy msgid "Bad friend name" msgstr "ชื่อเล่น: " -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "การขอ Authentication ไม่สำเร็จ" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "" -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" msgstr "" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" -#: network/msnnotificationconnection.cpp:2371 -msgid "Your passport account needs to be verified first." +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." msgstr "" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "ระบบเน็ทเวิร์กของเซิร์ฟเวอร์ล่ม" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 #, fuzzy msgid "The server is going down" msgstr "เซิร์ฟเวอร์กำลังจะล่มในไม่ช้า" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 #, fuzzy msgid "The server is going down soon" msgstr "เซิร์ฟเวอร์กำลังจะล่มในไม่ช้า" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 #, fuzzy msgid "The server is not available" msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "การขอ Authentication ไม่สำเร็จ" -#: network/msnnotificationconnection.cpp:2449 -msgid "Unknown error code received from the server: %1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 +#, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" +msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์" + +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." msgstr "" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "การขอ Authentication ไม่สำเร็จ" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "การขอ Authentication ไม่สำเร็จ" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +#, fuzzy +msgid "Connecting..." +msgstr "เชื่อมต่อ" + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "นาที" msgstr[1] "นาที" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" msgstr "" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -msgid "KMess could not process Offline-IM messages.
Details: %1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "การขอ Authentication ไม่สำเร็จ" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" -#: network/msnnotificationconnection.cpp:3242 -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" msgstr "" -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์" -#: network/msnnotificationconnection.cpp:3302 +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์" +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:681 +#, fuzzy +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "เกิดข้อผิดพลาดกับเซิร์ฟเวอร์ภายใน" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "การเชื่อมต่อหมดเวลา" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 #, fuzzy msgid "1 ping lost" msgstr "กำลังขอรับรายการ" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 #, fuzzy msgid "%1 pings lost" msgstr "กำลังขอรับรายการ" -#: network/msnsockettcp.cpp:387 +#: network/msnsockettcp.cpp:395 #, fuzzy -msgid "The connection to the server was lost." +msgid "The connection to the server was lost" msgstr "ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr " บุคคลนี้ออฟไลน์ หรือไม่แสดงให้เห็น" - -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" msgstr "" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "" + +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:402 #, fuzzy -msgid "The message \"%1\" was not received!" -msgstr "ไม่ได้รับ" +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "" - -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "" - -#: notification/chatnotification.cpp:163 -msgid "In %1's chat: %2" -msgstr "" - -#: notification/chatnotification.cpp:167 -msgid "%1 says:
'%2'" -msgstr "" - -#: notification/chatnotification.cpp:171 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "เซิร์ฟเวอร์ไม่สามารถให้บริการได้" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" msgstr " ออนไลน์" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:158 +#, fuzzy +msgid "%1 says:
'%2'" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:162 +#, fuzzy +msgid "%1 has sent you an offline message:
'%2'" +msgstr " ออนไลน์" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" msgstr "" -#: notification/chatnotification.cpp:183 -msgid "%1:
%2" -msgstr "" +#: notification/chatnotification.cpp:174 +#, fuzzy +msgid "%1:
%2" +msgstr " ออนไลน์" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr " ออนไลน์" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr " ออนไลน์" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr " ออนไลน์" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 msgid "%1 wants to use the webcam!" msgstr "" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr " ออนไลน์" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr " ออนไลน์" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "" "คุณได้มีการเชื่อมต่อ\n" "จากเครื่องอื่นแล้ว" -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "" "คุณได้มีการเชื่อมต่อ\n" "จากเครื่องอื่นแล้ว" -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 msgid "%1's activity has been canceled!" msgstr "" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "" "คุณได้มีการเชื่อมต่อ\n" "จากเครื่องอื่นแล้ว" -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "" "คุณได้มีการเชื่อมต่อ\n" "จากเครื่องอื่นแล้ว" -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr " ออนไลน์" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "" "คุณได้มีการเชื่อมต่อ\n" "จากเครื่องอื่นแล้ว" -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "ส่งต่อ" -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 msgid "%1's activity has ended!" msgstr "" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 msgid "%1's webcam session has failed!" msgstr "" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "ส่งต่อ" -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 msgid "%1's activity has ended with an error!" msgstr "" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" +msgid "%1
is now online" msgstr " ออนไลน์" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" +msgid "%1
has gone away" msgstr " ออนไลน์" -#: notification/contactstatusnotification.cpp:72 -msgid "%1 will be right back" +#: notification/contactstatusnotification.cpp:93 +#, fuzzy +msgid "%1
will be right back" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:94 +#, fuzzy +msgid "%1
is now busy" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:95 +#, fuzzy +msgid "%1
has become invisible" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:96 +#, fuzzy +msgid "%1
has gone idle" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:97 +#, fuzzy +msgid "%1
has logged out" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:98 +#, fuzzy +msgid "%1
is on the phone" +msgstr " ออนไลน์" + +#: notification/contactstatusnotification.cpp:99 +#, fuzzy +msgid "%1
is out for lunch" +msgstr " ออนไลน์" + +#: notification/newemailnotification.cpp:90 +#, fuzzy +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr " ออนไลน์" + +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "เริ่มต้นการประชุม" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "เจาะจงข้อความหากไม่อยู่" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "เจาะจงข้อความหากไม่อยู่" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "ปีศาจ" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "&ส่งอีเมล์" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" msgstr "" -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr " ออนไลน์" - -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr " ออนไลน์" - -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr " ออนไลน์" - -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr " ออนไลน์" - -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr " ออนไลน์" - -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr " ออนไลน์" - -#: notification/newemailnotification.cpp:78 -msgid "New email:
'%1'
by '%2'" +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." msgstr "" -#: settings/accountpage.cpp:69 +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 และ %2 กำลังพิมพ์" + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "" -#: settings/accountpage.cpp:70 -msgid "Browse and crop picture..." +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." msgstr "" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "การดาวน์โหลดรูปภาพไม่สำเร็จ" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "&ลบผู้ติดต่อ" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "กำหนดค่า" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 #, fuzzy msgid "Account" msgstr "เอคเค้าท์" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "เอคเค้าท์" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "แจ้งเตือน" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "อีเมล์แจ้งเตือน" +msgid "Contact List" +msgstr "ผู้ติดต่อ" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "กำลังสนทนา" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "เข้าสู่วงสนทนา" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" msgstr "" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "สวัสดี สบายดีไม๊" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "เยี่ยม" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "ฉันเพิ่งกลับจากพักร้อนในอิตาลี" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "ไอคอนแสดงอารมณ์" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "คุณแน่ใจที่จะลบเอคเค้าท์นี้ ?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "ไอคอนแสดงอารมณ์" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "กำหนดค่า" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "เอคเค้าท์" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "อีเมล์แจ้งเตือน" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "บันทึกการสนทนาในไดเรคทอรี่: " -#: systemtraywidget.cpp:64 +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" +msgstr "" + +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" + +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." msgstr "" -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." msgstr "" -#: systemtraywidget.cpp:245 -msgid "- %1 (%2)" +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." msgstr "" +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "ผู้ติดต่อ" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "ไม่สามารถส่งข้อความ '%1'" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "ไม่สามารถส่งข้อความ '%1'" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "ไม่สามารถส่งข้อความ '%1'" + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "ไม่สามารถส่งข้อความ '%1'" + +#, fuzzy +#~ msgid "Use" +#~ msgstr "สับสน" + +#~ msgid "&Copy..." +#~ msgstr "ก๊อปปี้" + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "เพิ่มไอคอนแสดงอารมณ์" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "อีเมล์:" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "(บล๊อค)" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "ผู้ติดต่อ" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "แสดงรายชื่อที่ออฟไลน์" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "ค้น&หารายชื่อ" + +#~ msgid "Alerts" +#~ msgstr "แจ้งเตือน" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "อีเมล์แจ้งเตือน" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "&ลบกลุ่ม" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "ส่งไฟล์" + +#, fuzzy +#~ msgid "Close all tabs" +#~ msgstr "ปิดแท็บ" + +#~ msgid "&Send email" +#~ msgstr "&ส่งอีเมล์" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "บันทึกการสนทนา" + +#, fuzzy +#~ msgid "C&lose all tabs" +#~ msgstr "ปิดแท็บ" + +#~ msgid "Connect" +#~ msgstr "เชื่อมต่อ" + +#, fuzzy +#~ msgid "Rename group" +#~ msgstr "เ&ปลี่ยนชื่อกลุ่ม" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "&ตั้งค่าเอคเค้าท์" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr " ออนไลน์" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr " ออนไลน์" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr " ออนไลน์" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr " ออนไลน์" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "อีเมล์แจ้งเตือน" + +#, fuzzy +#~ msgid "Show notifications when your contacts:" +#~ msgstr "แสดงบอกเมื่อผู้ติดต่อออฟไลน์" + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "ออฟไลน์" + +#, fuzzy +#~ msgid "S&end you a message" +#~ msgstr "เจาะจงข้อความหากไม่อยู่" + +#, fuzzy +#~ msgid "Go o&ffline" +#~ msgstr "ออฟไลน์" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "อีเมล์:" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "แสดงการเตือนเมื่อได้รับอีเมล์" + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "แจ้งเตือน" + +#~ msgid "Hide popups after" +#~ msgstr "ซ่อนหน้าต่างหลังจาก" + +#~ msgid "seconds" +#~ msgstr "วินาที" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "แจ้งเตือน" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "ผู้ติดต่อ" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "รหัสผ่าน:" + +#, fuzzy +#~ msgid "Log &all chats" +#~ msgstr "บันทึกทุกการสนทนา" + +#, fuzzy +#~ msgid "Month" +#~ msgstr "เดือน" + +#~ msgid "Day" +#~ msgstr "วัน" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "ผู้ติดต่อ" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "ค้น&หารายชื่อ" + +#~ msgid "This person is offline or invisible." +#~ msgstr " บุคคลนี้ออฟไลน์ หรือไม่แสดงให้เห็น" + +#, fuzzy +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "ไม่ได้รับ" + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "แสดง/ซ่อน &แถบผู้ติดต่อ" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "แสดงหรือซ่อนแถบผู้ติดต่อ" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "แสดงหรือซ่อนแถบผู้ติดต่อ" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "เ&ชื้อเชิญ" + +#~ msgid "Black sheep" +#~ msgstr "แกะดำ" + +#, fuzzy +#~ msgid "Copy E&mail" +#~ msgstr "ก๊อปปี้อีเมล์" + +#~ msgid "Specify an Away message" +#~ msgstr "เจาะจงข้อความเมื่อไม่อยู่" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "อีเมล์" + +#~ msgid "Soccer ball" +#~ msgstr "ลูกฟุตบอล" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "อีเมล์" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "เพิ่มผู้ติดต่อไปยังรายการเพื่อนของคุณ" + +#, fuzzy +#~ msgid "Enter your personal message here" +#~ msgstr "(ใส่ข้อความที่นี่)" + +#, fuzzy +#~ msgid "Click" +#~ msgstr "(บล๊อค)" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "หน้าต่างเน็ทเวิร์ก" + +#~ msgid "Co&nnect" +#~ msgstr "เชื่อ&มต่อ" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "&ตั้งค่าเอคเค้าท์" + +#, fuzzy +#~ msgid "You received a wink from %1." +#~ msgstr "คุณได้รับวิงค์จาก %1" + +#~ msgid "Got synchronization" +#~ msgstr "ทำการซิงโครไนท์" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "กำหนดค่า" + +#, fuzzy +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "คุณต้องการที่จะยอมรับไฟล์: %1 (%2)" + +#, fuzzy +#~ msgid "The transfer was cancelled" +#~ msgstr "การส่งไฟล์ถูกยกเลิก" + +#, fuzzy +#~ msgid "Successfully transferred file: %1" +#~ msgstr "การส่งไฟล์สำเร็จ" + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "การส่งไฟล์ %1 ผิดพลาด ไม่มีไฟล์ " + +#, fuzzy +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "เกิดการผิดพลาดในการส่งไฟล์ %1 ไฟล์ไม่สามารถอ่านได้" + +#, fuzzy +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "การส่งไฟล์ %1 ถูกยกเลิก" + #~ msgid "Picture:" #~ msgstr "รูปภาพ: " -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "แสดงข้อมูลอีเมล์ในรายชื่อผู้ติดต่อ" - #~ msgid "Logging in..." #~ msgstr "เข้าสู่ระบบ ..." @@ -4208,10 +6282,6 @@ msgstr "" #~ msgid "You have %1 new emails in your inbox." #~ msgstr " เมล์ใหม่ในกล่องรับเมล์" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "ออนไลน์" - #, fuzzy #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "การส่งไฟล์ %1 เกิดข้อผิดพลาด ไม่สามารถเปิดไฟล์ได้ " @@ -4240,14 +6310,6 @@ msgstr "" #~ msgid "Your password:" #~ msgstr "รหัสผ่าน:" -#, fuzzy -#~ msgid "Display picture:" -#~ msgstr "รูปภาพ: " - -#, fuzzy -#~ msgid "Don't show a displa&y picture" -#~ msgstr "รูปภาพ: " - #, fuzzy #~ msgid "Show notifications when you recei&ve an email" #~ msgstr "แสดงการเตือนเมื่อได้รับอีเมล์" diff --git a/po/tr.po b/po/tr.po index 8505037..d563ee1 100644 --- a/po/tr.po +++ b/po/tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: tr\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2007-11-01 07:01+0200\n" "Last-Translator: Uğur Çetin \n" "Language-Team: Turkish \n" @@ -16,79 +16,188 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "Çizgi Film İfadeleri" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "Kişinizin profiline bakmak için tıklayın." + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "Sohbet mesajlarında &zamanı göster" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "Çizgi Film İfadeleri" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "Ö&zel İfadeler" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "Göz kırpan" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "Kişinizin profiline bakmak için tıklayın." + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" msgstr "Yeni &Satır" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "&Gönder" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "Kişiler" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +#, fuzzy +msgctxt "@title:menu" +msgid "&Chat" +msgstr "&Sohbet Et" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "Kenar Çubuğu" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +#, fuzzy +msgid "Click here to display the menu for this contact" msgstr "Kişinizin profiline bakmak için tıklayın." -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +#, fuzzy +msgid "Click here to open your account settings" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "Sekmeyi temizle" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +#, fuzzy +msgid "&Pen Color" +msgstr "Yazıtipi &Rengini Değiştir" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +#, fuzzy +msgid "Initial groups" +msgstr "Grubu Y&eniden Adlandır" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 #, fuzzy msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "Eklemek istediğiniz kişinin eposta adresini girin:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "E-posta adresi" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 #, fuzzy -msgid "Initial group" -msgstr "Grubu Y&eniden Adlandır" +msgid "Email address:" +msgstr "E-posta adresi:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +#, fuzzy +msgid "Enter a shortcut for the emoticon:" msgstr "Bu ifade için bir kısayol girin:" -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "Bir resim dosyası seçin:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 #, fuzzy msgid "" "Enter a message to be automatically sent to people who try to message you." @@ -96,358 +205,588 @@ msgstr "" "Size ileti göndermek isteyen kişilere\n" "kendiliğinden gönderilecek iletiyi girin:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 #, fuzzy -msgid "&Automatic away message" +msgid "&Specify an automatic away message:" msgstr "Uzakta durumu için ileti belirle" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "&Kişiyi Ara" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "Sohbet Günlüğü" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "to" +msgstr "Otomatik" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "Bir &Görüşme başlat veya bitir" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" msgstr "Bu kişiyi \"Arkadaşlar\" listesine &ekle" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "" "Bu kişiyi ekle&me, ancak benim İnternet'teki durumunu görmesine izin ver" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "" "Bu kişinin benim bağlantı durumumu görmesine ya da benimle bağlantıya " "geçmesine izin verme." -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "%1 için Özellikler" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 -msgid "&Information" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 #, fuzzy -msgid "Restore" +msgid "&Information" +msgstr "E-posta bilgisini göster" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +#, fuzzy +msgid "Click this button to restore the display picture of this contact" +msgstr "Kişinizin profiline bakmak için tıklayın." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +#, fuzzy +msgid "&Restore" msgstr "Silindi" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 #, fuzzy -msgid "Use alternative name for this person" +msgid "&Groups:" +msgstr "Grup" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +#, fuzzy +msgid "Use an &alternative name for this person" msgstr "Bu kişi için seçimlik bir ad girin" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 #, fuzzy -msgid "Show a popup when the contact goes online/offline" +msgid "Show a &popup when the contact goes online/offline" msgstr "" "Bu kişi bağlandığı ya da bağlantısını kopardığı zaman uyarı balonu göster" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +#, fuzzy +msgid "&Sound:" msgstr "Ses:" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "Görüntü Resmi:" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 #, fuzzy msgid "&Clear Cache" msgstr "Sekmeyi temizle" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 #, fuzzy -msgid "Notes" +msgid "&Notes" msgstr "Not" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "İfadeler" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +#, fuzzy +msgid "Click here to delete the selected emoticon" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "&Sil" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "Kişiye İzin &Ver" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +#, fuzzy +msgid "Invite a contact not on your list:" +msgstr "Kişi listenizde yok" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +#, fuzzy +msgid "Invited Contacts" +msgstr "Kişiler" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +#, fuzzy +msgid "Items to export:" +msgstr "Bağlanıyor %1, port %2" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +#, fuzzy +msgid "Format" +msgstr "Keçi" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +#, fuzzy +msgid "Contacts:" +msgstr "Kişiler" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +#, fuzzy +msgid "Select All" +msgstr "Tümünü &Seç" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +#, fuzzy +msgid "Deselect All" +msgstr "Tümünü &Seç" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +#, fuzzy +msgid "Close" +msgstr "Kafası karışık" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "Ağ Penceresi" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 +#, fuzzy msgid "Command to Current Tab" -msgstr "" +msgstr "Sekmeyi kapat" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 #, fuzzy msgid "Standard" msgstr "Yıldız" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 #, fuzzy msgid "Send" msgstr "&Gönder" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "E-posta adresi:" +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +#, fuzzy +msgid "C&lean Up" +msgstr "&Temizle" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +#, fuzzy +msgid "&Close" +msgstr "Kafası karışık" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +#, fuzzy +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "Eklemek istediğiniz kişinin eposta adresini girin:" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 #, fuzzy msgid "Password:" msgstr "Parola" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +#, fuzzy +msgid "Status at login:" msgstr "Girişteki durum" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 +msgid "Choose a status to set when successfully connected." msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 #, fuzzy -msgid " Account options " -msgstr "&Hesap Ayarları" +msgid "If enabled, KMess will save your account" +msgstr "Etkinse KMess otomatik olarak bu hesapla giriş yapar." -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +#, fuzzy +msgid "Remem&ber account" msgstr "Bu hesabı &hatırla" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +#, fuzzy +msgid "R&emember password" +msgstr "Parola" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "&Bağlan" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "Buraya kişisel bir ileti yazın" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +#, fuzzy +msgid "New Account" +msgstr "Yeni &Hesap" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +#, fuzzy +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +#, fuzzy +msgctxt "@title:menu" +msgid "&Connect" +msgstr "&Bağlan" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +#, fuzzy +msgctxt "@title:menu" +msgid "&Actions" +msgstr "&Eylemler" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +#, fuzzy +msgid "Form" +msgstr "Keçi" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "Hesap" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 #, fuzzy msgid "Your Account Information" msgstr "&Hesap Ayarları" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." msgstr "Bağlı olduğunuzda listenizdekilerin görmesini istediğiniz ismi yazın." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 #, fuzzy msgid "&Friendly name:" msgstr "&Takma ad:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +#, fuzzy msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" "MSN Passport hesabınızın e-posta adresini girin. http://register.passport." "com/ adresinden yeni bir hesaba kaydolabilirsiniz" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 #, fuzzy msgid "&Email address:" msgstr "E-posta adresi:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" @@ -455,45 +794,46 @@ msgstr "" "MSN Passport hesabınızın parolasını girin. http://register.passport.com/ " "adresinden yeni bir hesaba kaydolabilirsiniz." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 #, fuzzy msgid "&Password:" msgstr "Parola" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 #, fuzzy -msgid "&Remember Password" +msgid "&Remember password" msgstr "Parola" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "Görüntü Resmi:" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." msgstr "&Değiştir..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." @@ -504,330 +844,645 @@ msgstr "" " Eğer misafir olarak (ör: İnternet kafede) kullanmıyorsanız bunu seçmeniz " "önerilir." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 #, fuzzy msgid "Re&member the settings of this account" msgstr "Bu hesabın ayarlarını hatırla" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "Etkinse KMess otomatik olarak bu hesapla giriş yapar." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" +msgid "Log in &with this account automatically" msgstr "Başlangıçta otomatik olarak bu &hesaba bağlan" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 #, fuzzy msgid "Login &as" msgstr "Bütün sohbetleri &kaydet" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "" + +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 +#, fuzzy +msgid "" +"You can't change your friendly name because your Passport email address is " +"not verified." +msgstr "" +"Görünen adınızı değiştiremezsiniz çünkü e-posta adresiniz doğrulanmamış." + +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 +msgid "Request verification email" +msgstr "Doğrulama e-postası iste" + +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 +msgid "Go to accountservices.passport.net" +msgstr "accountservices.passport.net'e git" + +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 +#, fuzzy +msgid "" +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " "Hotmail account to connect." msgstr "" "MSN Messenger ağına bağlanmak için bir passport hesabızın olması gerekiyor. " "Kullandığınız e-posta adresiyle register.passport.com'dan kaydınızı " "yapabilir veya bağlanmak için Hotmail hesabınızı kullanabilirsiniz." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +#, fuzzy msgid "" -"You can't change your friendly name because your passport e-mail address is " -"not verified." -msgstr "" -"Görünen adınızı değiştiremezsiniz çünkü e-posta adresiniz doğrulanmamış." - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 -msgid "Request verification email" -msgstr "Doğrulama e-postası iste" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 -msgid "https://accountservices.passport.net/" -msgstr "https://accountservices.passport.net/" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 -msgid "Go to accountservices.passport.net" -msgstr "accountservices.passport.net'e git" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 -msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" "MSN Messenger'a bağlanmak için bir e-posta adresini Passport hesabı olarak " "kayıt ettirmelisiniz." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "Yeni hesaba kayıt ol" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "register.passport.com'a git" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +#, fuzzy +msgid "&Status Options" +msgstr "Girişteki durum" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +#, fuzzy +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"Etkinse, birkaç dakika bilgisayar kullanılmadığı zaman durumunuz otomatik " +"olarak \"Uzakta-Boşta\" olarak değiştirilir." + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "Boştayken durumumu otomatik olarak \"&Uzakta-Boşta\" olarak değiştir." + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "" +"KMess'in kaç dakika sonra \"Uzakta-Boşta\" durumuna geçeceğini belirler." + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "Şu kadar zaman sonra boşta konumuna geç:" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "dakika" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 #, fuzzy msgid "Saved accounts:" msgstr "Hesaplar" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "Tıkla" +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "Özel bir ifade eklemek için buraya tıklayın." - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 #, fuzzy -msgid "&Add account..." +msgid "&Add Account..." msgstr "Hesap" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" msgstr "Bir ifade seçin ve silmek için buraya tıklayın." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +#, fuzzy +msgid "Select an account and click here to delete it" +msgstr "Bir ifade seçin ve silmek için buraya tıklayın." + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 #, fuzzy msgid "&Remove" msgstr "Silindi" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "Açılır bildirimler" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 #, fuzzy -msgid "Contact Events" +msgid "Enable chat logging" +msgstr "Sohbet Günlüğü" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +#, fuzzy +msgid "Save chats to file" +msgstr "Sohbeti &Dosyaya Kaydet" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "Sohbeti Kaydet" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +#, fuzzy +msgid "Create a directory to organize chats by year" +msgstr "Sohbet kayıtlarının neye göre düzenleneceğini seçin." + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "Yıl" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +#, fuzzy +msgid "Create directories to organize chats by year then by month" +msgstr "Sohbet kayıtlarının neye göre düzenleneceğini seçin." + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +#, fuzzy +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "Sohbet kayıtlarının neye göre düzenleneceğini seçin." + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "Bütün konuşmaları ana dizine kaydet" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "Sohbet kayıtlarının duracağı dizini seçin." + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "Sohbetleri bu dizine kaydet:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "" +"KMess'in tüm sohbet mesajlarını gösterirken kullandığı temayı değiştirmenizi " +"sağlar." + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "Sohbet stili:" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +#, fuzzy +msgid "Chat Settings" +msgstr "Ayarlar" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "Sohbetlerde ifadelerin görünmesine izin verir." + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +#, fuzzy +msgid "&Show emoticons" +msgstr "İfadelerimi &Göster" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "İfadelerimi &Göster" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +#, fuzzy +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"Bu seçenek aynı kişiden gelen mesajların gruplanmasını sağlar. Kişi bir şeyi " +"anlatmak için birden fazla ard arda mesaj yazdığında KMess bunları tek " +"mesajmış gibi gösterir. Görünüş seçili sohbet biçimine göre değişebilir." + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "Aynı kişiden ard arda gelen mesajları &grupla" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "Her mesajın yanında zamanın görünmesini sağlar." + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "Sohbet mesajlarında &zamanı göster" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "Kişiler" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "Kişiler bu durumda olduğunda bildirim göster:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 -msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." -msgstr "Etkinse, kişileriniz MSN'e bağlandığında uyarı penceresi çıkar." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 #, fuzzy -msgid "&Go online" -msgstr "Çe&vrimdışı olduklarında" +msgid "Show s&econds" +msgstr "İfadelerimi &Göster" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "" -"Etkinse, kişileriniz sizinle sohbet başlattığında uyarı penceresi çıkar." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "Sizinle &sohbet başlatıldığında" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "" -"Etkinse, kişileriniz size her ileti yolladığında uyarı penceresi çıkar." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "Size ileti &gönerildiğinde" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "" -"Etkinse, kişileriniz durumlarını değiştirdiklerinde uyarı penceresi çıkar." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "&Durumlarını değiştirdiklerinde" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "Etkinse, kişileriniz bağlantıyı kestiğinde uyarı penceresi çıkar." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "Çe&vrimdışı olduklarında" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 #, fuzzy -msgid "Email Events" -msgstr "E-posta adresi" +msgid "&Text" +msgstr "&Yazıyı Kopyala" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "Bu sohbet mesajlarınızın yazı tipi ve rengidir." + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 #, fuzzy -msgid "Show notifications when email is received:" -msgstr "\"diğer dizinlerde\" bir eposta alındığında bildirim göster" +msgid "Your &message font:" +msgstr "İleti yazıtipiniz:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." msgstr "" -"Etkinse, diğer dizinlere gelen e-postalar için de uyarı penceresi " -"gösterilir. Bu seçenek sadece Hotmail hesapları için geçerlidir." +"Aşağıda seçtiğiniz yazıtipi biçimi ve rengi kişinizin seçtiğinin yerine " +"kullanılır." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "Kişinin iletilerinde bu yazı tipinin kullanmasını zorla:" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "Sekmeyi temizle" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +#, fuzzy +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"Yazıtipi efektleri kullanmayı aktif eder. *koyu*, /italik/, ve _altı çizili_ " +"şeklinde yazmayı etkinleştir." + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +#, fuzzy +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "" +"Mesajlarda &yazıtipi efektleri kullan, ör: *koyu*, /italik/, ve _altı çizili_" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "Uyarı penceresinin ne kadar süre sonra gizleneceğini belirler." +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "Uyarı pencerelerini gizleme süresi" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "saniye" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "Uyarılar" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "Bağlı &olmayanları göster" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -843,1127 +1498,1414 @@ msgstr "" "anda sürekli titreme gönderse bile KMess pencereyi bir kez sallayacaktır." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" msgstr "Bir titreme alındığında ve gönderildiğinde sohbet &penceresini salla" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "Resim &gösterme" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "Bağlantı listenizde çok fazla grup var" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +#, fuzzy +msgid "Always" +msgstr "Uzakta" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +#, fuzzy +msgid "For contacts in the same group" +msgstr "Bağlantı listenizde çok fazla grup var" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +#, fuzzy +msgid "Never" +msgstr "Gözlüklü" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "Görünen Resim:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +#, fuzzy +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" "Etkinse, gelen kutunuza bir e-posta geldiğinde bir uyarı penceresi çıkar. " "Okunmamış e-posta listesi kişi listenizin üzerindedir. Bu seçenek sadece " "Hotmail hesapları için geçerlidir." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 +#, fuzzy msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" "Etkinse, dinlediğiniz parça kişilerinize gösterilir. Bu bilgi o an çalışan " "müzik programlarından alınır." -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" +msgid "Show contacts w&hich song I am listening to" msgstr "Kişilerime ne &dinlediğimi göster" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -#, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"Etkinse, birkaç dakika bilgisayar kullanılmadığı zaman durumunuz otomatik " -"olarak \"Uzakta-Boşta\" olarak değiştirilir." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "Boştayken durumumu otomatik olarak \"&Uzakta-Boşta\" olarak değiştir." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "" -"KMess'in kaç dakika sonra \"Uzakta-Boşta\" durumuna geçeceğini belirler." - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "Şu kadar zaman sonra boşta konumuna geç:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "dakika" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "Etkinse, sohbetler belirlenmiş olan dizine kaydedilir." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "Bütün sohbetleri &kaydet" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "Sohbet kayıtlarının duracağı dizini seçin." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "Sohbetleri bu dizine kaydet:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "Sohbet kayıtlarının neye göre düzenleneceğini seçin." - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "Yıl" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "Ay" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "Gün" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "Bütün konuşmaları ana dizine kaydet" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "" -"KMess'in tüm sohbet mesajlarını gösterirken kullandığı temayı değiştirmenizi " -"sağlar." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "Sohbet stili:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "Ayarlar" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "Sohbetlerde ifadelerin görünmesine izin verir." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "İfadelerimi &Göster" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "Her mesajın yanında zamanın görünmesini sağlar." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "Sohbet mesajlarında &zamanı göster" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"Bu seçenek aynı kişiden gelen mesajların gruplanmasını sağlar. Kişi bir şeyi " -"anlatmak için birden fazla ard arda mesaj yazdığında KMess bunları tek " -"mesajmış gibi gösterir. Görünüş seçili sohbet biçimine göre değişebilir." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "Aynı kişiden ard arda gelen mesajları &grupla" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "Uzakta" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "Bağlantı listenizde çok fazla grup var" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "Gözlüklü" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "Bu sohbet mesajlarınızın yazı tipi ve rengidir." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "İleti yazıtipiniz:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"Aşağıda seçtiğiniz yazıtipi biçimi ve rengi kişinizin seçtiğinin yerine " -"kullanılır." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "Kişinin iletilerinde bu yazı tipinin kullanmasını zorla:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"Yazıtipi efektleri kullanmayı aktif eder. *koyu*, /italik/, ve _altı çizili_ " -"şeklinde yazmayı etkinleştir." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "" -"Mesajlarda &yazıtipi efektleri kullan, ör: *koyu*, /italik/, ve _altı çizili_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "Kişi listesi alınıyor..." - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" msgstr "İfade &Temaları" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" msgstr "Mümkün olan İfade stilleri:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" msgstr "Ö&zel İfadeler" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" msgstr "Bu hesap için özel ifadeler:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "&Yeni ekle..." - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +#, fuzzy +msgid "Click here to add a new custom emoticon" msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +#, fuzzy +msgid "Add Ne&w..." +msgstr "&Yeni ekle..." + +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +#, fuzzy +msgid "Click here to rename the selected emoticon" +msgstr "Seçili ifadeyi yeniden adlandırmak için tıklayın." + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" msgstr "Y&eniden Adlandır" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "&Sil" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 #, fuzzy msgid "Web Browser" msgstr "Solgun gül" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 +#, fuzzy msgid "&Specify a custom command:" -msgstr "" +msgstr "Uzakta durumu için ileti belirle" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "E-posta istemcisi" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "Dosya Aktarımları" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" msgstr "Sohbetleri bu dizine kaydet:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 #, fuzzy msgid "and" msgstr "Üzgün" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "Dosya Aktarımları" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +#, fuzzy +msgid "Your comment:" +msgstr "Sizin adınız" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "Hesabınız yasaklanmış." + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Bilgisayarımdan uzaktayım" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Sizin adınız" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "siz@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +#, fuzzy +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "&Kişiyi Sil" + +#: accountsmanager.cpp:404 +#, fuzzy +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Uykulu" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "Bu daveti başlatamazsınız çünkü bu sohbette birden fazla kişi var." -#: chat/chat.cpp:158 +#: chat/chat.cpp:142 #, fuzzy msgid "%1 has joined the chat." msgstr "%1 sohbete katıldı." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "Sohbet boşta, %1 sohbetten ayrıldı." -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "%1 sohbetten ayrıldı." -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" msgstr "%1 ve %2 - Sohbet" -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr "%1 - Sohbet" -#: chat/chat.cpp:630 +#: chat/chat.cpp:664 #, fuzzy msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" msgstr "(Bu ileti kendiliğinden gönderildi)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 +msgid "" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" + +#: chat/chat.cpp:941 #, fuzzy -msgid "You received a wink from %1." +msgid "You have sent a wink" msgstr "%1 size bir göz kırpması gönderdi" -#: chat/chat.cpp:971 +#: chat/chat.cpp:966 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +#, fuzzy +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "%1 gizli" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "%1 size çevrimdışı bir ileti gönderdi:
'%2'" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "%1 size çevrimdışı bir ileti gönderdi:
'%2'" + +#: chat/chat.cpp:1168 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "%1 size bir titreme gönderdi!" + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "Göz kırpması gösterilemiyor. Veri okunamadı." + +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." msgstr "" "Göz kırpması gösterilemiyor. 'cabextract'ın kurulu olduğundan emin olun." -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"Göz kırpması gösterilemiyor. 'cabextract'ın kurulu olduğundan emin olun." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." msgstr "Göz kırpması gösterilemiyor. Veri okunamadı." -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1252 #, fuzzy -msgid "You have received a wink from %1" -msgstr "%1 size bir göz kırpması gönderdi" +msgid "%1 has sent you a wink!" +msgstr "%1 size bir göz kırpma gönderdi!" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 #, fuzzy -msgid "You received a nudge from %1!" +msgid "%1 has gone offline." +msgstr "%1 sohbete katıldı." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 sohbete katıldı." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 size bir titreme gönderdi!" + +#: chat/chat.cpp:1363 +#, fuzzy +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "Kişiye İzin &Ver" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." msgstr "%1 titreme gönderdi" -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1381 #, fuzzy -msgid "The message '%1' could not be sent." +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "%1 size bir göz kırpması gönderdi" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 sohbete katıldı." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1 size çevrimdışı bir ileti gönderdi:
'%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "\"%1\" mesajı gönderilemedi." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "%1 titretildi!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "Bir titreme gönderdiniz!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 bir göz kırpması gönderdi: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 diyor ki:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "Sesli görüşme başlat. %1 dinleniyor." + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "Bu ifadeyi ekle: %1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "Da&vet et" +#: chat/chatstatusbar.cpp:49 +#, fuzzy +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Bağlan" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 +#, fuzzy msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" "Sohbet kaydedilemedi. Sohbetlerin kaydedildiği dizinde yazma izniniz " "olduğundan emin olun." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 +#, fuzzy msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" "'%1' isimli dosya zaten var.\n" "üzerine yazmak istiyor musunuz?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Dosyanın Üzerine Yaz" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "Üzerine &Yaz" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." msgstr "Bu İfadeyi &Ekle" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "Bu İfadeyi &Ekle" + +#: chat/chatview.cpp:833 msgid "Send &Email" msgstr "E-&posta Gönder" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "E-posta'yı &Kopyala" +#: chat/chatview.cpp:837 +#, fuzzy +msgid "Add &Contact" +msgstr "Kişi &Ekle" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "E-posta adresi" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "Bağlantıya &Git" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "&Adresi Kopyala" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +#, fuzzy +msgid "&Copy Text" msgstr "&Yazıyı Kopyala" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "Tümünü &Seç" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +#, fuzzy +msgid "C&lear Chat" +msgstr "Sekmeyi temizle" + +#: chat/chatview.cpp:871 +#, fuzzy +msgid "Save Chat to &File..." msgstr "Sohbeti &Dosyaya Kaydet" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Sohbet Et" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Kişiler" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "İfadeler" + +#: chat/chatwindow.cpp:121 +#, fuzzy +msgid "My Emoticons" +msgstr "İfadelerim" + +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." +msgstr "" + +#: chat/chatwindow.cpp:331 +#, fuzzy +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Sekmeyi kapat" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "Sekmeyi kapat" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "Sekmeyi kapat" + +#: chat/chatwindow.cpp:409 +#, fuzzy +msgid "&Invite..." +msgstr "Da&vet et" + +#: chat/chatwindow.cpp:410 +#, fuzzy +msgid "Send a &File..." msgstr "Bir &Dosya Gönder" -#: chat/chatwindow.cpp:493 +#: chat/chatwindow.cpp:411 +#, fuzzy +msgid "Webcam Chat" +msgstr "Sohbeti Kaydet" + +#: chat/chatwindow.cpp:412 msgid "Start a &Meeting" msgstr "Bir &Buluşma Başlat" -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:413 msgid "Send a &Nudge!" msgstr "&Titreme Gönder!" -#: chat/chatwindow.cpp:495 -msgid "Save chat" +#: chat/chatwindow.cpp:414 +#, fuzzy +msgid "Save Chat..." msgstr "Sohbeti Kaydet" -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "İfadeler" - -#: chat/chatwindow.cpp:498 +#: chat/chatwindow.cpp:415 #, fuzzy msgid "Close &All Tabs" msgstr "Sekmeyi kapat" -#: chat/chatwindow.cpp:504 +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "&Yazıtipini Değiştir" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Yazıtipi &Rengini Değiştir" + +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "İfadelerimi &Göster" + +#: chat/chatwindow.cpp:429 +#, fuzzy +msgid "Show S&tatus Messages" +msgstr "Sohbet mesajlarında &zamanı göster" + +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "" + +#: chat/chatwindow.cpp:442 #, fuzzy msgid "Meeting" msgstr "Ayarlar" -#: chat/chatwindow.cpp:505 +#: chat/chatwindow.cpp:443 msgid "Nudge" msgstr "" -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "Bir &Görüşme başlat veya bitir" +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "Bir &Dosya Gönder" -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "&Yazıtipini Değiştir" +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Yazıtipi &Rengini Değiştir" +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" -#: chat/chatwindow.cpp:576 +#: chat/chatwindow.cpp:465 +#, fuzzy +msgid "Enable or disable the contacts panel" +msgstr "Kişi listesi alınıyor..." + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +#, fuzzy +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Kişiler" + +#: chat/chatwindow.cpp:471 +#, fuzzy +msgid "Enable or disable the standard emoticons panel" +msgstr "Kişi listesi alınıyor..." + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +#, fuzzy +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "İfadeler" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Kişi listesi alınıyor..." + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +#, fuzzy +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "İfadelerim" + +#: chat/chatwindow.cpp:491 #, fuzzy msgid "&Font" msgstr "&Bağlan" -#: chat/chatwindow.cpp:577 +#: chat/chatwindow.cpp:492 #, fuzzy msgid "Font &Color" msgstr "Yazıtipi &Rengini Değiştir" -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 -msgid "Emoticons" -msgstr "İfadeler" - -#: chat/chatwindow.cpp:658 -msgid "My emoticons" -msgstr "İfadelerim" - -#: chat/chatwindow.cpp:738 +#: chat/chatwindow.cpp:493 #, fuzzy -msgid "&Settings" -msgstr "Ayarlar" +msgid "C&lear Chat Window" +msgstr "Sekmeyi temizle" -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" -msgstr "" - -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "İfadelerimi &Göster" - -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 +#: chat/chatwindow.cpp:561 #, fuzzy -msgid "Hide Side&bar" -msgstr "Kenar Çubuğu" +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Bir &Görüşme başlat veya bitir" -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "Kenar Çubuğu" - -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "Bağlantı yançubuğunu göster ya da gizle" - -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" msgstr "" -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "Sekmeyi kapat" +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "Sekmeyi kapat" +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "Kenar Çubuğu" +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "Bağlantı yançubuğunu göster ya da gizle" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 yazıyor." - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 ve %2 yazıyor." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 ve diğer %3 kişi yazıyor." - -#: chat/chatwindow.cpp:1611 +#: chat/chatwindow.cpp:1555 #, fuzzy msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Sohbet" -#: chat/chatwindow.cpp:1615 +#: chat/chatwindow.cpp:1559 #, fuzzy msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - Sohbet" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "&E-posta gönder" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +#, fuzzy +msgid "%1 is typing..." +msgstr "%1 yazıyor." + +#: chat/chatwindow.cpp:1846 +#, fuzzy +msgid "%1 and %2 are typing..." +msgstr "%1 ve %2 yazıyor." + +#: chat/chatwindow.cpp:1850 +#, fuzzy +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 ve diğer %3 kişi yazıyor." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "Bir &Buluşma Başlat" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" +msgstr "E-&posta Gönder" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "&Profili Göster" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" msgstr "" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "Kişi &Ekle" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "Kişiye İzin &Ver" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "&Kişiyi Sil" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "Kişiyi E&ngelle" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "Kişinin &Engelini Kaldır" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" msgstr "&Takma ad:" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "&Kişisel Mesaj" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" msgstr "E-p&osta adresi:" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" msgstr "Ko&pyala..." -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "Engellenmiş" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 #, fuzzy +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" msgstr "Kişi çevrimdışı" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" msgstr "Kişi ekle" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "Bir ifade kullan" +msgid "Add New" +msgstr "&Yeni ekle..." -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 #, fuzzy msgid "Remove" msgstr "Silindi" -#: contact/contactbase.cpp:280 +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" + +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 +#: contact/contactbase.cpp:308 #, fuzzy msgid "Web Messenger" msgstr "Site tasarımı" -#: contact/contactbase.cpp:288 +#: contact/contactbase.cpp:312 msgid "Office Communicator" msgstr "" -#: contact/contactbase.cpp:292 +#: contact/contactbase.cpp:316 msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 +#: contact/contactbase.cpp:320 +#, fuzzy +msgid "Windows Media Center" +msgstr "Site tasarımı" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 msgid "MSN Messenger %1 compatible" msgstr "" -#: contact/contactbase.cpp:312 +#: contact/contactbase.cpp:349 #, fuzzy msgid "Windows Live Messenger %1" msgstr "Site tasarımı" -#: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" - -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Site tasarımı" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "Bağlı" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "Bağlı değil" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "İzin verildi" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "Silindi" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 %2" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 %2" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "Uzakta" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "Döneceğim" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "Meşgul" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "Görünmez" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "Uzakta" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "Kendiliğinden yanıtlamayla Uzakta" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "Boşta" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "Döneceğim" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "Telefonda" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "Yemekte" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "Görünmez" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "Bağlı değil" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "&Durumum" + +#: contact/msnstatus.cpp:215 +#, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "Bağlantıyı &Kes" + +#: dialogs/addcontactdialog.cpp:49 #, fuzzy msgid "Add a Contact" msgstr "Kişi ekle" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "Grubu &Sil" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" msgstr "Yeni İfade &Ekle" -#: dialogs/addemoticondialog.cpp:127 +#: dialogs/addemoticondialog.cpp:129 #, fuzzy msgid "Edit Emoticon" msgstr "İfadeler" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +#, fuzzy +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" msgstr "\"%1\" ifadesi zaten var, üzerine yazmak istiyor musunuz?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "Uzakta durumu için ileti belirle" -#: dialogs/contactaddeduserdialog.cpp:33 +#: dialogs/chathistorydialog.cpp:48 +#, fuzzy +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "Sohbet stili:" + +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "%1 aktarılamadı. Yerel port açılamadı." + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 msgid "You have been added by someone" msgstr "" -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/contactaddeduserdialog.cpp:58 #, fuzzy msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"%1 (%2)\n" +"has added you to his or her contact list." msgstr "%1
sizi bağlantı listesine ekledi. Ne yapmak istiyorsunuz?:" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "%1 için Özellikler" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "Bağlı" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 #, fuzzy msgid "No messages yet" msgstr "Sohbet mesajlarında &zamanı göster" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:383 +#: dialogs/contactpropertiesdialog.cpp:421 #, fuzzy -msgid "Email: %1" -msgstr "E-posta" +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "E-posta adresi:" -#: dialogs/contactpropertiesdialog.cpp:384 +#: dialogs/contactpropertiesdialog.cpp:422 #, fuzzy +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "E-posta istemcisi" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "Kişinizin profiline bakmak için tıklayın." + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "Kişiler" + +#: dialogs/invitedialog.cpp:41 +#, fuzzy +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "Kişiler" + +#: dialogs/listexportdialog.cpp:83 +#, fuzzy +msgid "Export Contact List for %1" +msgstr "%1 için Özellikler" + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "Bağlanıyor %1, port %2" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "" + +#: dialogs/listexportdialog.cpp:159 +#, fuzzy +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "" +"'%1' isimli dosya zaten var.\n" +"üzerine yazmak istiyor musunuz?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "Kişi listesi alınıyor..." + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "Sekmeyi kaydet" + #: dialogs/networkwindow.cpp:79 #, fuzzy -msgid "S&ave tab" -msgstr "Sekmeyi kaydet" +msgid "C&lear Tab" +msgstr "Sekmeyi temizle" #: dialogs/networkwindow.cpp:80 #, fuzzy -msgid "C&lear tab" -msgstr "Sekmeyi temizle" +msgid "C&lose All Tabs" +msgstr "Sekmeyi kapat" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 #, fuzzy msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "Hiç bağlantı yok. Lütfen Ağ Penceresini açın." -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 #, fuzzy msgid "" "Could not save the Network Window log. Make sure you have permission to " @@ -1972,86 +2914,101 @@ msgstr "" "Ağ Penceresi kayıtları kaydedilemiyor. Kayıtların yapıldığı dizinde yazma " "izniniz olduğundan emin olun." -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "Ana bağlantı sekmesi kapatılamaz" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 #, fuzzy msgid "Cannot send commands to this kind of connection!" msgstr "Ana bağlantı sekmesi kapatılamaz" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 #, fuzzy msgid "Completed" msgstr "Bilgisayar" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 KB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 bayt" -#: dialogs/transferentry.cpp:335 +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "" -#: dialogs/transferentry.cpp:339 +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" msgstr "" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 #, fuzzy -msgid "Cl&ean Up" -msgstr "&Temizle" +msgid "&Use" +msgstr "Kafası karışık" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "&Kişiyi Sil" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "Görüntü Resmi:" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "Görüntü Resmi:" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "Gerçekten bu hesabı silmek istiyor musunuz?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." @@ -2059,930 +3016,1433 @@ msgstr "" "İfade teması kaydedilemiyor. Tema dizini olan '%1' dizinine yazma izniniz " "olduğundan emin olun." -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "Gülen surat" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "Göz kırpan" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "Dil çıkaran" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "Kahkaha" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "Üzgün" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "Ağlıyor" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "Kızgın" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "Kafası karışık" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "Utanmış" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "Kırgın" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "Sıcak" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "Dişleri gösteren" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "Gözlüklü" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "Hasta" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "Şaşkın" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "Parti" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "Uykulu" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "Düşünen" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "Kimseye söyleme" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "Bu bir sır" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "Gözleri yuvarlayan" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "Alaycı" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "Bilmiyorum" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "Hemen döneceğim" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "Melek" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "Soldan sarıl" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "Erkek çocuk" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "Kırmızı kalp" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "Kırmızı gül" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +#, fuzzy +msgid "Thumbs up" msgstr "Parmaklar yukarı" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "Köpek" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "Güneş" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "Şeytan" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "Sağdan sarıl" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "Kız çocuk" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "Kırık kalp" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "Solgun gül" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "Parmak aşağı" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "Kedi" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "Uykulu ay" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "Kırmızı dudaklar" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "Alkış" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "Şans dile" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "Otomatik" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "Uçak" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "Kaplumbağa" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "Salyangoz" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "Kara koyun" +#: emoticontheme.cpp:869 +#, fuzzy +msgid "Sheep" +msgstr "Uykulu" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "Keçi" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "Vampir yarasa" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "Pizza" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "Bira" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "İçki bardağı" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "Kahve fincanı" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "Doğum günü pastası" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "Tabak" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "Tas" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "Yıldız" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "Gökkuşağı" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "Şimşekli bulut" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "Yıldırım" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "Şemsiye" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "Issız ada" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "Ahize" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "Cep telefonu" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "E-posta" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "Saat" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "Fotoğraf Makinesi" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "Film şeridi" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "Not" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "Kelepçe" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "Para" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "Ampul" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +#, fuzzy +msgid "Cigarette" msgstr "Sigara" -#: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "Futbol topu" +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "Hediye" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "Bilgisayar" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "KMess simgesi" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "Sunucu hazır değil" + +#: initialview.cpp:384 +#, fuzzy +msgctxt "Status message on login screen" msgid "Internet connection not available." msgstr "Sunucu hazır değil" -#: initialview.cpp:377 -msgid "Connect" -msgstr "Bağlan" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" +msgstr[1] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "Bağlantıyı &Kes" +msgctxt "Button label" +msgid "&Connect" +msgstr "&Bağlan" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" msgstr "" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." msgstr "" -#: kmess.cpp:223 +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "E-posta adresi" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "E-posta bilgisini göster" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact %1 is already in your contact list." +msgstr "Kişi zaten listenizde bulunuyor" + +#: kmess.cpp:250 #, fuzzy msgid "New Group" msgstr "Yeni &Grup" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +#, fuzzy +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "Grup &Ekle" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +#, fuzzy +msgid "Enter a name for the new group:" msgstr "Bu grup için yeni adı girin:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "" "Gerçekten %1 grubunu listenizden silmek istiyor musunuz?" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" msgstr "K&işiyi Sil" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" msgstr "Engeli kaldır" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "Gerçekten %1 grubunu silmek istiyor musunuz?" -#: kmess.cpp:631 +#: kmess.cpp:637 #, fuzzy msgctxt "dialog button" msgid "Remove" msgstr "Silindi" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "Bu özel bir gruptur ve değiştirilemez." -#: kmess.cpp:671 -msgid "Rename group" -msgstr "&Grubu Yeniden Adlandır" +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" +msgstr "Grubu Y&eniden Adlandır" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "Bu grup için yeni adı girin:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" +msgid "Autologin Failed" msgstr "Kimlik denetimi başarısız" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "Bağlanıyor..." + +#: kmess.cpp:1123 +#, fuzzy +msgctxt "Status bar message" msgid "Disconnected" msgstr "Bağlı değil" -#: kmess.cpp:1408 +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "" + +#: kmess.cpp:1475 #, fuzzy +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" "

KMess sesleri ve bildirimleri çalamayacak.

KMess'in 'eventsrc' " "dosyası bu dizinlerde bulunamadı: %1

Lütfen kurulumunuzu kontrol edin " "ve eksik dosyayı bu dizinlerden birine kopyalayın.

" -#: kmess.cpp:1412 -msgid "Error with notifications" +#: kmess.cpp:1481 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "Bildirimlerde hata" -#: kmess.cpp:1589 +#: kmess.cpp:1759 #, fuzzy -msgctxt "Main window caption" +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" msgstr "KMess" -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "&Eylemler" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "Yeni &Kişi" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "Yeni &Grup" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "&Kişiyi Ara" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "İ&lgiye Göre Ara" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "&Kişiyi Ara" - #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "Yeni &Hesap" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "&Hesap Ayarları" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "Bağla&n" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "Bağlantıyı &Kes" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "&Profilimi Göster" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "&Durumum" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "Kendiliğinden yanıtlamayla Uzakta" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "İ&zin Verilen Kişileri Göster" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "Bağlı &olmayanları göster" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "&Silinen Kişileri Göster" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 +#, fuzzy +msgid "Show &History Box" +msgstr "Sohbet stili:" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "Kenar Çubuğu" + +#: kmessinterface.cpp:174 #, fuzzy msgid "Show &Empty Groups" msgstr "İfadelerimi &Göster" -#: kmessinterface.cpp:321 +#: kmessinterface.cpp:175 #, fuzzy -msgid "Display Pictures Size" +msgid "&Display Pictures Size" msgstr "Görüntü Resmi:" -#: kmessinterface.cpp:322 -msgid "Do not display" +#: kmessinterface.cpp:176 +msgid "&Sort Contacts by" +msgstr "&Kişileri şu ölçütle sırala" + +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "&Aktarım Penceresini Göster" + +#: kmessinterface.cpp:182 +#, fuzzy +msgid "New &Contact..." +msgstr "Yeni &Kişi" + +#: kmessinterface.cpp:183 +#, fuzzy +msgid "New &Group..." +msgstr "Yeni &Grup" + +#: kmessinterface.cpp:184 +#, fuzzy +msgid "&Export Contact List..." +msgstr "&Kişiyi Ara" + +#: kmessinterface.cpp:185 +#, fuzzy +msgid "Search for C&ontact" +msgstr "&Kişiyi Ara" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "İ&lgiye Göre Ara" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "Sohbet stili:" + +#: kmessinterface.cpp:188 +#, fuzzy +msgid "New &Account..." +msgstr "Yeni &Hesap" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "Yeni &Hesap" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." msgstr "" -#: kmessinterface.cpp:323 +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "" + +#: kmessinterface.cpp:195 #, fuzzy msgid "Small" msgstr "Gülen surat" -#: kmessinterface.cpp:324 +#: kmessinterface.cpp:196 msgid "Medium" msgstr "" -#: kmessinterface.cpp:325 +#: kmessinterface.cpp:197 msgid "Large" msgstr "" -#: kmessinterface.cpp:328 -msgid "&Sort Contacts by" -msgstr "&Kişileri şu ölçütle sırala" - -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:201 msgid "Group" msgstr "Grup" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "Bağlı/Bağlı değil" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" msgstr "" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "&Aktarım Penceresini Göster" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "&Ağ Penceresini Göster" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "Şimdi dinleniyor - %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" msgstr "" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" msgstr "" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" msgstr "" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "&Sohbet" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "&Özellikler" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" msgstr "&Gruptan Sil" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "Şimdi dinliyor - %1" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "Gruba &Kopyala" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "Gruba &Taşı" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "Grubu &Aşağı Taşı" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "Grubu &Yukarı Taşı" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "Grubu &Sil" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "Grubu Y&eniden Adlandır" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "E-posta" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "Bu kişiyi \"Arkadaşlar\" listesine &ekle" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +#: kmessview.cpp:1133 +#, fuzzy +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "E-posta adresi" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "E-posta istemcisi" + +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +#: kmessview.cpp:1156 +#, fuzzy +msgid "No" +msgstr "Not" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "Engellenmiş" + +#: kmessview.cpp:1179 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" msgstr "" -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "Sohbet mesajlarında &zamanı göster" -#: kmessview.cpp:1085 +#: kmessview.cpp:1204 #, fuzzy msgctxt "Group name in group tooltip" msgid "Group %1" msgstr "
%1 (%2)" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "Kişiler" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "Kişi çevrimdışı" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "Kişi çevrimdışı" +msgstr[1] "Kişi çevrimdışı" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "Kişiler" +msgstr[1] "Kişiler" + +#: kmessview.cpp:1631 #, fuzzy msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "Buraya kişisel bir ileti yazın" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" msgstr[1] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +#, fuzzy +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 %2" + +#: kmessviewdelegate.cpp:156 +#, fuzzy +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 %2" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 #, fuzzy msgid "Project support" msgstr "P4-İçerik alanı desteği" -#: main.cpp:73 main.cpp:74 main.cpp:75 +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 #, fuzzy msgid "Current developer" msgstr "GnomeMeeting geliştiricisi" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "" "Almanca çeviri, deneme, belgelendirme, web sayfası, proje yönetimi vs..." -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "Site tasarımı" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" + +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" msgstr "Esas ve sarı/mavi/violet belirteç kümeleri ve İtalyanca çeviri" -#: main.cpp:81 +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "Çizgi Film İfadeleri" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "Öntanımlı ses teması" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "Arapça çeviri, uluslararasılaştırma ve dosya kaydetme onarımı" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "Daha fazla Arapça çeviri" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "Portekizce çeviri" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +#, fuzzy +msgid "More Brazilian Portuguese translation" +msgstr "Portekizce çeviri" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 msgid "Catalan translation" msgstr "Katalanca çeviri" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "" "Basitleştirilmiş Çince çeviri, dosya gönderme hatası düzeltmesi, vekil " "sunucu bağlantısı kodu" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "Daha fazla Basitleştirilmiş Çince çeviri" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "Geleneksel Çince çeviri" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "Geleneksel Çince çeviri" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 msgid "Danish translation" msgstr "Danimarkaca çeviri" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 msgid "More Danish translation" msgstr "Daha fazla Danimarkaca çeviri" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "Holandaca çeviri" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "Daha fazla Holandaca çeviri" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "Daha fazla Arapça çeviri" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "Daha fazla Fransızca çeviri" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 msgid "Estonian translation" msgstr "Estonyaca çeviri" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 msgid "Finnish translation" msgstr "Fince çeviri" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "Daha fazla Fince çeviri" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "Fransızca çeviri" -#: main.cpp:108 +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" + +#: main.cpp:109 msgid "More French translation, MSN6 emoticon definitions" msgstr "Daha fazla Fransızca çeviri, MSN6 ifadelerinin tanımları" -#: main.cpp:109 +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" msgstr "Daha fazla Fransızca çeviri" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "Macarca çeviri" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "Macarca çeviri" + +#: main.cpp:115 main.cpp:116 msgid "More Italian translation" msgstr "Daha fazla İtalyanca çeviri" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "Korece çeviri" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 msgid "Norsk Bokmål translation" msgstr "Norveç Bokmal çeviri" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "Slovence çeviri" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "Slovence çeviri" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "Slovence çeviri" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "İspanyolca çeviri" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 msgid "More Spanish translation" msgstr "Daha fazla İspanyolca çeviri" -#: main.cpp:123 -msgid "Swedish translation" -msgstr "İspanyolca çeviri" - -#: main.cpp:125 -msgid "Thai translation" -msgstr "Tayca çeviri" - #: main.cpp:126 -msgid "Turkish translation" -msgstr "Türkçe çeviri" +msgid "Alejandro Araiza Alvarado" +msgstr "" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "Daha fazla Türkçe çeviri" +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "İspanyolca çeviri" + +#: main.cpp:133 +msgid "Mattias Newzella" msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "Dosya Aktarımları" - -#: main.cpp:134 -msgid "P4-Context field support" -msgstr "P4-İçerik alanı desteği" +msgid "More Swedish translation" +msgstr "İspanyolca çeviri" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Xinerama ayarları" - -#: main.cpp:136 -msgid "Original file receive code" -msgstr "Asıl dosya alım kodu" - -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Rachan Hongpairote" msgstr "" -#: main.cpp:138 -#, fuzzy -msgid "KWallet support" -msgstr "P4-İçerik alanı desteği" +#: main.cpp:135 +msgid "Thai translation" +msgstr "Tayca çeviri" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "Türkçe çeviri" + +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "Daha fazla Türkçe çeviri" + +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "Çevri&miçi olduklarında" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "Dosya Aktarımları" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "P4-İçerik alanı desteği" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Xinerama ayarları" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "Asıl dosya alım kodu" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +#, fuzzy +msgid "KWallet support" +msgstr "P4-İçerik alanı desteği" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "Sohbet stili:" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "Çeşitli uluslararasılaştırma onarımları" -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "Çeşitli uluslararasılaştırma onarımları" -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "GnomeMeeting geliştiricisi" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "Kafasında kağıt paket olan adam" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "Esinlenme ve çeşitli kodlar" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "Eski baloncuk kodu, p2p kodunun ilk hali, msn etkileşimi yöneticisi" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "Bekleme zamanlayıcı kodu" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" msgstr "Ve siz?" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" @@ -2993,29 +4453,43 @@ msgstr "" "Bu listede isminizin unutulduğunu düşünüyorsanız lütfen bizimle iletişime " "geçin!" -#: main.cpp:159 +#: main.cpp:171 #, fuzzy msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "Sizin adınız" -#: main.cpp:160 +#: main.cpp:172 #, fuzzy msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "E-posta adresiniz:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "Bu e-posta adresi ile otomatik bağlan" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "İzin verildi" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "Silindi" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "Karşıdaki oturumu iptal etti" @@ -3033,62 +4507,114 @@ msgstr "Daveti reddettiniz." #: network/applications/application.cpp:540 #, fuzzy -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "" "Ne yapmak istiyorsunuz? Kabul Et / Reddet" #: network/applications/application.cpp:581 #, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "İptal etmek için tıklayın." -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "Bu dosyayı almak istiyor musunuz: %1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"'%1' isimli dosya zaten var.\n" +"üzerine yazmak istiyor musunuz?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "%1 aktarılamadı. Dosya açılamadı." -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "%1 aktarılamadı. Dosya açılamadı." + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "Aktarım kabul edildi." -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "Bağlanıyor %1, port %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "Aktarım iptal edildi." +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "Karşıdaki kişi aktarımı iptal etti." -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "Oturumu iptal ettiniz." + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "Oturumu iptal ettiniz." + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "Bağlantı sağlandı" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +#, fuzzy +msgid "Successfully sent file "%1"." msgstr "Dosya başarıyla aktarıldı: %1" -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "%1 aktarılamadı. Dosya bulunamadı." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +#, fuzzy +msgid "Successfully received file "%1"." +msgstr "Dosya başarıyla aktarıldı: %1" -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "%1 aktarılamadı. Dosya okunamıyor." +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +#, fuzzy +msgid "The transfer of file "%1" failed. The file does not exist." +msgstr "%1 dosyası aktarılamadı. Dosya bulunamadı." -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "Dosya gönderiliyor: %1" +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +#, fuzzy +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "%1 dosyası aktarılamadı. Dosya okunamıyor." -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +#, fuzzy +msgid "Sending file "%1" (%2)." +msgstr "Dosya gönderiliyor: %1 (%2)" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +#, fuzzy +msgid "The contact has accepted the transfer of file "%1"." +msgstr "Karşıdaki kişi aktarımı iptal etti." + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "" @@ -3099,72 +4625,14 @@ msgstr "" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "Dosya aktarımı iptal edildi. Kötü veri aktarımı alındı." -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"'%1' isimli dosya zaten var.\n" -"üzerine yazmak istiyor musunuz?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "%1 aktarılamadı. Dosya açılamadı." - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "Karşıdaki kişi aktarımı iptal etti." - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "Oturumu iptal ettiniz." - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "Dosya başarıyla aktarıldı: %1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "Dosya başarıyla aktarıldı: %1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "%1 dosyası aktarılamadı. Dosya bulunamadı." - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "%1 dosyası aktarılamadı. Dosya okunamıyor." - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "Dosya gönderiliyor: %1 (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "Karşıdaki kişi aktarımı iptal etti." - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "Bir buluşmaya davet edildiniz (GnomeMeeting kullanarak)." @@ -3177,28 +4645,28 @@ msgstr "GnomeMeeting Başlatılıyor. %1 kişisine bağlanılıyor." msgid "Inviting the contact to a meeting." msgstr "Kişi buluşmaya davet ediliyor." -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "Davet reddedildi. Karşıdaki istemci bunu desteklemiyor." -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "Davet iptal edildi. Bir hata oluştu." -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "Davet iptal edildi. Karşıdaki uzun süredir cevap vermiyor." -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "Davet iptal edildi. Karşıdan uzun süredir veri gelmiyor." -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "Davet iptal edildi. Sohbet bağlantısı kapatıldı." -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "Davet iptal edildi." @@ -3210,25 +4678,17 @@ msgstr "Bu kişinin masaüstünü paylaşmaya davet edildiniz." msgid "Starting KRDC. Connecting to %1." msgstr "KRDC Başlatılıyor. %1 kişisine bağlanılıyor." -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "Kişi daveti reddetti. Bir hata oluştu." +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "Karşıdaki KMess'in henüz desteklemediği bir MSN6 özelliği kullanıyor." -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "Aktarım başarısız." - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." @@ -3236,78 +4696,86 @@ msgstr "" "Davet iptal edildi. Kişiden gelen veriler bozulmuş ya da KMess bunu " "desteklemiyor." -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "" -"Aktarım başarısız. Kişiden gelen veriler bozulmuş ya da KMess bunu " -"desteklemiyor." - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "Aktarım başarısız. Karşıdaki uzun süredir cevap vermiyor." - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "Aktarım başarısız. Bir hata oluştu." - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "Aktarım başarısız. Veri kaynağı açılamadı." - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "Karşıdaki KMess'in henüz desteklemediği bir MSN6 özelliği kullanıyor." - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "Aktarım başarısız. Veri hazırlanamadı." -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." msgstr "Davet iptal edildi. İleti bize gönderilmemiş." -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "" "Aktarım başarısız. Kişiden gelen veriler bozulmuş ya da KMess bunu " "desteklemiyor." -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "Kişi daveti reddetti. Bir hata oluştu." + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "Bağlantı bekleniyor %1, port %2" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "Dolaylı dosya gönderimi deneniyor (bu yavaş olabilir)." -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 #, fuzzy msgid "Waiting for connection" msgstr "Kişi listesi alınıyor..." -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "" "Davet iptal edildi. Karşıdakinin kabul etmesi beklenirken zaman aşımı oldu." -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "Davet iptal edildi. Bağlantıda zaman aşımı oldu." -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "Davet iptal edildi. Veri beklenirken zaman aşımı oldu." +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "Aktarım başarısız." + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "" +"Aktarım başarısız. Kişiden gelen veriler bozulmuş ya da KMess bunu " +"desteklemiyor." + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "Aktarım başarısız. Karşıdaki uzun süredir cevap vermiyor." + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "Aktarım başarısız. Bir hata oluştu." + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "Aktarım başarısız. Veri kaynağı açılamadı." + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "Sesli bir görüşmeye davet edildiniz." @@ -3338,673 +4806,869 @@ msgstr "Sesli görüşme başlat. %1 dinleniyor." msgid "Inviting the contact to a voice conversation." msgstr "Sesli görüşme daveti gönderiliyor." -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "Karşıdaki sizi '%1' için davet ediyor. Bu henüz desteklenmiyor." -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "Dosya aktarımı iptal edildi. Kötü veri aktarımı alındı." + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "%1 aktarımı iptal edildi." +#: network/applications/webcamtransferp2p.cpp:138 +#, fuzzy +msgid "You are invited to view this person's webcam." +msgstr "Bu kişinin masaüstünü paylaşmaya davet edildiniz." + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "Dosya gönderiliyor: %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "%1 aktarılamadı. Yerel port açılamadı." -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 #, fuzzy msgid "Couldn't open a local port." msgstr "%1 aktarılamadı. Yerel port açılamadı." -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "Dosya gönderimi başlatılıyor" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +#, fuzzy +msgid "The transfer of %1 failed. A connection could not be made." msgstr "%1 aktarılamadı. Bağlantı kurulamadı" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 #, fuzzy msgid "Unable to make a connection." msgstr "Bağlantı kurulamadı: %1" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "Dosya alınıyor: %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"KMess uzaktaki web servisine erişemedi. \n" -"\n" -"Ayrıntılar: %1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"Bağlantınız koptu, çünkü başka bir\n" -"MSN Messenger istemcisiyle veya\n" -"başka bir yerden bağlantı kurmuş olabilirsiniz." - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "Eşzamanlama alındı" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "Kimlik denetimi yapılıyor" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "Kişi listesi alınıyor..." - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "" -"Kimlik doğrulaması başarısız, lütfen hesap adınızı ve şifrenizi kontrol edin" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "Bağlanıyor..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess, sunucudan bilinmeyen bir komut aldı: %1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "Eklemeye çalıştığınız e-postanın MSN Messenger hesabı yok" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" +#: network/msnconnection.cpp:404 +#, fuzzy +msgid "The given account name is invalid" msgstr "Verilen hesap adı geçersiz" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 +#, fuzzy msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "Verilen hesap adı geçersiz veya henüz aktifleştirilmemiş" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "Bağlantı listeniz dolu" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "Kişi zaten listenizde bulunuyor" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "Kişi listenizde yok" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "Kişi çevrimdışı" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "Kişi listenizde yok" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 #, fuzzy msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "Bu grup adı Messenger veya Hotmail kişi listenizde kullanılıyor." -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:444 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "Bağlantı listenizde çok fazla grup var" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "Bu özel bir gruptur ve değiştirilemez." -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "Bağlantı listenizde çok fazla grup var" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "Bu grup boş değil" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "Grup adı çok uzun" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "KMess içinde bir hata oluştu: %1" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "Grubu Y&eniden Adlandır" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "Pano sunucusu başarısız" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "Pano sunucusu aktarımı başarısız" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "Direkt bağlantı (MSNSLP) hatası, bağlantı başarısız" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "Bu hesap için özel ifadeler:" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "Hesabınız yasaklanmış." -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "Aktarım başarısız." -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 #, fuzzy msgid "You are opening chat sessions too fast" msgstr "Çok fazla oturum açıyorsunuz" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "Çok fazla oturum açık" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "Hatalı isim" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +#, fuzzy +msgid "The server reports KMess is flooding it with too much data" msgstr "Sunucu KMess'in çok fazla veri göndererek flood yaptığını söylüyor." -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "Kimlik denetimi başarısız" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "Görünmez durumdayken bir sohbet başlatamazsınız." -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 #, fuzzy msgid "Not accepting new contacts" msgstr "Yeni kurallar kabul edilmiyor" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 #, fuzzy msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "" "Çocuk hesabınız var, İnternette sohbet yapmak için ebeveynlerinizden izin " "almalısınız." -#: network/msnnotificationconnection.cpp:2371 +#: network/msnconnection.cpp:569 #, fuzzy -msgid "Your passport account needs to be verified first." +msgid "Your Passport account needs to be verified first." msgstr "Hesabınızın doğrulanması gerekiyor." -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "Kişi listesine ulaşırken hata, daha sonra tekrar deneyin" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "Sunucuda iç hata oluştu" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "Bireysel bildirim sunucusu devre dışı" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "Sunucu kapatılacak" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "Sunucu yakında kapatılacak" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "Yazma engelleniyor" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "Oturum aşırı yüklenmiş durumda" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "Sunucu hazır değil" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "Kimlik denetimi başarısız" -#: network/msnnotificationconnection.cpp:2449 +#: network/msnconnection.cpp:642 #, fuzzy -msgid "Unknown error code received from the server: %1" +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "KMess, sunucudan bilinmeyen bir komut aldı: %1" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 #, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" msgstr "KMess - MSN hatası" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "Kimlik denetimi yapılıyor" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "Kimlik denetimi başarısız" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "Bağlanıyor..." + +#: network/msnnotificationconnection.cpp:1949 +#, fuzzy +msgid "Unknown command received from the server: %1" +msgstr "KMess, sunucudan bilinmeyen bir komut aldı: %1" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "dakika" msgstr[1] "dakika" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 #, fuzzy msgid "Server closes for maintenance in %1!" msgstr "Uyarı: Sunucu %1 dakika içinde bakım için kapanacak!" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 #, fuzzy msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "MSN Sunucusu bakım nedeniyle 1 dakika içinde kapanacağını bildirdi." -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 +#: network/msnnotificationconnection.cpp:2318 #, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" "KMess çevrimdışı mesajları işleyemedi.\n" "Ayrıntılar: %1" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "Kimlik denetimi başarısız" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "Kişi listesi alınıyor..." + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "KMess içinde bir hata oluştu: %1" -#: network/msnnotificationconnection.cpp:3242 +#: network/msnnotificationconnection.cpp:2916 #, fuzzy -msgctxt "Login error message, with more details for developer versions" +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" msgstr "" +"Kimlik doğrulaması başarısız, lütfen hesap adınızı ve şifrenizi kontrol edin" + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2932 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"Bağlantınız koptu, çünkü başka bir\n" +"MSN Messenger istemcisiyle veya\n" +"başka bir yerden bağlantı kurmuş olabilirsiniz." + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" "KMess MSN messenger sunucularına bağlanamadı. MSN Messenger servisi geçici " "olarak hizmet dışı olabilir veya İnternet bağlantınızda bir sorun var." -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" msgstr "" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2968 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"KMess MSN messenger sunucularına bağlanamadı. MSN Messenger servisi geçici " +"olarak hizmet dışı olabilir veya İnternet bağlantınızda bir sorun var." + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "Sunucuya bağlantı kaybedildi." -#: network/msnnotificationconnection.cpp:3302 -#, fuzzy +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -"Doğrulama başarısız, KMess hesabınızla giriş yapamadı.\n" -"Ayrıntılar: %1" -#: network/msnsockethttp.cpp:765 +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 #, fuzzy -msgid "SSL Error" -msgstr "Sunucu Hatası" +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "KMess içinde bir hata oluştu: %1" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "Bağlantı zaman aşımına uğradı" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "1 ping kayıp" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "%1 ping kayıp" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." +#: network/msnsockettcp.cpp:395 +#, fuzzy +msgid "The connection to the server was lost" msgstr "Sunucuya bağlantı kaybedildi." -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "Bu kişi bağlı değil ya da görünmez durumda." +#: network/soap/addressbookservice.cpp:777 +#, fuzzy +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "Eklemeye çalıştığınız e-postanın MSN Messenger hesabı yok" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "" -"Karşıdaki, KMess'in henüz desteklemediği bir MSN7 özelliği kullanmaya " -"çalışıyor." +#: network/soap/addressbookservice.cpp:787 +#, fuzzy +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "Eklemeye çalıştığınız e-postanın MSN Messenger hesabı yok" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "\"%1\" mesajı alınamadı!" - -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "Bağlantı kurulamadı: %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "Sunucu hazır değil" + +#: network/soap/httpsoapconnection.cpp:471 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "Giriş servisi çok fazla yönlendirme yapıyor" -#: notification/chatnotification.cpp:163 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "In %1's chat: %2" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "Sunucu hazır değil" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" msgstr "%1 ile sohbette: %2" -#: notification/chatnotification.cpp:167 +#: notification/chatnotification.cpp:158 #, fuzzy -msgid "%1 says:
'%2'" +msgid "%1 says:
'%2'" msgstr "%1 diyor ki:
'%2'" -#: notification/chatnotification.cpp:171 +#: notification/chatnotification.cpp:162 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgid "%1 has sent you an offline message:
'%2'" msgstr "%1 size çevrimdışı bir ileti gönderdi:
'%2'" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:169 #, fuzzy msgid "%1's chat requests attention!" msgstr "%1 ile sohbet ilgi istiyor!" -#: notification/chatnotification.cpp:183 +#: notification/chatnotification.cpp:174 #, fuzzy -msgid "%1:
%2" +msgid "%1:
%2" msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 +#: notification/chatnotification.cpp:181 #, fuzzy msgid "%1 has sent you a handwritten message!" msgstr "%1 size bir titreme gönderdi!" -#: notification/chatnotification.cpp:194 +#: notification/chatnotification.cpp:185 #, fuzzy msgid "%1 has sent you a nudge!" msgstr "%1 size bir titreme gönderdi!" -#: notification/chatnotification.cpp:198 +#: notification/chatnotification.cpp:189 #, fuzzy msgid "%1 has sent you a wink!" msgstr "%1 size bir göz kırpma gönderdi!" -#: notification/chatnotification.cpp:204 +#: notification/chatnotification.cpp:195 #, fuzzy msgid "%1 wants to use the webcam!" msgstr "%1 ağ kamerasını kullanmak istiyor!" -#: notification/chatnotification.cpp:205 +#: notification/chatnotification.cpp:196 #, fuzzy msgid "%1 is sending you a file!" msgstr "%1 size bir dosya gönderiyor!" -#: notification/chatnotification.cpp:206 +#: notification/chatnotification.cpp:197 #, fuzzy msgid "%1 has sent you an invitation!" msgstr "%1 size bir davet gönderdi!" -#: notification/chatnotification.cpp:213 +#: notification/chatnotification.cpp:204 #, fuzzy msgid "%1 has canceled the webcam session!" msgstr "%1 ağ kamerası oturumunu iptal etti!" -#: notification/chatnotification.cpp:214 +#: notification/chatnotification.cpp:205 #, fuzzy msgid "%1 has canceled the file transfer!" msgstr "%1 dosya aktarımını iptal etti!" -#: notification/chatnotification.cpp:215 +#: notification/chatnotification.cpp:206 #, fuzzy msgid "%1's activity has been canceled!" msgstr "%1 etkileşimi iptal edildi!" -#: notification/chatnotification.cpp:222 +#: notification/chatnotification.cpp:213 #, fuzzy msgid "%1 has accepted to use the webcam!" msgstr "%1 ağ kamerasını kullanmayı kabul etti!" -#: notification/chatnotification.cpp:223 +#: notification/chatnotification.cpp:214 #, fuzzy msgid "%1 has accepted the file transfer!" msgstr "%1 dosya aktarımını kabul etti!" -#: notification/chatnotification.cpp:224 +#: notification/chatnotification.cpp:215 #, fuzzy msgid "%1 has accepted your invitation!" msgstr "%1 davetinizi kabul etti!" -#: notification/chatnotification.cpp:231 +#: notification/chatnotification.cpp:222 #, fuzzy msgid "%1 has ended the webcam session!" msgstr "%1 ağ kamerası oturumunu bitirdi!" -#: notification/chatnotification.cpp:232 +#: notification/chatnotification.cpp:223 #, fuzzy msgid "The file transfer with %1 is done!" msgstr "%1 ile olan dosya aktarımı tamamlandı!" -#: notification/chatnotification.cpp:233 +#: notification/chatnotification.cpp:224 #, fuzzy msgid "%1's activity has ended!" msgstr "%1 ile olan etkileşim bitti!" -#: notification/chatnotification.cpp:240 +#: notification/chatnotification.cpp:231 #, fuzzy msgid "%1's webcam session has failed!" msgstr "%1 ile ağ kamerası oturumu başarısız oldu!" -#: notification/chatnotification.cpp:241 +#: notification/chatnotification.cpp:232 #, fuzzy msgid "The file transfer with %1 has failed!" msgstr "%1 ile olan dosya aktarımı başarısız oldu!" -#: notification/chatnotification.cpp:242 +#: notification/chatnotification.cpp:233 #, fuzzy msgid "%1's activity has ended with an error!" msgstr "%1 ile olan etkileşim hatalı sonlandı!" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" -msgstr "%1 çevrimiçi" +msgid "%1
is now online" +msgstr "%1:
%2" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" -msgstr "%1 uzakta" +msgid "%1
has gone away" +msgstr "%1:
%2" -#: notification/contactstatusnotification.cpp:72 +#: notification/contactstatusnotification.cpp:93 #, fuzzy -msgid "%1 will be right back" +msgid "%1
will be right back" msgstr "%1 hemen dönecek" -#: notification/contactstatusnotification.cpp:73 +#: notification/contactstatusnotification.cpp:94 #, fuzzy -msgid "%1 is now busy" -msgstr "%1 artık meşgul" +msgid "%1
is now busy" +msgstr "%1:
%2" -#: notification/contactstatusnotification.cpp:74 +#: notification/contactstatusnotification.cpp:95 #, fuzzy -msgid "%1 has become invisible" +msgid "%1
has become invisible" msgstr "%1 gizli" -#: notification/contactstatusnotification.cpp:75 +#: notification/contactstatusnotification.cpp:96 #, fuzzy -msgid "%1 has gone idle" -msgstr "%1 artık boşta" +msgid "%1
has gone idle" +msgstr "%1:
%2" -#: notification/contactstatusnotification.cpp:76 +#: notification/contactstatusnotification.cpp:97 #, fuzzy -msgid "%1 has logged out" +msgid "%1
has logged out" msgstr "%1 çevrimdışı" -#: notification/contactstatusnotification.cpp:77 +#: notification/contactstatusnotification.cpp:98 #, fuzzy -msgid "%1 is on the phone" +msgid "%1
is on the phone" msgstr "%1 telefonda" -#: notification/contactstatusnotification.cpp:78 +#: notification/contactstatusnotification.cpp:99 #, fuzzy -msgid "%1 is out for lunch" +msgid "%1
is out for lunch" msgstr "%1 yemeğe gitti" -#: notification/newemailnotification.cpp:78 +#: notification/newemailnotification.cpp:90 #, fuzzy -msgid "New email:
'%1'
by '%2'" +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" msgstr "Yeni e-posta:
'%1'
gönderen '%2'" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "Bir &Buluşma Başlat" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "&Kişisel Mesaj" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "Size ileti &gönerildiğinde" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "Şeytan" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "E-&posta Gönder" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "" + +#: notification/systemtraywidget.cpp:78 +#, fuzzy +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"Ana pencere kapatılınca KMess sistem çekmecesinde çalışmaya devam eder. " +"Uygulamadan çıkmak için 'Dosya' menüsünden 'çık'ı kullanın." + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "Sistem Tepsisine Yerleş" + +#: notification/systemtraywidget.cpp:240 +#, fuzzy +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 %2" + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "" -#: settings/accountpage.cpp:70 +#: settings/accountpage.cpp:81 #, fuzzy -msgid "Browse and crop picture..." +msgid "Browse and Crop Picture..." msgstr "Resme gözat ve kırp..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "Görüntü resmi alınamadı" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 #, fuzzy msgid "" "An error occurred when trying to change the display picture.\n" @@ -4013,160 +5677,735 @@ msgstr "" "Görüntü resmi değiştirilirken bir hata oluştu.\n" "Doğru resmi seçtiğinizden emin olun" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "&Kişiyi Sil" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "Ayarlar" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "Hesap" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "Hesap" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "Uyarılar" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "KMess Bildirimi" +msgid "Contact List" +msgstr "Kişiler" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "Sohbet ediyor" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "Sohbet Günlüğü" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 #, fuzzy msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "'%1' geçerli bir kişi adresi değil." -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 #, fuzzy msgid "The email address you have entered is already in use: '%1'" msgstr "'%1' geçerli bir kişi adresi değil." -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "Gerçekten bu hesabı silmek istiyor musunuz?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "Gerçekten bu hesabı silmek istiyor musunuz?" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "Selam, nasıl gidiyor? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "Simge" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "Harika!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "Bodrum'daki tatilden /yeni/ döndüm!" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "İfadeler" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "Gerçekten bu hesabı silmek istiyor musunuz?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "İfadeler" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "Ayarlar" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "Hesaplar" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "E-posta bildirimi" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "Sohbetleri bu dizine kaydet:" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"Ana pencere kapatılınca KMess sistem çekmecesinde çalışmaya devam eder. " -"Uygulamadan çıkmak için 'Dosya' menüsünden 'çık'ı kullanın." -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "Sistem Tepsisine Yerleş" +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" -#: systemtraywidget.cpp:245 +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" +msgstr[1] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 %2" +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "'%1' geçerli bir kişi adresi değil." + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "Kişiler" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#, fuzzy +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "Bir ifade seçin ve silmek için buraya tıklayın." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "\"%1\" mesajı gönderilemedi." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "\"%1\" mesajı gönderilemedi." + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "\"%1\" mesajı gönderilemedi." + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "\"%1\" mesajı gönderilemedi." + +#, fuzzy +#~ msgid "Use" +#~ msgstr "Kafası karışık" + +#~ msgid "&Copy..." +#~ msgstr "Ko&pyala..." + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "Bir ifade kullan" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "E-posta adresi:" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "Engellenmiş" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "Kişiler" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "Bağlı &olmayanları göster" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "Kişi listesi alınıyor..." + +#, fuzzy +#~ msgid "Enable in the chat windows" +#~ msgstr "Kişi listesi alınıyor..." + +#~ msgid "Alerts" +#~ msgstr "Uyarılar" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "KMess Bildirimi" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "Grubu &Sil" + +#, fuzzy +#~ msgid "Now listening to: %1" +#~ msgstr "Şimdi dinleniyor - %1" + +#, fuzzy +#~ msgid "&Listening Music" +#~ msgstr "Şimdi dinliyor - %1" + +#, fuzzy +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "" +#~ "KMess uzaktaki web servisine erişemedi. \n" +#~ "\n" +#~ "Ayrıntılar: %1" + +#, fuzzy +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "Doğrulama başarısız, KMess hesabınızla giriş yapamadı.\n" +#~ "Ayrıntılar: %1" + +#, fuzzy +#~ msgid "Close all tabs" +#~ msgstr "Sekmeyi kapat" + +#~ msgid "&Send email" +#~ msgstr "&E-posta gönder" + +#, fuzzy +#~ msgid "Save complete" +#~ msgstr "Sohbeti Kaydet" + +#, fuzzy +#~ msgid "C&lose all tabs" +#~ msgstr "Sekmeyi kapat" + +#~ msgid "Connect" +#~ msgstr "Bağlan" + +#~ msgid "Rename group" +#~ msgstr "&Grubu Yeniden Adlandır" + +#, fuzzy +#~ msgid "Account &Settings..." +#~ msgstr "&Hesap Ayarları" + +#, fuzzy +#~ msgid "Select an emoticon and click here to delete it" +#~ msgstr "Bir ifade seçin ve silmek için buraya tıklayın." + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1 çevrimiçi" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1 uzakta" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1 artık meşgul" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1 artık boşta" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "Açılır bildirimler" + +#~ msgid "Show notifications when your contacts:" +#~ msgstr "Kişiler bu durumda olduğunda bildirim göster:" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "Etkinse, kişileriniz MSN'e bağlandığında uyarı penceresi çıkar." + +#, fuzzy +#~ msgid "&Go online" +#~ msgstr "Çe&vrimdışı olduklarında" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "" +#~ "Etkinse, kişileriniz sizinle sohbet başlattığında uyarı penceresi çıkar." + +#~ msgid "Start a &chat with you" +#~ msgstr "Sizinle &sohbet başlatıldığında" + +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "" +#~ "Etkinse, kişileriniz size her ileti yolladığında uyarı penceresi çıkar." + +#~ msgid "S&end you a message" +#~ msgstr "Size ileti &gönerildiğinde" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when your contacts change their MSN " +#~ "status." +#~ msgstr "" +#~ "Etkinse, kişileriniz durumlarını değiştirdiklerinde uyarı penceresi çıkar." + +#~ msgid "Change their &status" +#~ msgstr "&Durumlarını değiştirdiklerinde" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts goes " +#~ "offline." +#~ msgstr "Etkinse, kişileriniz bağlantıyı kestiğinde uyarı penceresi çıkar." + +#~ msgid "Go o&ffline" +#~ msgstr "Çe&vrimdışı olduklarında" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "E-posta adresi" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "\"diğer dizinlerde\" bir eposta alındığında bildirim göster" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in the Inbox. " +#~ "This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Etkinse, diğer dizinlere gelen e-postalar için de uyarı penceresi " +#~ "gösterilir. Bu seçenek sadece Hotmail hesapları için geçerlidir." + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in other " +#~ "folders. This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "Etkinse, diğer dizinlere gelen e-postalar için de uyarı penceresi " +#~ "gösterilir. Bu seçenek sadece Hotmail hesapları için geçerlidir." + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "Uyarılar" + +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "Uyarı penceresinin ne kadar süre sonra gizleneceğini belirler." + +#~ msgid "Hide popups after" +#~ msgstr "Uyarı pencerelerini gizleme süresi" + +#~ msgid "seconds" +#~ msgstr "saniye" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "Uyarılar" + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "" +#~ "Karşıdaki, KMess'in henüz desteklemediği bir MSN7 özelliği kullanmaya " +#~ "çalışıyor." + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "Kişiler" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "Parola" + +#, fuzzy +#~ msgid "" +#~ "If enabled, all chat conversations will be saved in the specified " +#~ "directory." +#~ msgstr "Etkinse, sohbetler belirlenmiş olan dizine kaydedilir." + +#~ msgid "Log &all chats" +#~ msgstr "Bütün sohbetleri &kaydet" + +#~ msgid "Month" +#~ msgstr "Ay" + +#~ msgid "Day" +#~ msgstr "Gün" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "Kişiler" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "&Kişiyi Ara" + +#~ msgid "This person is offline or invisible." +#~ msgstr "Bu kişi bağlı değil ya da görünmez durumda." + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "\"%1\" mesajı alınamadı!" + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "Kenar Çubuğu" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "Bağlantı yançubuğunu göster ya da gizle" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "Bağlantı yançubuğunu göster ya da gizle" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "Kişi çevrimdışı" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "Da&vet et" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "Bağlantı kurulamadı: %1" + +#, fuzzy +#~ msgid "" +#~ "Click here to add a new custom emoticon which can be sent to your contacts" +#~ msgstr "Özel bir ifade eklemek için buraya tıklayın." + +#~ msgid "Black sheep" +#~ msgstr "Kara koyun" + +#~ msgid "Copy E&mail" +#~ msgstr "E-posta'yı &Kopyala" + +#~ msgid "Specify an Away message" +#~ msgstr "Uzakta durumu için ileti belirle" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "E-posta" + +#~ msgid "Soccer ball" +#~ msgstr "Futbol topu" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "Kişi zaten listenizde bulunuyor" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "E-posta" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "Kişi listenizde yok" + +#~ msgid "The group name is too long" +#~ msgstr "Grup adı çok uzun" + +#, fuzzy +#~ msgid "No permissions given for this account" +#~ msgstr "Bu hesap için özel ifadeler:" + +#~ msgid "Enter your personal message here" +#~ msgstr "Buraya kişisel bir ileti yazın" + +#~ msgid "Click" +#~ msgstr "Tıkla" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "Ağ Penceresi" + +#, fuzzy +#~ msgid "Enable new Windows Live Messenger protocol support" +#~ msgstr "Site tasarımı" + +#~ msgid "Co&nnect" +#~ msgstr "Bağla&n" + +#, fuzzy +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "Kişi listesi alınıyor..." + +#, fuzzy +#~ msgid "SSL Error" +#~ msgstr "Sunucu Hatası" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "&Hesap Ayarları" + +#, fuzzy +#~ msgid "You received a wink from %1." +#~ msgstr "%1 size bir göz kırpması gönderdi" + +#~ msgid "Got synchronization" +#~ msgstr "Eşzamanlama alındı" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "Ayarlar" + +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "Bu dosyayı almak istiyor musunuz: %1 (%2)" + +#~ msgid "The transfer was cancelled" +#~ msgstr "Aktarım iptal edildi." + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "Dosya başarıyla aktarıldı: %1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "%1 aktarılamadı. Dosya bulunamadı." + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "%1 aktarılamadı. Dosya okunamıyor." + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "%1 aktarımı iptal edildi." #~ msgid "Click to send an email to this contact." #~ msgstr "Bu kişiye bir e-posta göndermek için tıklayın." @@ -4174,10 +6413,6 @@ msgstr "%1 %2" #~ msgid "Picture:" #~ msgstr "Resim:" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "E-posta bilgisini göster" - #~ msgid "Logging in..." #~ msgstr "Oturum açılıyor..." @@ -4210,10 +6445,6 @@ msgstr "%1 %2" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "Gelen kutunuzda %1 yeni posta var." -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "Çevri&miçi olduklarında" - #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "%1 dosyasının aktarımı başarısız oldu. Dosya açılamadı" @@ -4238,12 +6469,6 @@ msgstr "%1 %2" #~ msgid "Your password:" #~ msgstr "Parolanız:" -#~ msgid "Display picture:" -#~ msgstr "Görünen Resim:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "Resim &gösterme" - #~ msgid "Status to set at login:" #~ msgstr "Girişte durumu böyle yap:" diff --git a/po/zh_CN.po b/po/zh_CN.po index 1a2835d..6dff3c7 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: KMess\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" "PO-Revision-Date: 2008-06-01 17:47+0800\n" "Last-Translator: Liu Sizhuang \n" "Language-Team: Chinese/Simplified \n" @@ -22,478 +22,778 @@ msgstr "" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 +#, fuzzy +msgid "Standard text mode" +msgstr "卡通表情" + +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +#, fuzzy +msgid "Click this button to switch to standard text mode." +msgstr "点击此处恢复联络人的头像" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) +#: rc.cpp:9 +#, fuzzy +msgid "Ink message" +msgstr "还没有消息" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +#, fuzzy +msgid "Standard emoticons" +msgstr "卡通表情" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +#, fuzzy +msgid "Custom emoticons" +msgstr "自定义表情(&C)" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +#, fuzzy +msgid "Winks" +msgstr "眨眼" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +#, fuzzy +msgid "Click this button to view the available winks." +msgstr "点击此处恢复联络人的头像" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 msgid "Ne&w Line" msgstr "换行(&w)" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 -#: rc.cpp:9 +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "发送(&e)" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "联系人" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "聊天(&C)" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +#, fuzzy +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "侧边栏" + +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" msgstr "点击此处显示联系人的档案。" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +#, fuzzy +msgid "Click here to open your account settings" +msgstr "单击这里重命名选中的表情" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +#, fuzzy +msgid "&Clear area" +msgstr "清除标签" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "改变字体颜色(&C)" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 #, fuzzy +msgid "Initial groups" +msgstr "重命名组(&n)" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" msgstr "输入您想添加的联系人电子邮件地址:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "电子邮件地址" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "电子邮件地址:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "为表情输入一个快捷键:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -#, fuzzy -msgid "Initial group" -msgstr "重命名组(&n)" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "输入这个图释的快捷键:" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "选择图片文件: " -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 -#, fuzzy +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." msgstr "输入自动回复的内容:" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 -#, fuzzy -msgid "&Automatic away message" -msgstr "指定处于离开状态时发送的消息" +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "指定处于离开状态时发送的消息(&S)" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +#, fuzzy +msgid "Search through contacts..." +msgstr "搜索联系人(&o)" + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 +#, fuzzy +msgid "Chat Log Filter" +msgstr "聊天记录" + +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +#, fuzzy +msgid "&Do not filter" +msgstr "不启用(&D)" + +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 #, fuzzy -msgid "&Add this person to my \"Friends\" list" +msgid "to" +msgstr "汽车" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 +#, fuzzy +msgid "Filter by &chat" +msgstr "开始或停止一个对话(&C)" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +#, fuzzy +msgid "&Add this person to these groups of my contact list:" msgstr "将这个联系人加入您的列表中(&A)" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" +msgid "&Do not add this person; only allow them to see my status" msgstr "不添加这个联系人,但让他看到您的状态(&N)" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" +msgid "&Block this person from contacting me or seeing my status" msgstr "阻止此人与你联系或者看到你的联机状态(&y)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "联系人%1的属性:" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 +#, fuzzy msgid "&Information" -msgstr "" +msgstr "信息" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "点击此处恢复联络人的头像" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "恢复(&R)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "组(&G)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 #, fuzzy -msgid "Restore" -msgstr "删除的" +msgid "Use an &alternative name for this person" +msgstr "使用另一个名字(&a)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "当此人上线或下线时通知我(&p)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 #, fuzzy -msgid "Use alternative name for this person" -msgstr "使用另一个名字" +msgid "&Sound:" +msgstr "声音(&S):" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "当此人上线或下线时通知我" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "声音:" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" +msgstr "图像(&m)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +#, fuzzy +msgid "Click here to use the selected picture as your display picture" +msgstr "单击这里删除选中的表情。" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +#, fuzzy +msgid "Use As Display Picture" +msgstr "显示头像" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 +msgid "&Clear Cache" +msgstr "清除缓存(&C)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "音符(&N)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +#, fuzzy +msgid "&Emoticons" +msgstr "表情" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 -#, fuzzy -msgid "&Clear Cache" -msgstr "清除标签" +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "单击这里删除选中的表情。" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -#, fuzzy -msgid "Notes" -msgstr "音符" +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "删除(&v)" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +#, fuzzy +msgid "Available Contacts" +msgstr "允许联系人(&A)" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "邀请一个不在您的列表中的联系人" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "输入你想邀请的联系人的电子邮件" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "邀请的联系人" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "输出的项目" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "格式" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "联系人" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "全选" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "全不选" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "导出..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "关闭" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" msgstr "网络窗口" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" -msgstr "" +msgstr "关闭标签" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "命令" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" msgstr "类型:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "星" +msgstr "标准" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" msgstr "" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" msgstr "发送(&e)" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 +#, fuzzy msgid "Command payload (can be empty):" -msgstr "" +msgstr "命令附加(可以为空)" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" -msgstr "" +msgstr "打开" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 -#, fuzzy +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" -msgstr "已取消" +msgstr "取消" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "下载(&D)" + +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "上传(&U)" + +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "清除(&l)" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "关闭(&C)" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "电子邮件地址:" +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "请输入您的Passport或者Live账号的邮件地址:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" msgstr "密码:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "输入您的账号密码" + +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" msgstr "登录时的状态" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "" - -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 #, fuzzy -msgid " Account options " -msgstr "帐号设置(&S)" +msgid "Choose a status to set when successfully connected." +msgstr "选择成功登陆后的状态" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" -msgstr "记住这个帐号(&b)" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "如果选中,KMess自动保存这个帐号的记录。" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" +msgstr "记住帐号(&b)" + +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "如果您选择在KMess中保存这个账号, 您可以同时选择保存密码" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "记住密码(&e)" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" msgstr "" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "登录(&C)" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "请在此处输入您的个人信息" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "添加新帐号" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" + +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 +msgid "" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" +msgstr "" + +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "忘记密码?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "" + +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "登录(&C)" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "查看(&V)" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "操作(&A)" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 #, fuzzy -msgid "Your Account Information" -msgstr "输入您的登录信息:" +msgid "Form" +msgstr "格式" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +#, fuzzy +msgid "Account &Info" +msgstr "帐号" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "您的账号信息:" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." msgstr "输入你在线时其他联系人将看到的名字。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 -#, fuzzy +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 msgid "&Friendly name:" msgstr "昵称(&F)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" msgstr "" -"输入你的MSN Passport帐号的e-mail地址。你可以在 https://accountservices." -"passport.net/reg.srf?ns=msn.com&lc=2052 注册新帐号。" +"输入你的MSN Passport帐号的e-mail地址。你可以在 https://register.passport.com" +"注册新帐号。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 -#, fuzzy +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 msgid "&Email address:" -msgstr "电子邮件地址:" +msgstr "电子邮件地址(&E):" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -"输入你的MSN Passport帐号的密码。你可以在 https://accountservices.passport." -"net/reg.srf?ns=msn.com&lc=2052 注册新帐号。" +"输入你的MSN Passport帐号的密码。你可以在 https://register.passport.com注册新" +"帐号。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" -msgstr "密码:" +msgstr "密码(&P):" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -#, fuzzy -msgid "&Remember Password" -msgstr "密码" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "记住密码(&R)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" -msgstr "头像" +msgstr "显示头像" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." msgstr "更改(&h)..." -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 +#, fuzzy msgid "&Do not use" -msgstr "" +msgstr "不启用(&D)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." @@ -504,324 +804,626 @@ msgstr "" "建议选中这个选项,除非你是以客人身份使用KMess或者你在使用公共计算机系统(比如" "网吧)。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 -#, fuzzy +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "记住这个帐号的设置" +msgstr "记住这个帐号的设置(&m)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "如果选中,KMess自动保存这个帐号的记录。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" -msgstr "启动时自动登录此帐号(&w)" +msgid "Log in &with this account automatically" +msgstr "自动登录此帐号(&w)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "保存所有聊天记录(&a)" +msgstr "登陆状态(&a)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " -"Hotmail account to connect." +"You need to connect to the Passport site to confirm that your email address " +"exists." msgstr "" -"你需要一个 passport 帐号来连接到 MSN Messenger 网络。你可以在 https://" -"accountservices.passport.net/reg.srf?ns=msn.com&lc=2052 注册你目前的 e-mail," -"或使用 Hotmail 帐号来连接。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 msgid "" -"You can't change your friendly name because your passport e-mail address is " +"You can't change your friendly name because your Passport email address is " "not verified." -msgstr "你无法改变你的昵称,因为你还没有确认你的passport email地址。" +msgstr "你无法改变你的昵称,因为你的passport email地址尚未验证。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 msgid "Request verification email" msgstr "需要验证电子邮件" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 msgid "https://accountservices.passport.net/" msgstr "https://accountservices.passport.net/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 msgid "Go to accountservices.passport.net" msgstr "访问 accountservices.passport.net" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " +"Hotmail account to connect." +msgstr "" +"你需要一个 passport 帐号来连接到 MSN Messenger 网络。你可以在 https://" +"register.passport.com 注册你目前的 e-mail,或使用 Hotmail 帐号来连接。" + +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 +msgid "" +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." msgstr "" "连接到 MSN Messenger 服务,你需要注册一个 e-mail 来当作 Passport 帐号。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "注册新账户" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" -msgstr "https://accountservices.passport.net/reg.srf?ns=msn.com&lc=2052" +msgstr "https://register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" -msgstr "连接到 https://accountservices.passport.net/reg.srf?ns=msn.com&lc=2052" +msgstr "连接到 https://register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 #, fuzzy -msgid "Saved accounts:" -msgstr "帐号" +msgid "&Status Options" +msgstr "登录时的状态" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "单击这里" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "单击这里添加一个新的自定义图释。" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 #, fuzzy -msgid "&Add account..." -msgstr "添加联系人" +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"如果选中,当你几分钟不是用电脑时,你的状态会自动切换到\"离开 - 发呆\"。" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "选择一个图释然后单击这里删除。" +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +#, fuzzy +msgid "Change status to \"&Idle\" when inactive" +msgstr "不活跃时将状态改为\"离开-空闲\" (&y)" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 -msgid "&Edit" +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "控制 KMess 转变状态为 \"离开 - 发呆\" 前的分钟数。" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "开启定时器" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "分钟后" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 #, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "当我的状态(&H)" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 +msgid "Saved accounts:" +msgstr "已保存的帐号" + +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" +msgstr "" + +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +#, fuzzy +msgid "&Add Account..." +msgstr "添加联系人(&A)..." + +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 +#, fuzzy +msgid "Select an account and click here to modify it" +msgstr "选择一个账号然后单击这里删除。" + +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 +msgid "&Edit" +msgstr "编辑(&E)" + +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "选择一个账号然后单击这里删除。" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" -msgstr "删除的" +msgstr "删除(&R)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "弹出通知" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 +msgid "" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "启用聊天记录" + +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "将聊天记录保存到文件" + +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 #, fuzzy -msgid "Contact Events" +msgid "File format used for saving:" +msgstr "用于保存的文件格式" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 +msgid "" +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "纯文本" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +#, fuzzy +msgid "Separate logged chats by:" +msgstr "保存聊天" + +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +#, fuzzy +msgid "Create a directory to organize chats by year" +msgstr "当你选择“以年、月、日组织聊天记录”时,KMess 会自动建立子文件夹。" + +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "年" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +#, fuzzy +msgid "Create directories to organize chats by year then by month" +msgstr "当你选择“以年、月、日组织聊天记录”时,KMess 会自动建立子文件夹。" + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +#, fuzzy +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "当你选择“以年、月、日组织聊天记录”时,KMess 会自动建立子文件夹。" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +#, fuzzy +msgid "Place all saved chats directly in the directory specified below" +msgstr "在顶级目录中保存所有聊天记录" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +#, fuzzy +msgid "Click here to choose a directory" +msgstr "单击这里重命名选中的表情。" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "选择一个你想要保存聊天记录的文件夹。" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +#, fuzzy +msgid "Save logged chats in this directory:" +msgstr "在此目录中保存聊天记录:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "允许你改变 KMess 用来显示聊天信息的主题。" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +#, fuzzy +msgid "&Chat style:" +msgstr "聊天主题(&C):" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "聊天设置" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 +#, fuzzy +msgid "Enables the appearance of emoticons in the chat window." +msgstr "可以在聊天内容中使用表情。" + +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "显示表情(&S)" + +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +#, fuzzy +msgid "Show &winks" +msgstr "显示表情(&E)" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +#, fuzzy +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"这个选项使同一个联系人的信息组合在一起。当联系人输入多个信息来解释某事时," +"KMess 把这些信息组合成单个的信息。具体的外观则依主题的不同而不同。\n" +"当你使用小i的MSN群时,此功能可能会引起显示混乱。" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "把同一个联系人发来的消息放在一起(&G)" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "在每一条聊天内容中显示时间标记。" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +#, fuzzy +msgid "S&how timestamp" +msgstr "在显示消息时间(&h)" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +#, fuzzy +msgid "Show &date" msgstr "联系人" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "当联系人有如下动作时通知你:" +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +#, fuzzy +msgid "Show s&econds" +msgstr "显示表情(&S)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +#, fuzzy +msgid "&Text" +msgstr "文字(&T)" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "这是你的聊天信息的字体、字型和颜色。" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "消息所用字体(&m):" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." -msgstr "如果选中,当你的联系人连接到MSN时会弹出消息。" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"允许用以下已选的字型、形式和颜色来覆盖你的联系人的聊天信息中的字型、形式和颜" +"色。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -msgid "&Go online" -msgstr "上线(&G)" +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +#, fuzzy +msgid "&Force messages from your contacts to use this font:" +msgstr "强制所有联系人的消息使用此字体:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +#, fuzzy +msgid "Chat Window Formatting" +msgstr "清除标签" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +#, fuzzy msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "如果选中,当你的联系人开始与你谈话时会弹出消息。" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"使用字体效果。输入 *粗体*,/斜体/ 和 _下划线_,可使字呈现相应的粗体、斜体和下" +"划线样式。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "开始了与您的聊天(&c)" +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +#, fuzzy +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "在消息中使用字体效果,例如*粗体*、/斜体/和_下划线_。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "如果选中,每当你的联系人给你发消息时会弹出消息。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "给您发送了消息(&e)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "如果选中,当你的联系人改变MSN状态时也会弹出消息。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "更改状态(&s)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "如果选中,每当你的联系人下线时也会弹出消息。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "下线(&f)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "电子邮件地址" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "当电子邮件到达\"其他文件夹\"时通知我" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 -msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." -msgstr "" -"如果选中,当你在其他文件夹中收到邮件时,也会弹出气泡。此选项仅适用于 Hotmail " -"帐户。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "控制弹出气泡隐藏前的显示时间。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "通知停留" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "秒" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 -#, fuzzy -msgid "Other Alerts" -msgstr "提醒" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "显示脱机的联系人(&A)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -835,2130 +1437,2866 @@ msgstr "" "

当开启此选项时,KMess 依然限制摇晃效果。联系人可能会一次发出许多个闪屏震" "动,但是 KMess 只会摇晃窗口一次。

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" -msgstr "当发送或者接到闪屏震动时窗口会摇晃(%w)" +msgstr "当发送或者接到闪屏震动时窗口会摇晃(&w)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." +msgstr "" + +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "禁止显示头像(&y)" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +#, fuzzy +msgid "G&roup chats in the same window:" +msgstr "在同一个窗口中显示所有的聊天" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "总是" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "同一组的联系人" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "从不" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +#, fuzzy +msgid "Display Options" +msgstr "头像:" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +#, fuzzy +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" "如果选中,当你在收件箱中收到邮件时,会弹出气泡。未读邮件的数目会在联系人列表" "的上方出现。此选项仅适用于 Hotmail 帐户。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 +#, fuzzy msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" "如果选中,KMess 会通知你的联系人你正在收听什么。这个信息是从当前运行的音频播" "放软件中获取的。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 #, fuzzy -msgid "Inform contacts w&hich song I am listening to" +msgid "Show contacts w&hich song I am listening to" msgstr "通知我的联系人我在听哪一首歌。(&h)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -#, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"如果选中,当你几分钟不是用电脑时,你的状态会自动切换到\"离开 - 发呆\"。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "不活跃时将状态改为\"离开-空闲\" (&y)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "控制 KMess 转变状态为 \"离开 - 发呆\" 前的分钟数。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "开启定时器" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "分钟后" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "如果选中,聊天记录会保存在指定的目录下。" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "保存所有聊天记录(&a)" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "选择一个你想要保存聊天记录的文件夹。" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "在此目录中保存聊天记录:" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "当你选择“以年、月、日组织聊天记录”时,KMess 会自动建立子文件夹。" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "年" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "月" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "日" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "在顶级目录中保存所有聊天记录" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "允许你改变 KMess 用来显示聊天信息的主题。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "聊天主题:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "设置" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "在聊天内容中使用图释。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "显示图释(&E)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "在每一条聊天内容中显示时间标记。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "在消息中显示时间信息(&h)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"这个选项使同一个联系人的信息组合在一起。当联系人输入多个信息来解释某事时," -"KMess 把这些信息组合成单个的信息。具体的外观则依主题的不同而不同。\n" -"当你使用小i的MSN群时,此功能可能会引起显示混乱。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "把同一个联系人发来的消息放在一起(&G)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "离开" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "您的联系人列表中分组太多了" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "厌恶" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "这是你的聊天信息的字体、字型和颜色。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "消息所用字体:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"允许用以下已选的字型、形式和颜色来覆盖你的联系人的聊天信息中的字型、形式和颜" -"色。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "强制所有联系人的消息使用此字体:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"使用字体效果。输入 *粗体*,/斜体/ 和 _下划线_,可使字呈现相应的粗体、斜体和下" -"划线样式。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "在消息中使用字体效果,例如*粗体*、/斜体/和_下划线_。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "等待联系人列表……" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" msgstr "表情主题(&E)" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" -msgstr "可用的图释主题:" +msgstr "可用的表情主题:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" -msgstr "自定义图释(&C)" +msgstr "自定义表情(&C)" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" -msgstr "这个帐号的自定义图释:" +msgstr "这个帐号的自定义表情:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "单击这里创建一个新的自定义表情。" + +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." msgstr "添加(&w)..." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "单击这里重命名选中的图释。" +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "单击这里重命名选中的表情" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" msgstr "重命名(&n)" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "删除(&v)" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" -msgstr "枯玫瑰" +msgstr "浏览器" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 +#, fuzzy msgid "Choose this option to use the browser used by the rest of KDE." -msgstr "" +msgstr "选中这个选项来使用KDE所使用的浏览器" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "使用KDE默认浏览器(&U)" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 +#, fuzzy msgid "Select this option to choose from a list of installed browsers." -msgstr "" +msgstr "选中这个选项, 从下列列表中选择已安装的浏览器" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "使用已安装的浏览器(&U)" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 +#, fuzzy msgid "Choose this option to enter the path to your favorite browser." -msgstr "" +msgstr "选中这个选项, 输入你偏爱的浏览器路径" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "指定一个自定义命令(&S)" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 #, fuzzy msgid "Email Client" msgstr "电子邮件客户程序" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "如果账号支持,使用Live Mail(&L)" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 +#, fuzzy msgid "Choose this option to use the email client used by the rest of KDE." -msgstr "" +msgstr "选中这个选项来使用KDE所使用的浏览器" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "使用KDE默认电子邮件客户端(&K)" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "使用已安装的电子邮件客户端(&i)" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "文件传送" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 #, fuzzy msgid "&Save all received files in one directory:" -msgstr "在此目录中保存聊天记录:" +msgstr "将所有接受的文件保存在同一目录(&S):" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 +#, fuzzy msgid "&Use ports between" -msgstr "" +msgstr "使用以下端口" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 #, fuzzy msgid "and" -msgstr "悲伤" +msgstr "和" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 #, fuzzy msgid "for file transfers" msgstr "文件传送" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "你的注释" + +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 +msgid "" +"\n" +"\n" +"

" +msgstr "" + +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +#, fuzzy +msgid "Your comment is about:" +msgstr "您的注释关于" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +#, fuzzy +msgid "Something you like" +msgstr "你喜欢的" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +#, fuzzy +msgid "Something you dislike" +msgstr "你不喜欢的" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +#, fuzzy +msgid "An improper behavior of the application" +msgstr "本程序不切当的表现" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "你希望的新特性" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "请输入您希望被联系的email地址" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "我已离开电脑" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "您的姓名" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "you@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "删除(&D)" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "保持" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "你无法开启这个邀请,因为这个聊天中有多个联系人。" -#: chat/chat.cpp:158 -#, fuzzy +#: chat/chat.cpp:142 msgid "%1 has joined the chat." msgstr "%1 已经加入聊天" -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." msgstr "对话闲置。%1 已经离开聊天。" -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." msgstr "%1 已经离开聊天" -#: chat/chat.cpp:364 +#: chat/chat.cpp:367 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr "与 %1 和 %2 聊天" +msgstr " %1 和 %2 聊天" -#: chat/chat.cpp:371 +#: chat/chat.cpp:374 #, fuzzy msgctxt "Name of a chat tab" msgid "%1 et al." msgstr "%1 ..等 - 聊天" -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr "(这条消息是自动发送的)" +msgstr "%1(这条消息是自动发送的)" -#: chat/chat.cpp:934 -#, fuzzy -msgid "You received a wink from %1." -msgstr "你接收了%1发来的传情动漫。" - -#: chat/chat.cpp:971 +#: chat/chat.cpp:830 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "传情动漫无法播放。请确认你安装了'cabextract'。" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." +#: chat/chat.cpp:941 +#, fuzzy +msgid "You have sent a wink" +msgstr "你收到了%1发来的传情动漫。" + +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "连接故障" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "%1给你发送了动作消息, 但KMess目前还不支持" + +#: chat/chat.cpp:1153 +#, fuzzy +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "%1给你发送了动作消息, 但KMess目前还不支持" + +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "%1给你发送了目前KMess还不支持的MSN特性" + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." msgstr "传情动漫无法显示。无法读取数据。" -#: chat/chat.cpp:1080 +#: chat/chat.cpp:1220 #, fuzzy -msgid "You have received a wink from %1" -msgstr "你接收了%1发来的传情动漫。" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "你从%1收到了一个传情动漫, 但无法播放。请确认你安装了'cabextract'。" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1230 #, fuzzy -msgid "You received a nudge from %1!" -msgstr "你收到了%1发来的闪屏震动!" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "传情动漫无法播放。请确认你安装了'cabextract'。" -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1241 #, fuzzy -msgid "The message '%1' could not be sent." +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "传情动漫无法显示。无法读取数据。" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1给您发送了传情动漫!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 已经加入聊天" + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 已经加入聊天" + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1给您发送了闪屏振动!" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "所有联系人(&A)" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "你收到了%1发来的闪屏震动!" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "你收到了%1发来的传情动漫。" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 已经加入聊天" + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1给你发送了离线消息:
'%2'" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." msgstr "消息 '%1' 无法发送。" -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" msgstr "你向%1发送了闪屏震动!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "您发送了闪屏振动!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 正在发送传情动漫: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 说:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:364 +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "启动语音对话。接听%1" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" -msgstr "添加这个图释: %1" +msgstr "添加这个表情: %1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "邀请(&I)" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "重新登录" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 +#, fuzzy msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "无法保存聊天记录。请确保你对保存记录文件的文件夹有写权限。" -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" + +#: chat/chatview.cpp:457 +#, fuzzy msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" "文件“%1”已存在。\n" "您要覆盖它吗?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "覆盖文件" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "覆盖文件(&w)" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." -msgstr "添加这个图释(&E)…" +msgstr "添加这个表情(&E)…" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "添加这个表情(&E)…" + +#: chat/chatview.cpp:833 msgid "Send &Email" msgstr "发送电子邮件(&E)" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "添加联系人(&A)" + +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" msgstr "复制电子邮件地址(&m)" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "访问链接(&L)" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "复制地址(&A)" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "复制文本(&C)" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "全选(&A)" -#: chat/chatview.cpp:1314 -msgid "Find &Text" +#: chat/chatview.cpp:869 +msgid "Find &Text..." msgstr "" -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +#, fuzzy +msgid "C&lear Chat" +msgstr "清除标签" + +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." msgstr "聊天记录保存到文件(&F)" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "聊天(&C)" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "联系人" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 +msgid "Emoticons" +msgstr "表情" + +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" +msgstr "我的表情" + +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." +msgstr "" + +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "关闭聊天标签" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "关闭所有标签(&A)" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "关闭这个标签" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "邀请(&I)" + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." msgstr "发送文件(&F)" -#: chat/chatwindow.cpp:493 +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "视频聊天" + +#: chat/chatwindow.cpp:412 msgid "Start a &Meeting" msgstr "开始会议(&M)" -#: chat/chatwindow.cpp:494 +#: chat/chatwindow.cpp:413 msgid "Send a &Nudge!" msgstr "发送闪屏(&N)" -#: chat/chatwindow.cpp:495 -msgid "Save chat" +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." msgstr "保存聊天" -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "图释" - -#: chat/chatwindow.cpp:498 -#, fuzzy +#: chat/chatwindow.cpp:415 msgid "Close &All Tabs" -msgstr "关闭标签" +msgstr "关闭所有标签(&A)" -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "设置" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "开始或停止一个对话(&C)" - -#: chat/chatwindow.cpp:568 +#: chat/chatwindow.cpp:420 msgid "Change &Font" msgstr "改变字体(&F)" -#: chat/chatwindow.cpp:569 +#: chat/chatwindow.cpp:421 msgid "Change Font &Color" msgstr "改变字体颜色(&C)" -#: chat/chatwindow.cpp:576 +#: chat/chatwindow.cpp:428 +msgid "Show &Emoticons" +msgstr "显示表情(&E)" + +#: chat/chatwindow.cpp:429 #, fuzzy -msgid "&Font" -msgstr "登录(&C)" +msgid "Show S&tatus Messages" +msgstr "在显示消息时间(&h)" -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "改变字体颜色(&C)" +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "面板(&P)" -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 -msgid "Emoticons" -msgstr "图释" - -#: chat/chatwindow.cpp:658 -msgid "My emoticons" -msgstr "我的图释" - -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "设置" - -#: chat/chatwindow.cpp:741 +#: chat/chatwindow.cpp:438 msgid "Use &Spell Checking" msgstr "使用拼写检查(&S)" -#: chat/chatwindow.cpp:742 -msgid "Show &Emoticons" -msgstr "显示图释(&E)" +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "会议" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "闪屏" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "发送文件(&F)" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 #, fuzzy -msgid "Hide Side&bar" -msgstr "侧边栏" +msgid "Enable or disable the contacts panel" +msgstr "等待联系人列表……" -#: chat/chatwindow.cpp:744 +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "联系人" + +#: chat/chatwindow.cpp:471 #, fuzzy -msgid "Hide &Toolbar" -msgstr "侧边栏" +msgid "Enable or disable the standard emoticons panel" +msgstr "等待联系人列表……" -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "表情" + +#: chat/chatwindow.cpp:477 #, fuzzy -msgid "Hide the contact sidebar" -msgstr "显示或隐藏联系人侧栏" +msgid "Enable or disable the Custom Emoticons panel" +msgstr "等待联系人列表……" -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "我的表情" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "字体(&F)" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "改变字体颜色(&C)" + +#: chat/chatwindow.cpp:493 +#, fuzzy +msgid "C&lear Chat Window" +msgstr "清除标签" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "开始或停止一个对话(&C)" + +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" msgstr "" -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "关闭标签" +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +msgid "You can't block anyone in a group chat." +msgstr "" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "关闭标签" +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "" -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "侧边栏" +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." +msgstr "" -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "显示或隐藏联系人侧栏" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "" -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1正在输入消息" - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 和 %2 正在打字" - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 和 %3 个其他人正在打字" - -#: chat/chatwindow.cpp:1611 -#, fuzzy +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "聊天" -#: chat/chatwindow.cpp:1615 -#, fuzzy +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "与 %1 聊天" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "发送电子邮件(&S)" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1正在输入消息..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 和 %2 正在输入信息..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 和 %3 个其他人正在打字" + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" + +#: chat/contactframe.cpp:304 +#, fuzzy +msgid "&Start Private Chat" +msgstr "开始私聊(&S)" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +#, fuzzy +msgid "&Send Email" +msgstr "发送电子邮件(&E)" + +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "查看档案(&V)" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" -msgstr "" +msgstr "编辑备注(&i)" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "添加联系人(&A)" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "允许联系人(&A)" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "删除联系人(&D)" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "阻止联系人(&B)" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "解除阻止联系人(&U)" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" msgstr "昵称(&F)" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "个人消息(&P)" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" msgstr "电子邮件地址(&E)" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." +#: chat/contactframe.cpp:341 kmessview.cpp:639 +#, fuzzy +msgid "&Copy" msgstr "复制(&C)..." -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "被阻止" -#: chat/contactframe.cpp:652 +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" -msgstr "联系人%1" +msgstr "联系人 %1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" -#: chat/emoticonsidebar.cpp:212 +#: chat/emoticonswidget.cpp:449 #, fuzzy msgid "Add to Chat" -msgstr "添加联系人" +msgstr "添加到聊天" -#: chat/emoticonsidebar.cpp:213 +#: chat/emoticonswidget.cpp:450 #, fuzzy -msgid "Insert new" -msgstr "插入图释" +msgid "Add New" +msgstr "添加(&w)..." -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" +msgstr "编辑" + +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 +msgid "Remove" +msgstr "删除" + +#: chat/winkswidget.cpp:106 +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" msgstr "" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 -#, fuzzy -msgid "Remove" -msgstr "删除的" - -#: contact/contactbase.cpp:280 +#: contact/contactbase.cpp:304 msgid "Windows Mobile" msgstr "" -#: contact/contactbase.cpp:284 -#, fuzzy +#: contact/contactbase.cpp:308 msgid "Web Messenger" -msgstr "网页设计" - -#: contact/contactbase.cpp:288 -msgid "Office Communicator" -msgstr "" - -#: contact/contactbase.cpp:292 -msgid "Messenger Bot" -msgstr "" - -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 -msgid "MSN Messenger %1 compatible" msgstr "" #: contact/contactbase.cpp:312 -msgid "Windows Live Messenger %1" +msgid "Office Communicator" msgstr "" #: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" +msgid "Messenger Bot" msgstr "" -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "" + +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" msgstr "" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Window Live Messenger %1 兼容" + +#: contact/contactbase.cpp:367 +#, fuzzy +msgid "Windows Live Messenger compatible" +msgstr "Window Live Messenger %1 兼容" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "联机" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "脱机" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "允许的" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "删除的" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 %2" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 %2" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "离开" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "马上回来" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "忙碌" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "显示为脱机" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "离开" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +#, fuzzy +msgid "Away with Auto-Reply" +msgstr "离开后自动回复" + +#: contact/msnstatus.cpp:160 msgid "Idle" msgstr "发呆" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "马上回来" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "接听电话" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "外出就餐" -#: dialogs/addcontactdialog.cpp:48 +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "显示为脱机" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "脱机" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "我的状态(&M)" + +#: contact/msnstatus.cpp:215 #, fuzzy +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "注销(&D)" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" msgstr "添加联系人" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "删除组(&m)" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" -msgstr "添加新的图释" +msgstr "添加新的表情" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "图释" +msgstr "编辑表情" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "图释“%1”已存在,你要覆盖它吗?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +#, fuzzy +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "表情“%1”已存在,你要覆盖它吗?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" +#: dialogs/awaymessagedialog.cpp:37 +#, fuzzy +msgid "Automatic Away Message" msgstr "指定处于离开状态时发送的消息" -#: dialogs/contactaddeduserdialog.cpp:33 -msgid "You have been added by someone" -msgstr "" - -#: dialogs/contactaddeduserdialog.cpp:85 +#: dialogs/chathistorydialog.cpp:48 #, fuzzy -msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " -msgstr "" -"%1\n" -"已将您加入他(她)的联系人列表。 您想:" +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "聊天主题(&C):" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" +msgid "" +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." +msgstr "" + +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +#, fuzzy +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "无法打开本地端口。" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "你被添加位好友了" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1 (%2)\n" +"已将您加入他(她)的联系人列表。" + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "联系人%1的属性:" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "已连接" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" msgstr "" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "在消息中显示时间信息(&h)" +msgstr "还没有消息" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" -msgstr "" +msgstr "最后登陆: %1" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" -msgstr "" +msgstr "最后消息: %1" -#: dialogs/contactpropertiesdialog.cpp:383 -#, fuzzy -msgid "Email: %1" -msgstr "电子邮件" +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "电子邮件地址: %1" -#: dialogs/contactpropertiesdialog.cpp:384 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" msgid "Client: %1" msgstr "客户端: %1" +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "点击此处恢复联络人的头像" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "联系人" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "邀请联系人" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "导出联系人%1的列表:" + +#: dialogs/listexportdialog.cpp:102 +#, fuzzy +msgid "Nothing to export" +msgstr "没有导出任何信息" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "文件已存在" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "文件 %1 已存在,您要覆盖它吗?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "" + +#: dialogs/listexportdialog.cpp:272 +#, fuzzy +msgid "The export of the contact list is finished" +msgstr "联系人列表已保存完毕" + +#: dialogs/networkwindow.cpp:78 +#, fuzzy +msgid "S&ave Tab" +msgstr "保存标签" + #: dialogs/networkwindow.cpp:79 #, fuzzy -msgid "S&ave tab" -msgstr "保存标签" +msgid "C&lear Tab" +msgstr "清除标签" #: dialogs/networkwindow.cpp:80 #, fuzzy -msgid "C&lear tab" -msgstr "清除标签" +msgid "C&lose All Tabs" +msgstr "关闭所有标签(&A)" -#: dialogs/networkwindow.cpp:1054 +#: dialogs/networkwindow.cpp:1081 #, fuzzy msgid "" "No connections are present.\n" "Cannot open the Network Window." msgstr "没有网络连接。无法打开网络窗口。" -#: dialogs/networkwindow.cpp:1100 +#: dialogs/networkwindow.cpp:1125 #, fuzzy msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." msgstr "无法记录网络窗口记录。请确保你对保存记录文件的文件夹有写权限。" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "不能关闭主连接标签。" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" -#: dialogs/networkwindow.cpp:1321 +#: dialogs/networkwindow.cpp:1374 #, fuzzy msgid "Cannot send commands to this kind of connection!" msgstr "不能关闭主连接标签。" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "已取消" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "失败!" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 msgid "Completed" msgstr "完成" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 字节" -#: dialogs/transferentry.cpp:335 -#, fuzzy +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." msgstr "已接收 %2 中的 %1" -#: dialogs/transferentry.cpp:339 -#, fuzzy +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." msgstr "已发送 %2 中的 %1" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "无穷大" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 #, fuzzy -msgid "Cl&ean Up" -msgstr "清除(&E)" +msgid "&Use" +msgstr "使用" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +#, fuzzy +msgid "&Delete" +msgstr "删除联系人(&D)" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:46 +#, fuzzy +msgid "Choose or Remove Your Display Picture" +msgstr "选择或删除你的头像" -#: emoticontheme.cpp:601 +#: dialogs/userpicturesdialog.cpp:129 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "显示头像" + +#: dialogs/userpicturesdialog.cpp:128 +#, fuzzy +msgid "Are you sure you want to delete the picture?" +msgstr "您确定要删除这个帐号吗?" + +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." -msgstr "无法保存图释主题。请确保你对保存图释主题的文件夹 '%1' 有写权限。" +msgstr "无法保存表情主题。请确保你对保存表情主题的文件夹 '%1' 有写权限。" -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "微笑" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "眨眼" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "伸舌头" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "笑" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "悲伤" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "哭" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "生气" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "疑惑" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "尴尬" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "失望" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" msgstr "好热" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "咧嘴" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "厌恶" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "生病" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "惊讶" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "聚会" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "困" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "思考" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "不要告诉任何人" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "偷偷地说" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "转眼球" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "讽刺" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "不知道" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "马上回来" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "天使" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "拥抱(左)" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "男孩" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "红心" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "红玫瑰" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "太棒了" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "狗脸" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "太阳" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "邪恶" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "拥抱(右)" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "女孩" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "心碎" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "枯玫瑰" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "太不好了" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "猫脸" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "入睡的月牙" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "红嘴唇" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "鼓掌" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "交叉手指" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "汽车" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "飞机" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "龟" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "蜗牛" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "黑羊(害群之马)" +#: emoticontheme.cpp:869 +#, fuzzy +msgid "Sheep" +msgstr "困" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "羊" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "吸血蝙蝠" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "比萨" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "啤酒杯" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "高脚杯" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "咖啡杯" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "生日蛋糕" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "盘子" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "碗" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "星" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "彩虹" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "风暴" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "闪电" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "雨伞" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "有棕榈树的岛" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "电话" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "移动电话" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "电子邮件" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "表" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "照相机" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "胶卷" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "音符" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "手铐" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" msgstr "钱" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "灯泡" -#: emoticontheme.cpp:882 -msgid "Cigarrette" +#: emoticontheme.cpp:895 +msgid "Cigarette" msgstr "香烟" -#: emoticontheme.cpp:883 -msgid "Soccer ball" -msgstr "足球" +#: emoticontheme.cpp:896 +msgid "Football ball" +msgstr "" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "礼物" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "计算机" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "KMess 图标" -#: initialview.cpp:226 +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "" + +#: initialview.cpp:280 initialview.cpp:379 #, fuzzy +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "正在等待网络重新连接" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" msgid "Internet connection not available." -msgstr "服务器不可用" +msgstr "互联网连接不可用" -#: initialview.cpp:377 -msgid "Connect" -msgstr "登录" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "" -#: initialview.cpp:382 +#: initialview.cpp:581 #, fuzzy -msgid "Disconnect" -msgstr "注销(&D)" +msgctxt "Button label" +msgid "&Connect" +msgstr "登录(&C)" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "" - -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "" - -#: kmess.cpp:223 +#: initialview.cpp:586 #, fuzzy +msgctxt "Button label" +msgid "&Cancel" +msgstr "取消" + +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "请输入您的电子邮件地址和密码" + +#: initialview.cpp:657 +#, fuzzy +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "不合法的电子邮件地址" + +#: kmess.cpp:220 +#, fuzzy +msgid "Contact Information" +msgstr "联系信息" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "联系人%1已经在您的列表中" + +#: kmess.cpp:250 msgid "New Group" -msgstr "添加组(&G)" +msgstr "新建组(&G)" -#: kmess.cpp:226 -msgid "Add a group" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" msgstr "添加组(&A)" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" msgstr "输入新组名:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" msgstr "你确定要从你的联系人列表中删除 %1 吗?" -#: kmess.cpp:571 -msgid "Remove contact" +#: kmess.cpp:579 +#, fuzzy +msgid "Remove Contact" msgstr "删除联系人(&R)" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +#, fuzzy +msgid "Remove and Block" msgstr "删除并且屏蔽" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" msgstr "" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" +msgid "Group Removal" msgstr "" -#: kmess.cpp:628 +#: kmess.cpp:634 #, fuzzy msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" msgstr "您确定要从联系人列表中删除 %1 这个组吗?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" msgstr "删除的" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "这是一个特殊组,不能被改变。" -#: kmess.cpp:671 -msgid "Rename group" +#: kmess.cpp:677 +#, fuzzy +msgid "Rename Group" msgstr "重命名组(&n)" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "输入新组名:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" msgstr "" -#: kmess.cpp:746 +#: kmess.cpp:757 #, fuzzy msgctxt "dialog title" -msgid "Autologin failed" -msgstr "验证失败" +msgid "Autologin Failed" +msgstr "自动登陆失败" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "正在连接……" + +#: kmess.cpp:1123 +msgctxt "Status bar message" msgid "Disconnected" msgstr "已注销" -#: kmess.cpp:1408 +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "" + +#: kmess.cpp:1475 #, fuzzy +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" "

KMess 将不能播放声音和弹出提示。

在以下文件夹中:%1,KMess 文件 " "'eventsrc' 无法找到。

请检查你的安装,然后把缺失的文件复制到任何一个列" "出的文件夹中。

" -#: kmess.cpp:1412 -msgid "Error with notifications" +#: kmess.cpp:1481 +#, fuzzy +msgctxt "Message box title" +msgid "Error With Notifications" msgstr "通知发生错误" -#: kmess.cpp:1589 -#, fuzzy -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "操作(&A)" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "添加联系人(&C)..." - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "添加组(&G)" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "搜索联系人(&e)" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "按兴趣搜索(&I)" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "搜索联系人(&e)" +msgstr "KMess - %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "添加新帐号(&A)" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "帐号设置(&S)" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "登录(&n)" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "注销(&D)" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "查看我的档案(&P)" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "我的状态(&M)" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "离开后自动回复" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "显示被允许的联系人(&A)" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "显示脱机的联系人(&A)" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "显示被删除的联系人(&R)" -#: kmessinterface.cpp:318 +#: kmessinterface.cpp:172 #, fuzzy +msgid "Show &History Box" +msgstr "聊天主题(&C):" + +#: kmessinterface.cpp:173 +#, fuzzy +msgid "&Show Search Bar" +msgstr "侧边栏" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" -msgstr "显示图释(&E)" +msgstr "显示空组(&E)" -#: kmessinterface.cpp:321 -#, fuzzy -msgid "Display Pictures Size" -msgstr "头像" +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "头像大小(&D)" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -#, fuzzy -msgid "Small" -msgstr "微笑" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" msgstr "对联系人进行排序(&S)" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "显示文件传送窗口(&T)" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "添加联系人(&C)..." + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "添加组(&G)" + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "导出联系人列表(&E)" + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "搜索联系人(&o)" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "按兴趣搜索(&I)" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "聊天主题(&C):" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "添加新帐号(&A)" + +#: kmessinterface.cpp:189 +#, fuzzy +msgid "Configure Account..." +msgstr "添加新帐号(&A)" + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "设置 Kmess(&K)" + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "不显示" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "小" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "中" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "大" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "组" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "联机/脱机" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "混合" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "显示文件传送窗口(&T)" - -#: kmessinterface.cpp:341 -msgid "Show &Network Window" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." msgstr "显示网络窗口(&N)" -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "正在收听%1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "[%1]以 %2 登陆" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr "" +msgstr "[%1] %2上线了" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr "" +msgstr "[%1]%2离线" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "聊天(&t)" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "属性(&P)" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +#, fuzzy +msgid "&Remove From Group" msgstr "从组中删除(&R)" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "正在收听 %1" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "将联系人复制到(&C)" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "将联系人移动到(&M)" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "向下移动组(&D)" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "向上移动组(&U)" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "删除组(&m)" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "重命名组(&n)" -#: kmessview.cpp:1053 +#: kmessview.cpp:1124 #, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "电子邮件" +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "将这个联系人加入您的列表中(&A)" -#: kmessview.cpp:1059 +#: kmessview.cpp:1133 #, fuzzy -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "电子邮件地址" + +#: kmessview.cpp:1140 +#, fuzzy +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" msgstr "客户端: %1" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" +#: kmessview.cpp:1152 +msgid "Yes" msgstr "" -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" - -#: kmessview.cpp:1085 +#: kmessview.cpp:1156 #, fuzzy +msgid "No" +msgstr "音符" + +#: kmessview.cpp:1159 +#, fuzzy +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "被阻止" + +#: kmessview.cpp:1179 +#, fuzzy +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "最后登陆: %1" + +#: kmessview.cpp:1194 +#, fuzzy +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "最后消息: %1" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" -msgstr "
%1 (%2)" +msgstr "组%1 " -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "联系人" - -#: kmessview.cpp:1095 +#: kmessview.cpp:1212 #, fuzzy msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "联系人离线" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "联系人离线" -#: kmessview.cpp:1504 +#: kmessview.cpp:1219 +#, fuzzy +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "联系人" + +#: kmessview.cpp:1631 #, fuzzy msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" msgstr "请在此处输入您的个人信息" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" msgstr[0] "" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1 (%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1 (%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" msgstr "" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "" + +#: main.cpp:60 msgid "Developer and project founder" msgstr "" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "" + +#: main.cpp:61 msgid "Developer" msgstr "" -#: main.cpp:72 +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "" + +#: main.cpp:62 #, fuzzy msgid "Project support" msgstr "P4-Context 域的支持" -#: main.cpp:73 main.cpp:74 main.cpp:75 -#, fuzzy -msgid "Current developer" -msgstr "GnomeMeeting 开发者" +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "" -#: main.cpp:78 +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 +msgid "Current developer" +msgstr "当前开发者" + +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "德语翻译、测试、文档、网站设计、项目主管,等等。" -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "" + +#: main.cpp:70 msgid "Web design" msgstr "网页设计" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "黄/蓝/紫色图释集和意大利语翻译" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "" -#: main.cpp:81 +#: main.cpp:71 +#, fuzzy +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "黄/蓝/紫色表情集和意大利语翻译" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "" + +#: main.cpp:72 msgid "Cartoon emoticons" -msgstr "卡通图释" +msgstr "卡通表情" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "" + +#: main.cpp:73 msgid "Default sound theme" msgstr "缺省声音主题" -#: main.cpp:83 +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "" + +#: main.cpp:74 msgid "KMess icon in Oxygen style" msgstr "" -#: main.cpp:87 +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "阿拉伯语翻译和文件保存国际化的修正" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "更多阿拉伯语翻译" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "巴西葡萄牙语翻译" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "巴西葡萄牙语翻译" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "" + +#: main.cpp:84 msgid "Catalan translation" msgstr "加泰罗尼亚语翻译" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "简体中文翻译,文件发送的bug修复,连接代理的代码" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "更多简体中文翻译" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "繁体中文翻译" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "" + +#: main.cpp:90 +#, fuzzy +msgid "More Traditional Chinese translation" +msgstr "繁体中文翻译" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "" + +#: main.cpp:92 msgid "Danish translation" msgstr "丹麦语翻译" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "" + +#: main.cpp:93 msgid "More Danish translation" msgstr "更多丹麦语翻译" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "" + +#: main.cpp:94 msgid "Dutch translation" msgstr "荷兰语翻译" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "更多的荷兰语翻译" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "" + +#: main.cpp:97 +msgid "Elve" +msgstr "" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "" + +#: main.cpp:100 +#, fuzzy +msgid "More German translation, Greek translation" +msgstr "更多阿拉伯语翻译" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "" + +#: main.cpp:101 +#, fuzzy +msgid "More Greek translation" +msgstr "更多法语翻译" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "" + +#: main.cpp:103 msgid "Estonian translation" msgstr "爱沙尼亚语翻译" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "" + +#: main.cpp:104 msgid "Finnish translation" msgstr "芬兰语翻译" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "更多芬兰语翻译" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "" + +#: main.cpp:108 +msgid "Choplair" +msgstr "" + +#: main.cpp:108 msgid "French translation" msgstr "法语翻译" -#: main.cpp:108 -msgid "More French translation, MSN6 emoticon definitions" -msgstr "更多法语翻译,MSN6 图释定义" +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "" #: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "更多法语翻译,MSN6 表情定义" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" msgstr "更多法语翻译" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "匈牙利语翻译" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "" + +#: main.cpp:114 +#, fuzzy +msgid "More Hungarian translation" +msgstr "匈牙利语翻译" + +#: main.cpp:115 main.cpp:116 msgid "More Italian translation" msgstr "更多意大利语翻译" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "" + +#: main.cpp:117 msgid "Korean translation" msgstr "韩文翻译" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "" + +#: main.cpp:118 msgid "Norsk Bokmål translation" msgstr "挪威语翻译" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "" + +#: main.cpp:120 +#, fuzzy +msgid "Serbian translation" +msgstr "斯洛文尼亚语翻译" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "" + +#: main.cpp:122 +#, fuzzy +msgid "Slovak translation" +msgstr "斯洛文尼亚语翻译" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "斯洛文尼亚语翻译" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "" + +#: main.cpp:124 msgid "Spanish translation" msgstr "西班牙语翻译" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 msgid "More Spanish translation" msgstr "更多西班牙语翻译" -#: main.cpp:123 -msgid "Swedish translation" -msgstr "瑞典语翻译" - -#: main.cpp:125 -msgid "Thai translation" -msgstr "泰语翻译" - #: main.cpp:126 -msgid "Turkish translation" -msgstr "土耳其语翻译" +msgid "Alejandro Araiza Alvarado" +msgstr "" -#: main.cpp:127 main.cpp:128 -msgid "More Turkish translation" -msgstr "更多土耳其语翻译" +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "" -#: main.cpp:131 -msgid "MSNP12 support, various patches." +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" msgstr "" #: main.cpp:132 -msgid "Pictures in contact list code, contact client info, chat font zoom" -msgstr "联系人列表中的图片代码,联系人客户端信息,聊天字体缩放" +msgid "Christian Lundgren" +msgstr "" + +#: main.cpp:132 +msgid "Swedish translation" +msgstr "瑞典语翻译" + +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "" #: main.cpp:133 #, fuzzy -msgid "File transfer thumbnails" -msgstr "文件传送" - -#: main.cpp:134 -msgid "P4-Context field support" -msgstr "P4-Context 域的支持" +msgid "More Swedish translation" +msgstr "瑞典语翻译" #: main.cpp:135 -msgid "Xinerama fixes" -msgstr "Xinerama 的修正" - -#: main.cpp:136 -msgid "Original file receive code" -msgstr "最初文件接收的代码" - -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" +msgid "Rachan Hongpairote" msgstr "" -#: main.cpp:138 -#, fuzzy -msgid "KWallet support" -msgstr "P4-Context 域的支持" +#: main.cpp:135 +msgid "Thai translation" +msgstr "泰语翻译" -#: main.cpp:139 -msgid "" -"Notifications blocking option,winks disabling option,last message date " -"feature" +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "" + +#: main.cpp:136 +msgid "Turkish translation" +msgstr "土耳其语翻译" + +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "" + +#: main.cpp:137 main.cpp:138 +msgid "More Turkish translation" +msgstr "更多土耳其语翻译" + +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "" + +#: main.cpp:141 +msgid "Richard Conway" +msgstr "" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" msgstr "" #: main.cpp:142 #, fuzzy +msgid "Guido Solinas" +msgstr "上线(&G)" + +#: main.cpp:142 +msgid "Pictures in contact list code, contact client info, chat font zoom" +msgstr "联系人列表中的图片代码,联系人客户端信息,聊天字体缩放" + +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "" + +#: main.cpp:143 +#, fuzzy +msgid "File transfer thumbnails" +msgstr "文件传送" + +#: main.cpp:144 +msgid "P4-Context field support" +msgstr "P4-Context 域的支持" + +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "" + +#: main.cpp:145 +msgid "Xinerama fixes" +msgstr "Xinerama 的修正" + +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "" + +#: main.cpp:146 +msgid "Original file receive code" +msgstr "最初文件接收的代码" + +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "" + +#: main.cpp:147 +msgid "KWallet support" +msgstr "KWallet的支持" + +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "" + +#: main.cpp:148 +msgid "" +"Notifications blocking option, winks disabling option, last message date " +"feature" +msgstr "" + +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "" + +#: main.cpp:151 +#, fuzzy +msgid "Chat history dialog" +msgstr "聊天主题(&C):" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "" + +#: main.cpp:154 +#, fuzzy msgid "Various internationalization fixes" msgstr "各种国际化问题的修正" -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "各种国际化问题的修正" -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "GnomeMeeting 开发者" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "" + +#: main.cpp:158 msgid "Guy with a bag over his head" msgstr "头上罩着袋子的人" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "" + +#: main.cpp:161 msgid "Inspiration and assorted code" msgstr "灵感和多项代码" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "" + +#: main.cpp:162 msgid "Old popup balloons code, initial p2p code, msn challenge handler" msgstr "旧的弹出气泡代码、最初的 p2p 代码和处理 msn challenge" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "" + +#: main.cpp:163 msgid "Idle timer code" msgstr "空闲定时器的代码" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" msgstr "“截屏时收缩到托盘”代码" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "" + +#: main.cpp:165 msgid "Custom crash handler implementation" msgstr "" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" msgstr "将您的名字写在这里?" -#: main.cpp:156 +#: main.cpp:168 #, fuzzy msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" @@ -2967,29 +4305,42 @@ msgstr "" "我们欢迎您到 KMess 帮助论坛去修补漏洞和提交补丁!\n" "如果您认为这里漏下了您的名字,也请联系我们!" -#: main.cpp:159 -#, fuzzy +#: main.cpp:171 msgctxt "NAME OF TRANSLATORS" msgid "Your names" msgstr "您的姓名" -#: main.cpp:160 -#, fuzzy +#: main.cpp:172 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" msgstr "您的电子邮件地址:" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "以给定的邮件地址自动登录" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" msgstr "" +#: model/contactlist.cpp:1503 +#, fuzzy +msgid "Individuals" +msgstr "个人" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "允许的" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "删除的" + #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." msgstr "联系人取消了邀请。" @@ -3007,61 +4358,107 @@ msgstr "您拒绝了邀请。" #: network/applications/application.cpp:540 #, fuzzy -msgid "Do you want to
accept or cancel?" +msgid "Do you want to accept or cancel?" msgstr "你想接受还是取消?" #: network/applications/application.cpp:581 #, fuzzy -msgid "Click to cancel." +msgid "Click to cancel." msgstr "单击这里取消" -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "您要接收这个文件吗:%1 (%2 )" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "" -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +#, fuzzy +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"文件“%1”已存在。\n" +"您要覆盖它吗?" + +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +#, fuzzy +msgid "The transfer of file "%1" failed. Couldn't save the file." msgstr "文件传送失败,无法打开文件%1。" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:295 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "文件传送失败,无法打开文件%1。" + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "传送被接受。" -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" msgstr "正在连接到 %1, %2 端口" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "文件传送被取消" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +#, fuzzy +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "联系人取消了文件传送。" -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +#, fuzzy +msgid "You have cancelled the transfer of file "%1"." +msgstr "您取消了邀请。" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +#, fuzzy +msgid "You have rejected the transfer of file "%1"." +msgstr "您取消了邀请。" + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "连接已建立" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." msgstr "成功传送文件:%1" -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "成功收到文件:%1" + +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." msgstr "文件传送失败,文件%1不存在。" -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." msgstr "文件传送失败,无法读取 %1。" -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "正在发送文件 %1" +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "正在发送文件 %1 (%2)" -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "联系人接受了文件传送。" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "协定连接参数" @@ -3072,72 +4469,14 @@ msgstr "协定连接参数" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "文件传送邀请被取消。接收的数据已损坏。" -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"文件“%1”已存在。\n" -"您要覆盖它吗?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "文件传送失败,无法打开文件%1。" - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." msgstr "" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "联系人取消了文件传送。" - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "您取消了邀请。" - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "文件无法写入" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "成功传送文件:%1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "成功传送文件:%1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "文件传送失败,文件%1不存在。" - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "文件传送失败,无法读取 %1。" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "正在发送文件 %1 (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "联系人取消了文件传送。" - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." msgstr "您被邀请参加会议(使用 GnomeMeeting)。" @@ -3150,28 +4489,28 @@ msgstr "启动 GnomeMeeting…… 正在连接到 %1。" msgid "Inviting the contact to a meeting." msgstr "正在邀请联系人参加会议。" -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "邀请被取消。另一方客户端不支持。" -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "邀请被终止。发生了内部错误。" -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "邀请被终止。等待用户接受超时。" -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "邀请被终止。等待文件数据超时。" -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "邀请被终止。切换板关闭了聊天连接。" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "邀请被终止。" @@ -3183,96 +4522,96 @@ msgstr "您被邀请共享此人的桌面。" msgid "Starting KRDC. Connecting to %1." msgstr "启动 KRDC。正在连接到 %1。" -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "联系人拒绝了邀请。发生了内部错误。" +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "联系人启动了一项 KMess 不支持的 MSN6 功能。" -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "传输失败。" - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "邀请被取消。联系人发送了损坏的数据,或者KMess不支持它。" -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "文件传送失败。联系人发送了损坏的数据,或者KMess不支持。" - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "文件传送失败。等待用户接受超时。" - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "文件传送失败。发生了内部错误。" - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "文件传送失败。无法打开数据源。" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "联系人启动了一项 KMess 不支持的 MSN6 功能。" - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "文件传送失败。数据准备失败" -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." msgstr "邀请被取消。消息不是针对我们的。" -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "文件传送失败。联系人发送了损坏的数据,或者KMess不支持。" -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "联系人拒绝了邀请。发生了内部错误。" + +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 msgid "Awaiting connection at %1, port %2" msgstr "等候到主机 %1 端口 %2 的连接。" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "转换到间接传输模式(这可能很慢)" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "等待连接" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "邀请被取消。等待用户接受超时。" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "邀请被取消。等待确认连接是否成功超时。" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "邀请被取消。等待数据超时。" +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "传输失败。" + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "文件传送失败。联系人发送了损坏的数据,或者KMess不支持。" + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "文件传送失败。等待用户接受超时。" + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "文件传送失败。发生了内部错误。" + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "文件传送失败。无法打开数据源。" + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." msgstr "您被邀请与此人语音聊天。" @@ -3303,665 +4642,837 @@ msgstr "启动语音对话。接听%1" msgid "Inviting the contact to a voice conversation." msgstr "正在邀请联系人参加语音会议。" -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." msgstr "联系人邀请您使用“%1”,但是现在KMess还没有开发此功能。" -#: network/applications/webcamtransferp2p.cpp:89 -msgid "webcam" +#: network/applications/webcamtransferp2p.cpp:113 +#, fuzzy +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "视频邀请被取消。接收的数据已损坏。" + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." msgstr "" -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "文件 %1 的传送被取消。" +#: network/applications/webcamtransferp2p.cpp:138 +#, fuzzy +msgid "You are invited to view this person's webcam." +msgstr "您被邀请共享此人的桌面。" + +#: network/applications/webcamtransferp2p.cpp:147 +msgid "webcam" +msgstr "" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "失败" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "正在发送文件 %1" + +#: network/extra/msnftpconnection.cpp:398 +#, fuzzy +msgid "The transfer of %1 failed. Couldn't open a local port." msgstr "%1的传送失败,无法打开本地端口。" -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." msgstr "无法打开本地端口。" -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "初始化文件传送" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." msgstr "%1的传送失败,无法建立连接。" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "无法建立连接。" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" -msgstr "发送文件 %1" +msgstr "接受文件 %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"KMess无法访问远程web服务。\n" -"\n" -"细节:%1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"您已经失去连接,因为您使用了另一个MSN Messenger客户端程序或在另一个地方登录。" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "已同步" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "正在验证" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "等待联系人列表……" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "验证失败,请检查你的用户名和密码。" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "正在连接……" - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess从服务器接到了一个未知命令:%1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" msgstr "" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" msgstr "你试图添加的email地址不是MSN Messenger帐号" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" msgstr "" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" msgstr "用户名无效" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 +#, fuzzy msgid "" -"That account name is invalid, or your passport has not been confirmed yet" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" msgstr "帐号无效,或者你的passport还没有确认。" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "您的联系人列表已满" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" msgstr "" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "这个联系人已经在您的列表中" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "这个联系人不在您的列表中" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "联系人离线" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" msgstr "" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "这个联系人不在您的列表中" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "" -#: network/msnnotificationconnection.cpp:2247 +#: network/msnconnection.cpp:440 #, fuzzy msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." msgstr "在你的MSN Messenger或者Hotmail联系人列表中已经使用了这个组名" -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" +#: network/msnconnection.cpp:444 +#, fuzzy +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." msgstr "您的联系人列表中分组太多了" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "这个组不能被改变。" -#: network/msnnotificationconnection.cpp:2260 +#: network/msnconnection.cpp:453 #, fuzzy msgid "Contact is not added to this group" msgstr "您的联系人列表中分组太多了" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "组非空" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "组名过长" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" msgstr "" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "KMess内部错误: %1" -#: network/msnnotificationconnection.cpp:2277 +#: network/msnconnection.cpp:470 #, fuzzy msgid "Invalid Group" msgstr "重命名组(&n)" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" msgstr "" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "切换板服务器失败。" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "到切换板服务器的文件传送失败" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "直接连接(MSNSLP)错误,连接失败" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" msgstr "" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" msgstr "" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "这个帐号的自定义图释:" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" msgstr "" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." msgstr "您的账户被停用。" -#: network/msnnotificationconnection.cpp:2314 +#: network/msnconnection.cpp:512 #, fuzzy msgid "Challenge response failed" msgstr "传输失败。" -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" msgstr "" -#: network/msnnotificationconnection.cpp:2323 +#: network/msnconnection.cpp:521 #, fuzzy msgid "You are opening chat sessions too fast" msgstr "你开启会话太快了" -#: network/msnnotificationconnection.cpp:2327 +#: network/msnconnection.cpp:525 #, fuzzy msgid "You have too many open chat sessions" msgstr "你已开启的会话太多了" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" msgstr "" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "错误的联系人名字" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" msgstr "" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +#, fuzzy +msgid "The server reports KMess is flooding it with too much data" msgstr "服务器报告,KMess发送的数据太多了,造成泛滥" -#: network/msnnotificationconnection.cpp:2357 +#: network/msnconnection.cpp:555 #, fuzzy msgid "Authentication ticket was incorrect" msgstr "验证失败" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "您不能在隐身的状态下进行聊天。" -#: network/msnnotificationconnection.cpp:2364 +#: network/msnconnection.cpp:562 #, fuzzy msgid "Not accepting new contacts" msgstr "不接受新的规则" -#: network/msnnotificationconnection.cpp:2368 +#: network/msnconnection.cpp:566 #, fuzzy msgid "" -"You have a kids passport account, you need parental consent to chat online." +"You have a Kids Passport account, you need parental consent to chat online." msgstr "你的passport是儿童型的,聊天时需要父母的同意。" -#: network/msnnotificationconnection.cpp:2371 +#: network/msnconnection.cpp:569 #, fuzzy -msgid "Your passport account needs to be verified first." +msgid "Your Passport account needs to be verified first." msgstr "你的passport需要先验证。" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" msgstr "" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "访问联系人列表时发生错误,稍后再试" -#: network/msnnotificationconnection.cpp:2399 +#: network/msnconnection.cpp:592 #, fuzzy msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." msgstr "服务器内部错误" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" msgstr "" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "点对点服务器已关闭" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "服务器即将关闭" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "服务器马上就要关闭" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "禁止写操作" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "会话超载" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "服务器不可用" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "验证失败" -#: network/msnnotificationconnection.cpp:2449 +#: network/msnconnection.cpp:642 #, fuzzy -msgid "Unknown error code received from the server: %1" +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" msgstr "KMess从服务器接到了一个未知命令:%1" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 #, fuzzy msgctxt "Error dialog box title" -msgid "MSN error" +msgid "MSN Error" msgstr "KMess - MSN 错误" -#: network/msnnotificationconnection.cpp:2596 +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1333 +#, fuzzy +msgid "Authenticating..." +msgstr "正在验证" + +#: network/msnnotificationconnection.cpp:1370 +#, fuzzy +msgid "Authenticated" +msgstr "验证失败" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "" + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "正在连接……" + +#: network/msnnotificationconnection.cpp:1949 +#, fuzzy +msgid "Unknown command received from the server: %1" +msgstr "KMess从服务器接到了一个未知命令:%1" + +#: network/msnnotificationconnection.cpp:2109 #, fuzzy msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" msgstr[0] "分钟后" -#: network/msnnotificationconnection.cpp:2599 +#: network/msnnotificationconnection.cpp:2112 #, fuzzy msgid "Server closes for maintenance in %1!" msgstr "警告:服务器%1分钟后因维护而关闭!" -#: network/msnnotificationconnection.cpp:2604 +#: network/msnnotificationconnection.cpp:2117 #, fuzzy msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." msgstr "MSN服务器报告,它1分钟后将会关闭进行维护。" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." msgstr "" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 +#: network/msnnotificationconnection.cpp:2318 #, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" +msgid "KMess could not process Offline-IM messages.
Details: %1" msgstr "" "KMess不能处理离线消息。\n" "\n" "细节:%1" -#: network/msnnotificationconnection.cpp:3172 +#: network/msnnotificationconnection.cpp:2589 #, fuzzy msgid "Authentication time limit exceeded" msgstr "验证失败" -#: network/msnnotificationconnection.cpp:3218 +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "等待联系人列表……" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "" + +#: network/msnnotificationconnection.cpp:2879 #, fuzzy msgid "
Internal error reason: %1" msgstr "KMess内部错误: %1" -#: network/msnnotificationconnection.cpp:3242 +#: network/msnnotificationconnection.cpp:2916 #, fuzzy -msgctxt "Login error message, with more details for developer versions" +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" +msgstr "验证失败,请检查你的用户名和密码。" + +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2932 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" +msgstr "" +"您已经失去连接,因为您使用了另一个MSN Messenger客户端程序或在另一个地方登录。" + +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2947 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" msgstr "" "KMess 无法连接到 MSN Messenger 服务器。MSN Messenger服务器可能暂时无法工作或" "者你的网络连接有问题。" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 +#: network/msnnotificationconnection.cpp:2966 #, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "如果选中,将会使用代理服务器连接到MSN Messenger服务器。" + +#: network/msnnotificationconnection.cpp:2968 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"KMess 无法连接到 MSN Messenger 服务器。MSN Messenger服务器可能暂时无法工作或" +"者你的网络连接有问题。" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "" + +#: network/msnnotificationconnection.cpp:3017 +#, fuzzy +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" msgstr "到服务器的连接丢失。" -#: network/msnnotificationconnection.cpp:3302 -#, fuzzy +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

Developer info:
Error number: %1
Error string: %2

" msgstr "" -"验证失败。KMess无法再次登录这个passport。\n" -"\n" -"细节:%1" -#: network/msnsockethttp.cpp:765 +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "" + +#: network/msnsockethttp.cpp:681 #, fuzzy -msgid "SSL Error" -msgstr "服务器错误" +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "KMess内部错误: %1" -#: network/msnsockettcp.cpp:352 +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "" + +#: network/msnsockettcp.cpp:359 #, fuzzy msgid "Connection time limit exceeded" msgstr "连接超时" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "丢失了1个 ping 数据包" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "丢失了%1个 ping 数据包" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." +#: network/msnsockettcp.cpp:395 +#, fuzzy +msgid "The connection to the server was lost" msgstr "到服务器的连接丢失。" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "此人已经下线或隐身。" +#: network/soap/addressbookservice.cpp:777 +#, fuzzy +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "你试图添加的email地址不是MSN Messenger帐号" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "联系人启动了一项KMess不能处理的MSN7功能。" +#: network/soap/addressbookservice.cpp:787 +#, fuzzy +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "你试图添加的email地址不是MSN Messenger帐号" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "消息\"%1\"没有收到!" - -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "无法建立连接: %1" - -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" msgstr "" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" +#: network/soap/httpsoapconnection.cpp:402 +#, fuzzy +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "服务器不可用" + +#: network/soap/httpsoapconnection.cpp:471 +#, fuzzy +msgctxt "Error message" +msgid "Too many redirections by web service" msgstr "登录服务器的重定向过多" -#: notification/chatnotification.cpp:163 +#: network/soap/httpsoapconnection.cpp:521 #, fuzzy -msgid "In %1's chat: %2" +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "服务器不可用" + +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "" + +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "" + +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "" + +#: notification/chatnotification.cpp:154 +#, fuzzy +msgid "In %1's chat:
%2" msgstr "在%1的聊天中: %2" -#: notification/chatnotification.cpp:167 +#: notification/chatnotification.cpp:158 #, fuzzy -msgid "%1 says:
'%2'" +msgid "%1 says:
'%2'" msgstr "%1 说:
'%2'" -#: notification/chatnotification.cpp:171 +#: notification/chatnotification.cpp:162 #, fuzzy -msgid "%1 has sent you an offline message:
'%2'" +msgid "%1 has sent you an offline message:
'%2'" msgstr "%1给你发送了离线消息:
'%2'" -#: notification/chatnotification.cpp:178 +#: notification/chatnotification.cpp:169 #, fuzzy msgid "%1's chat requests attention!" msgstr "%1的聊天请求注意!" -#: notification/chatnotification.cpp:183 +#: notification/chatnotification.cpp:174 #, fuzzy -msgid "%1:
%2" +msgid "%1:
%2" msgstr "%1:
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr "%1给你发送了离线消息:
'%2'" +msgstr "%1给你发送了手写消息:
'" -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr "%1给您发送了闪屏振动!" +msgstr "%1给您发送了闪屏振动!" -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr "%1给您发送了传情动漫!" +msgstr "%1给您发送了传情动漫!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1想使用摄像头!" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1给您发送了文件!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1给您发送了邀请!" #: notification/chatnotification.cpp:204 -#, fuzzy -msgid "%1 wants to use the webcam!" -msgstr "%1想使用摄像头!" +msgid "%1 has canceled the webcam session!" +msgstr "%1取消了摄像头邀请!" #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1给您发送了文件!" +msgid "%1 has canceled the file transfer!" +msgstr "%1取消了文件传送!" #: notification/chatnotification.cpp:206 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "%1给您发送了邀请!" +msgid "%1's activity has been canceled!" +msgstr "%1的活动已被取消!" #: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "%1取消了摄像头邀请!" +msgid "%1 has accepted to use the webcam!" +msgstr "%1同意了使用摄像头!" #: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "%1取消了文件传送!" +msgid "%1 has accepted the file transfer!" +msgstr "%1接受了文件传送!" #: notification/chatnotification.cpp:215 -#, fuzzy -msgid "%1's activity has been canceled!" -msgstr "%1的活动已被取消!" +msgid "%1 has accepted your invitation!" +msgstr "%1接受了你的邀请!" #: notification/chatnotification.cpp:222 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1同意了使用摄像头!" +msgid "%1 has ended the webcam session!" +msgstr "%1结束了摄像头邀请!" #: notification/chatnotification.cpp:223 -#, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "%1接受了文件传送!" +msgid "The file transfer with %1 is done!" +msgstr "和%1的文件传输完成!" #: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1接受了你的邀请!" +msgid "%1's activity has ended!" +msgstr "%1的活动已经结束!" #: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "%1结束了摄像头邀请!" +msgid "%1's webcam session has failed!" +msgstr "%1的视频会话失败!" #: notification/chatnotification.cpp:232 -#, fuzzy -msgid "The file transfer with %1 is done!" -msgstr "和%1的文件传输完成!" +msgid "The file transfer with %1 has failed!" +msgstr "和%1的文件传送失败!" #: notification/chatnotification.cpp:233 -#, fuzzy -msgid "%1's activity has ended!" -msgstr "%1的活动已经结束!" - -#: notification/chatnotification.cpp:240 -#, fuzzy -msgid "%1's webcam session has failed!" -msgstr "%1的视频会话失败!" - -#: notification/chatnotification.cpp:241 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "和%1的文件传送失败!" - -#: notification/chatnotification.cpp:242 -#, fuzzy msgid "%1's activity has ended with an error!" -msgstr "%1的活动因有错误而结束!" +msgstr "%1的活动因有错误而结束!" -#: notification/contactstatusnotification.cpp:70 +#: notification/contactstatusnotification.cpp:91 #, fuzzy -msgid "%1 is now online" -msgstr "%1现在联机了" +msgid "%1
is now online" +msgstr "%1正在线" -#: notification/contactstatusnotification.cpp:71 +#: notification/contactstatusnotification.cpp:92 #, fuzzy -msgid "%1 has gone away" -msgstr "%1走了" +msgid "%1
has gone away" +msgstr "%1离开" -#: notification/contactstatusnotification.cpp:72 -#, fuzzy -msgid "%1 will be right back" -msgstr "%1马上回来" +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1马上回来" -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1繁忙" +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1忙碌 " -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1脱机了" +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1脱机了" -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1发起了呆" +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1空闲" -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1已登出" +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1已登出" -#: notification/contactstatusnotification.cpp:77 +#: notification/contactstatusnotification.cpp:98 #, fuzzy -msgid "%1 is on the phone" -msgstr "%1在电话上 " +msgid "%1
is on the phone" +msgstr "%1在电话上 " -#: notification/contactstatusnotification.cpp:78 +#: notification/contactstatusnotification.cpp:99 #, fuzzy -msgid "%1 is out for lunch" +msgid "%1
is out for lunch" msgstr "%1出去吃饭了" -#: notification/newemailnotification.cpp:78 +#: notification/newemailnotification.cpp:90 #, fuzzy -msgid "New email:
'%1'
by '%2'" +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" msgstr "新电子邮件:
来自'%2'的
%1" -#: settings/accountpage.cpp:69 +#: notification/notificationmanager.cpp:114 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "开始会议(&M)" + +#: notification/notificationmanager.cpp:118 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "个人消息(&P)" + +#: notification/notificationmanager.cpp:122 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "给您发送了消息(&e)" + +#: notification/notificationmanager.cpp:126 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "邪恶" + +#: notification/notificationmanager.cpp:130 +#, fuzzy +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "发送电子邮件(&E)" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "" + +#: notification/systemtraywidget.cpp:78 +#, fuzzy +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." +msgstr "" +"关闭主窗口后 KMess 将在系统托盘中继续运行。可用文件菜单中的退出来退出程序。" + +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "使用系统托盘" + +#: notification/systemtraywidget.cpp:240 +#, fuzzy +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +#, fuzzy +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr "%1 %2" + +#: settings/accountpage.cpp:80 msgid "Browse..." msgstr "" -#: settings/accountpage.cpp:70 +#: settings/accountpage.cpp:81 #, fuzzy -msgid "Browse and crop picture..." +msgid "Browse and Crop Picture..." msgstr "浏览并裁剪图片……" -#: settings/accountpage.cpp:71 -msgid "Set previous image..." +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." msgstr "" -#: settings/accountpage.cpp:448 +#: settings/accountpage.cpp:493 #, fuzzy msgid "Downloading of display picture failed" msgstr "下载显示图像失败" -#: settings/accountpage.cpp:507 +#: settings/accountpage.cpp:552 #, fuzzy msgid "" "An error occurred when trying to change the display picture.\n" @@ -3970,159 +5481,729 @@ msgstr "" "试图改变头像时发生了错误。\n" "确定你选择了正确的图像文件" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "删除联系人(&D)" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "设置" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "帐号" -#: settings/accountsettingsdialog.cpp:76 +#: settings/accountsettingsdialog.cpp:79 #, fuzzy msgid "My Account" msgstr "帐号" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "提醒" - -#: settings/accountsettingsdialog.cpp:81 +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 #, fuzzy -msgid "Alerts and Notifications" -msgstr "KMess 通知" +msgid "Contact List" +msgstr "联系人" -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "聊天" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "聊天记录" -#: settings/accountsettingsdialog.cpp:193 +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" + +#: settings/accountsettingsdialog.cpp:206 #, fuzzy msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" msgstr "你输入的联系人地址不正确:'%1'" -#: settings/accountsettingsdialog.cpp:201 +#: settings/accountsettingsdialog.cpp:214 #, fuzzy msgid "The email address you have entered is already in use: '%1'" msgstr "你输入的联系人地址不正确:'%1'" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "您确定要删除这个帐号吗?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." msgstr "您确定要删除这个帐号吗?" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" msgstr "Hi, 你最近怎么样? :)" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "小鱼儿" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "太棒了!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "我 /刚刚/ 从意大利度假回来!" -#: settings/emoticonspage.cpp:122 -msgid "Replace Existing Emoticon" +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." msgstr "" -#: settings/globalsettingsdialog.cpp:45 +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "" + +#: settings/emoticonspage.cpp:136 +#, fuzzy +msgctxt "Dialog box title" +msgid "Replace Existing Emoticon" +msgstr "编辑表情" + +#: settings/emoticonspage.cpp:233 +#, fuzzy +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "您确定要删除这个帐号吗?" + +#: settings/emoticonspage.cpp:234 +#, fuzzy +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "编辑表情" + +#: settings/globalsettingsdialog.cpp:46 #, fuzzy msgid "KMess Settings" msgstr "设置" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "帐号" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 #, fuzzy -msgid "Notification" +msgid "Notifications" msgstr "KMess 通知" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." msgstr "" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." msgstr "" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" msgstr "" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" msgstr "" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" msgstr "" -#: settings/miscellaneouspage.cpp:404 +#: settings/miscellaneouspage.cpp:406 #, fuzzy msgid "Select Files Directory" msgstr "在此目录中保存聊天记录:" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"关闭主窗口后 KMess 将在系统托盘中继续运行。可用文件菜单中的退出来退出程序。" -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "使用系统托盘" +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "" -#: systemtraywidget.cpp:245 +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "" + +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "" + +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" + +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "" + +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "" + +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "" + +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "" + +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "" + +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "" + +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:221 #, fuzzy -msgid "- %1 (%2)" -msgstr "%1 %2" +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "你输入的联系人地址不正确:'%1'" + +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:298 +#, fuzzy +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "联系人" + +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "" + +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "" + +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "选择一个你要修改的账号, 然后点击这里" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "无法向%1发送闪屏" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "无法向%1 发送传情动漫" + +#, fuzzy +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "消息 '%1' 无法发送。" + +#, fuzzy +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "消息 '%1' 无法发送。" + +#, fuzzy +#~ msgid "Use" +#~ msgstr "使用" + +#~ msgid "&Copy..." +#~ msgstr "复制(&C)..." + +#, fuzzy +#~ msgid "Insert New" +#~ msgstr "插入" + +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email address: %1" +#~ msgstr "电子邮件地址:" + +#~ msgctxt "Contact MSN client in list tooltip" +#~ msgid "Client: %1" +#~ msgstr "客户端: %1" + +#, fuzzy +#~ msgctxt "Contact's blocked status in list tooltip" +#~ msgid "Blocked: %1" +#~ msgstr "被阻止" + +#, fuzzy +#~ msgid "Contact List Alerts" +#~ msgstr "联系人事件" + +#, fuzzy +#~ msgid "&Show winks from contacts" +#~ msgstr "显示脱机的联系人(&A)" + +#, fuzzy +#~ msgid "Enable in the contact list" +#~ msgstr "在联系人列表中启用" + +#, fuzzy +#~ msgid "Enable in the chat windows" +#~ msgstr "在聊天窗口中启用" + +#~ msgid "Alerts" +#~ msgstr "提醒" + +#, fuzzy +#~ msgid "Alerts and Notifications" +#~ msgstr "KMess 通知" + +#, fuzzy +#~ msgid "No Group" +#~ msgstr "无分组" + +#~ msgid "Now listening to: %1" +#~ msgstr "正在收听%1" + +#~ msgid "&Listening Music" +#~ msgstr "正在收听音乐(&L)" + +#, fuzzy +#~ msgid "KMess could not access the remote webservice.
Details: %1" +#~ msgstr "" +#~ "KMess无法访问远程web服务。\n" +#~ "\n" +#~ "细节:%1" + +#, fuzzy +#~ msgid "" +#~ "Authentication failed. KMess could not process the Passport login.
Details: %1" +#~ msgstr "" +#~ "验证失败。KMess无法再次登录这个passport。\n" +#~ "\n" +#~ "细节:%1" + +#~ msgid "Close all tabs" +#~ msgstr "关闭所有标签" + +#~ msgid "&Send email" +#~ msgstr "发送电子邮件(&S)" + +#~ msgid "Save complete" +#~ msgstr "保存完成" + +#~ msgid "C&lose all tabs" +#~ msgstr "关闭所有标签(&l)" + +#~ msgid "Connect" +#~ msgstr "登录" + +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: account not found." +#~ msgstr "无法连接:没有找到账户" + +#~ msgctxt "Status message on login screen" +#~ msgid "Cannot connect: no password has been entered." +#~ msgstr "无法连接: 密码没有输入" + +#~ msgid "Rename group" +#~ msgstr "重命名组(&n)" + +#~ msgid "Account &Settings..." +#~ msgstr "帐号设置(&S)" + +#, fuzzy +#~ msgid "Select an emoticon and click here to delete it" +#~ msgstr "选择一个表情然后单击这里删除。" + +#, fuzzy +#~ msgid "%1





is now online" +#~ msgstr "%1现在联机了" + +#, fuzzy +#~ msgid "%1





has gone away" +#~ msgstr "%1走了" + +#, fuzzy +#~ msgid "%1





is now busy" +#~ msgstr "%1繁忙" + +#, fuzzy +#~ msgid "%1





has gone idle" +#~ msgstr "%1发起了呆" + +#, fuzzy +#~ msgid "Popup Notifications" +#~ msgstr "弹出通知" + +#~ msgid "Show notifications when your contacts:" +#~ msgstr "当联系人有如下动作时通知你:" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts connects " +#~ "to MSN." +#~ msgstr "如果选中,当你的联系人连接到MSN时会弹出消息。" + +#~ msgid "&Go online" +#~ msgstr "上线(&G)" + +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts starts a " +#~ "conversation with you." +#~ msgstr "如果选中,当你的联系人开始与你谈话时会弹出消息。" + +#~ msgid "Start a &chat with you" +#~ msgstr "开始了与您的聊天(&c)" + +#~ msgid "" +#~ "If enabled, a popup message is shown every time one of your contacts " +#~ "sends you a message." +#~ msgstr "如果选中,每当你的联系人给你发消息时会弹出消息。" + +#~ msgid "S&end you a message" +#~ msgstr "给您发送了消息(&e)" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when your contacts change their MSN " +#~ "status." +#~ msgstr "如果选中,当你的联系人改变MSN状态时也会弹出消息。" + +#~ msgid "Change their &status" +#~ msgstr "更改状态(&s)" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message is shown when one of your contacts goes " +#~ "offline." +#~ msgstr "如果选中,每当你的联系人下线时也会弹出消息。" + +#~ msgid "Go o&ffline" +#~ msgstr "下线(&f)" + +#, fuzzy +#~ msgid "Email Events" +#~ msgstr "电子邮件地址" + +#, fuzzy +#~ msgid "Show notifications when email is received:" +#~ msgstr "当电子邮件到达\"其他文件夹\"时通知我" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in the Inbox. " +#~ "This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "如果选中,当你在其他文件夹中收到邮件时,也会弹出气泡。此选项仅适用于 " +#~ "Hotmail 帐户。" + +#, fuzzy +#~ msgid "" +#~ "If enabled, a popup message appears when email is received in other " +#~ "folders. This option is only available for Hotmail/Live Mail accounts." +#~ msgstr "" +#~ "如果选中,当你在其他文件夹中收到邮件时,也会弹出气泡。此选项仅适用于 " +#~ "Hotmail 帐户。" + +#, fuzzy +#~ msgid "In other folders" +#~ msgstr "提醒" + +#~ msgid "Controls the number of seconds before popups are hidden." +#~ msgstr "控制弹出气泡隐藏前的显示时间。" + +#~ msgid "Hide popups after" +#~ msgstr "通知停留" + +#~ msgid "seconds" +#~ msgstr "秒" + +#, fuzzy +#~ msgid "Other Alerts" +#~ msgstr "提醒" + +#~ msgid "The contact initiated a MSN7 feature KMess can't handle yet." +#~ msgstr "联系人启动了一项KMess不能处理的MSN7功能。" + +#, fuzzy +#~ msgctxt "Toolbar button" +#~ msgid "Hide Contacts" +#~ msgstr "联系人" + +#, fuzzy +#~ msgid "Also r&emember the password" +#~ msgstr "密码" + +#, fuzzy +#~ msgid "" +#~ "If enabled, all chat conversations will be saved in the specified " +#~ "directory." +#~ msgstr "如果选中,聊天记录会保存在指定的目录下。" + +#~ msgid "Log &all chats" +#~ msgstr "保存所有聊天记录(&a)" + +#~ msgid "Month" +#~ msgstr "月" + +#~ msgid "Day" +#~ msgstr "日" + +#, fuzzy +#~ msgid "Invite contacts" +#~ msgstr "联系人" + +#, fuzzy +#~ msgid "&Search in Contact List" +#~ msgstr "搜索联系人(&e)" + +#~ msgid "This person is offline or invisible." +#~ msgstr "此人已经下线或隐身。" + +#~ msgid "The message \"%1\" was not received!" +#~ msgstr "消息\"%1\"没有收到!" + +#, fuzzy +#~ msgid "Hide Side&bar" +#~ msgstr "侧边栏" + +#, fuzzy +#~ msgid "Hide the contact sidebar" +#~ msgstr "显示或隐藏联系人侧栏" + +#, fuzzy +#~ msgid "Show the contact sidebar" +#~ msgstr "显示或隐藏联系人侧栏" + +#, fuzzy +#~ msgid "Other contact:" +#~ msgstr "联系人%1" + +#, fuzzy +#~ msgid "Invited" +#~ msgstr "邀请(&I)" + +#~ msgid "Unable to make a connection: %1" +#~ msgstr "无法建立连接: %1" + +#, fuzzy +#~ msgid "" +#~ "Click here to add a new custom emoticon which can be sent to your contacts" +#~ msgstr "单击这里添加一个新的自定义表情。" + +#~ msgid "Black sheep" +#~ msgstr "黑羊(害群之马)" + +#~ msgid "Copy E&mail" +#~ msgstr "复制电子邮件地址(&m)" + +#~ msgid "Specify an Away message" +#~ msgstr "指定处于离开状态时发送的消息" + +#, fuzzy +#~ msgctxt "Contact props dialog info" +#~ msgid "Email: %1" +#~ msgstr "电子邮件" + +#~ msgid "Soccer ball" +#~ msgstr "足球" + +#, fuzzy +#~ msgid "Contact %1 already exists." +#~ msgstr "这个联系人已经在您的列表中" + +#, fuzzy +#~ msgctxt "Contact email in list tooltip" +#~ msgid "Email: %1" +#~ msgstr "电子邮件" + +#, fuzzy +#~ msgid "Contact is in the opposite list" +#~ msgstr "这个联系人不在您的列表中" + +#~ msgid "The group name is too long" +#~ msgstr "组名过长" + +#, fuzzy +#~ msgid "No permissions given for this account" +#~ msgstr "这个帐号的自定义表情:" + +#~ msgid "Enter your personal message here" +#~ msgstr "请在此处输入您的个人信息" + +#~ msgid "Click" +#~ msgstr "单击这里" + +#, fuzzy +#~ msgid "Network" +#~ msgstr "网络窗口" + +#~ msgid "Co&nnect" +#~ msgstr "登录(&n)" + +#, fuzzy +#~ msgctxt "Login status message, with load percentage" +#~ msgid "Waiting for contact list (%1%)..." +#~ msgstr "等待联系人列表……" + +#, fuzzy +#~ msgid "SSL Error" +#~ msgstr "服务器错误" + +#, fuzzy +#~ msgid " Account options " +#~ msgstr "帐号设置(&S)" + +#, fuzzy +#~ msgid "You received a wink from %1." +#~ msgstr "你接收了%1发来的传情动漫。" + +#~ msgid "Got synchronization" +#~ msgstr "已同步" + +#, fuzzy +#~ msgid "&Settings" +#~ msgstr "设置" + +#~ msgid "Do you want to accept the file: %1 (%2)" +#~ msgstr "您要接收这个文件吗:%1 (%2 )" + +#~ msgid "The transfer was cancelled" +#~ msgstr "文件传送被取消" + +#~ msgid "Successfully transferred file: %1" +#~ msgstr "成功传送文件:%1" + +#~ msgid "The transfer of %1 failed. The file does not exist." +#~ msgstr "文件传送失败,文件%1不存在。" + +#~ msgid "The transfer of %1 failed. The file could not be read." +#~ msgstr "文件传送失败,无法读取 %1。" + +#~ msgid "The transfer of %1 was cancelled." +#~ msgstr "文件 %1 的传送被取消。" #~ msgid "Click to send an email to this contact." #~ msgstr "点击这里给这个联系人发送 email" @@ -4134,10 +6215,6 @@ msgstr "%1 %2" #~ msgid "Speed:" #~ msgstr "服务器:" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "显示email信息" - #~ msgid "Logging in..." #~ msgstr "正在登录..." @@ -4156,10 +6233,6 @@ msgstr "%1 %2" #~ msgid "Email: " #~ msgstr "电子邮件" -#, fuzzy -#~ msgid "Client: " -#~ msgstr "客户端: %1" - #~ msgid "Remove group" #~ msgstr "删除组(&m)" @@ -4172,10 +6245,6 @@ msgstr "%1 %2" #~ msgid "You have %1 new emails in your inbox." #~ msgstr "您的收件箱中有%1封新邮件。" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "上线(&G)" - #~ msgid "The transfer of %1 failed. Couldn't open file" #~ msgstr "文件传送失败,无法打开文件%1。" @@ -4273,12 +6342,6 @@ msgstr "%1 %2" #~ msgid "Your password:" #~ msgstr "您的密码:" -#~ msgid "Display picture:" -#~ msgstr "头像:" - -#~ msgid "Don't show a displa&y picture" -#~ msgstr "禁止显示头像(&y)" - #~ msgid "Status to set at login:" #~ msgstr "登录时的状态:" @@ -4315,11 +6378,6 @@ msgstr "%1 %2" #~ msgid "I want to use a proxy" #~ msgstr "我想使用代理" -#~ msgid "" -#~ "If enabled, a proxy server will be used to connect to the MSN Messenger " -#~ "service." -#~ msgstr "如果选中,将会使用代理服务器连接到MSN Messenger服务器。" - #~ msgid "Port:" #~ msgstr "端口:" @@ -4336,7 +6394,7 @@ msgstr "%1 %2" #~ msgstr "SOCKS5 代理" #~ msgid "Add this emoticon" -#~ msgstr "添加这个图释" +#~ msgstr "添加这个表情" #~ msgid "" #~ "Continue closing the chat window?\n" diff --git a/po/zh_TW.po b/po/zh_TW.po index b9390a3..26c1f04 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -1,824 +1,1416 @@ # translation of zh_TW.po to # Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# # Yen-chou Chen , 2005. # Milton , 2006. # Yenchou Chen , 2007. +# msgid "" msgstr "" "Project-Id-Version: zh_TW\n" "Report-Msgid-Bugs-To: http://www.kmess.org/board/\n" -"POT-Creation-Date: 2008-08-10 12:41+0200\n" -"PO-Revision-Date: 2008-02-06 18:57+0800\n" -"Last-Translator: Yenchou Chen\n" +"POT-Creation-Date: 2009-03-23 22:32+0100\n" +"PO-Revision-Date: 2009-02-26 18:13+0800\n" +"Last-Translator: Yen-chou Chen \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=1; plural=0;\n" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 189 +#. i18n: file: chat/chatwindow.ui:181 +#. i18n: ectx: property (toolTip), widget (QToolButton, textButton_) #: rc.cpp:3 -msgid "Ne&w Line" -msgstr "新一行(&w)" +msgid "Standard text mode" +msgstr "標準文字模式" -#. i18n: tag string -#. i18n: file ./chat/chatview.ui line 205 +#. i18n: file: chat/chatwindow.ui:184 +#. i18n: ectx: property (whatsThis), widget (QToolButton, textButton_) +#: rc.cpp:6 +msgid "Click this button to switch to standard text mode." +msgstr "點擊此按鍵切換到標準文字模式。" + +#. i18n: file: chat/chatwindow.ui:203 +#. i18n: ectx: property (toolTip), widget (QToolButton, inkButton_) #: rc.cpp:9 +msgid "Ink message" +msgstr "手寫訊息" + +#. i18n: file: chat/chatwindow.ui:206 +#. i18n: ectx: property (whatsThis), widget (QToolButton, inkButton_) +#: rc.cpp:12 +msgid "" +"Click this button to switch to ink mode, so you can write or paint an ink " +"message." +msgstr "點擊此按鍵切換到手寫模式,您可以寫或畫出您的訊息。" + +#. i18n: file: chat/chatwindow.ui:229 +#. i18n: ectx: property (toolTip), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:15 +msgid "Standard emoticons" +msgstr "標準表情符號" + +#. i18n: file: chat/chatwindow.ui:232 +#. i18n: ectx: property (whatsThis), widget (QToolButton, standardEmoticonButton_) +#: rc.cpp:18 +msgid "" +"Click this button to show all default MSN emoticons, so you can easily " +"insert them in your messages." +msgstr "點擊此按鍵會顯示所有預設的 MSN 表情圖示,您可以將它們加入訊息中。" + +#. i18n: file: chat/chatwindow.ui:248 +#. i18n: ectx: property (toolTip), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:21 +msgid "Custom emoticons" +msgstr "自訂表情符號" + +#. i18n: file: chat/chatwindow.ui:251 +#. i18n: ectx: property (whatsThis), widget (QToolButton, customEmoticonButton_) +#: rc.cpp:24 +msgid "" +"If you have added any custom emoticons, click this button to view them, so " +"you can easily insert them in your messages." +msgstr "若您已加入任何自訂的表情圖示,點擊此按鍵可以檢視,讓您加入訊息中。" + +#. i18n: file: chat/chatwindow.ui:267 +#. i18n: ectx: property (toolTip), widget (QToolButton, winksButton_) +#: rc.cpp:27 +msgid "Winks" +msgstr "動畫快遞" + +#. i18n: file: chat/chatwindow.ui:270 +#. i18n: ectx: property (whatsThis), widget (QToolButton, winksButton_) +#: rc.cpp:30 +msgid "Click this button to view the available winks." +msgstr "點擊此按鍵以顯示可用的動畫快遞。" + +#. i18n: file: chat/chatwindow.ui:305 +#. i18n: ectx: property (text), widget (QPushButton, newLineButton_) +#: rc.cpp:33 +msgid "Ne&w Line" +msgstr "新增一行(&w)" + +#. i18n: file: chat/chatwindow.ui:327 +#. i18n: ectx: property (text), widget (QPushButton, sendButton_) +#: rc.cpp:39 msgid "S&end" msgstr "傳送(&e)" -#. i18n: tag string -#. i18n: file ./chat/chatwindow.ui line 117 -#: rc.cpp:15 -msgid "Contacts" -msgstr "聯絡人" +#. i18n: file: chat/chatwindowui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:45 +msgctxt "@title:menu" +msgid "&Chat" +msgstr "聊天(&C)" -#. i18n: tag string -#. i18n: file ./chat/contactframe.ui line 162 -#: rc.cpp:18 -msgid "Click here to display this contact's profile." -msgstr "按這裡來顯示連絡人資訊" +#. i18n: file: chat/chatwindowui.rc:37 +#. i18n: ectx: ToolBar (mainToolBar) +#: rc.cpp:48 +msgctxt "@title:menu" +msgid "Main Toolbar" +msgstr "主要工具列" -#. i18n: tag string -#. i18n: file ./chat/inkedit.ui line 104 -#: rc.cpp:21 -msgid "Size pen" -msgstr "" +#. i18n: file: chat/contactframe.ui:128 +#. i18n: ectx: property (toolTip), widget (QLabel, contactPixmapLabel_) +#: rc.cpp:51 +msgid "Click here to display the menu for this contact" +msgstr "點擊此處以顯示此聯絡人的選單" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 22 -#: rc.cpp:24 -#, fuzzy +#. i18n: file: chat/contactswidget.ui:101 +#. i18n: ectx: property (toolTip), widget (QLabel, userPixmapLabel_) +#: rc.cpp:54 +msgid "Click here to open your account settings" +msgstr "點選此處以開啟您的帳號設定" + +#. i18n: file: chat/inkedit.ui:72 +#. i18n: ectx: property (toolTip), widget (QToolButton, clearButton_) +#: rc.cpp:57 +msgid "&Clear area" +msgstr "清除區域(&C)" + +#. i18n: file: chat/inkedit.ui:85 +#. i18n: ectx: property (toolTip), widget (QToolButton, colorButton_) +#: rc.cpp:60 +msgid "&Pen Color" +msgstr "字體顏色(&P)" + +#. i18n: file: chat/inkedit.ui:107 +#. i18n: ectx: property (toolTip), widget (QSlider, sizePen_) +#: rc.cpp:63 +msgid "Pen Size" +msgstr "筆刷大小" + +#. i18n: file: chat/inkedit.ui:126 +#. i18n: ectx: property (toolTip), widget (QToolButton, eraseButton_) +#: rc.cpp:66 +msgid "&Erase brush" +msgstr "橡皮擦(&E)" + +#. i18n: file: dialogs/addcontactdialog.ui:33 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:69 +msgid "Initial groups" +msgstr "初始群組" + +#. i18n: file: dialogs/addcontactdialog.ui:47 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:72 msgid "" "Enter here the email address of the person you wish to add to your contact " "list" -msgstr "請輸入欲加入聯絡人的電子郵件:" +msgstr "請在此輸入您要加入的聯絡人的電子郵件地址" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 25 -#: rc.cpp:27 -msgid "Email address" -msgstr "電子郵件位址" +#. i18n: file: dialogs/addcontactdialog.ui:50 +#. i18n: ectx: property (text), widget (QLabel, label) +#. i18n: file: initialview.ui:174 +#. i18n: ectx: property (text), widget (QLabel, TextLabel2) +#: rc.cpp:75 rc.cpp:271 +msgid "Email address:" +msgstr "電子郵件地址:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 35 -#: rc.cpp:30 -msgid "Optionally, you can choose the group where to place the new contact" -msgstr "" +#. i18n: file: dialogs/addemoticondialog.ui:96 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:78 +msgid "Enter a shortcut for the emoticon:" +msgstr "輸入此表情符號的快捷鍵:" -#. i18n: tag string -#. i18n: file ./dialogs/addcontactdialog.ui line 38 -#: rc.cpp:33 -#, fuzzy -msgid "Initial group" -msgstr "重新命名此群組(&n)" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 96 -#: rc.cpp:36 -msgid "Enter a shortcut for this emoticon:" -msgstr "給這個表情輸入一個快捷鍵:" - -#. i18n: tag string -#. i18n: file ./dialogs/addemoticondialog.ui line 113 -#: rc.cpp:39 +#. i18n: file: dialogs/addemoticondialog.ui:113 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:81 msgid "Select an image file:" msgstr "選擇一個影像檔案" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 19 -#: rc.cpp:45 -#, fuzzy +#. i18n: file: dialogs/awaymessagedialog.ui:19 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:87 msgid "" "Enter a message to be automatically sent to people who try to message you." -msgstr "" -"輸入一個訊息,\n" -"讓嘗試傳訊息給你的人會被自動回覆:" +msgstr "請輸入訊息。當其他人傳訊息給您的時候,會自動以此訊息回覆。" -#. i18n: tag string -#. i18n: file ./dialogs/awaymessagedialog.ui line 22 -#: rc.cpp:48 +#. i18n: file: dialogs/awaymessagedialog.ui:22 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:90 +msgid "&Specify an automatic away message:" +msgstr "指定一個自動離開的訊息:" + +#. i18n: file: dialogs/chathistorydialog.ui:30 +#. i18n: ectx: property (clickMessage), widget (KLineEdit, searchEdit_) +#: rc.cpp:93 +msgid "Search through contacts..." +msgstr "在聯絡人間搜尋..." + +#. i18n: file: dialogs/chathistorydialog.ui:64 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:96 #, fuzzy -msgid "&Automatic away message" -msgstr "指定一個離開訊息" +msgid "Chat Log Filter" +msgstr "交談紀錄" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 51 -#: rc.cpp:51 -msgid "What would you like to do" -msgstr "" +#. i18n: file: dialogs/chathistorydialog.ui:78 +#. i18n: ectx: property (text), widget (QRadioButton, radioButton) +#: rc.cpp:99 +msgid "&Do not filter" +msgstr "不要過濾(&D)" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 57 -#: rc.cpp:54 +#. i18n: file: dialogs/chathistorydialog.ui:95 +#. i18n: ectx: property (text), widget (QRadioButton, dateRadio_) +#: rc.cpp:102 +msgid "Filter by &date" +msgstr "以日期過濾(&d)" + +#. i18n: file: dialogs/chathistorydialog.ui:110 +#. i18n: ectx: property (text), widget (QCheckBox, fromBox_) +#: rc.cpp:105 +msgid "from" +msgstr "從" + +#. i18n: file: dialogs/chathistorydialog.ui:127 +#. i18n: ectx: property (text), widget (QCheckBox, toBox_) +#: rc.cpp:108 +msgid "to" +msgstr "到" + +#. i18n: file: dialogs/chathistorydialog.ui:143 +#. i18n: ectx: property (text), widget (QRadioButton, conversationRadio_) +#: rc.cpp:111 #, fuzzy -msgid "&Add this person to my \"Friends\" list" -msgstr "將此加入你的朋友清單(&A)" +msgid "Filter by &chat" +msgstr "以日期過濾(&d)" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 67 -#: rc.cpp:57 +#. i18n: file: dialogs/contactaddeduserdialog.ui:52 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:114 +msgid "What would you like to do?" +msgstr "您打算怎麼做?" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:58 +#. i18n: ectx: property (text), widget (QRadioButton, addContactOption_) +#: rc.cpp:117 +msgid "&Add this person to these groups of my contact list:" +msgstr "將此人加入我的聯絡人清單中的這些群組(&A):" + +#. i18n: file: dialogs/contactaddeduserdialog.ui:114 +#. i18n: ectx: property (text), widget (QRadioButton, allowContactOption_) +#: rc.cpp:120 #, fuzzy -msgid "Do not add this person; only allow them to see my online state" -msgstr "不新加此聯絡人,但是讓他能看見你的狀態(&N)" +msgid "&Do not add this person; only allow them to see my status" +msgstr "不要加入此人,只讓他們能看見我的上線狀態" -#. i18n: tag string -#. i18n: file ./dialogs/contactaddeduserdialog.ui line 74 -#: rc.cpp:60 +#. i18n: file: dialogs/contactaddeduserdialog.ui:121 +#. i18n: ectx: property (text), widget (QRadioButton, blockContactOption_) +#: rc.cpp:123 #, fuzzy -msgid "&Block this person from contacting me or seeing my online state" -msgstr "封鎖此人,使他不能聯絡你,或瞧見你的上線狀態(&y)" +msgid "&Block this person from contacting me or seeing my status" +msgstr "封鎖此人,他將無法聯繫您,也無法看到您的狀態(&B)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 13 -#: rc.cpp:64 dialogs/contactpropertiesdialog.cpp:271 -#, no-c-format -msgid "Contact Properties for %1" -msgstr "%1 的聯絡人特性" - -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 31 -#: rc.cpp:67 +#. i18n: file: dialogs/contactpropertiesdialog.ui:23 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:126 msgid "&Information" -msgstr "" +msgstr "資訊(&I)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 72 -#: rc.cpp:70 -#, fuzzy -msgid "Restore" -msgstr "被移除" +#. i18n: file: dialogs/contactpropertiesdialog.ui:64 +#. i18n: ectx: property (toolTip), widget (QPushButton, restoreButton_) +#: rc.cpp:129 +msgid "Click this button to restore the display picture of this contact" +msgstr "點擊此按鍵以儲存此聯絡人的顯示圖片" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 183 -#: rc.cpp:73 -msgid "" -"\n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::RichText\n" -" \n" -" \n" -" true\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Vertical\n" -" \n" -" \n" -" QSizePolicy::Minimum\n" -" \n" -" \n" -" \n" -" 250\n" -" 10\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Qt::Horizontal\n" -" \n" -" \n" -" QSizePolicy::Expanding\n" -" \n" -" \n" -" \n" -" 10\n" -" 20\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" Groups:" -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:67 +#. i18n: ectx: property (text), widget (QPushButton, restoreButton_) +#: rc.cpp:132 +msgid "&Restore" +msgstr "回復(&R)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 184 -#: rc.cpp:139 -msgid "" -"Groups:\n" -" " -msgstr "" +#. i18n: file: dialogs/contactpropertiesdialog.ui:178 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:135 +msgid "&Groups:" +msgstr "群組(&G):" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 218 -#: rc.cpp:143 -#, fuzzy -msgid "Use alternative name for this person" -msgstr "對此人使用替代名稱" +#. i18n: file: dialogs/contactpropertiesdialog.ui:216 +#. i18n: ectx: property (text), widget (QCheckBox, alternativeNameCheckBox_) +#: rc.cpp:138 +msgid "Use an &alternative name for this person" +msgstr "對此人使用替代名稱(&A)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 228 -#: rc.cpp:146 -#, fuzzy -msgid "Show a popup when the contact goes online/offline" -msgstr "當使用者上線或離線時,跳出氣球提示" +#. i18n: file: dialogs/contactpropertiesdialog.ui:226 +#. i18n: ectx: property (text), widget (QCheckBox, notifyOnlineCheckBox_) +#: rc.cpp:141 +msgid "Show a &popup when the contact goes online/offline" +msgstr "當聯絡人上線或離線時,顯示彈出訊息(&P)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 237 -#: rc.cpp:149 -msgid "Sound:" -msgstr "音效:" +#. i18n: file: dialogs/contactpropertiesdialog.ui:235 +#. i18n: ectx: property (text), widget (QLabel, label_6) +#: rc.cpp:144 +msgid "&Sound:" +msgstr "音效(&S):" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 289 -#: rc.cpp:158 +#. i18n: file: dialogs/contactpropertiesdialog.ui:282 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:150 msgid "I&mages" -msgstr "" +msgstr "影像(&M)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 335 -#: rc.cpp:161 -#, fuzzy +#. i18n: file: dialogs/contactpropertiesdialog.ui:331 +#. i18n: ectx: property (toolTip), widget (QPushButton, useButton_) +#: rc.cpp:153 +msgid "Click here to use the selected picture as your display picture" +msgstr "點擊此處以使用選取的圖片做為顯示圖片" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:334 +#. i18n: ectx: property (text), widget (QPushButton, useButton_) +#: rc.cpp:156 +msgid "Use As Display Picture" +msgstr "做為顯示圖片" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:341 +#. i18n: ectx: property (text), widget (QPushButton, clearCacheButton_) +#: rc.cpp:159 msgid "&Clear Cache" -msgstr "清除標籤" +msgstr "清除快取(&C)" -#. i18n: tag string -#. i18n: file ./dialogs/contactpropertiesdialog.ui line 353 -#: rc.cpp:164 -#, fuzzy -msgid "Notes" -msgstr "音符" +#. i18n: file: dialogs/contactpropertiesdialog.ui:351 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:162 +msgid "&Notes" +msgstr "備忘(&N)" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 13 -#: rc.cpp:167 dialogs/networkwindow.cpp:58 dialogs/networkwindow.cpp:1221 -#: dialogs/networkwindow.cpp:1248 +#. i18n: file: dialogs/contactpropertiesdialog.ui:361 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:165 +msgid "&Emoticons" +msgstr "表情符號(&E)" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:368 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:168 +msgid "" +"You can choose to hide any emoticon received from this contact. Just right-" +"click on a received emoticon and choose \"Ignore this Emoticon\".\n" +"With this page, you can restore the hidden emoticons." +msgstr "" +"你可以選擇隱藏任何從聯絡人傳來的表情符號。只要在表情符號上點選右鍵,並選擇 " +"\"忽略這個表情符號\"。\n" +"有了這個頁面,你可以回復隱藏的表情符號。" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:442 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:204 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:172 rc.cpp:792 +msgid "Click here to delete the selected emoticon" +msgstr "點擊此處以刪除選取的表情符號" + +#. i18n: file: dialogs/contactpropertiesdialog.ui:445 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#. i18n: file: settings/emoticonspage.ui:207 +#. i18n: ectx: property (text), widget (QPushButton, removeEmoticonButton_) +#: rc.cpp:175 rc.cpp:795 +msgid "Remo&ve" +msgstr "移除(&V)" + +#. i18n: file: dialogs/invitedialog.ui:19 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:181 +msgid "Available Contacts" +msgstr "可用的聯絡人" + +#. i18n: file: dialogs/invitedialog.ui:70 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:184 +msgid "Invite a contact not on your list:" +msgstr "邀請不在您清單中的聯絡人:" + +#. i18n: file: dialogs/invitedialog.ui:82 +#. i18n: ectx: property (toolTip), widget (QLineEdit, otherEdit_) +#: rc.cpp:187 +msgid "Insert the email of a contact to invite" +msgstr "請輸入要邀請的聯絡人的電子郵件地址" + +#. i18n: file: dialogs/invitedialog.ui:101 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:190 +msgid "Invited Contacts" +msgstr "已邀請的聯絡人" + +#. i18n: file: dialogs/listexportdialog.ui:18 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:199 +msgid "Items to export:" +msgstr "要匯出的項目:" + +#. i18n: file: dialogs/listexportdialog.ui:31 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:202 +msgid "Format" +msgstr "格式" + +#. i18n: file: dialogs/listexportdialog.ui:37 +#. i18n: ectx: property (text), widget (QRadioButton, csvButton_) +#: rc.cpp:205 +msgid "CSV" +msgstr "CSV(逗號分隔)" + +#. i18n: file: dialogs/listexportdialog.ui:44 +#. i18n: ectx: property (text), widget (QRadioButton, xmlButton_) +#: rc.cpp:208 +msgid "XML" +msgstr "XML" + +#. i18n: file: dialogs/listexportdialog.ui:71 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:211 +msgid "Contacts:" +msgstr "聯絡人:" + +#. i18n: file: dialogs/listexportdialog.ui:83 +#. i18n: ectx: property (text), widget (QPushButton, selectAllButton_) +#: rc.cpp:214 +msgid "Select All" +msgstr "全部選取" + +#. i18n: file: dialogs/listexportdialog.ui:90 +#. i18n: ectx: property (text), widget (QPushButton, deselectAllButton_) +#: rc.cpp:217 +msgid "Deselect All" +msgstr "全部取消選取" + +#. i18n: file: dialogs/listexportdialog.ui:116 +#. i18n: ectx: property (text), widget (QPushButton, exportButton_) +#: rc.cpp:220 +msgid "Export..." +msgstr "匯出..." + +#. i18n: file: dialogs/listexportdialog.ui:123 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:223 +msgid "Close" +msgstr "關閉" + +#. i18n: file: dialogs/networkwindow.ui:13 +#. i18n: ectx: property (windowTitle), widget (QWidget, NetworkWindow) +#: rc.cpp:226 dialogs/networkwindow.cpp:57 dialogs/networkwindow.cpp:1274 +#: dialogs/networkwindow.cpp:1301 msgid "Network Window" -msgstr "網絡視窗" +msgstr "網路視窗" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 25 -#: rc.cpp:170 +#. i18n: file: dialogs/networkwindow.ui:25 +#. i18n: ectx: property (title), widget (QGroupBox, commandSendingGroup_) +#: rc.cpp:229 msgid "Command to Current Tab" -msgstr "" +msgstr "對目前分頁下指令" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 37 -#: rc.cpp:173 +#. i18n: file: dialogs/networkwindow.ui:37 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:232 msgid "Command:" -msgstr "" +msgstr "指令:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 53 -#: rc.cpp:176 +#. i18n: file: dialogs/networkwindow.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:235 msgid "Type:" -msgstr "" +msgstr "型態:" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 60 -#: rc.cpp:179 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:60 +#. i18n: ectx: property (text), widget (QRadioButton, sendStandardCmdRadio_) +#: rc.cpp:238 msgid "Standard" -msgstr "星星" +msgstr "標準" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 67 -#: rc.cpp:182 +#. i18n: file: dialogs/networkwindow.ui:67 +#. i18n: ectx: property (text), widget (QRadioButton, sendMimeCmdRadio_) +#: rc.cpp:241 msgid "MIME" -msgstr "" +msgstr "MIME協定" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 93 -#: rc.cpp:185 -#, fuzzy +#. i18n: file: dialogs/networkwindow.ui:93 +#. i18n: ectx: property (text), widget (QPushButton, sendCommandButton_) +#: rc.cpp:244 msgid "Send" -msgstr "傳送(&e)" +msgstr "傳送" -#. i18n: tag string -#. i18n: file ./dialogs/networkwindow.ui line 132 -#: rc.cpp:188 +#. i18n: file: dialogs/networkwindow.ui:132 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:247 msgid "Command payload (can be empty):" -msgstr "" +msgstr "指令資料(可為空):" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 111 -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 136 -#. i18n: tag string -#. i18n: file ./kmessview.ui line 394 -#: rc.cpp:191 rc.cpp:194 rc.cpp:239 -msgid "KSqueezedTextLabel" -msgstr "" - -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 169 -#: rc.cpp:197 +#. i18n: file: dialogs/transferentry.ui:196 +#. i18n: ectx: property (text), widget (KUrlLabel, openLabel_) +#: rc.cpp:250 msgid "Open" -msgstr "" +msgstr "開啟" -#. i18n: tag string -#. i18n: file ./dialogs/transferentry.ui line 188 -#: rc.cpp:200 -#, fuzzy +#. i18n: file: dialogs/transferentry.ui:215 +#. i18n: ectx: property (text), widget (KUrlLabel, cancelLabel_) +#: rc.cpp:253 msgid "Cancel" msgstr "取消" -#. i18n: tag string -#. i18n: file ./dialogs/userpicturesdialog.ui line 16 -#: rc.cpp:203 -msgid "Form" -msgstr "" +#. i18n: file: dialogs/transferwindow.ui:85 +#. i18n: ectx: property (text), widget (QPushButton, downloadButton_) +#: rc.cpp:256 +msgid "&Download" +msgstr "下載(&D)" -#. i18n: tag string -#. i18n: file ./initialview.ui line 144 -#: rc.cpp:206 -#, fuzzy -msgid "Email address:" -msgstr "電子郵件:" +#. i18n: file: dialogs/transferwindow.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, uploadButton_) +#: rc.cpp:259 +msgid "&Upload" +msgstr "上傳(&U)" -#. i18n: tag string -#. i18n: file ./initialview.ui line 161 -#: rc.cpp:209 -#, fuzzy +#. i18n: file: dialogs/transferwindow.ui:136 +#. i18n: ectx: property (text), widget (QPushButton, cleanupButton_) +#: rc.cpp:262 +msgid "C&lean Up" +msgstr "清除(&L)" + +#. i18n: file: dialogs/transferwindow.ui:143 +#. i18n: ectx: property (text), widget (QPushButton, closeButton_) +#: rc.cpp:265 +msgid "&Close" +msgstr "關閉(&C)" + +#. i18n: file: initialview.ui:111 +#. i18n: ectx: property (toolTip), widget (QLabel, pictureLabel_) +#: rc.cpp:268 +msgid "" +"Click here to display the options for the currently selected account, " +"or scroll using the mouse wheel to switch between the saved accounts" +msgstr "按這裡顯示使用者設定,或滾動滑鼠滾輪切換使用者。" + +#. i18n: file: initialview.ui:193 +#. i18n: ectx: property (toolTip), widget (KComboBox, handleCombobox_) +#: rc.cpp:274 +msgid "" +"Insert here the email address of your registered Passport or Live account" +msgstr "請輸入您已用於註冊 Live 或護照帳號的電子郵件地址" + +#. i18n: file: initialview.ui:209 +#. i18n: ectx: property (text), widget (QLabel, TextLabel3) +#: rc.cpp:277 msgid "Password:" -msgstr "密碼" +msgstr "密碼:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 185 -#: rc.cpp:212 -msgid "Status at login" -msgstr "登入時的狀態" +#. i18n: file: initialview.ui:222 +#. i18n: ectx: property (toolTip), widget (QLineEdit, passwordEdit_) +#: rc.cpp:280 +msgid "Insert here your account's password" +msgstr "請輸入您的密碼" -#. i18n: tag string -#. i18n: file ./initialview.ui line 213 -#: rc.cpp:215 -msgid "More options..." -msgstr "" +#. i18n: file: initialview.ui:238 +#. i18n: ectx: property (text), widget (QLabel, initialStatusLabel_) +#: rc.cpp:283 +msgid "Status at login:" +msgstr "登入時的狀態:" -#. i18n: tag string -#. i18n: file ./initialview.ui line 222 -#: rc.cpp:218 +#. i18n: file: initialview.ui:257 +#. i18n: ectx: property (toolTip), widget (QComboBox, initialStatus_) +#: rc.cpp:286 #, fuzzy -msgid " Account options " -msgstr "帳號設定(&S)" +msgid "Choose a status to set when successfully connected." +msgstr "請選擇連線後要設定成哪一種 MSN 狀態。" -#. i18n: tag string -#. i18n: file ./initialview.ui line 228 -#: rc.cpp:221 -msgid "Remem&ber this profile" -msgstr "記住這個帳號 (&b)" +#. i18n: file: initialview.ui:280 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:289 +msgid "If enabled, KMess will save your account" +msgstr "若開啟此選項,KMess 會儲存您的帳號設定" -#. i18n: tag string -#. i18n: file ./initialview.ui line 238 -#: rc.cpp:227 -msgid "Also r&emember the password" -msgstr "" +#. i18n: file: initialview.ui:283 +#. i18n: ectx: property (text), widget (QCheckBox, rememberAccountCheckBox_) +#: rc.cpp:292 +msgid "Remem&ber account" +msgstr "記住帳號(&B)" -#. i18n: tag string -#. i18n: file ./initialview.ui line 288 -#: rc.cpp:233 kmessinterface.cpp:210 +#. i18n: file: initialview.ui:293 +#. i18n: ectx: property (toolTip), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:298 +msgid "" +"If you choose to remember an account within KMess, you can also save its " +"password" +msgstr "若您選擇要將帳號記在 KMess 內,您可以儲存密碼" + +#. i18n: file: initialview.ui:296 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:301 +msgid "R&emember password" +msgstr "記住密碼(&E)" + +#. i18n: file: initialview.ui:343 +#. i18n: ectx: property (toolTip), widget (QPushButton, connectButton_) +#: rc.cpp:307 +msgid "" +"Click this button to start using KMess, or to cancel a connection attempt" +msgstr "點擊此按鍵開始使用 KMess,或是取消連線嘗試" + +#. i18n: file: initialview.ui:346 +#. i18n: ectx: property (text), widget (QPushButton, connectButton_) +#: rc.cpp:310 kmessinterface.cpp:162 msgid "&Connect" msgstr "連線(&C)" -#. i18n: tag string -#. i18n: file ./kmessview.ui line 206 -#: rc.cpp:236 -msgid "Enter your personal message here" -msgstr "請在此輸入你的個人訊息" +#. i18n: file: initialview.ui:442 +#. i18n: ectx: property (text), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:313 +msgid "New Account" +msgstr "新增帳號" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 27 -#: rc.cpp:242 -#, fuzzy -msgid "Your Account Information" -msgstr "帳號設定(&S)" +#. i18n: file: initialview.ui:445 +#. i18n: ectx: property (url), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:316 +msgid "https://accountservices.passport.net/reg.srf" +msgstr "https://accountservices.passport.net/reg.srf" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 33 -#: rc.cpp:245 -msgid "Enter the name other contacts should see when you're online." -msgstr "請輸入當你上線時給其他使用者看的名稱" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 36 -#: rc.cpp:248 -#, fuzzy -msgid "&Friendly name:" -msgstr "昵稱" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 52 -#: rc.cpp:251 +#. i18n: file: initialview.ui:448 +#. i18n: ectx: property (tipText), widget (KUrlLabel, newAccountLabel_) +#: rc.cpp:319 msgid "" -"Enter the e-mail address of your MSN Passport account. You can register a " -"new account at http://register.passport.com/" +"Click here to register a new Live account, which you can use to " +"connect to MSN.
You can also use your existing email address" msgstr "" -"輸入你的 MSN Passport 帳號。你可以在 http://register.passport.com/ 註冊一個新" -"帳號。" +"點擊此處以註冊新的 Live 帳號,以便連線到 MSN。
您可以使用您現有的電" +"子郵件地址。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 55 -#: rc.cpp:254 +#. i18n: file: initialview.ui:477 +#. i18n: ectx: property (text), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:322 +msgid "Password forgotten?" +msgstr "忘記密碼?" + +#. i18n: file: initialview.ui:480 +#. i18n: ectx: property (url), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:325 +msgid "https://login.live.com/resetpw.srf" +msgstr "重設密碼 https://login.live.com/resetpw.srf" + +#. i18n: file: initialview.ui:483 +#. i18n: ectx: property (tipText), widget (KUrlLabel, forgottenPasswordLabel_) +#: rc.cpp:328 #, fuzzy -msgid "&Email address:" -msgstr "電子郵件:" +msgid "" +"Click here to go to the Live web site, to reset your account's " +"password" +msgstr "請點擊此處連線到 Live 網站,您可以重設您的密碼。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 71 -#: rc.cpp:257 +#. i18n: file: kmessinterfaceui.rc:5 +#. i18n: ectx: Menu (file) +#: rc.cpp:331 +msgctxt "@title:menu" +msgid "&Connect" +msgstr "連線(&C)" + +#. i18n: file: kmessinterfaceui.rc:17 +#. i18n: ectx: Menu (view) +#: rc.cpp:334 +msgctxt "@title:menu" +msgid "&View" +msgstr "檢視(&V)" + +#. i18n: file: kmessinterfaceui.rc:36 +#. i18n: ectx: Menu (settings) +#: rc.cpp:337 +msgctxt "@title:menu" +msgid "&Actions" +msgstr "動作(&A)" + +#. i18n: file: settings/accountpage.ui:14 +#. i18n: ectx: property (windowTitle), widget (QWidget, AccountPage) +#: rc.cpp:340 +msgid "Form" +msgstr "表單" + +#. i18n: file: settings/accountpage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:343 +msgid "Account &Info" +msgstr "帳號資訊(&I)" + +#. i18n: file: settings/accountpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_) +#: rc.cpp:346 +msgid "Your Account Information" +msgstr "您的帳號資訊" + +#. i18n: file: settings/accountpage.ui:44 +#. i18n: ectx: property (whatsThis), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:349 +#, fuzzy +msgid "Enter the name other contacts should see when you are online." +msgstr "請輸入您要顯示給別人看的名稱。" + +#. i18n: file: settings/accountpage.ui:47 +#. i18n: ectx: property (text), widget (QLabel, friendlyNameLabel_) +#: rc.cpp:352 +msgid "&Friendly name:" +msgstr "暱稱(&F):" + +#. i18n: file: settings/accountpage.ui:63 +#. i18n: ectx: property (whatsThis), widget (QLabel, handleLabel_4) +#: rc.cpp:355 +msgid "" +"Enter the email address of your MSN Passport account. You can register a new " +"account at http://register.passport.com/" +msgstr "" +"請輸入您用於註冊 MSN Passport 帳號的電子郵件地址。您可以在 http://register." +"passport.com/ 註冊一個新的帳號。" + +#. i18n: file: settings/accountpage.ui:66 +#. i18n: ectx: property (text), widget (QLabel, handleLabel_4) +#: rc.cpp:358 +msgid "&Email address:" +msgstr "電子郵件地址(&E):" + +#. i18n: file: settings/accountpage.ui:82 +#. i18n: ectx: property (whatsThis), widget (QLabel, passwordLabel_) +#: rc.cpp:361 msgid "" "Enter the password of your MSN Passport account. You can register a new " "account at http://register.passport.com/" msgstr "" -"輸入你的 MSN Passport 帳號。你可以在 http://register.passport.com/ 註冊一個新" -"帳號。" +"請輸入您的 MSN Passport 帳號的密碼。您可以在 http://register.passport.com/ 註" +"冊一個新的帳號。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 74 -#: rc.cpp:260 -#, fuzzy +#. i18n: file: settings/accountpage.ui:85 +#. i18n: ectx: property (text), widget (QLabel, passwordLabel_) +#: rc.cpp:364 msgid "&Password:" -msgstr "密碼" +msgstr "密碼(&P):" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 103 -#: rc.cpp:263 -#, fuzzy -msgid "&Remember Password" -msgstr "密碼" +#. i18n: file: settings/accountpage.ui:114 +#. i18n: ectx: property (text), widget (QCheckBox, rememberPasswordCheckBox_) +#: rc.cpp:367 +msgid "&Remember password" +msgstr "記住密碼(&R)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 121 -#: rc.cpp:266 settings/accountpage.cpp:424 +#. i18n: file: settings/accountpage.ui:130 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:370 settings/accountpage.cpp:463 msgid "Display Picture" msgstr "顯示圖片" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 221 -#: rc.cpp:269 +#. i18n: file: settings/accountpage.ui:230 +#. i18n: ectx: property (text), widget (KPushButton, browseButton_) +#: rc.cpp:373 msgid "C&hange..." msgstr "改變...(&h)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 246 -#: rc.cpp:275 +#. i18n: file: settings/accountpage.ui:255 +#. i18n: ectx: property (text), widget (QCheckBox, noPictureCheckbox_) +#: rc.cpp:379 msgid "&Do not use" -msgstr "" +msgstr "不要使用(&D)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 294 -#: rc.cpp:281 +#. i18n: file: settings/accountpage.ui:272 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:385 +#, fuzzy msgid "" -"The option \"Remember this profile\" was left unchecked while logging in, so " -"your settings won't be saved by default. Enable this option when you want to " -"save your account settings permanently at this system.\n" +"The option \"Remember account\" was left unchecked while logging in, so your " +"settings won't be saved by default. Enable this option if you want to save " +"your account settings permanently on this system.\n" "\n" "It's recommended to enable this option unless you're using KMess as guest or " "you're using a public system (e.g. Internet cafe)." msgstr "" -"「記得這個帳號」選項在登入時是不勾選的。所以預設裡,你的設定不會被保存。當你" -"想在系統裡保存這個帳號,請開啟這個選項。\n" +"「記住此設定檔」選項在登入時並未勾選,所以您的設定將不會被保留。若您希望保留" +"您的帳號設定,請開啟此選項。\n" "\n" -"建議你開啟此功能,除非你使用 guest 帳號登入,或你正在使用公共系統(例如:網咖)" +"除非您使用的是公共系統(例如:網咖的電腦)上的 KMess,否則建議您開啟此選項。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 297 -#: rc.cpp:286 -#, fuzzy +#. i18n: file: settings/accountpage.ui:275 +#. i18n: ectx: property (text), widget (QCheckBox, rememberCheckbox_) +#: rc.cpp:390 msgid "Re&member the settings of this account" -msgstr "記住這個帳號的設定" +msgstr "記住這個帳號的設定(&M)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 307 -#: rc.cpp:289 +#. i18n: file: settings/accountpage.ui:285 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:393 msgid "If enabled, KMess automatically logs in with this account." msgstr "如果開啟,KMess 會自動以此帳號登入" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 310 -#: rc.cpp:292 +#. i18n: file: settings/accountpage.ui:288 +#. i18n: ectx: property (text), widget (QCheckBox, autologinCheckBox_) +#: rc.cpp:396 #, fuzzy -msgid "Login &with this account automatically" -msgstr "在啟動時,以此帳號自動登入(&w)" +msgid "Log in &with this account automatically" +msgstr "自動以此帳號登入(&W)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 322 -#: rc.cpp:298 -#, fuzzy +#. i18n: file: settings/accountpage.ui:300 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_) +#: rc.cpp:402 msgid "Login &as" -msgstr "紀錄所有交談內容(&a)" +msgstr "登入為(&A)" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 374 -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 442 -#: rc.cpp:301 rc.cpp:316 +#. i18n: file: settings/accountpage.ui:353 +#. i18n: ectx: property (whatsThis), widget (QLabel, verifyLabel_) +#: rc.cpp:405 msgid "" -"You need a passport account to connect to the MSN Messenger network. You can " -"register your current e-mail address at register.passport.com or use a " +"You need to connect to the Passport site to confirm that your email address " +"exists." +msgstr "您必須連線到微軟護照認證網站來確認您的電子郵件地址是否存在。" + +#. i18n: file: settings/accountpage.ui:356 +#. i18n: ectx: property (text), widget (QLabel, verifyLabel_) +#: rc.cpp:408 +msgid "" +"You can't change your friendly name because your Passport email address is " +"not verified." +msgstr "您無法變更您的暱稱,因為您的 Passport 帳號尚未認證。" + +#. i18n: file: settings/accountpage.ui:396 +#. i18n: ectx: property (text), widget (KUrlLabel, verifyButton_) +#: rc.cpp:411 +msgid "Request verification email" +msgstr "要求確認電子郵件地址" + +#. i18n: file: settings/accountpage.ui:399 +#. i18n: ectx: property (url), widget (KUrlLabel, verifyButton_) +#: rc.cpp:414 +msgid "https://accountservices.passport.net/" +msgstr "https://accountservices.passport.net/" + +#. i18n: file: settings/accountpage.ui:402 +#. i18n: ectx: property (tipText), widget (KUrlLabel, verifyButton_) +#: rc.cpp:417 +msgid "Go to accountservices.passport.net" +msgstr "連到 accountservices.passport.net" + +#. i18n: file: settings/accountpage.ui:421 +#. i18n: ectx: property (whatsThis), widget (QLabel, registerLabel_) +#: rc.cpp:420 +msgid "" +"You need a Passport account to connect to the MSN Messenger network. You can " +"register your current email address at register.passport.com or use a " "Hotmail account to connect." msgstr "" -"你需要一個 passport 帳號來連接到 MSN Messenger 網路。你可以在 register." -"passport.com 註冊你目前的 e-mail,或使用 Hotmail 帳號來連線。" +"您需要一個 Passport 的帳號才能連線到 MSN Messenger 網路。您可以用您的電子郵件" +"地址到 register.passport.com 註冊一個帳號,或是用 Hotmail 帳號來連線。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 377 -#: rc.cpp:304 +#. i18n: file: settings/accountpage.ui:424 +#. i18n: ectx: property (text), widget (QLabel, registerLabel_) +#: rc.cpp:423 msgid "" -"You can't change your friendly name because your passport e-mail address is " -"not verified." -msgstr "你不能更該你的名稱,因為你的 passport e-mail 尚未認證" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 417 -#: rc.cpp:307 -msgid "Request verification email" -msgstr "要求確認 email" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 420 -#: rc.cpp:310 -msgid "https://accountservices.passport.net/" -msgstr "http://accountservuces.passport.net/" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 423 -#: rc.cpp:313 -msgid "Go to accountservices.passport.net" -msgstr "連至 accountservices.passport.net" - -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 445 -#: rc.cpp:319 -msgid "" -"To connect to the MSN Messenger service, you will need to register an e-mail " +"To connect to the MSN Messenger service, you will need to register an email " "address as Passport account." -msgstr "" -"連線到 MSN Messenger 服務,你需要註冊一個 e-mail 來當作 Passport 帳號。" +msgstr "要連線到 MSN Messenger 服務,您必須用電子郵件地址註冊 Passport 帳號。" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 485 -#: rc.cpp:322 +#. i18n: file: settings/accountpage.ui:464 +#. i18n: ectx: property (text), widget (KUrlLabel, registerButton_) +#: rc.cpp:426 msgid "Register new account" msgstr "註冊一個新帳號" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 488 -#: rc.cpp:325 +#. i18n: file: settings/accountpage.ui:467 +#. i18n: ectx: property (url), widget (KUrlLabel, registerButton_) +#: rc.cpp:429 msgid "http://register.passport.com/" msgstr "http://register.passport.com/" -#. i18n: tag string -#. i18n: file ./settings/accountpage.ui line 491 -#: rc.cpp:328 +#. i18n: file: settings/accountpage.ui:470 +#. i18n: ectx: property (tipText), widget (KUrlLabel, registerButton_) +#: rc.cpp:432 msgid "Go to register.passport.com" msgstr "連至 register.passport.com" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 25 -#: rc.cpp:331 +#. i18n: file: settings/accountpage.ui:488 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:435 +msgid "&Status Options" +msgstr "狀態選項(&S)" + +#. i18n: file: settings/accountpage.ui:494 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:438 +msgid "" +"If enabled, your status will be changed automatically to \"Away-Idle\" when " +"you're not using the computer for a few minutes. If this option is not " +"available, KMess was built without support for this feature." +msgstr "" +"若開啟此選項,當您未使用電腦數分鐘後,會自動將您的狀態切換為「離開─閒置」。若" +"此選項無法選取,則表示 KMess 未將此功能支援編譯進來。" + +#. i18n: file: settings/accountpage.ui:497 +#. i18n: ectx: property (text), widget (QCheckBox, useIdleTimerCheckBox_) +#: rc.cpp:441 +msgid "Change status to \"&Idle\" when inactive" +msgstr "當不活動時,將狀態改變為「閒置」(&I)" + +#. i18n: file: settings/accountpage.ui:528 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel1_) +#. i18n: file: settings/accountpage.ui:547 +#. i18n: ectx: property (whatsThis), widget (QSpinBox, idleTimeSpinBox_) +#. i18n: file: settings/accountpage.ui:554 +#. i18n: ectx: property (whatsThis), widget (QLabel, idleLabel2_) +#: rc.cpp:447 rc.cpp:453 rc.cpp:456 +msgid "" +"Controls the number of minutes before KMess changes the status to \"Away-Idle" +"\"." +msgstr "控制 KMess 經過多久後會轉變狀態為「離開─閒置」" + +#. i18n: file: settings/accountpage.ui:531 +#. i18n: ectx: property (text), widget (QLabel, idleLabel1_) +#: rc.cpp:450 +msgid "Become idle after" +msgstr "多久之後變為閒置狀態:" + +#. i18n: file: settings/accountpage.ui:557 +#. i18n: ectx: property (text), widget (QLabel, idleLabel2_) +#: rc.cpp:459 +msgid "minutes" +msgstr "分鐘" + +#. i18n: file: settings/accountpage.ui:591 +#. i18n: ectx: property (toolTip), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:462 +msgid "" +"This happens because KMess was built without support for the \"XScreenSaver" +"\" Xorg extension, which is used to detect user activity.\n" +"Refer to your packaging team for more details." +msgstr "" +"KMess 編譯時並未加入 \"XScreenSaver\" 的 Xorg 延伸功能,此功能是用於偵測使用" +"者活動用的。\n" +"詳情請詢問您的套件供應商。" + +#. i18n: file: settings/accountpage.ui:594 +#. i18n: ectx: property (text), widget (QLabel, needXScreensaverLabel_) +#: rc.cpp:466 +msgid "Cannot enable auto idle: KMess was built without inactivity detection." +msgstr "無法啟動自動閒置功能:KMess 編譯時未加入偵測活動功能。" + +#. i18n: file: settings/accountpage.ui:620 +#. i18n: ectx: property (text), widget (QCheckBox, hideNotificationsWhenBusyCheckBox_) +#: rc.cpp:469 #, fuzzy +msgid "&Hide notifications when my status is set to \"Busy\"" +msgstr "當我的狀態設定為忙碌時,隱藏所有通知(&H)" + +#. i18n: file: settings/accountsmanagerpage.ui:25 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:472 msgid "Saved accounts:" -msgstr "帳號" +msgstr "已儲存帳號:" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 75 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 135 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 170 -#: rc.cpp:334 rc.cpp:641 rc.cpp:653 -msgid "Click" -msgstr "點選" +#. i18n: file: settings/accountsmanagerpage.ui:75 +#. i18n: ectx: property (toolTip), widget (QPushButton, addAccountButton_) +#: rc.cpp:475 +msgid "" +"Click here to create a new KMess account for an email already associated to " +"an MSN account" +msgstr "" +"點擊此處可用您現有已註冊為 MSN 帳號的電子郵件地址建立一個新的 KMess 帳號" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 78 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 138 -#: rc.cpp:337 rc.cpp:644 -msgid "Click here to add a new customized emoticons to send to your contacts." -msgstr "點選這裡來加入一個新的自訂表情來傳送給你的連絡人" +#. i18n: file: settings/accountsmanagerpage.ui:78 +#. i18n: ectx: property (text), widget (QPushButton, addAccountButton_) +#: rc.cpp:478 +msgid "&Add Account..." +msgstr "新增帳號(&A)..." -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 81 -#: rc.cpp:340 +#. i18n: file: settings/accountsmanagerpage.ui:91 +#. i18n: ectx: property (toolTip), widget (QPushButton, configureAccountButton_) +#: rc.cpp:484 #, fuzzy -msgid "&Add account..." -msgstr "帳號" +msgid "Select an account and click here to modify it" +msgstr "請選擇一個帳號,並點擊此處以刪除。" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 94 -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 189 -#: rc.cpp:346 rc.cpp:355 rc.cpp:665 -msgid "Select an emoticon and click here to delete it." -msgstr "選擇一個表情並點選這裡來刪除它。" - -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 97 -#: rc.cpp:349 chat/chatwindow.cpp:565 +#. i18n: file: settings/accountsmanagerpage.ui:94 +#. i18n: ectx: property (text), widget (QPushButton, configureAccountButton_) +#: rc.cpp:487 msgid "&Edit" -msgstr "" +msgstr "編輯(&E)" -#. i18n: tag string -#. i18n: file ./settings/accountsmanagerpage.ui line 113 -#: rc.cpp:358 -#, fuzzy +#. i18n: file: settings/accountsmanagerpage.ui:107 +#. i18n: ectx: property (toolTip), widget (QPushButton, removeAccountButton_) +#: rc.cpp:493 +msgid "Select an account and click here to delete it" +msgstr "請選擇一個帳號,並點擊此處以刪除。" + +#. i18n: file: settings/accountsmanagerpage.ui:110 +#. i18n: ectx: property (text), widget (QPushButton, removeAccountButton_) +#: rc.cpp:496 msgid "&Remove" -msgstr "被移除" +msgstr "移除(&R)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 31 -#: rc.cpp:364 -#, fuzzy -msgid "Popup Notifications" -msgstr "彈出示提示" +#. i18n: file: settings/chatloggingpage.ui:16 +#. i18n: ectx: property (toolTip), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:502 +msgid "Enable this check box to save your chats for later viewing" +msgstr "勾選此選項以儲存您的聊天紀錄,稍後可以檢視" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 37 -#: rc.cpp:367 -#, fuzzy -msgid "Contact Events" -msgstr "聯絡人" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 43 -#: rc.cpp:370 -msgid "Show notifications when your contacts:" -msgstr "顯示通知,當你的連絡人:" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 52 -#: rc.cpp:373 +#. i18n: file: settings/chatloggingpage.ui:22 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:505 msgid "" -"If enabled, a popup message is shown when one of your contacts connects to " -"MSN." -msgstr "如果開啟,當有聯絡人連上 MSN 時,彈出訊息會顯示。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 55 -#: rc.cpp:376 -#, fuzzy -msgid "&Go online" -msgstr "離線(&f)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 68 -#: rc.cpp:382 -msgid "" -"If enabled, a popup message is shown when one of your contacts starts a " -"conversation with you." -msgstr "如果開啟,當有聯絡人與你開始交談時,彈出訊息會顯示。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 71 -#: rc.cpp:385 -msgid "Start a &chat with you" -msgstr "與你開始交談(&c)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 84 -#: rc.cpp:391 -msgid "" -"If enabled, a popup message is shown every time one of your contacts sends " -"you a message." -msgstr "如果開啟,每當有聯絡人傳送訊息給你時,彈出訊息會顯示。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 87 -#: rc.cpp:394 -msgid "S&end you a message" -msgstr "傳送給你一個訊息(&e)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 97 -#: rc.cpp:400 -msgid "" -"If enabled, a popup message is also shown when your contacts change their " -"MSN status." -msgstr "如果開啟,當有聯絡人改變狀態時,彈出訊息會顯示。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 100 -#: rc.cpp:403 -msgid "Change their &status" -msgstr "改變他們的狀態(&s)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 110 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 166 -#: rc.cpp:409 rc.cpp:427 -msgid "" -"If enabled, a popup message is also shown when one of your contacts goes " -"offline." -msgstr "如果開啟,當有聯絡人離線時,彈出訊息也會顯示。" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 113 -#: rc.cpp:412 -msgid "Go o&ffline" -msgstr "離線(&f)" - -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 125 -#: rc.cpp:418 -msgid "&Hide notifications when my status is set to Busy" +"

If you enable chat logging, every chat you have will be saved in a " +"certain place (which can be specified below).

\n" +"

The saved chats will allow you to find something in your old discussions, " +"like a link, or you may use them to remember what you did say in a certain " +"occasion to someone.

\n" +"

They may also pose some privacy issues though, because unauthorized " +"people who use your account may read your chat logs.

\n" +"

Be sure to keep this option disabled on publicly accessible computers!" +"

" msgstr "" +"

若您開啟聊天紀錄功能,每次您的聊天內容都會儲存在一個特定的地方(您可" +"以在下方指定)。

\n" +"

儲存的聊天內容可以讓您在過去的討論中尋找東西,或是紀錄您在特定狀況下對某人" +"說了什麼話。

\n" +"

不過這樣做也可能產生一些隱私上的問題,因為某個未經允許就使用您帳號的人也可" +"以看到這些內容。

\n" +"

請確定在公用電腦中關閉此選項!

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 151 -#: rc.cpp:421 -#, fuzzy -msgid "Email Events" -msgstr "電子郵件位址" +#. i18n: file: settings/chatloggingpage.ui:25 +#. i18n: ectx: property (text), widget (QCheckBox, logChatsCheckBox_) +#: rc.cpp:511 +msgid "Enable chat logging" +msgstr "開啟聊天紀錄" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 157 -#: rc.cpp:424 -#, fuzzy -msgid "Show notifications when email is received:" -msgstr "當電子郵件被接收至 \"其他資料夾\" 時,顯示通知" +#. i18n: file: settings/chatloggingpage.ui:35 +#. i18n: ectx: property (toolTip), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:514 +msgid "KMess can also save your chats as HTML files, and keep them organized " +msgstr "KMess 可以將您的聊天內容存成 HTML 檔。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 169 -#: rc.cpp:430 -msgid "In the Inbox" -msgstr "" +#. i18n: file: settings/chatloggingpage.ui:38 +#. i18n: ectx: property (title), widget (QGroupBox, saveChatsToFileCheckBox_) +#: rc.cpp:517 +msgid "Save chats to file" +msgstr "將聊天內容存到檔案" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 182 -#: rc.cpp:436 +#. i18n: file: settings/chatloggingpage.ui:50 +#. i18n: ectx: property (toolTip), widget (QLabel, label_2) +#: rc.cpp:520 +msgid "With this option, you can choose how KMess will save your chats" +msgstr "在此選項,您可以決定如何儲存您的聊天紀錄。" + +#. i18n: file: settings/chatloggingpage.ui:53 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:523 +msgid "File format used for saving:" +msgstr "儲存的檔案格式:" + +#. i18n: file: settings/chatloggingpage.ui:85 +#. i18n: ectx: property (whatsThis), widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:526 msgid "" -"If enabled, a popup message also appears when e-mail is received in other " -"folders. This option is only available for Hotmail accounts." +"\n" +"

The file format you use is important.

\n" +"

HTML chat logs can be opened in any web browser, but they usually cannot " +"be displayed correctly on other computers.

\n" +"

Text files, however, can be perfectly read everywhere; but they will not " +"contain any text formatting, display pictures, or emoticons.

\n" +"" msgstr "" -"如果開啟,當 e-mail 收入其他資料夾時,會顯示彈出氣泡。這個選項只有使用 " -"Hotmail 帳號才能作用。" +"\n" +"

您使用的檔案格式是很重要的。

\n" +"

HTML 格式的紀錄檔可以在任何瀏覽器中開啟,但通常在其他電腦上可能無法正確顯" +"示。

\n" +"

相對的,文字檔可以在任何地方讀取,但本身沒有排版、顯示圖片與表情符號等功" +"能。

\n" +"" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 185 -#: rc.cpp:439 -msgid "In other folders" +#. i18n: file: settings/chatloggingpage.ui:89 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:533 +msgid "Web Pages (HTML)" +msgstr "網頁格式(HTML)" + +#. i18n: file: settings/chatloggingpage.ui:94 +#. i18n: ectx: property (text), item, widget (QComboBox, fileFormatComboBox_) +#: rc.cpp:536 +msgid "Plain Text" +msgstr "純文字" + +#. i18n: file: settings/chatloggingpage.ui:133 +#. i18n: ectx: property (toolTip), widget (QLabel, label) +#: rc.cpp:539 +msgid "" +"These options allow you to choose how KMess will organize your logged chats " +"within the directory specified below." +msgstr "這些選項讓您選擇 KMess 要如何存放您的聊天紀錄。" + +#. i18n: file: settings/chatloggingpage.ui:136 +#. i18n: ectx: property (whatsThis), widget (QLabel, label) +#: rc.cpp:542 +msgid "" +"Depending on which option you choose here, KMess will create some " +"directories to help you keep your chat logs organized. Use the \"What's This?" +"\" feature on a specific option for more details." msgstr "" +"根據您選取的選項,KMess 會建立目錄來存放您的聊天紀錄。詳情請參考每個選項的" +"「這是什麼?」功能。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 215 -#: rc.cpp:442 -msgid "Controls the number of seconds before popups are hidden." -msgstr "控制彈出氣泡後至隱藏前的時間。" +#. i18n: file: settings/chatloggingpage.ui:139 +#. i18n: ectx: property (text), widget (QLabel, label) +#: rc.cpp:545 +msgid "Separate logged chats by:" +msgstr "聊天紀錄分組依據:" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 218 -#: rc.cpp:445 -msgid "Hide popups after" -msgstr "隱藏彈出氣泡,在多久之後:" +#. i18n: file: settings/chatloggingpage.ui:155 +#. i18n: ectx: property (toolTip), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:548 +msgid "Create a directory to organize chats by year" +msgstr "以年份為依據建立目錄存放紀錄" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 234 -#: rc.cpp:448 -msgid "seconds" -msgstr "秒" +#. i18n: file: settings/chatloggingpage.ui:162 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:551 +msgid "" +"This option tells KMess to divide your logged chats by year only.\n" +"You will find directories for each year of logged chatting; those will " +"contain all of that year's chat logs, grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/date-and-contact-name.html" +msgstr "" +"這個選項讓 KMess 將您的聊天紀錄依年份來分組。\n" +"也就是說,您的存放目錄下,每一年會開一個目錄,裡面是您整年份的聊天紀錄。\n" +"\n" +"2009 年 1 月 1 日的聊天紀錄會存放在:\n" +"<您指定的目錄>/2009/<日期與聯絡人名稱>.html" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 287 -#: rc.cpp:451 +#. i18n: file: settings/chatloggingpage.ui:165 +#. i18n: ectx: property (text), widget (QRadioButton, yearRadioButton_) +#: rc.cpp:558 +msgid "Year" +msgstr "年" + +#. i18n: file: settings/chatloggingpage.ui:181 +#. i18n: ectx: property (toolTip), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:561 +msgid "Create directories to organize chats by year then by month" +msgstr "以年份與月份為依據建立目錄存放紀錄 " + +#. i18n: file: settings/chatloggingpage.ui:188 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:564 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, you will find all of that month's chat logs grouped together.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/date-and-contact-name.html" +msgstr "" +"這個選項讓 KMess 將您的聊天紀錄依年份與月份來分組。\n" +"也就是說,您的存放目錄下,每一年會開一個目錄,裡面再依每個月份開一個目錄,目" +"錄內則是您一個月份的聊天紀錄。\n" +"\n" +"2009 年 1 月 1 日的聊天紀錄會存放在:\n" +"<您指定的目錄>/2009/01/<日期與聯絡人名稱>.html " + +#. i18n: file: settings/chatloggingpage.ui:191 +#. i18n: ectx: property (text), widget (QRadioButton, monthRadioButton_) +#: rc.cpp:571 +msgid "Year then Month" +msgstr "依年份與月份" + +#. i18n: file: settings/chatloggingpage.ui:204 +#. i18n: ectx: property (toolTip), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:574 +msgid "Create directories to organize chats by year, by month, then by day" +msgstr "以每一天為依據建立目錄存放紀錄" + +#. i18n: file: settings/chatloggingpage.ui:211 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:577 +msgid "" +"This option tells KMess to divide your logged chats by year, then by month, " +"then again by day.\n" +"You will find some directories for each year of logged chatting. Each will " +"contain a directory for each month where chats have been logged; and within " +"those, the chats will be further divided in a directory for each day.\n" +"\n" +"A chat had on November 29, 2008 will be saved in your logged chats directory " +"as:\n" +"/2008/11/29/date-and-contact-name.html" +msgstr "" +"這個選項讓 KMess 將您的聊天紀錄依每天的日期來分組。\n" +"也就是說,您的存放目錄下,每一年會開一個目錄,裡面再依每個月份開一個目錄,裡" +"面則是每一天都有一個目錄,目錄內則是您一整天的聊天紀錄。\n" +"\n" +"2009 年 1 月 1 日的聊天紀錄會存放在:\n" +"<您指定的目錄>/2009/01//01/<日期與聯絡人名稱>.html " + +#. i18n: file: settings/chatloggingpage.ui:214 +#. i18n: ectx: property (text), widget (QRadioButton, dayRadioButton_) +#: rc.cpp:584 +msgid "Year, Month then Day" +msgstr "依每一天" + +#. i18n: file: settings/chatloggingpage.ui:224 +#. i18n: ectx: property (toolTip), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:587 +msgid "Place all saved chats directly in the directory specified below" +msgstr "將所有儲存的聊天內容紀錄檔都放到以下指定的目錄中" + +#. i18n: file: settings/chatloggingpage.ui:227 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:590 +msgid "" +"This option tells KMess to save all your chat logs in the same folders, " +"without organizing them at all." +msgstr "這個選項讓 KMess 將您的聊天紀錄不分組,通通放在同一個目錄之下。" + +#. i18n: file: settings/chatloggingpage.ui:230 +#. i18n: ectx: property (text), widget (QRadioButton, singleDirectoryRadioButton_) +#: rc.cpp:593 +msgid "Do not organize files" +msgstr "不分組" + +#. i18n: file: settings/chatloggingpage.ui:273 +#. i18n: ectx: property (toolTip), widget (QToolButton, chatSavePathButton_) +#: rc.cpp:596 +msgid "Click here to choose a directory" +msgstr "點擊這裡選取目錄" + +#. i18n: file: settings/chatloggingpage.ui:302 +#. i18n: ectx: property (toolTip), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:602 +msgid "The directory where all your chat logs will be saved" +msgstr "您要儲存聊天紀錄的目錄" + +#. i18n: file: settings/chatloggingpage.ui:305 +#. i18n: ectx: property (whatsThis), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:605 +msgid "" +"Choose the directory on your system where you'd like to save the chat logs." +msgstr "請選擇您要將聊天紀錄保存在哪個目錄中。" + +#. i18n: file: settings/chatloggingpage.ui:308 +#. i18n: ectx: property (text), widget (QLabel, chatSavePathLabel_) +#: rc.cpp:608 +msgid "Save logged chats in this directory:" +msgstr "將聊天內容存在此目錄:" + +#. i18n: file: settings/chatstylepage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab_4) +#: rc.cpp:611 +msgid "St&yle" +msgstr "樣式(&Y)" + +#. i18n: file: settings/chatstylepage.ui:38 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1) +#. i18n: file: settings/chatstylepage.ui:637 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel1_2) +#: rc.cpp:614 rc.cpp:711 +msgid "Allows you to change the theme KMess uses to display all chat messages." +msgstr "讓您可以變更 KMess 用於顯示聊天訊息的佈景主題。" + +#. i18n: file: settings/chatstylepage.ui:41 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:617 +msgid "&Chat style:" +msgstr "聊天樣式(&C):" + +#. i18n: file: settings/chatstylepage.ui:64 +#. i18n: ectx: property (text), widget (KPushButton, newStylesButton_) +#: rc.cpp:620 +msgid "Get &New Styles..." +msgstr "取得新樣式(&N)" + +#. i18n: file: settings/chatstylepage.ui:120 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:623 +msgid "Chat Settings" +msgstr "聊天設定" + +#. i18n: file: settings/chatstylepage.ui:128 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:626 #, fuzzy -msgid "Other Alerts" -msgstr "警告" +msgid "Enables the appearance of emoticons in the chat window." +msgstr "在聊天室中開啟顯示表情符號。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 293 -#: rc.cpp:454 -#, fuzzy -msgid "&Show winks from contacts" -msgstr "顯示離線的聯絡人(&O)" +#. i18n: file: settings/chatstylepage.ui:131 +#. i18n: ectx: property (text), widget (QCheckBox, useEmoticonsCheckBox_) +#: rc.cpp:629 +msgid "&Show emoticons" +msgstr "顯示表情符號(&S)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 301 -#: rc.cpp:457 +#. i18n: file: settings/chatstylepage.ui:243 +#. i18n: ectx: property (text), widget (QCheckBox, showWinksCheckBox_) +#: rc.cpp:635 +msgid "Show &winks" +msgstr "顯示動畫快遞(&W)" + +#. i18n: file: settings/chatstylepage.ui:250 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:638 +msgid "" +"This option enables the grouping of messages from the same contact. Whenever " +"a contact sends you multiple messages, KMess will group those messages to " +"one single message. The exact appearance depends on the chosen chat style." +msgstr "" +"此選項會將來自同一個聯絡人的訊息集合在一起。當同一個聯絡人傳送多個訊息給您的" +"時候,KMess 會將它組合成單一的訊息。實際顯示出來的樣子會依聊天室樣式不同而不" +"同。" + +#. i18n: file: settings/chatstylepage.ui:253 +#. i18n: ectx: property (text), widget (QCheckBox, groupFollowupCheckbox_) +#: rc.cpp:641 +msgid "&Group follow-up messages from the same contact" +msgstr "集合從同一個聯絡人來的訊息(&G)" + +#. i18n: file: settings/chatstylepage.ui:279 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:647 +msgid "Enables the appearance of a timestamp in each chat message." +msgstr "在每個聊天訊息都顯示時間。" + +#. i18n: file: settings/chatstylepage.ui:282 +#. i18n: ectx: property (text), widget (QCheckBox, showTimeCheckbox_) +#: rc.cpp:650 +msgid "S&how timestamp" +msgstr "顯示訊息時間(&H)" + +#. i18n: file: settings/chatstylepage.ui:313 +#. i18n: ectx: property (text), widget (QCheckBox, showDateCheckbox_) +#: rc.cpp:656 +msgid "Show &date" +msgstr "顯示日期(&D)" + +#. i18n: file: settings/chatstylepage.ui:343 +#. i18n: ectx: property (text), widget (QCheckBox, showSecondsCheckbox_) +#: rc.cpp:659 +msgid "Show s&econds" +msgstr "顯示秒(&E)" + +#. i18n: file: settings/chatstylepage.ui:372 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:662 +msgid "&Text" +msgstr "文字(&T)" + +#. i18n: file: settings/chatstylepage.ui:384 +#. i18n: ectx: property (whatsThis), widget (QLabel, textLabel2) +#: rc.cpp:665 +msgid "This is the font style and color used in your chat messages." +msgstr "這是您聊天訊息使用的字型樣式與顏色。" + +#. i18n: file: settings/chatstylepage.ui:387 +#. i18n: ectx: property (text), widget (QLabel, textLabel2) +#: rc.cpp:668 +msgid "Your &message font:" +msgstr "您的訊息字型(&M):" + +#. i18n: file: settings/chatstylepage.ui:468 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:671 +msgid "" +"Allows to override the font style and color of your contacts' messages with " +"a the chosen font style and color below." +msgstr "" +"允許您使用底下選取的字型樣式與顏色來覆蓋聯絡人訊息使用的字型樣式與顏色。" + +#. i18n: file: settings/chatstylepage.ui:471 +#. i18n: ectx: property (text), widget (QCheckBox, useContactFontCheckBox_) +#: rc.cpp:674 +msgid "&Force messages from your contacts to use this font:" +msgstr "強制聯絡人的訊息使用此字型(&F):" + +#. i18n: file: settings/chatstylepage.ui:546 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_4) +#: rc.cpp:677 +msgid "Chat Window Formatting" +msgstr "聊天視窗格式" + +#. i18n: file: settings/chatstylepage.ui:552 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:680 +msgid "" +"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " +"causes those words to appear in a bold, italic or underlined font " +"respectively." +msgstr "" +"開啟使用字型效果。輸入時用星號夾住(如 *bold*)、斜線夾住(如 /italic/),與" +"用底線夾住(如 _underline_),被夾住的文字內容可呈現粗體、斜體與底線的效果。" + +#. i18n: file: settings/chatstylepage.ui:555 +#. i18n: ectx: property (text), widget (QCheckBox, useFontEffectsCheckBox_) +#: rc.cpp:683 +msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" +msgstr "在訊息中使用字體效果,如*粗體*,/斜體/,_底線_ 等(&E)" + +#. i18n: file: settings/chatstylepage.ui:565 +#. i18n: ectx: property (text), widget (QCheckBox, enableChatFormattingCheckBox_) +#: rc.cpp:689 +msgid "Enable MSN Plus formatting" +msgstr "開啟 MSN 加強格式化" + +#. i18n: file: settings/chatstylepage.ui:589 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:692 +msgid "&Behavior" +msgstr "行為(&B)" + +#. i18n: file: settings/chatstylepage.ui:596 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:695 msgid "" "

When contacts like to have your attention they can send a nudge. By " "default the chat window shakes when a nudge is received or sent. Disable " @@ -827,2168 +1419,2883 @@ msgid "" "Contacts may send multiple nudges at once, but KMess only shakes the chat " "window with the first nudge.

" msgstr "" -"

當聯絡人想要引起你的注意時,他們可以送出來電振動。預設中當收到或送出來" -"電振動時,視窗會搖晃。當搖晃效果太惱人時,可關閉此選項。

\n" -"

當此選項開啟時,KMess 依然限制搖晃效果。聯絡人可能會一次送出許多個來電振" +"

當聯絡人要引起您的注意時,他們可以對您送出來電振動。預設收到或送出來電" +"振動時,聊天視窗會搖晃。關閉此選項可以關閉搖晃的效果。

\n" +"

開啟此選項時,KMess 依然會限制搖晃的效果。聯絡人可能會一次送出許多個來電振" "動,但是 KMess 只會搖晃視窗一次。

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 304 -#: rc.cpp:461 +#. i18n: file: settings/chatstylepage.ui:599 +#. i18n: ectx: property (text), widget (QCheckBox, shakeNudgeCheckBox_) +#: rc.cpp:699 msgid "Shake the chat &window when a nudge is received or sent" -msgstr "當送出或接收來電振動時搖晃視窗(&w)" +msgstr "當收到或送出來電振動時搖晃視窗(&W)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 314 -#: rc.cpp:467 +#. i18n: file: settings/chatstylepage.ui:609 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:705 +#, fuzzy msgid "" -"If enabled, a popup is shown when e-mail is received in your inbox. The " -"number of unread e-mail messages is shown above the contact list. This " -"option is only available for Hotmail accounts." +"

When this option is enabled, you will see your own display picture in " +"the contacts panel, along with the pictures of the contacts in that chat." msgstr "" -"如果開啟,當接收到 e-mail 時會顯示彈出氣泡。未讀郵件的數量會顯示在聯絡人列表" -"之上。這個選項只有使用 Hotmail 帳號才能作用。" +"

開啟此選項的話,您會在聊天視窗中的聯絡人資訊中同時看到聯絡人與自己的圖" +"片。

" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 317 -#: rc.cpp:470 -msgid "Display a count of unread mail" +#. i18n: file: settings/chatstylepage.ui:612 +#. i18n: ectx: property (text), widget (QCheckBox, displayChatUserPictureCheckBox_) +#: rc.cpp:708 +#, fuzzy +msgid "Display your own &display picture in the chat window" +msgstr "在聊天視窗中也顯示您自己的圖片(&D)" + +#. i18n: file: settings/chatstylepage.ui:640 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:714 +msgid "G&roup chats in the same window:" +msgstr "將聊天集合在同一個視窗(&R):" + +#. i18n: file: settings/chatstylepage.ui:660 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:717 +msgid "Always" +msgstr "總是" + +#. i18n: file: settings/chatstylepage.ui:665 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:720 +msgid "For contacts in the same group" +msgstr "針對同一個群組中的聯絡人" + +#. i18n: file: settings/chatstylepage.ui:670 +#. i18n: ectx: property (text), item, widget (QComboBox, tabbedChatMode_) +#: rc.cpp:723 +msgid "Never" +msgstr "絕不" + +#. i18n: file: settings/contactlistpage.ui:17 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2) +#: rc.cpp:726 +msgid "Display Options" +msgstr "顯示選項" + +#. i18n: file: settings/contactlistpage.ui:23 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:729 +msgid "" +"If enabled, a popup is shown when email is received in your inbox. The " +"number of unread email messages is shown above the contact list. This option " +"is only available for Hotmail accounts." msgstr "" +"若開啟此選項,則當您的電子郵件地址收到一封新郵件時,會彈出視窗來提醒。在聯絡" +"人清單上方會顯示有多少未讀郵件。此選項只對 Hotmail 帳號有作用。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 324 -#: rc.cpp:473 +#. i18n: file: settings/contactlistpage.ui:26 +#. i18n: ectx: property (text), widget (QCheckBox, showEmailInfoCheckBox_) +#: rc.cpp:732 +msgid "Display a count of &unread mail" +msgstr "顯示未讀郵件數量(&U)" + +#. i18n: file: settings/contactlistpage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, nowListeningCheckBox_) +#. i18n: file: settings/contactlistpage.ui:46 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:735 rc.cpp:744 msgid "" "If enabled, KMess informs contacts what you're listening to. This " -"information is retrieved from the currently active audio player applications." +"information is retrieved from the currently active audio player." msgstr "" -"如果開啟,KMess 提示聯絡人你正在聽什麼這個訊息是從正在播放的音訊軟體中取回" -"的。" +"若開啟此選項,KMess 會將您正在收聽的音樂顯示給其他聯絡人看。此資訊會從目前使" +"用的音樂播放器取得。" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 327 -#: rc.cpp:476 -#, fuzzy -msgid "Inform contacts w&hich song I am listening to" -msgstr "提示聯絡人我正在聽什麼(&h)" +#. i18n: file: settings/contactlistpage.ui:36 +#. i18n: ectx: property (text), widget (QCheckBox, nowListeningCheckBox_) +#: rc.cpp:738 +msgid "Show contacts w&hich song I am listening to" +msgstr "顯示「正在收聽」(&H)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 353 -#: rc.cpp:482 -#, fuzzy -msgid "" -"If enabled, your status will be changed automatically to \"Away-Idle\" when " -"you're not using the computer for a few minutes. If this option is not " -"available, KMess was built without support for this feature." -msgstr "" -"如果開啟,當你幾分鐘內都沒有使用電腦,你的狀態將會自動變為 \"離開-發呆\"。" +#. i18n: file: settings/contactlistpage.ui:49 +#. i18n: ectx: property (text), widget (QCheckBox, showBirdCheckBox_) +#: rc.cpp:747 +msgid "Show background &image" +msgstr "顯示背景影像(&I)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 356 -#: rc.cpp:485 -msgid "Change status to \"Awa&y-Idle\" when inactive" -msgstr "在不活動時,改變狀態為\"離開-發呆(&y)\"" +#. i18n: file: settings/contactlistpage.ui:62 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:753 +msgid "List Formatting" +msgstr "清單格式" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 384 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 400 -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 407 -#: rc.cpp:491 rc.cpp:497 rc.cpp:500 -msgid "" -"Controls the number of minutes before KMess changes the status to \"Away-Idle" -"\"." -msgstr "控制 KMess 轉變狀態為 \"離開-發呆\" 前的分鐘數" +#. i18n: file: settings/contactlistpage.ui:68 +#. i18n: ectx: property (text), widget (QCheckBox, enableListFormattingCheckBox_) +#: rc.cpp:756 +msgid "Enable MSN &Plus formatting" +msgstr "開啟 MSN 加強格式化(&P)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 387 -#: rc.cpp:494 -msgid "Become idle after" -msgstr "改變為發呆狀態,在多久之後:" +#. i18n: file: settings/contactlistpage.ui:75 +#. i18n: ectx: property (text), widget (QCheckBox, showContactEmailCheckBox_) +#: rc.cpp:759 +msgid "Show the &email of contacts instead of the friendly name" +msgstr "顯示聯絡人的電子郵件地址而不是暱稱(&E)" -#. i18n: tag string -#. i18n: file ./settings/alertspage.ui line 410 -#: rc.cpp:503 -msgid "minutes" -msgstr "分鐘" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 25 -#: rc.cpp:506 -msgid "If enabled, chat conversations will be saved in a specified directory." -msgstr "如果開啟,交談紀錄將會被保存在一個特定的資料夾裡。" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 28 -#: rc.cpp:509 -msgid "Log &all chats" -msgstr "紀錄所有交談內容(&a)" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 61 -#: rc.cpp:512 -msgid "" -"Choose the directory on your system where you'd like to save the chat logs." -msgstr "選擇一個你想要保存交談紀錄的資料夾。" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 64 -#: rc.cpp:515 -#, fuzzy -msgid "Save chat files in this directory:" -msgstr "儲存聊天內容至上一層目錄" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 97 -#: rc.cpp:521 -msgid "" -"KMess automatically creates subdirectories when you choose the organize the " -"chat folder by year, month or day." -msgstr "當你選擇「以年、月、日組織交談紀錄」選項時,KMess 會自動建立次資料夾。" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 100 -#: rc.cpp:524 -msgid "Log Structure" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 106 -#: rc.cpp:527 -msgid "Separate saved chats by:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 119 -#: rc.cpp:530 -msgid "Year" -msgstr "年" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 135 -#: rc.cpp:533 -msgid "Month" -msgstr "月" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 148 -#: rc.cpp:536 -msgid "Day" -msgstr "日" - -#. i18n: tag string -#. i18n: file ./settings/chatloggingpage.ui line 164 -#: rc.cpp:539 -#, fuzzy -msgid "Save directly in the specified directory" -msgstr "儲存所有聊天內容至上一層目錄" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 34 -#: rc.cpp:542 -msgid "St&yle" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 45 -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 265 -#: rc.cpp:545 rc.cpp:581 -msgid "Allows you to change the theme KMess uses to display all chat messages." -msgstr "允許你改變 KMess 用來顯示交談訊息的佈置主景。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 48 -#: rc.cpp:548 -#, fuzzy -msgid "&Chat style:" -msgstr "交談形式:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 114 -#: rc.cpp:551 -#, fuzzy -msgid "Chat Settings" -msgstr "設定" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 122 -#: rc.cpp:554 -msgid "Enables the appearance of emoticons in the chat conversations." -msgstr "可以在交談內容中使用表情符號。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 125 -#: rc.cpp:557 -#, fuzzy -msgid "&Show emoticons" -msgstr "顯示表情符號(&E)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 237 -#: rc.cpp:563 -msgid "Enables the appearance of a timestamp in each chat message." -msgstr "可以在交談訊息中顯示時間標記。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 240 -#: rc.cpp:566 -#, fuzzy -msgid "S&how messages time" -msgstr "在聊天訊息中顯示時間(&h)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 250 -#: rc.cpp:572 -msgid "" -"This option enables grouping of messages from the same contact. When the " -"contact types uses multiple messages to explain something, KMess groups " -"those messages as one single message. The exact appearance depends on the " -"chosen chat style." -msgstr "" -"這個功能能夠讓同一個聯絡人傳來的訊息集合在一起。當聯絡人傳送多個訊息來解釋事" -"情時, KMess 聚集這些訊息成一單個訊息。呈現的結果則依形式的不同而不同。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 253 -#: rc.cpp:575 -msgid "&Group follow-up messages from the same contact" -msgstr "集合從同一個聯絡人來的訊息(&G)" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 268 -#: rc.cpp:584 -msgid "G&roup chats in the same window:" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 288 -#: rc.cpp:587 -#, fuzzy -msgid "Always" -msgstr "離開" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 293 -#: rc.cpp:590 -#, fuzzy -msgid "For contacts in the same group" -msgstr "您的聯絡人名單有太多的群組" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 298 -#: rc.cpp:593 -#, fuzzy -msgid "Never" -msgstr "厭惡" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 346 -#: rc.cpp:596 -msgid "&Text" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 358 -#: rc.cpp:599 -msgid "This is the font style and color used in your chat messages." -msgstr "這是你交談訊息的字型、顏色和形式。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 361 -#: rc.cpp:602 -#, fuzzy -msgid "Your &message font:" -msgstr "你的訊息字型:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 442 -#: rc.cpp:605 -msgid "" -"Allows to override the font style and color of your contacts' messages with " -"a the chosen font style and color below." -msgstr "" -"允許以下列中一個已選的字型、形式和顏色來覆蓋你交談紀錄中的字型、形式和顏色。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 445 -#: rc.cpp:608 -#, fuzzy -msgid "&Force contacts' messages to use this font:" -msgstr "強制聯絡人的訊息使用此字型:" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 520 -#: rc.cpp:611 -msgid "" -"Enables the use of font effects. Typing *bold*, /italic/, and _underline_ " -"causes those words appear in a bold, italics or underlined font respectively." -msgstr "" -"可以使用字型效果。輸入 *bold*,/italic/ 和 _underline_,可使字呈現粗體、斜" -"體、底線字型。" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 523 -#: rc.cpp:614 -#, fuzzy -msgid "Use font &effects in messages, like *bold*, /italic/, and _underline_" -msgstr "使用字體效果(&e),如: *粗體* 、 /斜體/ 、 _底線_" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 549 -#: rc.cpp:620 -msgid "MSN Plus formatting" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 555 -#: rc.cpp:623 -#, fuzzy -msgid "Enable in the contact list" -msgstr "等候使用者名單" - -#. i18n: tag string -#. i18n: file ./settings/chatstylepage.ui line 562 -#: rc.cpp:626 -msgid "Enable in the chat windows" -msgstr "" - -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 31 -#: rc.cpp:629 +#. i18n: file: settings/emoticonspage.ui:24 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:762 msgid "&Emoticon Themes" msgstr "表情符號主題(&E)" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 43 -#: rc.cpp:632 +#. i18n: file: settings/emoticonspage.ui:36 +#. i18n: ectx: property (text), widget (QLabel, textLabel1) +#: rc.cpp:765 msgid "Available emoticon styles:" -msgstr "可用的表情符號形式" +msgstr "可用的表情符號樣式:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 88 -#: rc.cpp:635 +#. i18n: file: settings/emoticonspage.ui:73 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:768 msgid "&Custom Emoticons" -msgstr "自訂的表情符號(&C)" +msgstr "自訂表情符號(&C)" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 94 -#: rc.cpp:638 +#. i18n: file: settings/emoticonspage.ui:79 +#. i18n: ectx: property (text), widget (QLabel, textLabel1_2) +#: rc.cpp:771 msgid "Custom emoticons for this account:" -msgstr "給這個帳號用的自訂表情符號:" +msgstr "此帳號使用的自訂表情符號:" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 141 -#: rc.cpp:647 -msgid "Add ne&w..." -msgstr "加入新的...(&w)" +#. i18n: file: settings/emoticonspage.ui:156 +#. i18n: ectx: property (toolTip), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:774 +msgid "Click here to add a new custom emoticon" +msgstr "點擊此處以新增自訂表情符號" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 173 -#: rc.cpp:656 -msgid "Click here to rename the selected emoticon." -msgstr "點選這裡來重新命名選擇的表情" +#. i18n: file: settings/emoticonspage.ui:159 +#. i18n: ectx: property (text), widget (QPushButton, addEmoticonButton_) +#: rc.cpp:777 +msgid "Add Ne&w..." +msgstr "新增(&W)..." -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 176 -#: rc.cpp:659 +#. i18n: file: settings/emoticonspage.ui:188 +#. i18n: ectx: property (toolTip), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:783 +msgid "Click here to rename the selected emoticon" +msgstr "點選此處以重新命名選取的表情符號" + +#. i18n: file: settings/emoticonspage.ui:191 +#. i18n: ectx: property (text), widget (QPushButton, renameEmoticonButton_) +#: rc.cpp:786 msgid "Re&name" -msgstr "重新命名(&n)" +msgstr "重新命名(&N)" -#. i18n: tag string -#. i18n: file ./settings/emoticonspage.ui line 192 -#: rc.cpp:668 -msgid "Remo&ve" -msgstr "移除(&v)" - -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 34 -#: rc.cpp:674 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:27 +#. i18n: ectx: attribute (title), widget (QWidget, tab) +#: rc.cpp:801 msgid "Web Browser" -msgstr "枯玫瑰" +msgstr "網頁瀏覽器" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 40 -#: rc.cpp:677 +#. i18n: file: settings/miscellaneouspage.ui:33 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:804 msgid "Choose this option to use the browser used by the rest of KDE." -msgstr "" +msgstr "選擇此選項使用其他 KDE 程式使用的瀏覽器" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 43 -#: rc.cpp:680 +#. i18n: file: settings/miscellaneouspage.ui:36 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEBrowserRadio_) +#: rc.cpp:807 msgid "&Use the KDE default browser" -msgstr "" +msgstr "使用預設瀏覽器(&U)" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 50 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 192 -#: rc.cpp:683 rc.cpp:718 +#. i18n: file: settings/miscellaneouspage.ui:43 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:177 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:810 rc.cpp:845 msgid "Select this option to choose from a list of installed browsers." -msgstr "" +msgstr "選擇其他已安裝瀏覽器" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 53 -#: rc.cpp:686 +#. i18n: file: settings/miscellaneouspage.ui:46 +#. i18n: ectx: property (text), widget (QRadioButton, useListedBrowserRadio_) +#: rc.cpp:813 msgid "&Use an installed browser:" -msgstr "" +msgstr "使用已安裝的瀏覽器(&U):" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 87 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 229 -#: rc.cpp:689 rc.cpp:724 +#. i18n: file: settings/miscellaneouspage.ui:80 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:214 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:816 rc.cpp:851 msgid "Choose this option to enter the path to your favorite browser." -msgstr "" +msgstr "選擇此選項您可以自行輸入您最愛使用的瀏覽器的路徑。" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 90 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 232 -#: rc.cpp:692 rc.cpp:727 +#. i18n: file: settings/miscellaneouspage.ui:83 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomBrowserRadio_) +#. i18n: file: settings/miscellaneouspage.ui:217 +#. i18n: ectx: property (text), widget (QRadioButton, useCustomMailClientRadio_) +#: rc.cpp:819 rc.cpp:854 msgid "&Specify a custom command:" -msgstr "" +msgstr "指定自訂指令(&S):" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 120 -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 262 -#: rc.cpp:696 rc.cpp:731 +#. i18n: file: settings/miscellaneouspage.ui:113 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customBrowserEdit_) +#. i18n: file: settings/miscellaneouspage.ui:247 +#. i18n: ectx: property (whatsThis), widget (QLineEdit, customMailClientEdit_) +#: rc.cpp:823 rc.cpp:858 #, no-c-format msgid "" "Specify the path of a program to use to open links; a '%u' here will be " "replaced with the links' URL." -msgstr "" +msgstr "指定用於開啟連結的程式路徑;'%u' 會被取代為連結的網址。" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 133 -#: rc.cpp:700 +#. i18n: file: settings/miscellaneouspage.ui:126 +#. i18n: ectx: property (text), widget (QLabel, customBrowserInfo_) +#: rc.cpp:827 #, no-c-format msgid "Use '%u' to insert the URL in the command line." -msgstr "" +msgstr "在命令列中用 '%u' 取代網址。" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 166 -#: rc.cpp:703 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:151 +#. i18n: ectx: attribute (title), widget (QWidget, tab_2) +#: rc.cpp:830 msgid "Email Client" -msgstr "電子郵件客戶端軟體" +msgstr "郵件客戶端軟體" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 172 -#: rc.cpp:706 +#. i18n: file: settings/miscellaneouspage.ui:157 +#. i18n: ectx: property (whatsThis), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:833 msgid "" "Check this box to use the Live Mail webmail site when you connect with " "accounts compatible with Live Mail." msgstr "" +"勾選此選項的話,當您使用與 Live Mail 相容的帳號連線時,可以使用 Live Mail 網" +"路郵局。" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 175 -#: rc.cpp:709 -msgid "Use Live Mail if the account supports it" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:160 +#. i18n: ectx: property (text), widget (QCheckBox, useLiveMailCheckbox_) +#: rc.cpp:836 +msgid "Use &Live Mail if the account supports it" +msgstr "若帳號支援則使用 Live Mail(&L)" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 182 -#: rc.cpp:712 +#. i18n: file: settings/miscellaneouspage.ui:167 +#. i18n: ectx: property (whatsThis), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:839 msgid "Choose this option to use the email client used by the rest of KDE." -msgstr "" +msgstr "選取此選項的話,您會使用 KDE 預設的郵件客戶端程式。" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 185 -#: rc.cpp:715 -msgid "&Use the KDE default email client" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:170 +#. i18n: ectx: property (text), widget (QRadioButton, useKDEMailClientRadio_) +#: rc.cpp:842 +msgid "Use the &KDE default email client" +msgstr "使用 KDE 預設的郵件客戶端程式(&K)" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 195 -#: rc.cpp:721 -msgid "&Use an installed email client:" -msgstr "" +#. i18n: file: settings/miscellaneouspage.ui:180 +#. i18n: ectx: property (text), widget (QRadioButton, useListedMailClientRadio_) +#: rc.cpp:848 +msgid "Use an &installed email client:" +msgstr "使用已安裝的郵件客戶端程式(&I):" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 275 -#: rc.cpp:735 +#. i18n: file: settings/miscellaneouspage.ui:260 +#. i18n: ectx: property (text), widget (QLabel, customMailClientInfo_) +#: rc.cpp:862 #, no-c-format msgid "Use '%u' to insert the email address in the command line." -msgstr "" +msgstr "在命令列中,用 '%u' 表示電子郵件地址。" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 308 -#: rc.cpp:738 dialogs/transferwindow.cpp:50 +#. i18n: file: settings/miscellaneouspage.ui:285 +#. i18n: ectx: attribute (title), widget (QWidget, tab_3) +#: rc.cpp:865 dialogs/transferwindow.cpp:51 msgid "File Transfers" msgstr "檔案傳輸" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 317 -#: rc.cpp:741 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:294 +#. i18n: ectx: property (text), widget (QCheckBox, useReceivedFilesDir_) +#: rc.cpp:868 msgid "&Save all received files in one directory:" -msgstr "儲存聊天內容至上一層目錄" +msgstr "將所有接收的檔案儲存在同一個目錄(&S):" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 366 -#: rc.cpp:747 +#. i18n: file: settings/miscellaneouspage.ui:343 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:874 msgid "&Use ports between" -msgstr "" +msgstr "使用連接埠範圍(&U):" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:369 +#. i18n: ectx: property (text), widget (QLabel, label_3) +#: rc.cpp:877 msgid "and" -msgstr "傷心" +msgstr "與" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 -#, fuzzy +#. i18n: file: settings/miscellaneouspage.ui:398 +#. i18n: ectx: property (text), widget (QLabel, label_4) +#: rc.cpp:880 msgid "for file transfers" -msgstr "檔案傳輸" +msgstr "針對檔案傳輸" -#: account.cpp:44 account.cpp:745 -msgid "I'm away from my computer" -msgstr "我正離開電腦" +#. i18n: file: utils/likeback/likebackdialog.ui:48 +#. i18n: ectx: property (text), widget (QLabel, label_2) +#: rc.cpp:883 +msgid "Your comment:" +msgstr "您的意見:" -#: account.cpp:60 -msgid "Your name" -msgstr "你的名稱" - -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 -msgid "you@hotmail.com" -msgstr "你的.Net Passport" - -#: chat/chat.cpp:124 +#. i18n: file: utils/likeback/likebackdialog.ui:65 +#. i18n: ectx: property (html), widget (QTextEdit, m_comment) +#: rc.cpp:886 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." -msgstr "你不能開始這個邀請,因為在這個交談裡有多重的聯絡人" +"\n" +"\n" +"

" +msgstr "" +"\n" +"\n" +"

" -#: chat/chat.cpp:158 +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "您的意見是關於:" + +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "您喜歡的事物" + +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "您不喜歡的事物" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "此應用程式的不合適的行為" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "您想要的新功能" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "指定電子郵件地址以便對方回覆" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "在視窗上顯示回饋按鍵列" + +#: account.cpp:45 account.cpp:736 +msgid "I'm away from my computer" +msgstr "我不在電腦前" + +#: account.cpp:54 +msgid "Your name" +msgstr "您的名稱" + +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 +msgid "you@hotmail.com" +msgstr "you@hotmail.com" + +#: accountsmanager.cpp:388 +msgid "" +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" +"找到一些帳號的密碼存放方式不夠安全。
您要將密碼匯入 KDE 錢包 %1," +"還是保持現有狀態,還是要刪除這些密碼?

注意:若您可以使用 KDE " +"錢包,最好就使用錢包。一般不安全的存放方式,密碼可以在 KMess 設定檔中被讀取" +"到。" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "安全密碼儲存" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "匯入" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "刪除" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "保持" + +#: chat/chat.cpp:119 #, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." +msgstr "當聊天室裡有多個聯絡人時,您不能傳送邀請" + +#: chat/chat.cpp:142 msgid "%1 has joined the chat." -msgstr "%1 已加入交談" +msgstr "%1 已加入聊天室。" -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "交談闲置太久。%1 已離開交談" +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "對話已閒置,%1 已離開交談。" -#: chat/chat.cpp:215 -#, fuzzy +#: chat/chat.cpp:202 +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." -msgstr "%1 已離開交談" +msgstr "%1 已離開交談。" -#: chat/chat.cpp:364 -#, fuzzy +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr "%1 和 %2 - 交談" +msgstr "%1 與 %2" -#: chat/chat.cpp:371 -#, fuzzy +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." -msgstr "%1 ...等 - 交談" +msgstr "%1 等人" -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr " (這個訊息將會被自動傳送)" +msgstr "%1(此訊息為自動回覆之訊息)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 #, fuzzy -msgid "You received a wink from %1." -msgstr "你從 %1 收到一個動畫快遞" - -#: chat/chat.cpp:971 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." -msgstr "動畫快遞不能顯示。請確認你有安裝 'cabextract' 套件。" +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." +msgstr "" +"KMess 無法儲存此聊天紀錄。
因為聊天紀錄目錄 %1 不存在。" -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "動畫快遞不能顯示。資料無法讀取。" +#: chat/chat.cpp:941 +msgid "You have sent a wink" +msgstr "您送出了動畫快遞" -#: chat/chat.cpp:1080 +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "發生了連線問題。" + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 #, fuzzy -msgid "You have received a wink from %1" -msgstr "你從 %1 收到一個動畫快遞" +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "%1 送給您一段錄音,但是 KMess 目前無法支援語音功能。" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:1153 #, fuzzy -msgid "You received a nudge from %1!" -msgstr "你從 %1 收到一個來電振動。" +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "%1 送給您一個動作訊息,但 KMess 尚未支援。" -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "%1 送給您一個 MSN 的特殊功能,但 KMess 尚未支援。" + +#: chat/chat.cpp:1194 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "訊息 \"%1\" 无法传送" +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "您收到 %1 傳送來的動畫快遞,但是帳號的選項中關閉了動畫快遞的顯示功能。" -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "您已從 %1 接收到動畫快遞,但無法顯示。請確定您已安裝 cabextract。" + +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "您從 %1 收到動畫快遞,但無法顯示。以 cabextract 解開動畫快遞時錯誤。" + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "您收到 %1 送來的動畫快遞,但無法顯示。資料無法讀取。" + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1傳送了一個動畫快遞給您!" + +#: chat/chat.cpp:1284 +#, fuzzy +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "%1 已離線。任何新送的訊息都會在下次他們登入時傳送。" + +#: chat/chat.cpp:1289 +msgid "%1 has gone offline." +msgstr "%1 已離線。" + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 的狀態已變更為 \"%2\"。" + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1傳送了一個來電振動給您。" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "所有聯絡人" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "您收到 %1 傳來的來電振動。" + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "您收到 %1 送來的動畫快遞。" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 已加入聊天室。" + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1 傳送一個離線訊息給您:
%2" + +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "在電腦中,及已下載中找不到檔案 '%1'。" + +#: chat/chat.cpp:1526 +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" -msgstr "你傳送來電振動給 %1" +msgstr "您傳送了來電振動給 %1!" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" -msgstr "你傳送了一個來電振動" +msgstr "您傳送了一個來電振動。" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +#, fuzzy +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "%1 目前離線中。任何您送的訊息都會在下次他們登入時傳送。" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 正傳送一個動畫快遞: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 說:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +#, fuzzy +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "與 %1 的對話
開始於:%2" + +#: chat/chatmessageview.cpp:364 +#, fuzzy +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "對話開始於:%2" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "儲存與 %1 的 KMess 對話" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "加入這個表情符號:%1" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "邀請(&I)" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "重新連線" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." -msgstr "無法儲存聊天紀錄。請確認儲存紀錄的資料夾你有寫入的權限。" +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." +msgstr "" +"無法將聊天紀錄儲存在目錄 %1。\n" +"請確定您有寫入儲存紀錄的資料夾的權限。" -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +#, fuzzy +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" +"*.html *.htm|網頁(*.html)\n" +"*.txt|純文字文件(*.txt)\n" +"*.xml|XML 文件(*.xml)" + +#: chat/chatview.cpp:457 msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -"檔案 %1 已經存在。\n" -"你想要覆寫它嗎?" +"檔案 %1 已存在。\n" +"您要覆寫它嗎?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "覆寫檔案" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" -msgstr "複寫(&w)" +msgstr "覆寫(&W)" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." -msgstr "加入這個表情符號(&E)" +msgstr "加入這個表情符號(&E)..." -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +msgid "Ignore this &Emoticon" +msgstr "忽略這個表情符號(&E)" + +#: chat/chatview.cpp:833 msgid "Send &Email" msgstr "傳送電子郵件(&E)" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "複製Email(&m)" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "新增聯絡人(&C)" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +msgid "Copy E&mail Address" +msgstr "複製電子郵件位址(&m)" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "造訪連結(&L)" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "複製地址(&A)" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "複製文字(&C)" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "全選(&A)" -#: chat/chatview.cpp:1314 -msgid "Find &Text" -msgstr "" +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "尋找文字(&T)..." -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" -msgstr "儲存交談成檔案(&F)" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +msgid "C&lear Chat" +msgstr "清除聊天紀錄(&L)" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "交談(&C)" +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "將聊天內容存到檔案(&F)..." -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "傳送檔案(&F)" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "聯絡人" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "開始會議(&M)" - -#: chat/chatwindow.cpp:494 -msgid "Send a &Nudge!" -msgstr "傳送來電振動(&N)" - -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "儲存交談內容" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "表情符號" - -#: chat/chatwindow.cpp:498 -#, fuzzy -msgid "Close &All Tabs" -msgstr "關閉標籤" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "設定" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "開始或結束一個對話(&C)" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "改變字型(&F)" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "改變字體顏色(&C)" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "連線(&C)" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "改變字體顏色(&C)" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "表情符號" -#: chat/chatwindow.cpp:658 -msgid "My emoticons" +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" msgstr "我的表情符號" -#: chat/chatwindow.cpp:738 -#, fuzzy -msgid "&Settings" -msgstr "設定" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" +#: chat/chatwindow.cpp:328 +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" +"在此聊天視窗中開啟了多個分頁。您要關閉目前的分頁,還是所有的分頁?

提示:您可以用 Alt+F4 一次關閉所有的分頁。" -#: chat/chatwindow.cpp:742 +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "關閉聊天分頁" + +#: chat/chatwindow.cpp:332 +msgid "Close All Tabs" +msgstr "關閉所有分頁" + +#: chat/chatwindow.cpp:333 +msgid "Close Current Tab" +msgstr "關閉目前的分頁" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "邀請(&I)..." + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." +msgstr "傳送檔案(&F)..." + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "網路視訊聊天" + +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "開始會議(&M)" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "傳送來電振動(&N)" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "儲存聊天內容..." + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "關閉所有分頁(&A)" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "改變字型(&F)" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "改變字體顏色(&C)" + +#: chat/chatwindow.cpp:428 msgid "Show &Emoticons" msgstr "顯示表情符號(&E)" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 -#, fuzzy -msgid "Hide Side&bar" -msgstr "側邊列" +#: chat/chatwindow.cpp:429 +msgid "Show S&tatus Messages" +msgstr "顯示狀態訊息(&T)" -#: chat/chatwindow.cpp:744 -#, fuzzy -msgid "Hide &Toolbar" -msgstr "側邊列" +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "面板(&P)" -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 -#, fuzzy -msgid "Hide the contact sidebar" -msgstr "顯示或隱藏聯絡人狀態列" +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "使用拼字檢查(&S)" -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "會議" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "來電振動" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "傳送檔案(&F)" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "前一個分頁(&r)" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "下一個分頁(&x)" + +#: chat/chatwindow.cpp:465 +msgid "Enable or disable the contacts panel" +msgstr "開啟或關閉聯絡人面板" + +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "聯絡人" + +#: chat/chatwindow.cpp:471 +msgid "Enable or disable the standard emoticons panel" +msgstr "開啟或關閉標準表情符號面板" + +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "表情符號" + +#: chat/chatwindow.cpp:477 +msgid "Enable or disable the Custom Emoticons panel" +msgstr "開啟或關閉自定表情符號面板" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "我的表情符號" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "字型(&F)" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "字型顏色(&C)" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "清除聊天視窗(&L)" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "開始或結束一段對話(&C)" + +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" +"您的 /status 指令用了不正確的語法。正確的語法為:/status online|" +"away|idle|brb|busy|lunch|phone|invisible
或是您可以直接使用 /" +"online/phone 等。" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "不正確的 /status 語法" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +#, fuzzy +msgid "You can't block anyone in a group chat." +msgstr "您不能阻擋任何一個已經在此群組對話中的人。" + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +#, fuzzy +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "現在不能阻檔!" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." msgstr "" +"未知的指令 %1。若您並不是要輸入指令,請在您的訊息上再加一個 / 。" +"" -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "關閉標籤" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "未知的指令" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "關閉標籤" - -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "側邊列" - -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "顯示或隱藏聯絡人狀態列" - -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 正在輸入" - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 和 %2 正在输入" - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1 %2 和 %3 其他人正在输入" - -#: chat/chatwindow.cpp:1611 -#, fuzzy +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" -msgstr "交談" +msgstr "聊天" -#: chat/chatwindow.cpp:1615 -#, fuzzy +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" -msgstr "%1 - 交談" +msgstr "%1 ─ 聊天" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" +"您確定您要隱藏選單列嗎?您可以用此快捷鍵來重新顯示選單:%1" + +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "隱藏選單" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1 正在輸入..." + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 與 %2 正在輸入..." + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1,%2 和其他 %3 個人正在輸入..." + +#: chat/chatwindow.cpp:2296 +msgctxt "Tool tip for chat tabs" +msgid "" +"

Chat Info

Contacts:
  • %1
Chat started on:
%2
Connected with " +"account:
%3
" +msgstr "" +"

聊天資訊

聯絡人:
  • %1
聊天開始於:
%2
連線帳號:
%3
" + +#: chat/contactframe.cpp:304 +msgid "&Start Private Chat" +msgstr "開始私密聊天(&S)" + +#: chat/contactframe.cpp:305 kmessview.cpp:591 +msgid "&Send Email" msgstr "傳送電子郵件(&S)" -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/contactframe.cpp:306 kmessview.cpp:592 msgid "&View Profile" msgstr "檢視帳號(&V)" -#: chat/contactframe.cpp:286 +#: chat/contactframe.cpp:307 msgid "Ed&it Notes" -msgstr "" +msgstr "編輯備忘(&I)" -#: chat/contactframe.cpp:288 kmessview.cpp:564 +#: chat/contactframe.cpp:309 kmessview.cpp:595 msgid "&Add Contact" msgstr "新增聯絡人(&A)" -#: chat/contactframe.cpp:289 kmessview.cpp:565 +#: chat/contactframe.cpp:310 kmessview.cpp:596 msgid "A&llow Contact" msgstr "允許此聯絡人(&l)" -#: chat/contactframe.cpp:290 kmessview.cpp:568 +#: chat/contactframe.cpp:311 kmessview.cpp:599 msgid "&Delete Contact" msgstr "刪除此聯絡人(&D)" -#: chat/contactframe.cpp:292 kmessview.cpp:566 +#: chat/contactframe.cpp:313 kmessview.cpp:597 msgid "&Block Contact" msgstr "封鎖此聯絡人(&B)" -#: chat/contactframe.cpp:293 kmessview.cpp:567 +#: chat/contactframe.cpp:314 kmessview.cpp:598 msgid "&Unblock Contact" msgstr "解除此聯絡人的封鎖(&U)" -#: chat/contactframe.cpp:295 kmessview.cpp:571 +#: chat/contactframe.cpp:316 kmessview.cpp:602 msgid "&Friendly Name" -msgstr "昵稱" +msgstr "暱稱(&F)" -#: chat/contactframe.cpp:296 kmessview.cpp:572 +#: chat/contactframe.cpp:317 kmessview.cpp:603 msgid "&Personal Message" msgstr "個人訊息(&P)" -#: chat/contactframe.cpp:297 kmessview.cpp:573 +#: chat/contactframe.cpp:318 kmessview.cpp:604 msgid "&Email Address" msgstr "電子郵件位址(&E)" -#: chat/contactframe.cpp:318 kmessview.cpp:608 -msgid "&Copy..." -msgstr "複製...(&C)" +#: chat/contactframe.cpp:341 kmessview.cpp:639 +msgid "&Copy" +msgstr "複製(&C)" -#: chat/contactframe.cpp:632 +#: chat/contactframe.cpp:693 msgid "Blocked" msgstr "被封鎖" -#: chat/contactframe.cpp:652 -#, fuzzy +#: chat/contactframe.cpp:705 +msgctxt "" +"Tooltip for a contact's status icon, arg %1 is the MSN Status, like 'Online'" msgid "The contact is %1" -msgstr "此聯絡人未上線" +msgstr "此聯絡人的狀態為%1" -#: chat/emoticonsidebar.cpp:64 -msgctxt "Informative label on the chat's Sidebar" +#: chat/emoticonswidget.cpp:287 +msgctxt "Informative label on the chat's emoticons bar" msgid "" "

You haven't added any custom emoticons yet.

To add new " "emoticons, click here!

" msgstr "" +"

您尚未加入任何自訂的表情符號。

要新增表情,請點選這裡

" -#: chat/emoticonsidebar.cpp:212 -#, fuzzy +#: chat/emoticonswidget.cpp:449 msgid "Add to Chat" -msgstr "新增一個聯絡人" +msgstr "新增到聊天室" -#: chat/emoticonsidebar.cpp:213 -#, fuzzy -msgid "Insert new" -msgstr "插入表情符號" +#: chat/emoticonswidget.cpp:450 +msgid "Add New" +msgstr "新增" -#: chat/emoticonsidebar.cpp:214 +#: chat/emoticonswidget.cpp:451 msgid "Edit" -msgstr "" +msgstr "編輯" -#: chat/emoticonsidebar.cpp:215 dialogs/userpicturesdialog.cpp:34 -#: kmess.cpp:572 -#, fuzzy +#: chat/emoticonswidget.cpp:452 kmess.cpp:580 msgid "Remove" -msgstr "被移除" +msgstr "移除" -#: contact/contactbase.cpp:280 -msgid "Windows Mobile" -msgstr "" - -#: contact/contactbase.cpp:284 +#: chat/winkswidget.cpp:106 #, fuzzy +msgctxt "Informative label on the chat's winks bar" +msgid "" +"

You don't have any winks yet.

To add new ones, have " +"your contacts send you some!

" +msgstr "" +"

您尚未加入任何自訂的表情符號。

要新增表情,請點選這裡

" + +#: contact/contactbase.cpp:304 +msgid "Windows Mobile" +msgstr "Windows 車用" + +#: contact/contactbase.cpp:308 msgid "Web Messenger" -msgstr "網頁設計" - -#: contact/contactbase.cpp:288 -msgid "Office Communicator" -msgstr "" - -#: contact/contactbase.cpp:292 -msgid "Messenger Bot" -msgstr "" - -#: contact/contactbase.cpp:299 contact/contactbase.cpp:304 -msgid "MSN Messenger %1 compatible" -msgstr "" +msgstr "Web Messenger" #: contact/contactbase.cpp:312 -#, fuzzy -msgid "Windows Live Messenger %1" -msgstr "網頁設計" +msgid "Office Communicator" +msgstr "辦公室通訊" #: contact/contactbase.cpp:316 -msgid "Windows Live Messenger %1 compatible" -msgstr "" +msgid "Messenger Bot" +msgstr "Messenger Bot" -#: contact/contactbase.cpp:322 +#: contact/contactbase.cpp:320 +msgid "Windows Media Center" +msgstr "Windows 媒體中心" + +#: contact/contactbase.cpp:327 contact/contactbase.cpp:332 +msgid "MSN Messenger %1 compatible" +msgstr "MSN Messenger %1 相容" + +#: contact/contactbase.cpp:349 +msgid "Windows Live Messenger %1" +msgstr "Windows Live Messenger %1" + +#: contact/contactbase.cpp:354 msgid "Windows Live Messenger" -msgstr "" +msgstr "Windows Live Messenger" -#: contact/contactlist.cpp:1141 contact/msnstatus.cpp:141 -#: contact/msnstatus.cpp:152 initialview.cpp:69 kmessinterface.cpp:219 -#: kmessview.cpp:259 settings/accountpage.cpp:87 +#: contact/contactbase.cpp:361 +msgid "Windows Live Messenger %1 compatible" +msgstr "Windows Live Messenger %1 相容" + +#: contact/contactbase.cpp:367 +msgid "Windows Live Messenger compatible" +msgstr "Windows Live Messenger 相容" + +#: contact/msnstatus.cpp:156 contact/msnstatus.cpp:169 initialview.cpp:85 +#: model/contactlist.cpp:1504 settings/accountpage.cpp:98 msgid "Online" msgstr "上線" -#: contact/contactlist.cpp:1142 contact/msnstatus.cpp:147 -msgid "Offline" -msgstr "離線" - -#: contact/contactlist.cpp:1143 -msgid "Allowed" -msgstr "被允許" - -#: contact/contactlist.cpp:1144 -msgid "Removed" -msgstr "被移除" - -#: contactlistviewdelegate.cpp:143 -#, fuzzy -msgctxt "Group name in the contact list with total contacts of that group" -msgid "%1 (%2)" -msgstr "%1 %2" - -#: contactlistviewdelegate.cpp:150 -#, fuzzy -msgctxt "" -"Group name in the contact list with online/total contacts of that group" -msgid "%1 (%2/%3)" -msgstr "%1 %2" - -#: contact/msnstatus.cpp:142 initialview.cpp:70 kmessinterface.cpp:220 -#: kmessview.cpp:260 settings/accountpage.cpp:88 -msgid "Away" -msgstr "離開" - -#: contact/msnstatus.cpp:143 initialview.cpp:71 kmessinterface.cpp:223 -#: kmessview.cpp:263 settings/accountpage.cpp:89 -msgid "Be Right Back" -msgstr "馬上回來" - -#: contact/msnstatus.cpp:144 initialview.cpp:72 kmessinterface.cpp:224 -#: kmessview.cpp:264 settings/accountpage.cpp:90 +#: contact/msnstatus.cpp:157 initialview.cpp:88 settings/accountpage.cpp:101 msgid "Busy" msgstr "忙啦" -#: contact/msnstatus.cpp:145 initialview.cpp:75 kmessinterface.cpp:227 -#: kmessview.cpp:267 settings/accountpage.cpp:93 -msgid "Invisible" -msgstr "隱形" +#: contact/msnstatus.cpp:158 initialview.cpp:86 settings/accountpage.cpp:99 +msgid "Away" +msgstr "離開" -#: contact/msnstatus.cpp:146 kmessinterface.cpp:222 kmessview.cpp:262 +#: contact/msnstatus.cpp:159 +msgid "Away with Auto-Reply" +msgstr "離開,並自動回覆" + +#: contact/msnstatus.cpp:160 msgid "Idle" -msgstr "發呆" +msgstr "閒置" -#: contact/msnstatus.cpp:148 initialview.cpp:74 kmessinterface.cpp:226 -#: kmessview.cpp:266 settings/accountpage.cpp:92 +#: contact/msnstatus.cpp:161 initialview.cpp:87 settings/accountpage.cpp:100 +msgid "Be Right Back" +msgstr "馬上回來" + +#: contact/msnstatus.cpp:162 initialview.cpp:90 settings/accountpage.cpp:103 msgid "On the Phone" msgstr "請等等...電話中" -#: contact/msnstatus.cpp:149 initialview.cpp:73 kmessinterface.cpp:225 -#: kmessview.cpp:265 settings/accountpage.cpp:91 +#: contact/msnstatus.cpp:163 initialview.cpp:89 settings/accountpage.cpp:102 msgid "Out to Lunch" msgstr "外出午餐" -#: dialogs/addcontactdialog.cpp:48 -#, fuzzy +#: contact/msnstatus.cpp:164 initialview.cpp:91 settings/accountpage.cpp:104 +msgid "Invisible" +msgstr "隱形" + +#: contact/msnstatus.cpp:165 model/contactlist.cpp:1505 +msgid "Offline" +msgstr "離線" + +#: contact/msnstatus.cpp:192 contact/msnstatus.cpp:194 +msgid "&My Status" +msgstr "我的狀態(&M)" + +#: contact/msnstatus.cpp:215 +msgctxt "Menu action name" +msgid "Disconnect" +msgstr "斷線" + +#: dialogs/addcontactdialog.cpp:49 msgid "Add a Contact" -msgstr "新增一個聯絡人" +msgstr "新增聯絡人" -#: dialogs/addcontactdialog.cpp:73 -#, fuzzy -msgid "No group" -msgstr "刪除群組" - -#: dialogs/addemoticondialog.cpp:58 dialogs/addemoticondialog.cpp:253 +#: dialogs/addemoticondialog.cpp:60 dialogs/addemoticondialog.cpp:256 msgid "Add New Emoticon" -msgstr "加入新的表情符號" +msgstr "新增表情符號" -#: dialogs/addemoticondialog.cpp:127 -#, fuzzy +#: dialogs/addemoticondialog.cpp:129 msgid "Edit Emoticon" -msgstr "表情符號" +msgstr "編輯表情符號" -#: dialogs/addemoticondialog.cpp:252 settings/emoticonspage.cpp:121 -msgid "The emoticon \"%1\" already exists, do you want to replace it?" -msgstr "表情 \"%1\" 已經存在,你想要取代它嗎?" +#: dialogs/addemoticondialog.cpp:255 settings/emoticonspage.cpp:135 +msgid "The emoticon \"%1\" already exists. Do you want to replace it?" +msgstr "表情符號 \"%1\" 已存在,您要取代它嗎?" -#: dialogs/awaymessagedialog.cpp:36 -msgid "Specify an Away message" -msgstr "指定一個離開訊息" +#: dialogs/awaymessagedialog.cpp:37 +msgid "Automatic Away Message" +msgstr "自動離開訊息" -#: dialogs/contactaddeduserdialog.cpp:33 -msgid "You have been added by someone" -msgstr "" +#: dialogs/chathistorydialog.cpp:48 +msgctxt "Dialog window title" +msgid "Chat History" +msgstr "聊天紀錄" -#: dialogs/contactaddeduserdialog.cpp:85 -#, fuzzy +#: dialogs/chathistorydialog.cpp:178 dialogs/chathistorydialog.cpp:421 +#: dialogs/chathistorydialog.cpp:512 +msgctxt "Dialog box text" msgid "" -"%1 (%2) \n" -" has added you to his or her contact list. " +"There has been an error while opening your logs. This is commonly a " +"permission problem, check if you have read/write access to directory \"%1" +"\". Otherwise, your logs may be corrupted." msgstr "" -"%1\n" -"已經將你加入 他/她 的聯絡人清單。你想要:" +"當開啟你的紀錄時出現了一個錯誤。通常這是一個權限問題,檢查你是否有讀取/寫入資" +"料夾\"%1\"的權限。否則你的紀錄會毀壞。" -#: dialogs/contactpropertiesdialog.cpp:361 kmess.cpp:807 kmessview.cpp:1071 -#: network/msnsockethttp.cpp:197 network/msnsockettcp.cpp:379 +#: dialogs/chathistorydialog.cpp:183 dialogs/chathistorydialog.cpp:426 +#: dialogs/chathistorydialog.cpp:517 +msgctxt "Dialog box title" +msgid "Could not open chat history" +msgstr "無法開啟聊天紀錄" + +#: dialogs/chathistorydialog.cpp:305 +msgid "" +"Could not retrieve a valid date from your logs! This is probably due to the " +"fact that this log was generated with an old KMess version" +msgstr "" +"無法從您的紀錄中取得合法的日期。這可能是因為您的紀錄是由舊版的 KMess 產生的" + +#: dialogs/chathistorydialog.cpp:371 +msgid "" +"Your logs seems to be corrupted or belonging to an old KMess version. KMess " +"can try migrating your logs. Do you want to do this now?" +msgstr "" +"您的紀錄可能已損毀,或是由舊版 KMess 所產生。KMess 可以試著將您的紀錄格式升" +"級。您要現在進行嗎?" + +#: dialogs/chathistorydialog.cpp:527 +msgid "" +"Migration terminated.\n" +"Tried to migrate %1 items\n" +"%2 items successfully migrated\n" +"%3 items could not have been migrated." +msgstr "" +"升級完成。\n" +"已試著更新 %1 個項目。\n" +"%2 個項目成功,%3 個項目無法升級。" + +#: dialogs/chathistorydialog.cpp:531 +msgid "Alpha logs migration" +msgstr "Alpha 紀錄升級" + +#: dialogs/contactaddeduserdialog.cpp:55 +msgid "You have been added by someone" +msgstr "您已被某人加入" + +#: dialogs/contactaddeduserdialog.cpp:58 +msgid "" +"%1 (%2)\n" +"has added you to his or her contact list." +msgstr "" +"%1(%2)\n" +"已將您加入聯絡人清單中。" + +#: dialogs/contactpropertiesdialog.cpp:309 +msgid "Contact Properties for %1" +msgstr "%1 的聯絡人特性" + +#: dialogs/contactpropertiesdialog.cpp:399 kmess.cpp:817 kmessview.cpp:1168 +#: network/msnsockethttp.cpp:190 network/msnsocketnull.cpp:332 +#: network/msnsockettcp.cpp:386 msgid "Connected" msgstr "已連線" -#: dialogs/contactpropertiesdialog.cpp:365 kmessview.cpp:1069 +#: dialogs/contactpropertiesdialog.cpp:403 kmessview.cpp:1172 msgid "Not seen yet" -msgstr "" +msgstr "尚未看到" -#: dialogs/contactpropertiesdialog.cpp:374 kmessview.cpp:1073 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:412 kmessview.cpp:1187 msgid "No messages yet" -msgstr "在聊天訊息中顯示時間(&h)" +msgstr "尚未有訊息" -#: dialogs/contactpropertiesdialog.cpp:381 +#: dialogs/contactpropertiesdialog.cpp:419 +msgctxt "Contact props dialog info" msgid "Last seen: %1" -msgstr "" +msgstr "上次看到:%1" -#: dialogs/contactpropertiesdialog.cpp:382 +#: dialogs/contactpropertiesdialog.cpp:420 +msgctxt "Contact props dialog info" msgid "Last message: %1" -msgstr "" +msgstr "上個訊息:%1" -#: dialogs/contactpropertiesdialog.cpp:383 -#, fuzzy -msgid "Email: %1" -msgstr "Email" +#: dialogs/contactpropertiesdialog.cpp:421 +msgctxt "Contact props dialog info" +msgid "Email address: %1" +msgstr "電子郵件地址:%1" -#: dialogs/contactpropertiesdialog.cpp:384 -#, fuzzy +#: dialogs/contactpropertiesdialog.cpp:422 +msgctxt "Contact props dialog info" msgid "Client: %1" -msgstr "電子郵件客戶端軟體" +msgstr "客戶端程式:%1" + +#: dialogs/contactpropertiesdialog.cpp:659 +#, fuzzy +msgctxt "Dialog box text" +msgid "Are you sure you want to use the display picture of this contact?" +msgstr "點擊此按鍵以儲存此聯絡人的顯示圖片" + +#: dialogs/contactpropertiesdialog.cpp:661 +#, fuzzy +msgid "Copy Contact Picture" +msgstr "聯絡人清單" + +#: dialogs/invitedialog.cpp:41 +msgctxt "Caption of a dialog box" +msgid "Invite Contacts" +msgstr "邀請聯絡人" + +#: dialogs/listexportdialog.cpp:83 +msgid "Export Contact List for %1" +msgstr "匯出 %1 的聯絡人清單" + +#: dialogs/listexportdialog.cpp:102 +msgid "Nothing to export" +msgstr "沒有東西可匯出" + +#: dialogs/listexportdialog.cpp:158 +msgid "File exists" +msgstr "檔案已存在" + +#: dialogs/listexportdialog.cpp:159 +msgid "The file %1 already exists, do you want to overwrite?" +msgstr "檔案 %1 已存在,您要覆寫它嗎?" + +#: dialogs/listexportdialog.cpp:272 +msgid "Export Finished" +msgstr "完成輸出" + +#: dialogs/listexportdialog.cpp:272 +msgid "The export of the contact list is finished" +msgstr "聯絡人清單的輸出已經完成" + +#: dialogs/networkwindow.cpp:78 +msgid "S&ave Tab" +msgstr "儲存分頁(&a)" #: dialogs/networkwindow.cpp:79 -#, fuzzy -msgid "S&ave tab" -msgstr "儲存標籤" +msgid "C&lear Tab" +msgstr "清除分頁(&l)" #: dialogs/networkwindow.cpp:80 -#, fuzzy -msgid "C&lear tab" -msgstr "清除標籤" +msgid "C&lose All Tabs" +msgstr "關閉所有分頁(&l)" -#: dialogs/networkwindow.cpp:1054 -#, fuzzy +#: dialogs/networkwindow.cpp:1081 msgid "" "No connections are present.\n" "Cannot open the Network Window." -msgstr "沒有任何連接呈現。無法開啟網路視窗。" +msgstr "" +"目前沒有任何連線。\n" +"無法開啟網路視窗。" -#: dialogs/networkwindow.cpp:1100 -#, fuzzy +#: dialogs/networkwindow.cpp:1125 msgid "" "Could not save the Network Window log. Make sure you have permission to " "write in the folder where it is being saved." -msgstr "無法儲存網路視窗紀錄。請確認儲存紀錄的資料夾你有權限寫入。" +msgstr "無法儲存網路視窗紀錄。請確定您有寫入紀錄資料夾的權限。" -#: dialogs/networkwindow.cpp:1122 +#: dialogs/networkwindow.cpp:1172 msgid "Cannot close the main connection tab." msgstr "無法關閉主連結標籤" -#: dialogs/networkwindow.cpp:1215 +#: dialogs/networkwindow.cpp:1268 msgid "" "Sending commands to the server is a risky operation.
If you don't know " -"how exactly send messages to the servers,you could be lucky and just get " -"disconnected, or you mayincur in more serious consequences.
You " -"have been warned!
Do you want to continue sending this message?" +"how to exactly do it, you could be lucky and just get disconnected, or " +"you may incur in more serious consequences.
You have been warned!" +"
Do you want to continue sending this message?" msgstr "" +"傳送指令到伺服器是很冒險的。
若您不知道怎麼做卻要硬做,運氣好的話您只是" +"被踢出去,不好的話會導致嚴重的後果
我們已經警告您了!" -#: dialogs/networkwindow.cpp:1245 +#: dialogs/networkwindow.cpp:1298 msgid "" "The payload you are trying to send does not end with the required newline " "('\\r\\n')!
Do you want KMess to add it for you?" msgstr "" +"您試圖傳送的資料內容並未以換行字元〈'\\r\\n'〉結束!
要讓 KMess 自動將它" +"加上嗎?" -#: dialogs/networkwindow.cpp:1321 -#, fuzzy +#: dialogs/networkwindow.cpp:1374 msgid "Cannot send commands to this kind of connection!" -msgstr "無法關閉主連結標籤" +msgstr "無法傳送指令給此類型的連線。" -#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:534 +#: dialogs/transferentry.cpp:133 network/applications/filetransfer.cpp:127 +#: network/applications/filetransfer.cpp:658 #: network/applications/filetransferp2p.cpp:99 -#: network/applications/filetransferp2p.cpp:768 -#: network/extra/msnftpconnection.cpp:120 +#: network/applications/filetransferp2p.cpp:767 +#: network/extra/msnftpconnection.cpp:121 +#: network/extra/msnftpconnection.cpp:127 msgid "Cancelled" msgstr "取消" -#: dialogs/transferentry.cpp:173 +#: dialogs/transferentry.cpp:181 msgid "Failed!" msgstr "失敗!" -#: dialogs/transferentry.cpp:217 +#: dialogs/transferentry.cpp:225 msgid "Completed" msgstr "完成" -#: dialogs/transferentry.cpp:263 network/applications/filetransfer.cpp:511 -#: network/applications/filetransferp2p.cpp:743 +#: dialogs/transferentry.cpp:271 network/applications/filetransfer.cpp:635 +#: network/applications/filetransferp2p.cpp:742 msgid "%1 MB" msgstr "%1 MB" -#: dialogs/transferentry.cpp:268 network/applications/filetransfer.cpp:516 -#: network/applications/filetransferp2p.cpp:748 +#: dialogs/transferentry.cpp:276 network/applications/filetransfer.cpp:640 +#: network/applications/filetransferp2p.cpp:747 msgid "%1 kB" msgstr "%1 kB" -#: dialogs/transferentry.cpp:272 network/applications/filetransfer.cpp:520 -#: network/applications/filetransferp2p.cpp:752 +#: dialogs/transferentry.cpp:280 network/applications/filetransfer.cpp:644 +#: network/applications/filetransferp2p.cpp:751 msgid "%1 bytes" msgstr "%1 bytes" -#: dialogs/transferentry.cpp:335 -#, fuzzy +#: dialogs/transferentry.cpp:343 msgid "%1 of %2 received." -msgstr "%2 的 %1 已接收" +msgstr "%1 已接收,共 %2。" -#: dialogs/transferentry.cpp:339 -#, fuzzy +#: dialogs/transferentry.cpp:347 msgid "%1 of %2 sent." -msgstr "%2 的 %1 已傳送" +msgstr "%1 已傳送,共 %2。" -#: dialogs/transferentry.cpp:373 +#: dialogs/transferentry.cpp:381 msgid "infinite" -msgstr "" +msgstr "無窮" -#: dialogs/transferwindow.cpp:54 +#: dialogs/userpicturesdialog.cpp:43 +msgid "&Use" +msgstr "使用(&U)" + +#: dialogs/userpicturesdialog.cpp:44 settings/accountsettingsdialog.cpp:59 +msgid "&Delete" +msgstr "刪除(&D)" + +#: dialogs/userpicturesdialog.cpp:46 #, fuzzy -msgid "Cl&ean Up" -msgstr "清除(&u)" +msgid "Choose or Remove Your Display Picture" +msgstr "選擇或移除您的頭像" -#: dialogs/userpicturesdialog.cpp:31 -msgid "Choose or remove your avatar" -msgstr "" +#: dialogs/userpicturesdialog.cpp:129 +msgctxt "Dialog box title" +msgid "Delete Picture" +msgstr "刪除圖片" -#: dialogs/userpicturesdialog.cpp:33 -msgid "Use" -msgstr "" +#: dialogs/userpicturesdialog.cpp:128 +msgid "Are you sure you want to delete the picture?" +msgstr "您確定要刪除此圖片?" -#: emoticontheme.cpp:601 +#: emoticontheme.cpp:612 msgid "" "Could not save the emoticon theme. Make sure you have permission to write to " "the theme folder '%1'." -msgstr "無法儲存表情符號主題。請確認主題資料夾 %1 你有權限寫入。" +msgstr "無法儲存此表情符號主題。請確定您有寫入主題資料夾 %1 的權限。" -#: emoticontheme.cpp:809 +#: emoticontheme.cpp:822 msgid "Smile" msgstr "微笑" -#: emoticontheme.cpp:810 +#: emoticontheme.cpp:823 msgid "Wink" msgstr "眨眼" -#: emoticontheme.cpp:811 +#: emoticontheme.cpp:824 msgid "Tongue out" msgstr "吐舌" -#: emoticontheme.cpp:812 +#: emoticontheme.cpp:825 msgid "Big smile" msgstr "大笑" -#: emoticontheme.cpp:813 +#: emoticontheme.cpp:826 msgid "Sad" msgstr "傷心" -#: emoticontheme.cpp:814 +#: emoticontheme.cpp:827 msgid "Crying" msgstr "哭泣" -#: emoticontheme.cpp:815 +#: emoticontheme.cpp:828 msgid "Angry" msgstr "生氣" -#: emoticontheme.cpp:816 +#: emoticontheme.cpp:829 msgid "Confused" msgstr "困惑" -#: emoticontheme.cpp:817 +#: emoticontheme.cpp:830 msgid "Embarrassed" msgstr "害羞" -#: emoticontheme.cpp:818 +#: emoticontheme.cpp:831 msgid "Disappointed" msgstr "失望" -#: emoticontheme.cpp:819 +#: emoticontheme.cpp:832 msgid "Hot" -msgstr "好熱" +msgstr "熱情" -#: emoticontheme.cpp:820 +#: emoticontheme.cpp:833 msgid "Baring teeth" msgstr "露牙" -#: emoticontheme.cpp:821 +#: emoticontheme.cpp:834 msgid "Nerd" msgstr "厭惡" -#: emoticontheme.cpp:822 +#: emoticontheme.cpp:835 msgid "Sick" msgstr "生病" -#: emoticontheme.cpp:823 +#: emoticontheme.cpp:836 msgid "Surprised" msgstr "驚喜" -#: emoticontheme.cpp:824 +#: emoticontheme.cpp:837 msgid "Party" msgstr "派對" -#: emoticontheme.cpp:825 +#: emoticontheme.cpp:838 msgid "Sleepy" msgstr "想睡" -#: emoticontheme.cpp:826 +#: emoticontheme.cpp:839 msgid "Thinking" msgstr "思考" -#: emoticontheme.cpp:827 +#: emoticontheme.cpp:840 msgid "Don't tell anyone" msgstr "封口" -#: emoticontheme.cpp:828 +#: emoticontheme.cpp:841 msgid "Secret telling" msgstr "秘密" -#: emoticontheme.cpp:829 +#: emoticontheme.cpp:842 msgid "Eye-rolling" msgstr "轉眼" -#: emoticontheme.cpp:830 +#: emoticontheme.cpp:843 msgid "Sarcastic" msgstr "諷刺" -#: emoticontheme.cpp:831 +#: emoticontheme.cpp:844 msgid "I don't know" msgstr "不知" -#: emoticontheme.cpp:832 +#: emoticontheme.cpp:845 msgid "Be right back" msgstr "速回" -#: emoticontheme.cpp:833 +#: emoticontheme.cpp:846 msgid "Angel" msgstr "天使" -#: emoticontheme.cpp:834 +#: emoticontheme.cpp:847 msgid "Left hug" msgstr "左擁" -#: emoticontheme.cpp:835 +#: emoticontheme.cpp:848 msgid "Boy" msgstr "男孩" -#: emoticontheme.cpp:836 +#: emoticontheme.cpp:849 msgid "Red heart" msgstr "紅心" -#: emoticontheme.cpp:837 +#: emoticontheme.cpp:850 msgid "Red rose" msgstr "紅玫瑰" -#: emoticontheme.cpp:838 -msgid "Thumby up" +#: emoticontheme.cpp:851 +msgid "Thumbs up" msgstr "讚啦" -#: emoticontheme.cpp:839 +#: emoticontheme.cpp:852 msgid "Dog face" msgstr "汪汪" -#: emoticontheme.cpp:840 +#: emoticontheme.cpp:853 msgid "Sun" msgstr "太陽" -#: emoticontheme.cpp:841 +#: emoticontheme.cpp:854 msgid "Devil" msgstr "邪惡" -#: emoticontheme.cpp:842 +#: emoticontheme.cpp:855 msgid "Right hug" msgstr "右抱" -#: emoticontheme.cpp:843 +#: emoticontheme.cpp:856 msgid "Girl" msgstr "女孩" -#: emoticontheme.cpp:844 +#: emoticontheme.cpp:857 msgid "Broken heart" msgstr "心碎" -#: emoticontheme.cpp:845 +#: emoticontheme.cpp:858 msgid "Wilted rose" msgstr "枯玫瑰" -#: emoticontheme.cpp:846 +#: emoticontheme.cpp:859 msgid "Thumbs down" msgstr "遜斃" -#: emoticontheme.cpp:847 +#: emoticontheme.cpp:860 msgid "Cat face" msgstr "喵喵" -#: emoticontheme.cpp:848 +#: emoticontheme.cpp:861 msgid "Sleeping half-moon" msgstr "月眠" -#: emoticontheme.cpp:849 +#: emoticontheme.cpp:862 msgid "Red lips" msgstr "紅唇" -#: emoticontheme.cpp:850 +#: emoticontheme.cpp:863 msgid "Clapping" msgstr "鼓掌" -#: emoticontheme.cpp:851 +#: emoticontheme.cpp:864 msgid "Crossed fingers" msgstr "指叉" -#: emoticontheme.cpp:852 +#: emoticontheme.cpp:865 msgid "Auto" msgstr "自動" -#: emoticontheme.cpp:853 +#: emoticontheme.cpp:866 msgid "Airplane" msgstr "飛機" -#: emoticontheme.cpp:854 +#: emoticontheme.cpp:867 msgid "Turtle" msgstr "烏龜" -#: emoticontheme.cpp:855 +#: emoticontheme.cpp:868 msgid "Snail" msgstr "蝸牛" -#: emoticontheme.cpp:856 -msgid "Black sheep" -msgstr "害群之馬" +#: emoticontheme.cpp:869 +msgid "Sheep" +msgstr "綿羊" -#: emoticontheme.cpp:857 +#: emoticontheme.cpp:870 msgid "Goat" msgstr "山羊" -#: emoticontheme.cpp:858 +#: emoticontheme.cpp:871 msgid "Vampire bat" msgstr "蝙蝠" -#: emoticontheme.cpp:859 +#: emoticontheme.cpp:872 msgid "Pizza" msgstr "比薩" -#: emoticontheme.cpp:860 +#: emoticontheme.cpp:873 msgid "Beer mug" msgstr "啤酒杯" -#: emoticontheme.cpp:861 +#: emoticontheme.cpp:874 msgid "Martini glass" msgstr "高腳杯" -#: emoticontheme.cpp:862 +#: emoticontheme.cpp:875 msgid "Coffee cup" msgstr "咖啡杯" -#: emoticontheme.cpp:863 +#: emoticontheme.cpp:876 msgid "Birthday cake" msgstr "蛋糕" -#: emoticontheme.cpp:864 +#: emoticontheme.cpp:877 msgid "Plate" msgstr "盤子" -#: emoticontheme.cpp:865 +#: emoticontheme.cpp:878 msgid "Bowl" msgstr "碗公" -#: emoticontheme.cpp:866 +#: emoticontheme.cpp:879 msgid "Star" msgstr "星星" -#: emoticontheme.cpp:867 +#: emoticontheme.cpp:880 msgid "Rainbow" msgstr "彩虹" -#: emoticontheme.cpp:868 +#: emoticontheme.cpp:881 msgid "Stormy cloud" msgstr "烏雲" -#: emoticontheme.cpp:869 +#: emoticontheme.cpp:882 msgid "Lightning" msgstr "閃電" -#: emoticontheme.cpp:870 +#: emoticontheme.cpp:883 msgid "Umbrella" msgstr "雨傘" -#: emoticontheme.cpp:871 +#: emoticontheme.cpp:884 msgid "Island with a palm tree" msgstr "棕櫚樹" -#: emoticontheme.cpp:872 +#: emoticontheme.cpp:885 msgid "Telephone receiver" msgstr "電話" -#: emoticontheme.cpp:873 +#: emoticontheme.cpp:886 msgid "Mobile Phone" msgstr "手機" -#: emoticontheme.cpp:874 +#: emoticontheme.cpp:887 msgid "Email" msgstr "Email" -#: emoticontheme.cpp:875 +#: emoticontheme.cpp:888 msgid "Clock" msgstr "時鐘" -#: emoticontheme.cpp:876 +#: emoticontheme.cpp:889 msgid "Camera" msgstr "相機" -#: emoticontheme.cpp:877 +#: emoticontheme.cpp:890 msgid "Filmstrip" msgstr "膠捲" -#: emoticontheme.cpp:878 +#: emoticontheme.cpp:891 msgid "Note" msgstr "音符" -#: emoticontheme.cpp:879 +#: emoticontheme.cpp:892 msgid "Handcuffs" msgstr "手銬" -#: emoticontheme.cpp:880 +#: emoticontheme.cpp:893 msgid "Money" -msgstr "它不是萬能,但沒有它萬萬不能" +msgstr "錢錢" -#: emoticontheme.cpp:881 +#: emoticontheme.cpp:894 msgid "Light bulb" msgstr "燈泡" -#: emoticontheme.cpp:882 -msgid "Cigarrette" -msgstr "雪茄" +#: emoticontheme.cpp:895 +msgid "Cigarette" +msgstr "香煙" -#: emoticontheme.cpp:883 -msgid "Soccer ball" +#: emoticontheme.cpp:896 +msgid "Football ball" msgstr "足球" -#: emoticontheme.cpp:884 +#: emoticontheme.cpp:897 msgid "Gift with a bow" msgstr "禮物" -#: emoticontheme.cpp:885 +#: emoticontheme.cpp:898 msgid "X-Box" msgstr "X-Box" -#: emoticontheme.cpp:886 +#: emoticontheme.cpp:899 msgid "Computer" msgstr "電腦" -#: emoticontheme.cpp:887 +#: emoticontheme.cpp:900 msgid "KMess Icon" msgstr "KMess" -#: initialview.cpp:226 -#, fuzzy +#: initialview.cpp:239 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: account not found." +msgstr "無法重新連線:找不到帳號。" + +#: initialview.cpp:252 +msgctxt "Status message on login screen" +msgid "Cannot reconnect: this account has no saved password." +msgstr "無法重新連線:帳號並未儲存密碼。" + +#: initialview.cpp:280 initialview.cpp:379 +msgctxt "Status message on login screen" +msgid "" +"Waiting for an Internet connection to reconnect...
Reconnect now!" +msgstr "等待網際網路連線來重新連線...
現在重新連線!" + +#: initialview.cpp:384 +msgctxt "Status message on login screen" msgid "Internet connection not available." -msgstr "伺服器不可用" +msgstr "網際網路無法連線。" -#: initialview.cpp:377 -msgid "Connect" -msgstr "連線" +#: initialview.cpp:405 +msgctxt "Status message on login screen" +msgid "" +"Waiting %1 second before reconnection...
Reconnect now!" +msgid_plural "" +"Waiting %1 seconds before reconnection...
Reconnect now!" +msgstr[0] "在重新連線之前等待 %1 秒...
現在重新連線!" -#: initialview.cpp:382 -#, fuzzy -msgid "Disconnect" -msgstr "斷線(&D)" +#: initialview.cpp:581 +msgctxt "Button label" +msgid "&Connect" +msgstr "連線(&C)" -#: initialview.cpp:504 -msgctxt "Clickable label on login screen" -msgid "Less options..." -msgstr "" +#: initialview.cpp:586 +msgctxt "Button label" +msgid "&Cancel" +msgstr "取消(&C)" -#: initialview.cpp:509 -msgctxt "Clickable label on login screen" -msgid "More options..." -msgstr "" +#: initialview.cpp:638 +msgctxt "Status message on login screen" +msgid "Please, fill both your email and password." +msgstr "請填入您的電子郵件地址以及密碼。" -#: kmess.cpp:223 -#, fuzzy +#: initialview.cpp:657 +msgctxt "Status message on login screen" +msgid "Please, enter a valid email address." +msgstr "請輸入正確的的電子郵件位址。" + +#: kmess.cpp:220 +msgid "Contact Information" +msgstr "聯絡人資訊" + +#: kmess.cpp:220 +msgid "Contact %1 is already in your contact list." +msgstr "聯絡人 %1 已經在您的清單中了。" + +#: kmess.cpp:250 msgid "New Group" -msgstr "新增群組(&G)" +msgstr "新增群組" -#: kmess.cpp:226 -msgid "Add a group" -msgstr "新增一個群組" +#: kmess.cpp:253 +msgctxt "Dialog box title" +msgid "Add a Group" +msgstr "新增群組" -#: kmess.cpp:227 kmess.cpp:672 -msgid "Enter the new name for this group:" -msgstr "請輸入此群組的名稱:" +#: kmess.cpp:254 +msgid "Enter a name for the new group:" +msgstr "輸入新群組的名稱:" -#: kmess.cpp:569 +#: kmess.cpp:577 msgid "" "Are you sure you want to remove the contact %1 from your contact " "list?" -msgstr "你確定要將%1從聯絡人名單中刪除嗎?" +msgstr "您確定要將聯絡人 %1 從清單中移除嗎?" -#: kmess.cpp:571 -msgid "Remove contact" -msgstr "刪除聯絡人" +#: kmess.cpp:579 +msgid "Remove Contact" +msgstr "移除聯絡人" -#: kmess.cpp:573 -msgid "Remove and block" +#: kmess.cpp:581 +msgid "Remove and Block" msgstr "移除並封鎖" -#: kmess.cpp:619 +#: kmess.cpp:627 msgctxt "dialog text" msgid "" "The group \"%1\" is not empty: remove all contacts from it, then try " "again!" -msgstr "" +msgstr "群組 %1 不是空的:請先將所有聯絡人從群組中移走,然後再試一次。" -#: kmess.cpp:621 kmess.cpp:630 +#: kmess.cpp:629 kmess.cpp:636 msgctxt "dialog title" -msgid "Group removal" -msgstr "" +msgid "Group Removal" +msgstr "群組移除" -#: kmess.cpp:628 -#, fuzzy +#: kmess.cpp:634 msgctxt "dialog text" msgid "" -"Are you sure you want to remove the group %1from your contact " +"Are you sure you want to remove the group %1 from your contact " "list?" -msgstr "你確定要將%1群組從聯絡人清單中刪除嗎?" +msgstr "您確定要將群組 %1 從聯絡人清單中移除嗎?" -#: kmess.cpp:631 -#, fuzzy +#: kmess.cpp:637 msgctxt "dialog button" msgid "Remove" -msgstr "被移除" +msgstr "移除" -#: kmess.cpp:662 +#: kmess.cpp:668 msgid "This is a special group and can't be changed." msgstr "這是一個不可變更的特殊群組" -#: kmess.cpp:671 -msgid "Rename group" +#: kmess.cpp:677 +msgid "Rename Group" msgstr "重新命名群組" -#: kmess.cpp:743 +#: kmess.cpp:678 +msgid "Enter the new name for this group:" +msgstr "請輸入此群組的名稱:" + +#: kmess.cpp:754 msgctxt "dialog text" msgid "" "

Cannot login automatically with account \"%1\":
you must first " "save the account password!

" -msgstr "" +msgstr "

無法自動以帳號 %1 登入:
您必須先儲存密碼。

" -#: kmess.cpp:746 -#, fuzzy +#: kmess.cpp:757 msgctxt "dialog title" -msgid "Autologin failed" -msgstr "認證失敗" +msgid "Autologin Failed" +msgstr "自動登入失敗" -#: kmess.cpp:1078 +#: kmess.cpp:1053 +#, fuzzy +msgid "Connection could be down..." +msgstr "連線中..." + +#: kmess.cpp:1123 +msgctxt "Status bar message" msgid "Disconnected" msgstr "已斷線" -#: kmess.cpp:1408 -#, fuzzy +#: kmess.cpp:1463 +msgctxt "" +"Paragraph to be added to the text of a message dialog box, but only when KDE " +"gives a list of folders where to search for an application file" +msgid "

KMess has searched for it in the following folders:
%1

" +msgstr "

KMess 已搜尋了以下的資料夾:
%1

" + +#: kmess.cpp:1475 +msgctxt "" +"Text for a message dialog box; %1 is an explanation about the list of " +"folders where the file was searched for, which is only shown if any folders " +"are found" msgid "" -"

KMess will not be able to play sounds and notifications.

The " -"KMess file 'kmess.notifyrc' could not be found in one of the following " -"folders: %1

Please verify your installation, and copy the missing file " -"to one of the listed folders.

" +"

KMess will not be able to play sounds nor show notifications.

The required file 'kmess.notifyrc' could not be found in any " +"application folder.

%1

Please verify your installation.

" msgstr "" -"

KMess 將不會播放音效與提示。

KMess 檔案 'eventrc' 無法在下列任何" -"一個資料夾被找到:%1

請確認你的安裝,並複製失去的檔案至以下任何一個資料" -"夾。

" +"

KMess 無法播放音效或顯示通知。

因為在以下的路徑中找不到需要的" +"設定檔 kmess.notifyrc。

%1

請檢查您的安裝。

" -#: kmess.cpp:1412 -msgid "Error with notifications" -msgstr "提示錯誤" +#: kmess.cpp:1481 +msgctxt "Message box title" +msgid "Error With Notifications" +msgstr "通知的錯誤" -#: kmess.cpp:1589 -#, fuzzy -msgctxt "Main window caption" +#: kmess.cpp:1759 +msgctxt "" +"Main window caption: switched order to easily distinguish it from chats" msgid "KMess - %1" -msgstr "KMess" - -#: kmessinterface.cpp:151 -msgid "&Actions" -msgstr "操作(&A)" - -#: kmessinterface.cpp:154 -msgid "New &Contact" -msgstr "新增聯絡人(&C)" - -#: kmessinterface.cpp:155 -msgid "New &Group" -msgstr "新增群組(&G)" - -#: kmessinterface.cpp:156 -#, fuzzy -msgid "Search for Contact" -msgstr "搜尋聯絡人(&e)" - -#: kmessinterface.cpp:157 -msgid "Search by &Interest" -msgstr "依興趣搜尋(&I)" - -#: kmessinterface.cpp:159 -#, fuzzy -msgid "Search in Contact List" -msgstr "搜尋聯絡人(&e)" +msgstr "KMess ─ %1" #: kmessinterface.cpp:163 -msgid "New &Account" -msgstr "新增帳號(&A)" - -#: kmessinterface.cpp:164 -msgid "Configure &KMess" -msgstr "" - -#: kmessinterface.cpp:182 -msgid "Account &Settings" -msgstr "帳號設定(&S)" - -#: kmessinterface.cpp:213 -msgid "Co&nnect" -msgstr "連線(&n)" - -#: kmessinterface.cpp:214 msgid "&Disconnect" msgstr "斷線(&D)" -#: kmessinterface.cpp:215 +#: kmessinterface.cpp:164 msgid "Show My &Profile" msgstr "顯示我的帳號(&P)" -#: kmessinterface.cpp:216 -msgid "&My Status" -msgstr "我的狀態(&M)" - -#: kmessinterface.cpp:221 kmessview.cpp:261 -msgid "Away with auto-reply" -msgstr "離開,並自動回覆" - -#: kmessinterface.cpp:312 -msgid "&View" -msgstr "" - -#: kmessinterface.cpp:315 +#: kmessinterface.cpp:169 msgid "Show &Allowed Contacts" msgstr "顯示所有被允許的聯絡人(&A)" -#: kmessinterface.cpp:316 +#: kmessinterface.cpp:170 msgid "Show &Offline Contacts" msgstr "顯示離線的聯絡人(&O)" -#: kmessinterface.cpp:317 +#: kmessinterface.cpp:171 msgid "Show &Removed Contacts" msgstr "顯示被刪除的聯絡人(&R)" -#: kmessinterface.cpp:318 -#, fuzzy +#: kmessinterface.cpp:172 +msgid "Show &History Box" +msgstr "顯示歷史紀錄(&H)" + +#: kmessinterface.cpp:173 +msgid "&Show Search Bar" +msgstr "顯示搜尋列(&S)" + +#: kmessinterface.cpp:174 msgid "Show &Empty Groups" -msgstr "顯示表情符號(&E)" +msgstr "顯示空白的群組(&E)" -#: kmessinterface.cpp:321 -#, fuzzy -msgid "Display Pictures Size" -msgstr "顯示圖片" +#: kmessinterface.cpp:175 +msgid "&Display Pictures Size" +msgstr "顯示圖片大小(&D)" -#: kmessinterface.cpp:322 -msgid "Do not display" -msgstr "" - -#: kmessinterface.cpp:323 -#, fuzzy -msgid "Small" -msgstr "微笑" - -#: kmessinterface.cpp:324 -msgid "Medium" -msgstr "" - -#: kmessinterface.cpp:325 -msgid "Large" -msgstr "" - -#: kmessinterface.cpp:328 +#: kmessinterface.cpp:176 msgid "&Sort Contacts by" msgstr "以聯絡人的狀態排列(&S)" -#: kmessinterface.cpp:329 +#: kmessinterface.cpp:177 +#, fuzzy +msgid "Show &Transfer Window..." +msgstr "顯示檔案傳輸視窗(&T)" + +#: kmessinterface.cpp:182 +msgid "New &Contact..." +msgstr "新增聯絡人(&C)..." + +#: kmessinterface.cpp:183 +msgid "New &Group..." +msgstr "新增群組(&G)..." + +#: kmessinterface.cpp:184 +msgid "&Export Contact List..." +msgstr "匯出聯絡人清單(&E)..." + +#: kmessinterface.cpp:185 +msgid "Search for C&ontact" +msgstr "搜尋聯絡人(&O)" + +#: kmessinterface.cpp:186 +msgid "Search by &Interest" +msgstr "依興趣搜尋(&I)" + +#: kmessinterface.cpp:187 +#, fuzzy +msgid "Show Chat &History..." +msgstr "顯示聊天紀錄(H)" + +#: kmessinterface.cpp:188 +msgid "New &Account..." +msgstr "新增帳號(&A)..." + +#: kmessinterface.cpp:189 +msgid "Configure Account..." +msgstr "設定帳號..." + +#: kmessinterface.cpp:190 +msgid "Configure &KMess..." +msgstr "設定 KMess(&K)..." + +#: kmessinterface.cpp:191 +msgid "Show Selection &Menu" +msgstr "顯示選取選單(&M)" + +#: kmessinterface.cpp:194 +msgid "Do Not Display" +msgstr "不要顯示" + +#: kmessinterface.cpp:195 +msgid "Small" +msgstr "小" + +#: kmessinterface.cpp:196 +msgid "Medium" +msgstr "中" + +#: kmessinterface.cpp:197 +msgid "Large" +msgstr "大" + +#: kmessinterface.cpp:201 msgid "Group" msgstr "群組" -#: kmessinterface.cpp:330 +#: kmessinterface.cpp:202 msgid "Online/Offline" msgstr "上線/離線" -#: kmessinterface.cpp:331 +#: kmessinterface.cpp:203 msgid "Mixed" -msgstr "" +msgstr "混合" -#: kmessinterface.cpp:334 -msgid "Show &Transfer Window" -msgstr "顯示檔案傳輸視窗(&T)" +#: kmessinterface.cpp:299 +#, fuzzy +msgid "Show &Network Window..." +msgstr "顯示網路視窗(&N)" -#: kmessinterface.cpp:341 -msgid "Show &Network Window" -msgstr "顯示網絡視窗(&N)" - -#: kmessview.cpp:135 -msgid "Now listening to %1" -msgstr "正在聽 %1" - -#: kmessview.cpp:337 +#: kmessview.cpp:315 msgid "[%1] Logged with %2" -msgstr "" +msgstr "【%1】紀錄為 %2" -#: kmessview.cpp:358 +#: kmessview.cpp:352 msgid "[%1] %2 goes online" -msgstr "" +msgstr "【%1】%2 上線了" -#: kmessview.cpp:363 +#: kmessview.cpp:357 msgid "[%1] %2 goes offline" -msgstr "" +msgstr "【%1】%2 離線了" -#: kmessview.cpp:559 +#: kmessview.cpp:590 msgid "Cha&t" msgstr "交談(&t)" -#: kmessview.cpp:562 +#: kmessview.cpp:593 msgid "&Properties" msgstr "特性(&P)" -#: kmessview.cpp:569 -msgid "&Remove from group" +#: kmessview.cpp:600 +msgid "&Remove From Group" msgstr "從群組中刪除(&R)" -#: kmessview.cpp:574 -#, fuzzy -msgid "&Listening Music" -msgstr "正聆聽 %1" +#: kmessview.cpp:605 +msgid "Song &Name" +msgstr "歌曲名稱(&N)" -#: kmessview.cpp:601 +#: kmessview.cpp:632 msgid "&Copy to Group" msgstr "複製至群組(&C)" -#: kmessview.cpp:602 +#: kmessview.cpp:633 msgid "&Move to Group" msgstr "移至群組(&M)" -#: kmessview.cpp:646 +#: kmessview.cpp:683 msgid "Move Group &Down" msgstr "群組向下移(&D)" -#: kmessview.cpp:647 +#: kmessview.cpp:684 msgid "Move Group &Up" msgstr "群組向上移(&U)" -#: kmessview.cpp:648 +#: kmessview.cpp:685 msgid "Re&move Group" msgstr "移除此群組(&m)" -#: kmessview.cpp:649 +#: kmessview.cpp:686 msgid "Re&name Group" msgstr "重新命名此群組(&n)" -#: kmessview.cpp:1053 -#, fuzzy -msgctxt "Contact email in list tooltip" -msgid "Email: %1" -msgstr "Email" +#: kmessview.cpp:1124 +msgctxt "Message in list tooltip" +msgid "This person does not have you in his or her contact list." +msgstr "此人並未將您加入聯絡人清單" -#: kmessview.cpp:1059 -msgctxt "Contact MSN client in list tooltip" -msgid "Client: %1" -msgstr "" +#: kmessview.cpp:1133 +msgctxt "Contact email label in list tooltip" +msgid "Email address" +msgstr "電子郵件地址" -#: kmessview.cpp:1075 -msgctxt "Last time the contact was seen online" -msgid "Last seen: %1" -msgstr "" +#: kmessview.cpp:1140 +msgctxt "Contact MSN client label in list tooltip" +msgid "Client" +msgstr "客戶端程式" -#: kmessview.cpp:1076 -msgctxt "Last time a message was received" -msgid "Last message: %1" -msgstr "" +#: kmessview.cpp:1152 +msgid "Yes" +msgstr "是" -#: kmessview.cpp:1085 -#, fuzzy +#: kmessview.cpp:1156 +msgid "No" +msgstr "否" + +#: kmessview.cpp:1159 +msgctxt "Contact blocked status label in list tooltip" +msgid "Blocked" +msgstr "被封鎖" + +#: kmessview.cpp:1179 +msgctxt "Contact last presence label in list tooltip" +msgid "Last seen" +msgstr "上次看到" + +#: kmessview.cpp:1194 +msgctxt "Contact last message label in list tooltip" +msgid "Last message" +msgstr "上次發送訊息" + +#: kmessview.cpp:1204 msgctxt "Group name in group tooltip" msgid "Group %1" -msgstr "
%1 (%2)" +msgstr "群組 %1" -#: kmessview.cpp:1090 -#, fuzzy -msgctxt "Contacts count in special group tooltip" -msgid "%1 contacts" -msgstr "聯絡人" - -#: kmessview.cpp:1095 -#, fuzzy +#: kmessview.cpp:1212 msgctxt "Contacts counters in normal group tooltip" -msgid "%1 contacts, %2 online" -msgstr "此聯絡人未上線" +msgid "%1 contact, %2 online" +msgid_plural "%1 contacts, %2 online" +msgstr[0] "%1 個聯絡人,%2 個正在線上" -#: kmessview.cpp:1504 -#, fuzzy +#: kmessview.cpp:1219 +msgctxt "Contacts count in special group tooltip" +msgid "%1 contact" +msgid_plural "%1 contacts" +msgstr[0] "%1 個聯絡人" + +#: kmessview.cpp:1631 msgctxt "Default personal message shown in the contact list" msgid "<Enter your personal message here>" -msgstr "請在此輸入你的個人訊息" +msgstr "【請在此輸入您的個人訊息】" -#: kmessview.cpp:1770 +#: kmessview.cpp:1632 +msgctxt "Default personal message tooltip" +msgid "" +"Enter here a message to show to your contacts: they will see it along with " +"your friendly name" +msgstr "在此輸入要顯示給聯絡人看的訊息:他們會在你的暱稱旁看到。" + +#: kmessview.cpp:1968 msgid "%1 new email message" msgid_plural "%1 new email messages" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1 封新信件" -#: main.cpp:53 settings/accountpage.cpp:448 settings/accountpage.cpp:509 +#: kmessviewdelegate.cpp:148 +msgctxt "" +"Group name in the contact list with online/total contacts of that group" +msgid "%1 (%2/%3)" +msgstr "%1(%2/%3)" + +#: kmessviewdelegate.cpp:156 +msgctxt "Group name in the contact list with total contacts of that group" +msgid "%1 (%2)" +msgstr "%1(%2)" + +#: main.cpp:42 settings/accountpage.cpp:493 settings/accountpage.cpp:554 msgid "KMess" msgstr "KMess" -#: main.cpp:55 +#: main.cpp:44 msgid "A MSN Messenger client for KDE" -msgstr "" +msgstr "KDE 上的 MSN Messenger 客戶端程式" -#: main.cpp:70 +#: main.cpp:46 +msgid "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" +msgstr "" +"(c) 2002-2008, Mike K. Bennett\n" +"(c) 2005-2008, Diederik van der Boor\n" +"(c) 2007-2008, Valerio Pilo\n" +"(c) 2008, Antonio Nastasi\n" +"(c) 2008, Ruben Vandamme\n" + +#: main.cpp:60 +msgid "Mike K. Bennett" +msgstr "Mike K. Bennett" + +#: main.cpp:60 msgid "Developer and project founder" -msgstr "" +msgstr "開發者與專案發起者" -#: main.cpp:71 +#: main.cpp:61 +msgid "Michael Curtis" +msgstr "Michael Curtis" + +#: main.cpp:61 msgid "Developer" -msgstr "" +msgstr "開發者" -#: main.cpp:72 -#, fuzzy +#: main.cpp:62 main.cpp:69 +msgid "Jan Tönjes" +msgstr "Jan Tönjes" + +#: main.cpp:62 msgid "Project support" -msgstr "P4 內容文件支援" +msgstr "專案支援" -#: main.cpp:73 main.cpp:74 main.cpp:75 -#, fuzzy +#: main.cpp:63 main.cpp:95 +msgid "Diederik van der Boor" +msgstr "Diederik van der Boor" + +#: main.cpp:63 main.cpp:64 main.cpp:65 main.cpp:66 msgid "Current developer" -msgstr "GnomeMeeting 開發者" +msgstr "目前開發者" -#: main.cpp:78 +#: main.cpp:64 main.cpp:115 +msgid "Valerio Pilo" +msgstr "Valerio Pilo" + +#: main.cpp:65 +msgid "Antonio Nastasi" +msgstr "Antonio Nastasi" + +#: main.cpp:66 +msgid "Ruben Vandamme" +msgstr "Ruben Vandamme" + +#: main.cpp:69 msgid "" "German translation, testing, documentation, web master, project management, " "etc..." msgstr "德文翻譯,測試,文件和網站設計,計劃主持、、、等" -#: main.cpp:79 +#: main.cpp:70 +msgid "Dane Harnett" +msgstr "Dane Harnett" + +#: main.cpp:70 msgid "Web design" msgstr "網頁設計" -#: main.cpp:80 -msgid "The main and yellow/blue/violet emoticon sets and Italian translation" -msgstr "黃/藍/紫 色表情符號集和義大利文翻譯" +#: main.cpp:71 +msgid "David Vignoni" +msgstr "David Vignoni" -#: main.cpp:81 +#: main.cpp:71 +msgid "Main and yellow/blue/violet emoticon sets, Italian translation" +msgstr "主要的,以及黃/藍/紫色表情符號集,義大利文翻譯" + +#: main.cpp:72 +msgid "Julien Joubin" +msgstr "Julien Joubin" + +#: main.cpp:72 msgid "Cartoon emoticons" msgstr "卡通表情符號" -#: main.cpp:82 +#: main.cpp:73 +msgid "Christian Müller" +msgstr "Christian Müller" + +#: main.cpp:73 msgid "Default sound theme" msgstr "預設的音效主題" -#: main.cpp:83 -msgid "KMess icon in Oxygen style" -msgstr "" +#: main.cpp:74 +msgid "Michael Anderton" +msgstr "Michael Anderton" -#: main.cpp:87 +#: main.cpp:74 +msgid "KMess icon in Oxygen style" +msgstr "Oxygen 風格的 KMess 圖示" + +#: main.cpp:78 main.cpp:100 +msgid "Panagiotis Papadopoulos" +msgstr "Panagiotis Papadopoulos" + +#: main.cpp:78 +msgid "Translations Maintainer" +msgstr "翻譯維護者" + +#: main.cpp:79 +msgid "Mohamed Aser" +msgstr "Mohamed Aser" + +#: main.cpp:79 msgid "Arabic translation, internationalization of file saving fix." msgstr "阿拉伯文翻譯和文件保存國際化的修正" -#: main.cpp:88 +#: main.cpp:80 +msgid "Youssef Chahibi" +msgstr "Youssef Chahibi" + +#: main.cpp:80 msgid "More Arabic translation" msgstr "更多阿拉伯文翻譯" -#: main.cpp:89 +#: main.cpp:81 +msgid "Mauricio Rother" +msgstr "Mauricio Rother" + +#: main.cpp:81 msgid "Brazilian Portuguese translation" msgstr "巴西葡萄牙文翻譯" -#: main.cpp:90 +#: main.cpp:82 +msgid "Leonel Freire" +msgstr "Leonel Freire" + +#: main.cpp:82 main.cpp:83 +msgid "More Brazilian Portuguese translation" +msgstr "更多巴西、葡萄牙文翻譯" + +#: main.cpp:83 +msgid "Maurício Arozi Moraes" +msgstr "" + +#: main.cpp:84 +msgid "Jaume Cornadó" +msgstr "Jaume Cornadó" + +#: main.cpp:84 msgid "Catalan translation" msgstr "加泰隆尼亞文翻譯" -#: main.cpp:92 +#: main.cpp:86 +msgid "Lin Haoxiang" +msgstr "Lin Haoxiang" + +#: main.cpp:86 msgid "Simplified Chinese translation, file send bug fix, proxy connect code" msgstr "簡體中文翻譯,文件傳送臭蟲修復,代理連結程式。" -#: main.cpp:93 +#: main.cpp:87 main.cpp:144 +msgid "Liu Sizhuang" +msgstr "Liu Sizhuang" + +#: main.cpp:87 main.cpp:88 msgid "More Simplified Chinese translation" msgstr "更多的簡體中文翻譯" -#: main.cpp:94 +#: main.cpp:88 +msgid "Cheng Yang" +msgstr "Cheng Yang" + +#: main.cpp:89 +msgid "Yen-chou Chen" +msgstr "Yen-chou Chen" + +#: main.cpp:89 msgid "Traditional Chinese translation" msgstr "繁體中文翻譯" -#: main.cpp:96 +#: main.cpp:90 +msgid "Tryneeds-Chinese" +msgstr "Tryneeds-中文" + +#: main.cpp:90 +msgid "More Traditional Chinese translation" +msgstr "更多的繁體中文翻譯" + +#: main.cpp:92 +msgid "Lars Sommer" +msgstr "Lars Sommer" + +#: main.cpp:92 msgid "Danish translation" msgstr "丹麥文翻譯" -#: main.cpp:97 +#: main.cpp:93 +msgid "Pascal d'Hermilly" +msgstr "Pascal d'Hermilly" + +#: main.cpp:93 msgid "More Danish translation" msgstr "更多的丹麥文翻譯" -#: main.cpp:98 +#: main.cpp:94 +msgid "Arend van Beelen Jr." +msgstr "Arend van Beelen Jr." + +#: main.cpp:94 msgid "Dutch translation" msgstr "荷蘭文翻譯" -#: main.cpp:99 main.cpp:100 +#: main.cpp:95 main.cpp:96 main.cpp:97 main.cpp:98 msgid "More Dutch translation" msgstr "更多的荷蘭文翻譯" -#: main.cpp:102 +#: main.cpp:96 +msgid "Jaap Woldringh" +msgstr "Jaap Woldringh" + +#: main.cpp:97 +msgid "Elve" +msgstr "Elve" + +#: main.cpp:98 +msgid "Sander Pientka" +msgstr "Sander Pientka" + +#: main.cpp:100 +msgid "More German translation, Greek translation" +msgstr "更多德文翻譯、希臘文翻譯" + +#: main.cpp:101 +msgid "Dimitrios Glentadakis" +msgstr "Dimitrios Glentadakis" + +#: main.cpp:101 +msgid "More Greek translation" +msgstr "更多的希臘文翻譯" + +#: main.cpp:103 +msgid "Jyri Toomessoo" +msgstr "Jyri Toomessoo" + +#: main.cpp:103 msgid "Estonian translation" msgstr "愛沙尼亞文翻譯" -#: main.cpp:103 +#: main.cpp:104 +msgid "Markus Vuori" +msgstr "Markus Vuori" + +#: main.cpp:104 msgid "Finnish translation" msgstr "芬蘭文翻譯" -#: main.cpp:104 main.cpp:105 +#: main.cpp:105 +msgid "Joonas Niilola" +msgstr "Joonas Niilola" + +#: main.cpp:105 main.cpp:106 msgid "More Finnish translation" msgstr "更多的芬蘭文翻譯" -#: main.cpp:107 +#: main.cpp:106 +msgid "Jussi Timperi" +msgstr "Jussi Timperi" + +#: main.cpp:108 +msgid "Choplair" +msgstr "Choplair" + +#: main.cpp:108 msgid "French translation" msgstr "法文翻譯" -#: main.cpp:108 -msgid "More French translation, MSN6 emoticon definitions" -msgstr "更多法文翻譯,MSN6 表情圖示定義" +#: main.cpp:109 +msgid "Vincent Fretin" +msgstr "Vincent Fretin" #: main.cpp:109 +msgid "More French translation, MSN6 emoticon definitions" +msgstr "更多法文翻譯,MSN6 表情符號定義" + +#: main.cpp:110 +msgid "Andrea Blankenstijn" +msgstr "Andrea Blankenstijn" + +#: main.cpp:110 main.cpp:111 msgid "More French translation" msgstr "法文翻譯" #: main.cpp:111 +msgid "Barthe Guillaume" +msgstr "Barthe Guillaume" + +#: main.cpp:113 +msgid "Páder Rezső" +msgstr "Páder Rezső" + +#: main.cpp:113 msgid "Hungarian translation" msgstr "匈牙利文翻譯" -#: main.cpp:112 main.cpp:113 +#: main.cpp:114 +msgid "Pauli Henrik" +msgstr "Pauli Henrik" + +#: main.cpp:114 +msgid "More Hungarian translation" +msgstr "更多匈牙利文翻譯" + +#: main.cpp:115 main.cpp:116 msgid "More Italian translation" msgstr "更多的義大利文翻譯" -#: main.cpp:114 +#: main.cpp:116 +msgid "Vincenzo Reale" +msgstr "Vincenzo Reale" + +#: main.cpp:117 +msgid "Park Dong Cheon" +msgstr "Park Dong Cheon" + +#: main.cpp:117 msgid "Korean translation" msgstr "韓文翻譯" -#: main.cpp:115 +#: main.cpp:118 +msgid "Øyvind Sæther" +msgstr "Øyvind Sæther" + +#: main.cpp:118 msgid "Norsk Bokmål translation" msgstr "挪威文翻譯" -#: main.cpp:117 +#: main.cpp:120 +msgid "Zoran Milovanović" +msgstr "Zoran Milovanović" + +#: main.cpp:120 +msgid "Serbian translation" +msgstr "塞餌維亞文翻譯" + +#: main.cpp:122 +msgid "Rastislav Krupanský" +msgstr "Rastislav Krupanský" + +#: main.cpp:122 +msgid "Slovak translation" +msgstr "斯洛伐克文翻譯" + +#: main.cpp:123 +msgid "Matjaž kaše" +msgstr "Matjaž kaše" + +#: main.cpp:123 msgid "Slovenian translation" msgstr "斯洛維尼亞文翻譯" -#: main.cpp:118 +#: main.cpp:124 +msgid "Johanna Gersch" +msgstr "Johanna Gersch" + +#: main.cpp:124 msgid "Spanish translation" msgstr "西班牙文翻譯" -#: main.cpp:119 main.cpp:120 main.cpp:121 main.cpp:122 +#: main.cpp:125 +msgid "J.C.A. Javi" +msgstr "J.C.A. Javi" + +#: main.cpp:125 main.cpp:126 main.cpp:127 main.cpp:128 main.cpp:129 +#: main.cpp:130 msgid "More Spanish translation" msgstr "更多的西班牙文翻譯" -#: main.cpp:123 +#: main.cpp:126 +msgid "Alejandro Araiza Alvarado" +msgstr "Alejandro Araiza Alvarado" + +#: main.cpp:127 +msgid "Jaume Corbí" +msgstr "Jaume Corbí" + +#: main.cpp:128 +msgid "Christian Kaiser" +msgstr "Christian Kaiser" + +#: main.cpp:129 +msgid "Juan Pablo González Tognarelli" +msgstr "Juan Pablo González Tognarelli" + +#: main.cpp:130 +msgid "Alexis Daniel Medina Medina" +msgstr "Alexis Daniel Medina Medina" + +#: main.cpp:132 +msgid "Christian Lundgren" +msgstr "Christian Lundgren" + +#: main.cpp:132 msgid "Swedish translation" msgstr "瑞典文翻譯" -#: main.cpp:125 +#: main.cpp:133 +msgid "Mattias Newzella" +msgstr "Mattias Newzella" + +#: main.cpp:133 +msgid "More Swedish translation" +msgstr "更多的瑞典文翻譯" + +#: main.cpp:135 +msgid "Rachan Hongpairote" +msgstr "Rachan Hongpairote" + +#: main.cpp:135 msgid "Thai translation" msgstr "泰文翻譯" -#: main.cpp:126 +#: main.cpp:136 +msgid "Gorkem Cetin" +msgstr "Gorkem Cetin" + +#: main.cpp:136 msgid "Turkish translation" msgstr "土耳其文翻譯" -#: main.cpp:127 main.cpp:128 +#: main.cpp:137 +msgid "Barbaros Ulutas" +msgstr "Barbaros Ulutas" + +#: main.cpp:137 main.cpp:138 msgid "More Turkish translation" msgstr "更多土耳其文翻譯" -#: main.cpp:131 -msgid "MSNP12 support, various patches." -msgstr "" +#: main.cpp:138 +msgid "Uğur Çetin" +msgstr "Uğur Çetin" -#: main.cpp:132 +#: main.cpp:141 +msgid "Richard Conway" +msgstr "Richard Conway" + +#: main.cpp:141 +msgid "MSNP12 support, various patches" +msgstr "MSNP12 支援,多個程式修補" + +#: main.cpp:142 +msgid "Guido Solinas" +msgstr "Guido Solinas" + +#: main.cpp:142 msgid "Pictures in contact list code, contact client info, chat font zoom" -msgstr "" +msgstr "顯示聯絡人清單中的圖片的程式碼,聯絡人客戶端資訊,聊天室字體縮放" -#: main.cpp:133 -#, fuzzy +#: main.cpp:143 +msgid "Pedro Ferreira" +msgstr "Pedro Ferreira" + +#: main.cpp:143 msgid "File transfer thumbnails" -msgstr "檔案傳輸" +msgstr "檔案傳輸縮圖" -#: main.cpp:134 +#: main.cpp:144 msgid "P4-Context field support" msgstr "P4 內容文件支援" -#: main.cpp:135 +#: main.cpp:145 +msgid "Scott Morgan" +msgstr "Scott Morgan" + +#: main.cpp:145 msgid "Xinerama fixes" msgstr "Xinerama的修正" -#: main.cpp:136 +#: main.cpp:146 +msgid "Laurence Anderson" +msgstr "Laurence Anderson" + +#: main.cpp:146 msgid "Original file receive code" msgstr "原始的檔案接收程式碼" -#: main.cpp:137 -msgid "" -"Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock" -msgstr "" +#: main.cpp:147 +msgid "Matteo Nardi" +msgstr "Matteo Nardi" -#: main.cpp:138 -#, fuzzy +#: main.cpp:147 msgid "KWallet support" -msgstr "P4 內容文件支援" +msgstr "KWallet 支援" -#: main.cpp:139 +#: main.cpp:148 +msgid "Adam Goossens" +msgstr "Adam Goossens" + +#: main.cpp:148 msgid "" -"Notifications blocking option,winks disabling option,last message date " +"Notifications blocking option, winks disabling option, last message date " "feature" -msgstr "" +msgstr "通知阻擋選項,動畫快遞關閉選項,上次訊息日期功能" -#: main.cpp:142 -#, fuzzy +#: main.cpp:149 +msgid "Sjors Gielen" +msgstr "Sjors Gielen" + +#: main.cpp:149 +msgid "IRC-like commands in the chat window" +msgstr "在聊天視窗中加入類似 IRC 指令的功能" + +#: main.cpp:150 +msgid "Andrea Decorte" +msgstr "Andrea Decorte" + +#: main.cpp:150 +msgid "Group selection in 'contact added user' dialog" +msgstr "在「聯絡人新增使用者」對話框中加入群組選擇" + +#: main.cpp:151 +msgid "Dario Freddi" +msgstr "Dario Freddi" + +#: main.cpp:151 +msgid "Chat history dialog" +msgstr "聊天歷史紀錄" + +#: main.cpp:154 +msgid "Alexandre Peixoto Ferreira" +msgstr "Alexandre Peixoto Ferreira" + +#: main.cpp:154 msgid "Various internationalization fixes" -msgstr "各國際化的修正" +msgstr "多種國際化的修正" -#: main.cpp:143 +#: main.cpp:155 +msgid "Choe Hwanjin" +msgstr "Choe Hwanjin" + +#: main.cpp:155 msgid "Various internationalization fixes." msgstr "各國際化的修正" -#: main.cpp:145 +#: main.cpp:157 +msgid "Damien Sandras" +msgstr "Damien Sandras" + +#: main.cpp:157 msgid "GnomeMeeting developer" msgstr "GnomeMeeting 開發者" -#: main.cpp:146 +#: main.cpp:158 +msgid "Tobias Tönjes" +msgstr "Tobias Tönjes" + +#: main.cpp:158 msgid "Guy with a bag over his head" -msgstr "一個頭上有袋子的人(?)" +msgstr "頭上頂著個包包的人" -#: main.cpp:149 +#: main.cpp:161 +msgid "KMerlin (kmerlin.olsd.de)" +msgstr "KMerlin (kmerlin.olsd.de)" + +#: main.cpp:161 msgid "Inspiration and assorted code" -msgstr "整理程式碼與鼓舞(?)" +msgstr "整理程式碼,給大家打氣" -#: main.cpp:150 +#: main.cpp:162 +msgid "Kopete (kopete.kde.org)" +msgstr "Kopete (kopete.kde.org)" + +#: main.cpp:162 msgid "Old popup balloons code, initial p2p code, msn challenge handler" -msgstr "就彈出氣泡程式碼,最初的 p2p 程式碼,msn 挑戰領頭者" +msgstr "舊的彈出式泡泡程式碼,初始的 p2p 程式碼,MSN 挑戰處理器" -#: main.cpp:151 +#: main.cpp:163 +msgid "KScreensaver" +msgstr "KScreensaver" + +#: main.cpp:163 msgid "Idle timer code" msgstr "閒置計時器程式碼" -#: main.cpp:152 +#: main.cpp:164 +msgid "BasKet" +msgstr "BasKet" + +#: main.cpp:164 msgid "Close-to-tray icon screenshot code" -msgstr "" +msgstr "關閉到系統匣的圖示快照程式碼" -#: main.cpp:153 +#: main.cpp:165 +msgid "Amarok" +msgstr "Amarok" + +#: main.cpp:165 msgid "Custom crash handler implementation" -msgstr "" +msgstr "自訂的程式錯誤處理器實作" -#: main.cpp:156 +#: main.cpp:168 msgid "Your name here?" -msgstr "你的名稱?" +msgstr "還有您!" -#: main.cpp:156 -#, fuzzy +#: main.cpp:168 msgid "" "You are welcome to send bugfixes and patches to the KMess help forums!\n" "If you feel your name is missing here, please contact us too!" msgstr "" -"很歡迎你的臭蟲修復與補丁至 KMess 幫助討論區!\n" -"如果你覺得你的名字遺漏了,也請連絡我們!" +"我們歡迎您傳送錯誤修正到 KMess 討論區!\n" +"若您希望將您的名字列在這裡,歡迎與我們聯絡!" -#: main.cpp:159 -#, fuzzy +#: main.cpp:171 msgctxt "NAME OF TRANSLATORS" msgid "Your names" -msgstr "你的名稱" +msgstr "Tryneeds-Chinese 翻譯平台 http://tryneeds.westart.tw/" -#: main.cpp:160 -#, fuzzy +#: main.cpp:172 msgctxt "EMAIL OF TRANSLATORS" msgid "Your emails" -msgstr "您的電子郵件:" +msgstr "tryneeds@gmail.com" -#: main.cpp:166 +#: main.cpp:178 +msgid "Do not show the Contact List window initially" +msgstr "不要在初始時顯示聯絡人清單視窗" + +#: main.cpp:179 msgid "Autologin with the given email address" msgstr "以給定的電子郵件自動登入" -#: main.cpp:171 +#: main.cpp:184 msgid "Run a debug test (developer build only)" -msgstr "" +msgstr "執行除錯測試〈只在開發者模式〉" + +#: model/contactlist.cpp:1503 +msgid "Individuals" +msgstr "個人" + +#: model/contactlist.cpp:1506 +msgid "Allowed" +msgstr "被允許" + +#: model/contactlist.cpp:1507 +msgid "Removed" +msgstr "被移除" #: network/applications/application.cpp:294 -#: network/extra/msnftpconnection.cpp:126 -#: network/extra/msnftpconnection.cpp:127 msgid "The contact cancelled the session." -msgstr "聯絡人取消了程序" +msgstr "聯絡人取消了此工作階段。" #: network/applications/application.cpp:306 msgid "The contact rejected the invitation." @@ -2996,69 +4303,107 @@ msgstr "聯絡人拒絕了邀請" #: network/applications/application.cpp:378 msgid "You have cancelled the session." -msgstr "你取消了程序" +msgstr "您取消了此工作階段。" #: network/applications/application.cpp:390 msgid "You have rejected the invitation." -msgstr "你拒絕了邀請" +msgstr "您拒絕了此邀請。" #: network/applications/application.cpp:540 -#, fuzzy -msgid "Do you want to accept or cancel?" -msgstr "你想要 接受取消?" +msgid "Do you want to accept or cancel?" +msgstr "您要接受取消?" #: network/applications/application.cpp:581 -#, fuzzy -msgid "Click to cancel." -msgstr "點選 以取消" +msgid "Click to cancel." +msgstr "點選此處以取消。" -#: network/applications/filetransfer.cpp:134 -msgid "Do you want to accept the file: %1 (%2)" -msgstr "你想要接收此檔案:%1 (%2)" +#: network/applications/filetransfer.cpp:167 +#: network/applications/filetransferp2p.cpp:233 +msgid "The contact wants to send you a file: "%1" (%2)." +msgstr "此聯絡人打算傳送一個檔案給您:%1(%2)" -#: network/applications/filetransfer.cpp:221 -msgid "The transfer of %1 failed. Couldn't open file." -msgstr "%1 的傳輸失敗。無法開啟檔案。" +#: network/applications/filetransfer.cpp:260 +#: network/applications/filetransferp2p.cpp:346 +msgid "" +"The file "%1" already exists.\n" +"do you want to overwrite it?" +msgstr "" +"檔案 %1 已存在。\n" +"您要覆寫它嗎?" -#: network/applications/filetransfer.cpp:238 -#: network/applications/filetransfer.cpp:672 +#: network/applications/filetransfer.cpp:290 +#: network/applications/filetransferp2p.cpp:376 +msgid "The transfer of file "%1" failed. Couldn't save the file." +msgstr "檔案 %1 傳輸失敗。無法儲存檔案。" + +#: network/applications/filetransfer.cpp:295 +msgid "The transfer of %1 failed. Couldn't open the destination file." +msgstr "%1 的傳輸失敗。無法開啟目的檔。" + +#: network/applications/filetransfer.cpp:319 msgid "Transfer accepted." msgstr "傳送被接受" -#: network/applications/filetransfer.cpp:319 -#: network/applications/p2papplication.cpp:2340 -#: network/applications/p2papplication.cpp:2361 +#: network/applications/filetransfer.cpp:399 +#: network/applications/p2papplication.cpp:2372 +#: network/applications/p2papplication.cpp:2393 msgid "Connecting to %1, port %2" -msgstr "連線到 %1,port %2" +msgstr "連線到 %1,連接埠 %2" -#: network/applications/filetransfer.cpp:339 -msgid "The transfer was cancelled" -msgstr "傳輸取消" +#: network/applications/filetransfer.cpp:421 +#: network/applications/filetransferp2p.cpp:549 +#: network/extra/msnftpconnection.cpp:126 +msgid "The contact has cancelled the transfer of file "%1"." +msgstr "聯絡人取消的檔案 %1 的傳輸。" -#: network/applications/filetransfer.cpp:386 +#: network/applications/filetransfer.cpp:432 +#: network/applications/filetransferp2p.cpp:560 +#: network/extra/msnftpconnection.cpp:120 +msgid "You have cancelled the transfer of file "%1"." +msgstr "您取消的檔案 %1 的傳輸。" + +#: network/applications/filetransfer.cpp:443 +#: network/applications/filetransferp2p.cpp:571 +msgid "You have rejected the transfer of file "%1"." +msgstr "您拒絕了檔案 %1 的傳輸。" + +#: network/applications/filetransfer.cpp:490 msgid "Connection established" msgstr "連線已建立" -#: network/applications/filetransfer.cpp:456 -msgid "Successfully transferred file: %1" -msgstr "成功地傳送了檔案:%1" +#: network/applications/filetransfer.cpp:581 +#: network/applications/filetransferp2p.cpp:675 +msgid "Successfully sent file "%1"." +msgstr "成功地傳送了檔案 %1。" -#: network/applications/filetransfer.cpp:620 -msgid "The transfer of %1 failed. The file does not exist." -msgstr "%1傳輸失敗。檔案不存在。" +#: network/applications/filetransfer.cpp:585 +#: network/applications/filetransferp2p.cpp:679 +msgid "Successfully received file "%1"." +msgstr "成功地接收了檔案 %1。" -#: network/applications/filetransfer.cpp:624 -msgid "The transfer of %1 failed. The file could not be read." -msgstr "%1 的傳輸失敗。無法讀取檔案。" +#: network/applications/filetransfer.cpp:742 +#: network/applications/filetransferp2p.cpp:812 +msgid "The transfer of file "%1" failed. The file does not exist." +msgstr "檔案 %1 傳輸失敗。檔案不存在。" -#: network/applications/filetransfer.cpp:649 -#: network/extra/msnftpconnection.cpp:204 -msgid "Sending file %1" -msgstr "傳送檔案 %1" +#: network/applications/filetransfer.cpp:747 +#: network/applications/filetransferp2p.cpp:817 +msgid "The transfer of file "%1" failed. The file could not be read." +msgstr "檔案 %1 的傳輸失敗。無法讀取檔案。" -#: network/applications/filetransfer.cpp:689 -#: network/applications/filetransferp2p.cpp:395 -#: network/applications/p2papplication.cpp:3161 +#: network/applications/filetransfer.cpp:774 +#: network/applications/filetransferp2p.cpp:851 +msgid "Sending file "%1" (%2)." +msgstr "傳送檔案 %1 中(%2)。" + +#: network/applications/filetransfer.cpp:799 +#: network/applications/filetransferp2p.cpp:889 +msgid "The contact has accepted the transfer of file "%1"." +msgstr "聯絡人接受了檔案 %1 的傳輸。" + +#: network/applications/filetransfer.cpp:817 +#: network/applications/filetransferp2p.cpp:393 +#: network/applications/p2papplication.cpp:3214 msgid "Negotiating options to connect" msgstr "談判連結的選項" @@ -3069,75 +4414,17 @@ msgstr "談判連結的選項" msgid "The file transfer invitation was cancelled. Bad data was received." msgstr "檔案傳輸的邀請被取消。收到了不好的資料。" -#: network/applications/filetransferp2p.cpp:233 -msgid "The contact wants to send you a file: "%1" (%2)." -msgstr "" - -#: network/applications/filetransferp2p.cpp:348 -#, fuzzy -msgid "" -"The file "%1" already exists.\n" -"do you want to overwrite it?" -msgstr "" -"檔案 %1 已經存在。\n" -"你想要覆寫它嗎?" - -#: network/applications/filetransferp2p.cpp:378 -#, fuzzy -msgid "The transfer of file "%1" failed. Couldn't save the file." -msgstr "%1 的傳輸失敗。無法開啟檔案。" - -#: network/applications/filetransferp2p.cpp:406 +#: network/applications/filetransferp2p.cpp:404 msgid "You have accepted the transfer of file "%1"." -msgstr "" +msgstr "您接受了檔案 %1 的傳輸。" -#: network/applications/filetransferp2p.cpp:561 -#, fuzzy -msgid "The contact has cancelled the transfer of file "%1"." -msgstr "聯絡人取消了傳輸" - -#: network/applications/filetransferp2p.cpp:572 -#, fuzzy -msgid "You have cancelled the transfer of file "%1"." -msgstr "你取消了程序" - -#: network/applications/filetransferp2p.cpp:616 +#: network/applications/filetransferp2p.cpp:615 msgid "File could not be written" msgstr "無法寫入檔案" -#: network/applications/filetransferp2p.cpp:676 -#, fuzzy -msgid "Successfully sent file "%1"." -msgstr "成功地傳送了檔案:%1" - -#: network/applications/filetransferp2p.cpp:680 -#, fuzzy -msgid "Successfully received file "%1"." -msgstr "成功地傳送了檔案:%1" - -#: network/applications/filetransferp2p.cpp:813 -#, fuzzy -msgid "The transfer of file "%1" failed. The file does not exist." -msgstr "%1傳輸失敗。檔案不存在。" - -#: network/applications/filetransferp2p.cpp:818 -#, fuzzy -msgid "The transfer of file "%1" failed. The file could not be read." -msgstr "%1 的傳輸失敗。無法讀取檔案。" - -#: network/applications/filetransferp2p.cpp:855 -#, fuzzy -msgid "Sending file "%1" (%2)." -msgstr "傳送檔案 %1 (%2)" - -#: network/applications/filetransferp2p.cpp:893 -#, fuzzy -msgid "The contact has accepted the transfer of file "%1"." -msgstr "聯絡人取消了傳輸" - #: network/applications/gnomemeeting.cpp:56 msgid "You are invited to start a meeting (using GnomeMeeting)." -msgstr "有人邀請你加入一個會談(使用 GnomeMeeting)" +msgstr "您被邀請參加一個會議(使用 GnomeMeeting)" #: network/applications/gnomemeeting.cpp:118 msgid "Starting GnomeMeeting. Connecting to %1." @@ -3147,142 +4434,142 @@ msgstr "啟動 GnomeMeeting。連線到 %1" msgid "Inviting the contact to a meeting." msgstr "邀請此聯絡人加入會談" -#: network/applications/mimeapplication.cpp:112 +#: network/applications/mimeapplication.cpp:154 msgid "The invitation was rejected. It's not supported by the other client." msgstr "邀請被拒絕。這不被其他用戶端軟體支援。" -#: network/applications/mimeapplication.cpp:122 +#: network/applications/mimeapplication.cpp:164 msgid "The invitation was aborted. An internal error occured." msgstr "邀請取消。發生一個內部錯誤" -#: network/applications/mimeapplication.cpp:128 +#: network/applications/mimeapplication.cpp:170 msgid "The invitation was aborted. Timeout while waiting for user to accept." msgstr "邀請取消。等候使用者接受逾時" -#: network/applications/mimeapplication.cpp:133 +#: network/applications/mimeapplication.cpp:175 msgid "The invitation was aborted. Timeout while waiting for file data." msgstr "邀請取消。等候檔案資料逾時" -#: network/applications/mimeapplication.cpp:138 +#: network/applications/mimeapplication.cpp:180 msgid "" "The invitation was aborted. The switchboard closed the chat connection." msgstr "邀請取消。交換器關閉此連線。" -#: network/applications/mimeapplication.cpp:144 +#: network/applications/mimeapplication.cpp:186 msgid "The invitation was aborted." msgstr "邀請取消" #: network/applications/msnremotedesktop.cpp:52 msgid "You are invited to share this person's desktop." -msgstr "有人邀請你分享他的桌面" +msgstr "您被邀請分享此人的桌面。" #: network/applications/msnremotedesktop.cpp:159 msgid "Starting KRDC. Connecting to %1." msgstr "啟動 KRDC。連線到 %1" -#: network/applications/p2papplicationbase.cpp:602 -#: network/applications/p2papplicationbase.cpp:1011 -#: network/applications/p2papplication.cpp:1780 -#: network/applications/p2papplication.cpp:1797 -#: network/applications/p2papplication.cpp:1828 -msgid "The contact rejected the invitation. An internal error occured." -msgstr "聯絡人拒絕邀請。發生一個內部錯誤。" +#: network/applications/p2papplication.cpp:215 +msgid "The contact initiated a MSN6 feature KMess can't handle yet." +msgstr "此聯絡人使用了一個 KMess 無法處理的 MSN6 特色" -#: network/applications/p2papplicationbase.cpp:609 -msgid "The transfer failed." -msgstr "傳輸失敗" - -#: network/applications/p2papplicationbase.cpp:687 -#: network/applications/p2papplication.cpp:511 -#: network/applications/p2papplication.cpp:679 -#: network/applications/p2papplication.cpp:1228 -#: network/applications/p2papplication.cpp:1609 -#: network/applications/p2papplication.cpp:1735 -#: network/applications/p2papplication.cpp:1854 +#: network/applications/p2papplication.cpp:520 +#: network/applications/p2papplication.cpp:686 +#: network/applications/p2papplication.cpp:1241 +#: network/applications/p2papplication.cpp:1636 +#: network/applications/p2papplication.cpp:1762 +#: network/applications/p2papplication.cpp:1886 +#: network/applications/p2papplicationbase.cpp:846 msgid "" "The invitation was cancelled. The contact sent bad data, or KMess doesn't " "support it." msgstr "邀請被取消。聯絡人傳送了錯誤的資料,或 KMess 不支援它" -#: network/applications/p2papplicationbase.cpp:835 -#: network/applications/p2papplicationbase.cpp:901 -msgid "" -"The transfer failed. The contact sent bad data, or KMess doesn't support it." -msgstr "傳輸失敗。聯絡人傳送了錯誤的資料,或 KMess 不支援" - -#: network/applications/p2papplicationbase.cpp:996 -msgid "The transfer failed. Timeout while waiting for user to accept." -msgstr "傳輸失敗。等候使用者接受逾時" - -#: network/applications/p2papplicationbase.cpp:1015 -msgid "The transfer failed. An internal error occured." -msgstr "傳輸失敗。發生一個內部錯誤" - -#: network/applications/p2papplicationbase.cpp:1176 -msgid "The transfer failed. Couldn't open data source." -msgstr "傳輸失敗。無法開啟資料來源。" - -#: network/applications/p2papplication.cpp:215 -msgid "The contact initiated a MSN6 feature KMess can't handle yet." -msgstr "此聯絡人使用了一個 KMess 無法處理的 MSN6 特色" - -#: network/applications/p2papplication.cpp:1071 +#: network/applications/p2papplication.cpp:1084 msgid "The transfer failed. Data preparation failed." msgstr "傳輸失敗。資料準備失敗" -#: network/applications/p2papplication.cpp:1178 +#: network/applications/p2papplication.cpp:1191 msgid "The invitation was cancelled. Message was not directed to us." -msgstr "邀請被取消。訊息並不指向我們。" +msgstr "邀請被取消。訊息並未導向到我們。" -#: network/applications/p2papplication.cpp:1716 +#: network/applications/p2papplication.cpp:1743 msgid "" "The transfer failed. The contact sent bad data, or KMess doesn't support it." msgstr "傳輸失敗。聯絡人傳送了錯誤的資料,或 KMess 不支援" -#: network/applications/p2papplication.cpp:2068 -#: network/extra/msnftpconnection.cpp:398 -msgid "Awaiting connection at %1, port %2" -msgstr "等候%1 port %2 的連線" +#: network/applications/p2papplication.cpp:1809 +#: network/applications/p2papplication.cpp:1827 +#: network/applications/p2papplication.cpp:1859 +#: network/applications/p2papplicationbase.cpp:762 +#: network/applications/p2papplicationbase.cpp:1185 +msgid "The contact rejected the invitation. An internal error occured." +msgstr "聯絡人拒絕邀請。發生一個內部錯誤。" -#: network/applications/p2papplication.cpp:2111 -#: network/applications/p2papplication.cpp:3322 +#: network/applications/p2papplication.cpp:2100 +#: network/extra/msnftpconnection.cpp:389 +msgid "Awaiting connection at %1, port %2" +msgstr "等待 %1,連接埠 %2 的連結" + +#: network/applications/p2papplication.cpp:2143 +#: network/applications/p2papplication.cpp:3375 msgid "Reverting to indirect file transfer (this could be slow)." msgstr "轉回成非直接傳輸(這有可能會慢)" -#: network/applications/p2papplication.cpp:3113 +#: network/applications/p2papplication.cpp:3166 msgid "Waiting for connection" msgstr "等候連線" -#: network/applications/p2papplication.cpp:3364 +#: network/applications/p2papplication.cpp:3420 msgid "" "The invitation was cancelled. A timeout occured waiting for the contact to " "accept." msgstr "邀請取消。等候聯絡人接受逾時。" -#: network/applications/p2papplication.cpp:3373 +#: network/applications/p2papplication.cpp:3429 msgid "" "The invitation was cancelled. A timeout occured waiting for a connection to " "succeed or fail." msgstr "邀請取消。等候連線 成功/失敗 逾時。" -#: network/applications/p2papplication.cpp:3440 -#: network/applications/p2papplication.cpp:3524 +#: network/applications/p2papplication.cpp:3496 +#: network/applications/p2papplication.cpp:3580 msgid "The invitation was cancelled. A timeout occured waiting for data." msgstr "邀請取消。等候資料逾時。" +#: network/applications/p2papplicationbase.cpp:769 +msgid "The transfer failed." +msgstr "傳輸失敗" + +#: network/applications/p2papplicationbase.cpp:995 +#: network/applications/p2papplicationbase.cpp:1075 +msgid "" +"The transfer failed. The contact sent bad data, or KMess doesn't support it." +msgstr "傳輸失敗。聯絡人傳送了錯誤的資料,或 KMess 不支援" + +#: network/applications/p2papplicationbase.cpp:1170 +msgid "The transfer failed. Timeout while waiting for user to accept." +msgstr "傳輸失敗。等候使用者接受逾時" + +#: network/applications/p2papplicationbase.cpp:1189 +msgid "The transfer failed. An internal error occured." +msgstr "傳輸失敗。發生一個內部錯誤" + +#: network/applications/p2papplicationbase.cpp:1350 +msgid "The transfer failed. Couldn't open data source." +msgstr "傳輸失敗。無法開啟資料來源。" + #: network/applications/voiceconversation.cpp:71 msgid "You are invited to start a voice conversation." -msgstr "你被邀請一個語音交談" +msgstr "您被邀請加入一個語音交談。" #: network/applications/voiceconversation.cpp:76 msgid "" "You are invited to start a voice conversation but support for this was not " "installed" -msgstr "你被邀請了語音交談,但是此支援並未被安裝" +msgstr "您被邀請加入語音交談,但是並未安裝語音支援" #: network/applications/voiceconversation.cpp:168 msgid "You have cancelled the voice conversation." -msgstr "你取消了語音交談。" +msgstr "您取消了此語音交談。" #: network/applications/voiceconversation.cpp:205 msgid "The invitation was cancelled. The audio device couldn't be opened." @@ -3300,1020 +4587,1139 @@ msgstr "啟動語音交談。聆聽 %1" msgid "Inviting the contact to a voice conversation." msgstr "邀請聯絡人至語音交談" -#: network/applications/webapplicationp2p.cpp:103 -#: network/applications/webcamtransferp2p.cpp:88 +#: network/applications/webapplicationp2p.cpp:101 +#: network/applications/webcamtransferp2p.cpp:146 msgid "The contact is inviting you for '%1', but this is not implemented yet." -msgstr "聯絡人邀請你 '%'1,但此功能還未被開發" +msgstr "聯絡人邀請您 '%'1,但此功能還未被開發" -#: network/applications/webcamtransferp2p.cpp:89 +#: network/applications/webcamtransferp2p.cpp:113 +msgid "The webcam invitation was cancelled. Bad data was received." +msgstr "檔案傳輸的邀請被取消。收到了不好的資料。" + +#: network/applications/webcamtransferp2p.cpp:134 +msgid "You are asked to show your webcam." +msgstr "您被要求顯示您的網路視訊。" + +#: network/applications/webcamtransferp2p.cpp:138 +msgid "You are invited to view this person's webcam." +msgstr "有人邀請您分享他的桌面" + +#: network/applications/webcamtransferp2p.cpp:147 msgid "webcam" -msgstr "" - -#: network/extra/msnftpconnection.cpp:119 -msgid "The transfer of %1 was cancelled." -msgstr "%1 的傳輸取消" +msgstr "網路攝影機" #: network/extra/msnftpconnection.cpp:133 msgid "Failed" msgstr "失敗" -#: network/extra/msnftpconnection.cpp:407 -msgid "The transfer of %1 failed. Couldn't open a local port." -msgstr "%1 的傳輸失敗。無法開啟本地端 port。" +#: network/extra/msnftpconnection.cpp:204 +msgid "Sending file %1" +msgstr "傳送檔案 %1" -#: network/extra/msnftpconnection.cpp:408 +#: network/extra/msnftpconnection.cpp:398 +msgid "The transfer of %1 failed. Couldn't open a local port." +msgstr "%1 的傳輸失敗。無法開啟本地端連接埠。" + +#: network/extra/msnftpconnection.cpp:399 msgid "Couldn't open a local port." -msgstr "無法開啟本地端 port。" +msgstr "無法開啟本地端連接埠。" -#: network/extra/msnftpconnection.cpp:465 +#: network/extra/msnftpconnection.cpp:456 msgid "Initiating file transfer" msgstr "初始化檔案傳輸" -#: network/extra/msnftpconnection.cpp:478 -msgid "The transfer of %1 failed. A connection could not be made" +#: network/extra/msnftpconnection.cpp:469 +msgid "The transfer of %1 failed. A connection could not be made." msgstr "%1 的傳輸失敗。無法建立連線。" -#: network/extra/msnftpconnection.cpp:479 +#: network/extra/msnftpconnection.cpp:470 msgid "Unable to make a connection." msgstr "無法建立連結" -#: network/extra/msnftpconnection.cpp:583 +#: network/extra/msnftpconnection.cpp:574 msgid "Receiving file %1" msgstr "正接收檔案 %1" -#: network/msnconnection.cpp:589 -#, fuzzy -msgid "KMess could not access the remote webservice.
Details: %1" -msgstr "" -"KMess 無法進行遠端服務。\n" -"\n" -"細節:%1" - -#: network/msnnotificationconnection.cpp:1317 -#, fuzzy -msgid "" -"

You have been disconnected!

You connected with this account from " -"another Messenger client, or from another location.

" -msgstr "" -"你已經被斷線了,\n" -"因為你已經用另一個 MSN Messenger \n" -"或從另一個地方登入" - -#: network/msnnotificationconnection.cpp:1532 -msgid "Got synchronization" -msgstr "已同步" - -#: network/msnnotificationconnection.cpp:1670 -#, fuzzy -msgid "Authenticating..." -msgstr "認證中" - -#: network/msnnotificationconnection.cpp:1719 -msgid "Waiting for contact list..." -msgstr "等候使用者名單" - -#: network/msnnotificationconnection.cpp:1791 -msgid "Switching to another server..." -msgstr "" - -#: network/msnnotificationconnection.cpp:1894 -#, fuzzy -msgid "Authentication failed, please verify your account name and password." -msgstr "認證失敗,請確認您的帳號和密碼" - -#: network/msnnotificationconnection.cpp:1993 -msgid "Connecting..." -msgstr "連線中..." - -#: network/msnnotificationconnection.cpp:2167 -#, fuzzy -msgid "Unknown command received from the server: %1" -msgstr "KMess 從伺服器收到一個未知的錯誤訊息:%1" - -#: network/msnnotificationconnection.cpp:2192 +#: network/msnconnection.cpp:385 msgid "Invalid command syntax" -msgstr "" +msgstr "不合法的指令語法" -#: network/msnnotificationconnection.cpp:2196 +#: network/msnconnection.cpp:389 msgid "Invalid command parameter" -msgstr "" +msgstr "不合法的指令參數" -#: network/msnnotificationconnection.cpp:2199 +#: network/msnconnection.cpp:392 msgid "The email you have tried to add is not a MSN Messenger account" -msgstr "你加入的 email 不是一個 MSN Messenger 帳號" +msgstr "您試著加入的電子郵件地址不是 MSN Messenger 的帳號" -#: network/msnnotificationconnection.cpp:2204 +#: network/msnconnection.cpp:397 msgid "Domain name missing" -msgstr "" +msgstr "沒有網域名稱" -#: network/msnnotificationconnection.cpp:2208 +#: network/msnconnection.cpp:401 msgid "Already logged in" -msgstr "" +msgstr "已登入" -#: network/msnnotificationconnection.cpp:2211 -msgid "The account name given is invalid" -msgstr "帳號無效" +#: network/msnconnection.cpp:404 +msgid "The given account name is invalid" +msgstr "給定的帳號不合法" -#: network/msnnotificationconnection.cpp:2215 +#: network/msnconnection.cpp:408 msgid "" -"That account name is invalid, or your passport has not been confirmed yet" -msgstr "帳號無效,或您的 passport 還未認證過" +"That account name is invalid, or your Passport account has not been " +"confirmed yet" +msgstr "帳號名稱不合法,或是您的 Passport 帳號尚未確認。" -#: network/msnnotificationconnection.cpp:2218 +#: network/msnconnection.cpp:411 msgid "Your contact list is full" msgstr "您的使用者名單已滿" -#: network/msnnotificationconnection.cpp:2223 +#: network/msnconnection.cpp:416 msgid "Invalid SBP parameter" -msgstr "" +msgstr "不合法的 SBP 參數" -#: network/msnnotificationconnection.cpp:2226 +#: network/msnconnection.cpp:419 msgid "This contact is already on your list" msgstr "此聯絡人已存在於您的聯絡人名單裡了" -#: network/msnnotificationconnection.cpp:2230 +#: network/msnconnection.cpp:423 msgid "This contact is not on your list" msgstr "此聯絡人並不在您的聯絡人名單裡" -#: network/msnnotificationconnection.cpp:2234 +#: network/msnconnection.cpp:427 msgid "This contact is not online" msgstr "此聯絡人未上線" -#: network/msnnotificationconnection.cpp:2239 +#: network/msnconnection.cpp:432 msgid "Already in this mode" -msgstr "" +msgstr "已經在此模式" -#: network/msnnotificationconnection.cpp:2243 -#, fuzzy -msgid "Contact is in the opposite list" -msgstr "此聯絡人並不在您的聯絡人名單裡" +#: network/msnconnection.cpp:436 +msgctxt "MSN error" +msgid "This contact cannot be added to both allow and block list." +msgstr "此聯絡人無法同時被加入允許與阻擋的清單中。" -#: network/msnnotificationconnection.cpp:2247 -#, fuzzy +#: network/msnconnection.cpp:440 msgid "" "The group name is already added to your Messenger or Hotmail contact list. " "Please use a different name." -msgstr "此群組名稱已被您的 Messenger 或 Hotmail 聯絡人名單所使用" +msgstr "" +"此群組名稱已經在您的 Messenger 或 Hotmail 聯絡人清單中。請使用其他的名稱。" -#: network/msnnotificationconnection.cpp:2251 -msgid "Your contact list has too many groups" -msgstr "您的聯絡人名單有太多的群組" +#: network/msnconnection.cpp:444 +msgid "" +"Your contact list has too many groups; you are allowed to only have at most " +"30." +msgstr "您的聯絡人清單中的群組過多。您最多只能有三十個群組。" -#: network/msnnotificationconnection.cpp:2255 +#: network/msnconnection.cpp:448 msgid "This group can't be changed" msgstr "此群組無法變更" -#: network/msnnotificationconnection.cpp:2260 -#, fuzzy +#: network/msnconnection.cpp:453 msgid "Contact is not added to this group" -msgstr "您的聯絡人名單有太多的群組" +msgstr "聯絡人尚未加入此群組" -#: network/msnnotificationconnection.cpp:2264 +#: network/msnconnection.cpp:457 msgid "This group is not empty" msgstr "此群組不是空的" -#: network/msnnotificationconnection.cpp:2268 -msgid "The group name is too long" -msgstr "此群組名稱太長" +#: network/msnconnection.cpp:461 +msgid "The group name is too long; it cannot be longer than 61 bytes." +msgstr "群組名稱太長;不能大於 61 個位元。" -#: network/msnnotificationconnection.cpp:2273 +#: network/msnconnection.cpp:466 msgid "Attempted to change group \"0\"" -msgstr "" +msgstr "嘗試變更群組 \"0\"" -#: network/msnnotificationconnection.cpp:2273 -#: network/soap/httpsoapconnection.cpp:596 +#: network/msnconnection.cpp:466 msgid "There was an internal error in KMess: %1" msgstr "KMess 有一個內部錯誤:%1" -#: network/msnnotificationconnection.cpp:2277 -#, fuzzy +#: network/msnconnection.cpp:470 msgid "Invalid Group" -msgstr "重新命名此群組(&n)" +msgstr "不合法的群組" -#: network/msnnotificationconnection.cpp:2281 +#: network/msnconnection.cpp:474 msgid "Empty domain" -msgstr "" +msgstr "空白的網域" -#: network/msnnotificationconnection.cpp:2284 +#: network/msnconnection.cpp:478 +msgid "Wrong ADL command format" +msgstr "錯誤的 ADL 指令格式" + +#: network/msnconnection.cpp:481 msgid "Switchboard server failed" msgstr "交換伺服器錯誤" -#: network/msnnotificationconnection.cpp:2287 +#: network/msnconnection.cpp:484 msgid "Transfer to switchboard server failed" msgstr "傳送到交換伺服器發生錯誤" -#: network/msnnotificationconnection.cpp:2291 +#: network/msnconnection.cpp:488 msgid "Direct connection (MSNSLP) error, connection failed" msgstr "直接連結 (MSNSLP) 錯誤,連結失敗" -#: network/msnnotificationconnection.cpp:2295 +#: network/msnconnection.cpp:492 msgid "Required field missing" -msgstr "" +msgstr "需要的欄位遺失" -#: network/msnnotificationconnection.cpp:2299 +#: network/msnconnection.cpp:496 msgid "Not logged in" -msgstr "" +msgstr "未登入" -#: network/msnnotificationconnection.cpp:2302 -#, fuzzy -msgid "No permissions given for this account" -msgstr "給這個帳號用的自訂表情符號:" +#: network/msnconnection.cpp:500 +msgctxt "" +"MSN error, due to e.g. trying the beta service without an allowed account" +msgid "This account was denied access to the MSN service." +msgstr "此帳號被拒絕使用 MSN 服務。" -#: network/msnnotificationconnection.cpp:2307 +#: network/msnconnection.cpp:505 msgid "Command is disabled" -msgstr "" +msgstr "指令已關閉" -#: network/msnnotificationconnection.cpp:2310 +#: network/msnconnection.cpp:508 msgid "Your account is banned." -msgstr "你的帳號被禁止了。" +msgstr "您的帳號被列入黑名單了。" -#: network/msnnotificationconnection.cpp:2314 -#, fuzzy +#: network/msnconnection.cpp:512 msgid "Challenge response failed" -msgstr "傳輸失敗" +msgstr "挑戰回應失敗" -#: network/msnnotificationconnection.cpp:2319 +#: network/msnconnection.cpp:517 msgid "Bad command data" -msgstr "" +msgstr "錯誤的指令資料" -#: network/msnnotificationconnection.cpp:2323 -#, fuzzy +#: network/msnconnection.cpp:521 msgid "You are opening chat sessions too fast" -msgstr "您開啟程序太過頻繁" +msgstr "您開啟聊天階段太過頻繁" -#: network/msnnotificationconnection.cpp:2327 -#, fuzzy +#: network/msnconnection.cpp:525 msgid "You have too many open chat sessions" -msgstr "您開啟太多程序" +msgstr "您開啟太多的聊天階段" -#: network/msnnotificationconnection.cpp:2334 +#: network/msnconnection.cpp:532 msgid "Unexpected command sequence" -msgstr "" +msgstr "非預期的指令順序" -#: network/msnnotificationconnection.cpp:2338 +#: network/msnconnection.cpp:536 msgid "Bad friend name" msgstr "壞朋友的名稱" -#: network/msnnotificationconnection.cpp:2344 +#: network/msnconnection.cpp:542 msgid "Bad CVR data" -msgstr "" +msgstr "錯誤的 CVR 資料" -#: network/msnnotificationconnection.cpp:2350 -msgid "The server reports KMess is flooding it with too many data" +#: network/msnconnection.cpp:548 +msgid "The server reports KMess is flooding it with too much data" msgstr "伺服器回報 KMess 湧入太多資料" -#: network/msnnotificationconnection.cpp:2357 -#, fuzzy +#: network/msnconnection.cpp:555 msgid "Authentication ticket was incorrect" -msgstr "認證失敗" +msgstr "認證資料不正確" -#: network/msnnotificationconnection.cpp:2360 +#: network/msnconnection.cpp:558 msgid "You can't start a chat with someone while you are invisible." msgstr "您不能以隱形的狀態開啟交談" -#: network/msnnotificationconnection.cpp:2364 -#, fuzzy +#: network/msnconnection.cpp:562 msgid "Not accepting new contacts" -msgstr "不接受新的規則" +msgstr "不接受新的聯絡人" -#: network/msnnotificationconnection.cpp:2368 -#, fuzzy +#: network/msnconnection.cpp:566 msgid "" -"You have a kids passport account, you need parental consent to chat online." -msgstr "您有一個受限的 passport ,您需要家長的允許來上線聊天。" +"You have a Kids Passport account, you need parental consent to chat online." +msgstr "您有一個兒童 Passport 帳號,您需要家長的同意才能上線聊天。" -#: network/msnnotificationconnection.cpp:2371 -#, fuzzy -msgid "Your passport account needs to be verified first." -msgstr "您的 passport 需要先經過確認" +#: network/msnconnection.cpp:569 +msgid "Your Passport account needs to be verified first." +msgstr "您的 Passport 帳號需要先經過認證。" -#: network/msnnotificationconnection.cpp:2375 +#: network/msnconnection.cpp:573 msgid "Bad USR ticket" -msgstr "" +msgstr "錯誤的 USR 票" -#: network/msnnotificationconnection.cpp:2385 +#: network/msnconnection.cpp:583 msgid "Error accessing contact list, try again later" msgstr "存取連絡人清單錯誤。過會兒再試。" -#: network/msnnotificationconnection.cpp:2399 -#, fuzzy +#: network/msnconnection.cpp:592 msgid "" "The MSN service is temporarily unavailable, there was an internal server " "error." -msgstr "內部伺服器發生錯誤" +msgstr "MSN 服務暫時無法使用,因為發生內部錯誤。" -#: network/msnnotificationconnection.cpp:2410 +#: network/msnconnection.cpp:603 msgid "The MSN service is temporarily unavailable, the server is too busy" -msgstr "" +msgstr "MSN 服務暫時無法使用,因為伺服器過於忙碌" -#: network/msnnotificationconnection.cpp:2414 +#: network/msnconnection.cpp:607 msgid "Peer notification server down" msgstr "通知伺服器已關機" -#: network/msnnotificationconnection.cpp:2418 +#: network/msnconnection.cpp:611 msgid "The server is going down" msgstr "伺服器將關機" -#: network/msnnotificationconnection.cpp:2422 +#: network/msnconnection.cpp:615 msgid "The server is going down soon" msgstr "伺服器即將關機" -#: network/msnnotificationconnection.cpp:2427 +#: network/msnconnection.cpp:620 msgid "Write is blocking" msgstr "Write is blocking" -#: network/msnnotificationconnection.cpp:2431 +#: network/msnconnection.cpp:624 msgid "Session is overloaded" msgstr "程序過載" -#: network/msnnotificationconnection.cpp:2438 +#: network/msnconnection.cpp:631 msgid "The server is not available" msgstr "伺服器不可用" -#: network/msnnotificationconnection.cpp:2442 +#: network/msnconnection.cpp:635 msgid "Authentication failed" msgstr "認證失敗" -#: network/msnnotificationconnection.cpp:2449 -#, fuzzy -msgid "Unknown error code received from the server: %1" -msgstr "KMess 從伺服器收到一個未知的錯誤訊息:%1" +#: network/msnconnection.cpp:642 +msgid "" +"Unknown error code received from the server: %1
Technical details: %2" +msgstr "從伺服器收到一個不明的錯誤代碼:%1
技術詳情:%2" -#: network/msnnotificationconnection.cpp:2463 -#: network/msnnotificationconnection.cpp:3214 -#, fuzzy +#: network/msnconnection.cpp:659 network/msnnotificationconnection.cpp:2918 msgctxt "Error dialog box title" -msgid "MSN error" -msgstr "KMess - MSN 錯誤" +msgid "MSN Error" +msgstr "MSN 錯誤" -#: network/msnnotificationconnection.cpp:2596 -#, fuzzy +#: network/msnconnection.cpp:964 +msgid "Trying the HTTP fallback..." +msgstr "嘗試 HTTP 的預設值..." + +#: network/msnnotificationconnection.cpp:1333 +msgid "Authenticating..." +msgstr "認證中..." + +#: network/msnnotificationconnection.cpp:1370 +msgid "Authenticated" +msgstr "已認證" + +#: network/msnnotificationconnection.cpp:1440 +msgid "Switching to another server..." +msgstr "切換到其它伺服器..." + +#: network/msnnotificationconnection.cpp:1804 +msgid "Connecting..." +msgstr "連線中..." + +#: network/msnnotificationconnection.cpp:1949 +msgid "Unknown command received from the server: %1" +msgstr "從伺服器收到不明的指令:%1" + +#: network/msnnotificationconnection.cpp:2109 msgctxt "Time left before server maintenance" -msgid "1 minute" +msgid "%1 minute" msgid_plural "%1 minutes" -msgstr[0] "分鐘" -msgstr[1] "分鐘" +msgstr[0] "%1 分鐘" -#: network/msnnotificationconnection.cpp:2599 -#, fuzzy +#: network/msnnotificationconnection.cpp:2112 msgid "Server closes for maintenance in %1!" -msgstr "警告:伺服器將在 %1 分鐘後關閉維護!" +msgstr "伺服器將在 %1 內關閉維護!" -#: network/msnnotificationconnection.cpp:2604 -#, fuzzy +#: network/msnnotificationconnection.cpp:2117 msgctxt "Server maintenance dialog box text" msgid "The MSN Server will be going down in %1 for maintenance." -msgstr "MSN 伺服器報告說將在一分鐘後關閉維護。" +msgstr "MSN 伺服器將在 %1 內關閉維護。" -#: network/msnnotificationconnection.cpp:2901 -msgid "Lost reference to SOAP client" -msgstr "" +#: network/msnnotificationconnection.cpp:2319 +msgid "SOAP client is no longer valid." +msgstr "SOAP 客戶端程式已經不能再使用了。" -#: network/msnnotificationconnection.cpp:2900 -#: network/msnnotificationconnection.cpp:3294 -#, fuzzy -msgid "KMess could not process Offline-IM messages.
Details: %1" -msgstr "" -"KMess 無法進行離線即時通訊訊息。\n" -"\n" -"細節:%1" +#: network/msnnotificationconnection.cpp:2318 +msgid "KMess could not process Offline-IM messages.
Details: %1" +msgstr "KMess 無法處理離線訊息。
詳情:%1" -#: network/msnnotificationconnection.cpp:3172 -#, fuzzy +#: network/msnnotificationconnection.cpp:2589 msgid "Authentication time limit exceeded" -msgstr "認證失敗" +msgstr "超過認證時間限制" -#: network/msnnotificationconnection.cpp:3218 -#, fuzzy +#: network/msnnotificationconnection.cpp:2759 +msgid "Waiting for contact list..." +msgstr "等候使用者名單" + +#: network/msnnotificationconnection.cpp:2805 +msgctxt "Connection warning: dialog box with message" +msgid "

Warning: %1

" +msgstr "

警告:%1

" + +#: network/msnnotificationconnection.cpp:2806 +msgctxt "Error dialog box title" +msgid "MSN Warning" +msgstr "MSN 警告" + +#: network/msnnotificationconnection.cpp:2879 msgid "
Internal error reason: %1" -msgstr "KMess 有一個內部錯誤:%1" +msgstr "
內部錯誤理由:%1" -#: network/msnnotificationconnection.cpp:3242 -#, fuzzy -msgctxt "Login error message, with more details for developer versions" +#: network/msnnotificationconnection.cpp:2916 +msgctxt "Connection error: dialog box" msgid "" -"

KMess could not connect the the MSN Messenger servers.
There is a " -"problem with your Internet connection, or the MSN Messenger servers may be " -"temporarily unavailable.%1

Show the MSN Messenger Service status page?" +"

Authentication has failed, please verify your account email and password." "

" -msgstr "" -"KMess 無法連線到 MSN Messenger 伺服器。MSN Messenger 伺服器可能暫時關閉,或者" -"你的網際網路連線有問題。" +msgstr "

認證失敗,請核對您的電子信箱帳號和密碼。

" -#: network/msnnotificationconnection.cpp:3252 -msgctxt "Server-reported user error dialog box" -msgid "

MSN message

%1

" -msgstr "" +#: network/msnnotificationconnection.cpp:2929 +msgctxt "Connection error: passive notification message" +msgid "

The account %1 has been connected from another location.

" +msgstr "

帳號 %1 從另一個位置連線。

" -#: network/msnnotificationconnection.cpp:3257 -msgctxt "Server error dialog box" -msgid "

MSN server message

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3262 -msgctxt "Server-reported client error dialog box" -msgid "

Internal error in KMess

%1

" -msgstr "" - -#: network/msnnotificationconnection.cpp:3270 -#, fuzzy -msgctxt "Connection error message, with more details for developer versions" -msgid "

Connection to the MSN server has been lost.%1

" -msgstr "失去至伺服器的連線" - -#: network/msnnotificationconnection.cpp:3302 -#, fuzzy +#: network/msnnotificationconnection.cpp:2932 +msgctxt "Connection error: detailed message" msgid "" -"Authentication failed, KMess could not process the passport login." -"
Details: %1" +"

You have been disconnected: you have connected with the account %1 " +"from another Messenger client, or from another location.

" msgstr "" -"認證失敗。KMess 無法進行passport 登入。\n" -"\n" -"細節:%1" +"

您被斷線了:您使用其他的 Messenger 軟體或從氣他地方以此帳號 %1 連" +"線。

" -#: network/msnsockethttp.cpp:765 -#, fuzzy -msgid "SSL Error" -msgstr "伺服器錯誤" +#: network/msnnotificationconnection.cpp:2944 +msgctxt "Connection error: passive notification message" +msgid "" +"

Unable to connect to the Live Messenger service.
Maybe you need to " +"authenticate before you can access the network?

" +msgstr "" +"

無法連線到 Live Messenger 服務。
或許您在存取網路之前需要認證?

" -#: network/msnsockettcp.cpp:352 -#, fuzzy +#: network/msnnotificationconnection.cpp:2947 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.
It is also possible that an authentication " +"to a web page or proxy may be required to access the network.

Click here to visit the Messenger service status page.

" +msgstr "" +"

KMess 無法連線到 Live Messenger 伺服器。
可能是您的網際網路連線有問" +"題,或是 Live Messenger 伺服器暫時關閉。
也有可能是到網頁或代理伺服器需要" +"存取網路的認證。

點選這裡來造訪 Messenger 服務狀態頁" +"面。

" + +#: network/msnnotificationconnection.cpp:2966 +msgctxt "Connection error: passive notification message" +msgid "

Unable to connect to the Live Messenger service.

" +msgstr "

無法連線到 Live Messenger 服務。

" + +#: network/msnnotificationconnection.cpp:2968 +msgctxt "Connection error: detailed message" +msgid "" +"

KMess could not connect to the Live Messenger servers.
There may be " +"a problem with your Internet connection, or the Live Messenger servers may " +"be temporarily unavailable.

Click here to visit the " +"Messenger service status page.

" +msgstr "" +"

KMess 無法連線到 Live Messenger 伺服器。
可能是您的網際網路連線有問" +"題,或是 Live Messenger 伺服器暫時關閉。

點選這裡來造" +"訪 Messenger 服務狀態頁面。

" + +#: network/msnnotificationconnection.cpp:2979 +msgctxt "" +"Connection error (Server-reported user error): passive notification message" +msgid "

Error: %1

" +msgstr "

錯誤:%1

" + +#: network/msnnotificationconnection.cpp:2981 +msgctxt "Connection error (Server-reported user error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Live Messenger 伺服器回報一個錯誤:

%1

" + +#: network/msnnotificationconnection.cpp:2992 +msgctxt "" +"Connection error (Server-reported server error): passive notification message" +msgid "

Messenger Service Error: %1

" +msgstr "

Messeenger 服務錯誤:%1

" + +#: network/msnnotificationconnection.cpp:2994 +msgctxt "Connection error (Server-reported server error): detailed message" +msgid "

The Live Messenger server has reported an error:

%1

" +msgstr "

Live Messenger 伺服器回報一個錯誤:

%1

" + +#: network/msnnotificationconnection.cpp:3002 +msgctxt "" +"Connection error (Server-reported client error): passive notification message" +msgid "

KMess Error: %1

" +msgstr "

KMess 錯誤:%1

" + +#: network/msnnotificationconnection.cpp:3004 +msgctxt "Connection error (Server-reported client error): detailed message" +msgid "

KMess has encountered an internal error:

%1

" +msgstr "

KMess 遭遇一個內部錯誤:

%1

" + +#: network/msnnotificationconnection.cpp:3015 +msgctxt "Connection error: passive notification message" +msgid "

Network connection lost.

" +msgstr "

失去網路連線。

" + +#: network/msnnotificationconnection.cpp:3017 +msgctxt "Connection error: detailed message" +msgid "

Connection to the Live Messenger server has been lost.

" +msgstr "

失去與 Live Messenger 伺服器的連線。%1

" + +#: network/msnnotificationconnection.cpp:3073 +msgctxt "Developer details placed on the network error dialog box" +msgid "" +"

Developer info:
Error number: %1
Error string: %2

" +msgstr "" +"

開發者資訊:
錯誤號碼: %1
錯誤字串: %2

" + +#: network/msnsocketbase.cpp:135 +msgctxt "Dialog box message" +msgid "Enter your username and password to access the network proxy." +msgstr "請輸入您在網路代理伺服器上的的帳號與密碼。" + +#: network/msnsockethttp.cpp:681 +msgctxt "Error message shown with HTTP connection" +msgid "%1 (Internal error code: %2)" +msgstr "%1(內部錯誤代碼:%2)" + +#: network/msnsockethttp.cpp:691 +msgctxt "Error message shown with HTTP connection" +msgid "" +"%1 (Internal error code: %2)
Response: %3 %4
Redirection " +"target: %5" +msgstr "%1 (內部錯誤碼:%2)
回應:%3 %4
重新指向目標:%5" + +#: network/msnsockettcp.cpp:359 msgid "Connection time limit exceeded" -msgstr "連線逾時" +msgstr "超過連線時間限制" -#: network/msnsockettcp.cpp:368 +#: network/msnsockettcp.cpp:375 msgid "1 ping lost" msgstr "1 ping lost" -#: network/msnsockettcp.cpp:372 +#: network/msnsockettcp.cpp:379 msgid "%1 pings lost" msgstr "%1 pings lost" -#: network/msnsockettcp.cpp:387 -msgid "The connection to the server was lost." -msgstr "失去至伺服器的連線" +#: network/msnsockettcp.cpp:395 +msgid "The connection to the server was lost" +msgstr "失去與伺服器的連線" -#: network/msnswitchboardconnection.cpp:963 -msgid "This person is offline or invisible." -msgstr "此人離線或隱形" +#: network/soap/addressbookservice.cpp:777 +msgctxt "Warning message" +msgid "The specified email address, \"%1\", is not a valid email address!" +msgstr "特定的電子郵件,\"%1\",不是一個正確的郵件位址!" -#: network/msnswitchboardconnection.cpp:1117 -msgid "The contact initiated a MSN7 feature KMess can't handle yet." -msgstr "此聯絡人使用了一個 KMess 無法處理的 MSN7 特色" +#: network/soap/addressbookservice.cpp:787 +msgctxt "Error message" +msgid "" +"The specified email address, \"%1\", does not belong to a Live Messenger " +"account!" +msgstr "特定的電子郵件,\"%1\",不屬於 Live Messenger 帳號!" -#: network/msnswitchboardconnection.cpp:1802 -#: network/msnswitchboardconnection.cpp:1931 -msgid "The message \"%1\" was not received!" -msgstr "訊息 \"%1\" 沒有被收到" +#: network/soap/addressbookservice.cpp:795 +#: network/soap/addressbookservice.cpp:818 +#: network/soap/httpsoapconnection.cpp:276 +msgctxt "Error message (system-generated description)" +msgid "Invalid web service request (%1)" +msgstr "不合法的網路服務要求 (%1)" -#: network/soap/httpsoapconnection.cpp:553 -msgid "Unable to make a connection: %1" -msgstr "無法對 %1 連結" +#: network/soap/httpsoapconnection.cpp:402 +msgctxt "Error message (system-generated description)" +msgid "The web service is not accessible (%1)" +msgstr "這個網路服務是不能存取的 (%1)" -#: network/soap/httpsoapconnection.cpp:597 -msgid "Unable to parse SOAP response" -msgstr "" +#: network/soap/httpsoapconnection.cpp:471 +msgctxt "Error message" +msgid "Too many redirections by web service" +msgstr "網頁服務發出太多重新導向" -#: network/soap/passportloginservice.cpp:219 -msgid "Too many redirects by login service" -msgstr "登入服務有太多重新導向" +#: network/soap/httpsoapconnection.cpp:521 +msgctxt "Warning message" +msgid "The Offline Messages web service is currently not available" +msgstr "離線訊息網頁伺服器目前無法使用" -#: notification/chatnotification.cpp:163 -#, fuzzy -msgid "In %1's chat: %2" -msgstr "在 %1 的交談:%2" +#: network/soap/httpsoapconnection.cpp:527 +msgctxt "Warning message" +msgid "The Live Messenger web service is experiencing problems" +msgstr "Live Messenter 網頁伺服器目前發生問題" -#: notification/chatnotification.cpp:167 -#, fuzzy -msgid "%1 says:
'%2'" -msgstr "%1說:
'%2'" +#: network/soap/httpsoapconnection.cpp:541 +msgctxt "Error message with description (system-generated description)" +msgid "Invalid web service response %1 (%2)" +msgstr "不合法的網路服務回應 %1 (%2)" -#: notification/chatnotification.cpp:171 -#, fuzzy -msgid "%1 has sent you an offline message:
'%2'" -msgstr "%1 傳送一個離線訊息:
'%2'" +#: network/soap/httpsoapconnection.cpp:575 +msgctxt "Error message" +msgid "No response from web service" +msgstr "沒有從網路服務來的回應" -#: notification/chatnotification.cpp:178 -#, fuzzy +#: network/soap/passportloginservice.cpp:191 +msgctxt "Error message (sytem-generated description)" +msgid "Unexpected response from server (%1)" +msgstr "從伺服器來的未預期回應 (%1)" + +#: notification/chatnotification.cpp:154 +msgid "In %1's chat:
%2" +msgstr "在 %1 的聊天室:
%2" + +#: notification/chatnotification.cpp:158 +msgid "%1 says:
'%2'" +msgstr "%1 說:
「%2」" + +#: notification/chatnotification.cpp:162 +msgid "%1 has sent you an offline message:
'%2'" +msgstr "%1 傳送一個離線訊息給您:
%2" + +#: notification/chatnotification.cpp:169 msgid "%1's chat requests attention!" -msgstr "%1 的交談需要注意!" +msgstr "與 %1 的聊天需要注意!" -#: notification/chatnotification.cpp:183 -#, fuzzy -msgid "%1:
%2" -msgstr "%1
%2" +#: notification/chatnotification.cpp:174 +msgid "%1:
%2" +msgstr "%1
%2" -#: notification/chatnotification.cpp:190 -#, fuzzy +#: notification/chatnotification.cpp:181 msgid "%1 has sent you a handwritten message!" -msgstr "%1傳送了一個來電振動給你" +msgstr "%1 送了一個手寫的訊息給您。" -#: notification/chatnotification.cpp:194 -#, fuzzy +#: notification/chatnotification.cpp:185 msgid "%1 has sent you a nudge!" -msgstr "%1傳送了一個來電振動給你" +msgstr "%1傳送了一個來電振動給您。" -#: notification/chatnotification.cpp:198 -#, fuzzy +#: notification/chatnotification.cpp:189 msgid "%1 has sent you a wink!" -msgstr "%1傳送了一個動畫圖示給你!" +msgstr "%1傳送了一個動畫快遞給您!" + +#: notification/chatnotification.cpp:195 +msgid "%1 wants to use the webcam!" +msgstr "%1想要使用網路攝影機!" + +#: notification/chatnotification.cpp:196 +msgid "%1 is sending you a file!" +msgstr "%1 正傳送一個檔案給您!" + +#: notification/chatnotification.cpp:197 +msgid "%1 has sent you an invitation!" +msgstr "%1 已傳送一個邀請給您!" #: notification/chatnotification.cpp:204 -#, fuzzy -msgid "%1 wants to use the webcam!" -msgstr "%1想要使用網路攝影機!" +msgid "%1 has canceled the webcam session!" +msgstr "%1 取消了網路視訊階段。" #: notification/chatnotification.cpp:205 -#, fuzzy -msgid "%1 is sending you a file!" -msgstr "%1 傳送給你一個檔案!" +msgid "%1 has canceled the file transfer!" +msgstr "%1 取消了檔案傳輸!" #: notification/chatnotification.cpp:206 -#, fuzzy -msgid "%1 has sent you an invitation!" -msgstr "%1 傳送給你一個邀請!" +msgid "%1's activity has been canceled!" +msgstr "%1 的活動已被取消。" #: notification/chatnotification.cpp:213 -#, fuzzy -msgid "%1 has canceled the webcam session!" -msgstr "%1 取消了網路攝影機程序" +msgid "%1 has accepted to use the webcam!" +msgstr "%1 已接受使用網路攝影機。" #: notification/chatnotification.cpp:214 -#, fuzzy -msgid "%1 has canceled the file transfer!" -msgstr "%1取消了檔案傳輸!" +msgid "%1 has accepted the file transfer!" +msgstr "%1 已接受檔案傳輸!" #: notification/chatnotification.cpp:215 -#, fuzzy -msgid "%1's activity has been canceled!" -msgstr "%1 的行動被取消!" +msgid "%1 has accepted your invitation!" +msgstr "%1已接受您的邀請。" #: notification/chatnotification.cpp:222 -#, fuzzy -msgid "%1 has accepted to use the webcam!" -msgstr "%1 接受使用網路攝影機!" +msgid "%1 has ended the webcam session!" +msgstr "%1 結束了網路視訊工作階段。" #: notification/chatnotification.cpp:223 -#, fuzzy -msgid "%1 has accepted the file transfer!" -msgstr "%1 接受檔案傳輸!" +msgid "The file transfer with %1 is done!" +msgstr "與 %1 的檔案傳輸完成!" #: notification/chatnotification.cpp:224 -#, fuzzy -msgid "%1 has accepted your invitation!" -msgstr "%1 接受你的邀請!" +msgid "%1's activity has ended!" +msgstr "%1 的活動已結束!" #: notification/chatnotification.cpp:231 -#, fuzzy -msgid "%1 has ended the webcam session!" -msgstr "%1結束了網路攝影機程序!" +msgid "%1's webcam session has failed!" +msgstr "%1 的網路視訊工作階段已失敗!" #: notification/chatnotification.cpp:232 -#, fuzzy -msgid "The file transfer with %1 is done!" -msgstr "與%1的檔案傳輸完成!" +msgid "The file transfer with %1 has failed!" +msgstr "與 %1 的檔案傳輸已失敗!" #: notification/chatnotification.cpp:233 -#, fuzzy -msgid "%1's activity has ended!" -msgstr "%1的行動已結束!" - -#: notification/chatnotification.cpp:240 -#, fuzzy -msgid "%1's webcam session has failed!" -msgstr "%1的網路攝影機程序失敗!" - -#: notification/chatnotification.cpp:241 -#, fuzzy -msgid "The file transfer with %1 has failed!" -msgstr "與%1 的檔案傳輸失敗!" - -#: notification/chatnotification.cpp:242 -#, fuzzy msgid "%1's activity has ended with an error!" -msgstr "%1的行動錯誤結束!" +msgstr "%1 的活動因為發生錯誤結束!" -#: notification/contactstatusnotification.cpp:70 -#, fuzzy -msgid "%1 is now online" -msgstr "%1 正在線上" +#: notification/contactstatusnotification.cpp:91 +msgid "%1
is now online" +msgstr "%1
上線了。" -#: notification/contactstatusnotification.cpp:71 -#, fuzzy -msgid "%1 has gone away" -msgstr "%1 已經走了" +#: notification/contactstatusnotification.cpp:92 +msgid "%1
has gone away" +msgstr "%1
已經離開。" -#: notification/contactstatusnotification.cpp:72 -#, fuzzy -msgid "%1 will be right back" -msgstr "%1 馬上回來" +#: notification/contactstatusnotification.cpp:93 +msgid "%1
will be right back" +msgstr "%1
馬上回來" -#: notification/contactstatusnotification.cpp:73 -#, fuzzy -msgid "%1 is now busy" -msgstr "%1 現在正忙" +#: notification/contactstatusnotification.cpp:94 +msgid "%1
is now busy" +msgstr "%1
現在忙碌中。" -#: notification/contactstatusnotification.cpp:74 -#, fuzzy -msgid "%1 has become invisible" -msgstr "%1 已經隱身" +#: notification/contactstatusnotification.cpp:95 +msgid "%1
has become invisible" +msgstr "%1
隱身了。" -#: notification/contactstatusnotification.cpp:75 -#, fuzzy -msgid "%1 has gone idle" -msgstr "%1 發呆" +#: notification/contactstatusnotification.cpp:96 +msgid "%1
has gone idle" +msgstr "%1
變閒置了。" -#: notification/contactstatusnotification.cpp:76 -#, fuzzy -msgid "%1 has logged out" -msgstr "%1 已經登出" +#: notification/contactstatusnotification.cpp:97 +msgid "%1
has logged out" +msgstr "%1
已經登出。" -#: notification/contactstatusnotification.cpp:77 -#, fuzzy -msgid "%1 is on the phone" -msgstr "%1 正在講電話" +#: notification/contactstatusnotification.cpp:98 +msgid "%1
is on the phone" +msgstr "%1
正在講電話。" -#: notification/contactstatusnotification.cpp:78 -#, fuzzy -msgid "%1 is out for lunch" -msgstr "%1 外出用餐" +#: notification/contactstatusnotification.cpp:99 +msgid "%1
is out for lunch" +msgstr "%1
外出用餐。" -#: notification/newemailnotification.cpp:78 -#, fuzzy -msgid "New email:
'%1'
by '%2'" -msgstr "新 email
'%2' 來的
'%1'" +#: notification/newemailnotification.cpp:90 +msgctxt "%1 is the subject of the mail, %2 is the sender of the mail" +msgid "New email:
'%1'
by '%2'" +msgstr "新的電子信件:
'%1'
寄件者:'%2'" -#: settings/accountpage.cpp:69 -msgid "Browse..." +#: notification/notificationmanager.cpp:114 +msgctxt "Button text for KDE notification boxes" +msgid "Start Chatting" +msgstr "開始聊天" + +#: notification/notificationmanager.cpp:118 +msgctxt "Button text for KDE notification boxes" +msgid "Leave a Message" +msgstr "留下訊息" + +#: notification/notificationmanager.cpp:122 +msgctxt "Button text for KDE notification boxes" +msgid "View Message" +msgstr "檢視訊息" + +#: notification/notificationmanager.cpp:126 +msgctxt "Button text for KDE notification boxes" +msgid "Details" +msgstr "細節" + +#: notification/notificationmanager.cpp:130 +msgctxt "Button text for KDE notification boxes" +msgid "Read Email" +msgstr "讀取電子郵件" + +#: notification/notificationmanager.cpp:134 +msgctxt "Button text for KDE notification boxes" +msgid "Hide" +msgstr "隱藏" + +#: notification/systemtraywidget.cpp:78 +msgid "" +"Closing the main window will keep KMess running in the system tray. Use " +"'Quit' from the 'Connect' menu to quit the application." msgstr "" +"關閉主視窗會讓 KMess 保持在系統列執行。使用「連線」中的「結束」選單來結束程" +"式。" -#: settings/accountpage.cpp:70 -#, fuzzy -msgid "Browse and crop picture..." +#: notification/systemtraywidget.cpp:89 notification/systemtraywidget.cpp:179 +#: notification/systemtraywidget.cpp:189 +msgid "Docking in System Tray" +msgstr "嵌入系統匣" + +#: notification/systemtraywidget.cpp:240 +msgctxt "Tray icon tooltip, HTML version" +msgid "
%1 (%2)" +msgstr "
%1 (%2)" + +#: notification/systemtraywidget.cpp:246 +msgctxt "Tray icon tooltip, text version" +msgid " - %1 (%2)" +msgstr " - %1(%2)" + +#: settings/accountpage.cpp:80 +msgid "Browse..." +msgstr "瀏覽..." + +#: settings/accountpage.cpp:81 +msgid "Browse and Crop Picture..." msgstr "瀏覽並剪裁影像..." -#: settings/accountpage.cpp:71 -msgid "Set previous image..." -msgstr "" +#: settings/accountpage.cpp:82 +msgid "Set Previous Image..." +msgstr "設定前一個影像..." -#: settings/accountpage.cpp:448 -#, fuzzy +#: settings/accountpage.cpp:493 msgid "Downloading of display picture failed" -msgstr "下載圖片失敗" +msgstr "下載顯示圖片失敗" -#: settings/accountpage.cpp:507 -#, fuzzy +#: settings/accountpage.cpp:552 msgid "" "An error occurred when trying to change the display picture.\n" "Make sure that you have selected an existing picture file." msgstr "" -"嘗試改變圖片時發生錯誤。\n" -"請確定您選擇了正確的圖片檔案。" +"嘗試改變顯示圖片時發生錯誤。\n" +"請確定您選擇了存在的圖片檔案。" -#: settings/accountsettingsdialog.cpp:56 -#, fuzzy -msgid "&Delete" -msgstr "刪除此聯絡人(&D)" - -#: settings/accountsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:65 -#: settings/globalsettingsdialog.cpp:66 +#: settings/accountsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:66 +#: settings/globalsettingsdialog.cpp:67 msgid "Settings" msgstr "設定" -#: settings/accountsettingsdialog.cpp:75 +#: settings/accountsettingsdialog.cpp:78 msgid "Account" msgstr "帳號" -#: settings/accountsettingsdialog.cpp:76 -#, fuzzy +#: settings/accountsettingsdialog.cpp:79 msgid "My Account" -msgstr "帳號" +msgstr "我的帳號" -#: settings/accountsettingsdialog.cpp:80 -msgid "Alerts" -msgstr "警告" +#: settings/accountsettingsdialog.cpp:84 settings/accountsettingsdialog.cpp:85 +msgid "Contact List" +msgstr "聯絡人清單" -#: settings/accountsettingsdialog.cpp:81 -#, fuzzy -msgid "Alerts and Notifications" -msgstr "KMess 提示" - -#: settings/accountsettingsdialog.cpp:92 settings/accountsettingsdialog.cpp:93 +#: settings/accountsettingsdialog.cpp:95 settings/accountsettingsdialog.cpp:96 msgid "Chatting" msgstr "交談" -#: settings/accountsettingsdialog.cpp:98 settings/accountsettingsdialog.cpp:99 +#: settings/accountsettingsdialog.cpp:101 +#: settings/accountsettingsdialog.cpp:102 msgid "Chat Logging" msgstr "交談紀錄" -#: settings/accountsettingsdialog.cpp:193 -#, fuzzy +#: settings/accountsettingsdialog.cpp:154 +msgctxt "Button tooltip text" +msgid "" +"Click here to delete this account from the list of registered accounts.\n" +"You cannot delete the currently connected account nor a guest account, which " +"will be deleted when you disconnect." +msgstr "" +"點擊此處以從註冊帳號清單中刪除此帳號。\n" +"您不能刪除目前連線中的帳號,或是訪客帳號。訪客帳號在您離線時即會被刪除。" + +#: settings/accountsettingsdialog.cpp:206 msgid "" "The email address you have entered is not valid, and cannot be used as an " "account: '%1'" -msgstr "你輸入的連絡位址不合法:%1" +msgstr "您輸入的電子郵件地址不合法,無法做為帳號:%1" -#: settings/accountsettingsdialog.cpp:201 -#, fuzzy +#: settings/accountsettingsdialog.cpp:214 msgid "The email address you have entered is already in use: '%1'" -msgstr "你輸入的連絡位址不合法:%1" +msgstr "您輸入的電子郵件地址已經在使用中:%1" -#: settings/accountsettingsdialog.cpp:272 +#: settings/accountsettingsdialog.cpp:294 msgid "Are you sure you want to delete this account?" msgstr "您確定要刪除此帳號?" -#: settings/accountsmanagerpage.cpp:132 +#: settings/accountsmanagerpage.cpp:160 #, fuzzy msgid "" -"Are you sure you want to delete the account '%1' ?
All settings of this " -"account will be lost." -msgstr "您確定要刪除此帳號?" +"Are you sure you want to delete the account '%1' ?
All settings of " +"this account will be lost." +msgstr "您確定您要刪除帳號 %1 嗎?
所有此帳號的設定都將消失。" -#: settings/chatstylepage.cpp:339 +#: settings/chatstylepage.cpp:378 msgid "Hi, how are you doing? :)" -msgstr "嗨!你好嗎?" +msgstr "嗨!您好嗎?" -#: settings/chatstylepage.cpp:340 +#: settings/chatstylepage.cpp:379 msgid "Stacy" msgstr "跳舞俠" -#: settings/chatstylepage.cpp:341 +#: settings/chatstylepage.cpp:380 msgid "Great!" msgstr "好啊!" -#: settings/chatstylepage.cpp:343 +#: settings/chatstylepage.cpp:382 msgid "I /just/ got back from my vacation in Italy!" msgstr "我才 /剛從/ 義大利渡假回來!" -#: settings/emoticonspage.cpp:122 +#: settings/emoticonspage.cpp:118 +msgctxt "Dialog box text" +msgid "You can only use 7 characters for the emoticon shortcuts." +msgstr "你只能使用七個字母來做為表情符號的快捷鍵。" + +#: settings/emoticonspage.cpp:119 +msgctxt "Dialog box title" +msgid "Invalid emoticon name" +msgstr "不合法的表情名稱" + +#: settings/emoticonspage.cpp:136 +msgctxt "Dialog box title" msgid "Replace Existing Emoticon" -msgstr "" +msgstr "取代已存在的表情符號" -#: settings/globalsettingsdialog.cpp:45 -#, fuzzy +#: settings/emoticonspage.cpp:233 +msgid "Are you sure you want to delete the emoticon \"%1\" ?" +msgstr "您確定要刪除此表情符號 \"%1\"?" + +#: settings/emoticonspage.cpp:234 +msgctxt "Dialog box title" +msgid "Delete Emoticon" +msgstr "刪除表情符號" + +#: settings/globalsettingsdialog.cpp:46 msgid "KMess Settings" -msgstr "設定" +msgstr "KMess 設定" -#: settings/globalsettingsdialog.cpp:57 settings/globalsettingsdialog.cpp:58 +#: settings/globalsettingsdialog.cpp:58 settings/globalsettingsdialog.cpp:59 msgid "Accounts" msgstr "帳號" -#: settings/globalsettingsdialog.cpp:61 settings/globalsettingsdialog.cpp:63 -#, fuzzy -msgid "Notification" -msgstr "電子郵件提示" +#: settings/globalsettingsdialog.cpp:62 settings/globalsettingsdialog.cpp:64 +msgid "Notifications" +msgstr "通知" -#: settings/miscellaneouspage.cpp:72 +#: settings/miscellaneouspage.cpp:74 msgid "No selectable browsers detected." -msgstr "" +msgstr "沒有偵測到任何可選取的瀏覽器。" -#: settings/miscellaneouspage.cpp:99 -msgid "No selectable e-mail clients detected." -msgstr "" +#: settings/miscellaneouspage.cpp:101 +msgid "No selectable email clients detected." +msgstr "沒有偵測到任何可選取的電子郵件客戶端程式。" -#: settings/miscellaneouspage.cpp:284 -msgid "You have to select a command to run as custom browser!" -msgstr "" +#: settings/miscellaneouspage.cpp:286 +msgid "You have to specify a console command to launch a custom browser!" +msgstr "您必須輸入命令列指令來啟動自訂的瀏覽器。" -#: settings/miscellaneouspage.cpp:289 +#: settings/miscellaneouspage.cpp:291 #, c-format msgid "" -"The command you selected to run as custom browser does not contain the " -"'%u' parameter. Without this, opening Web sites will not work.
Do you " -"want KMess to add it for you?" +"The console command you have specified to launch a custom browser does " +"not contain the '%u' parameter. Without this, opening Web sites will not " +"work.
Do you want KMess to add it for you?" msgstr "" +"您輸入的指令中沒有 '%u' 參數。這樣無法連結到您要去的網址。
您確定" +"要這樣嗎?" -#: settings/miscellaneouspage.cpp:314 -msgid "You have to select a command to run as custom email client!" -msgstr "" +#: settings/miscellaneouspage.cpp:316 +msgid "You have to specify a console command to launch a custom email client!" +msgstr "您必須輸入命令列指令來啟動自訂的郵件客戶端程式。" -#: settings/miscellaneouspage.cpp:319 +#: settings/miscellaneouspage.cpp:321 #, c-format msgid "" -"The command you selected to run as custom email client does not " -"contain the '%u' parameter. Without this, composing mail will not work.
Do you want KMess to add it for you?" +"The console command you specified to launch a custom email client does " +"not contain the '%u' parameter. Without this, composing mail will not work." +"
Do you want KMess to add it for you?" msgstr "" +"您輸入的指令並未包含 '%u' 參數。這樣您無法發送信件。
您確定要這樣" +"做嗎?" -#: settings/miscellaneouspage.cpp:342 +#: settings/miscellaneouspage.cpp:344 msgid "You have to select a directory for the received files!" -msgstr "" +msgstr "您必須選擇一個目錄來接收檔案。" -#: settings/miscellaneouspage.cpp:404 -#, fuzzy +#: settings/miscellaneouspage.cpp:406 msgid "Select Files Directory" -msgstr "儲存聊天內容至上一層目錄" +msgstr "選擇檔案目錄" -#: systemtraywidget.cpp:64 -msgid "" -"Closing the main window will keep KMess running in the system tray. Use " -"'Quit' from the 'File' menu to quit the application." +#: utils/kmess-send/kmesssendplugin.cpp:116 +msgid "Send with KMess" msgstr "" -"關閉主視窗,KMess 將會在系統列繼續執行。使用「檔案」中的「結束」來結束程式。" -#: systemtraywidget.cpp:75 systemtraywidget.cpp:163 systemtraywidget.cpp:173 -msgid "Docking in System Tray" -msgstr "縮小到系統列" +#: utils/kmessconfig.cpp:424 +msgctxt "Passive notification message" +msgid "

KMess was unable to access its configuration files!

" +msgstr "

KMess 無法存取設定檔!

" -#: systemtraywidget.cpp:242 -msgid "
%1 (%2)" -msgstr "
%1 (%2)" +#: utils/likeback/likeback.cpp:244 +msgid "&Send a Comment to the Developers" +msgstr "傳送意見給開發者" -#: systemtraywidget.cpp:245 -#, fuzzy -msgid "- %1 (%2)" -msgstr "%1 %2" +#: utils/likeback/likeback.cpp:305 +msgctxt "Welcome dialog text,header text for test apps" +msgid "Welcome to this testing version of %1." +msgstr "歡迎使用 %1 的測試版本。" -#~ msgid "Click to send an email to this contact." -#~ msgstr "按這裡來傳送 email 給這個連絡人" +#: utils/likeback/likeback.cpp:310 +msgctxt "Welcome dialog text,header text for released apps" +msgid "Welcome to %1." +msgstr "歡迎使用 %1。" -#~ msgid "Picture:" -#~ msgstr "圖片:" +#: utils/likeback/likeback.cpp:318 +msgctxt "Welcome dialog text,explanation for both the like and dislike buttons" +msgid "" +"Each time you have a great or frustrating experience, please click the " +"appropriate face below the window title-bar, briefly describe what you like " +"or dislike and click Send." +msgstr "" +"當您有好的或不好的經驗,請點選視窗標題列底下的臉,表達您喜歡或不喜歡,然後按" +"「傳送」。" -#, fuzzy -#~ msgid "Login Information" -#~ msgstr "顯示電子郵件資訊" +#: utils/likeback/likeback.cpp:325 +msgctxt "Welcome dialog text,explanation for the like button alone" +msgid "" +"Each time you have a great experience, please click the smiling face below " +"the window title-bar, briefly describe what you like and click Send." +msgstr "" +"當您有好的經驗時,請點選視窗標題列底下的笑臉,表示您喜歡,然後按「傳送」。" -#~ msgid "Logging in..." -#~ msgstr "登入中..." +#: utils/likeback/likeback.cpp:332 +msgctxt "Welcome dialog text,explanation for the dislike button alone" +msgid "" +"Each time you have a frustrating experience, please click the frowning face " +"below the window title-bar, briefly describe what you dislike and click Send." +msgstr "" +"當年有不好的經驗的時候,您可以點選視窗標題列下的皺眉頭的臉,表示您不喜歡,然" +"後按「傳送」。" -#~ msgid "" -#~ "Allows you to choose which e-mail program KMess should open to view e-" -#~ "mail messages." -#~ msgstr "允許你選擇 KMess 該開啟的 e-mail 軟體來檢視 e-mail" +#: utils/likeback/likeback.cpp:342 +msgctxt "Welcome dialog text,explanation for the bug button" +msgid "" +"If you experience an improper behavior in the application, just click the " +"broken-object icon in the top-right corner of the window, describe it and " +"click Send." +msgstr "" +"若您覺得應用程式中某些行為不恰當,只要點選視窗右上角的「破碎」圖示,描述一" +"下,然後按「傳送」。" -#~ msgid "Use a specified command:" -#~ msgstr "使用特定的指令" +#: utils/likeback/likeback.cpp:353 +msgctxt "Welcome dialog text,usage example" +msgid "I like the new artwork. Very refreshing." +msgstr "我喜歡新的美工圖案,非常好看。" -#~ msgid "This account does not have an Hotmail inbox!" -#~ msgstr "這個帳號並沒有 Hotmail" +#: utils/likeback/likeback.cpp:360 +msgctxt "Welcome dialog text,usage example" +msgid "" +"I dislike the welcome page of that assistant. Too time consuming." +msgstr "我不喜歡小助手的歡迎頁面。太浪費時間。" -#, fuzzy -#~ msgid "Email: " -#~ msgstr "Email" +#: utils/likeback/likeback.cpp:367 +msgctxt "Welcome dialog text,usage example" +msgid "" +"The application has an improper behaviour when clicking the Add " +"button. Nothing happens." +msgstr "點擊「新增」按鍵時,它的行為不正確。沒有任何作用。" -#~ msgid "Remove group" -#~ msgstr "刪除群組" +#: utils/likeback/likeback.cpp:374 +msgctxt "Welcome dialog text,usage example" +msgid "I desire a new feature allowing me to send my work by email." +msgstr "我希望有新功能讓我可以透過電子郵件傳送我的工作。" -#, fuzzy -#~ msgid "Show &Display Pictures" -#~ msgstr "顯示圖片" +#: utils/likeback/likeback.cpp:387 +msgctxt "Welcome dialog text,us=the developers,it=the application" +msgid "To help us improve it, your comments are important." +msgstr "您的意見對我們改進此軟體非常重要。" -#~ msgid "You have 1 new e-mail in your inbox." -#~ msgstr "你有一封新郵件在收件夾裡" +#: utils/likeback/likeback.cpp:390 +msgctxt "Welcome dialog text,header for the examples" +msgid "Example" +msgid_plural "Examples" +msgstr[0] "範例" -#~ msgid "You have %1 new emails in your inbox." -#~ msgstr "你有 %1 封新郵件在收件夾裡" +#: utils/likeback/likeback.cpp:396 +msgctxt "Welcome dialog title" +msgid "Help Improve the Application" +msgstr "協助改進應用程式" -#, fuzzy -#~ msgid "Guido Solinas" -#~ msgstr "上線(&G)" +#: utils/likeback/likebackdialog.cpp:28 +msgid "Send a Comment to the Developers" +msgstr "傳送意見給開發者" -#~ msgid "The transfer of %1 failed. Couldn't open file" -#~ msgstr "%1 的傳輸失敗。無法開啟檔案" +#: utils/likeback/likebackdialog.cpp:144 +msgctxt "" +"Feedback dialog text, message with one accepted language for the comments" +msgid "" +"Please, write it in %1 (you may want to use an online " +"translation tool for this).
" +msgstr "寫意見時請使用 %1(您可以用 線上翻譯工具)。
" -#, fuzzy -#~ msgid "Sidebar" -#~ msgstr "側邊列" +#: utils/likeback/likebackdialog.cpp:151 +msgctxt "" +"Feedback dialog text, message with list of accepted languages for the " +"comments" +msgid "" +"Please, write it in %1 or %2 (you may want to use an online " +"translation tool for this).
" +msgstr "寫意見時請用 %1 或 %2(您可以用線上翻譯工具)。
" -#, fuzzy -#~ msgid "New contact's group" -#~ msgstr "新增聯絡人(&C)" +#: utils/likeback/likebackdialog.cpp:164 +msgctxt "" +"Feedback dialog text, message to remind to balance the likes and dislikes" +msgid "" +"To make the comments you send more useful in improving this application, try " +"to send the same amount of positive and negative comments.
" +msgstr "" +"為了讓您傳送的意見對我們改進程式更有幫助,請試著盡量多傳送包括正面與負面的意" +"見。
" -#~ msgid "Enter your login information:" -#~ msgstr "請輸入你的登入訊息:" +#: utils/likeback/likebackdialog.cpp:173 +msgctxt "Feedback dialog text, text to disallow feature requests" +msgid "" +"Please, do not ask for new features: this kind of request will be ignored." +"
" +msgstr "請不要要求新功能:這類的要求會被忽略。
" -#~ msgid "Your friendly name:" -#~ msgstr "你的名稱" +#: utils/likeback/likebackdialog.cpp:179 +msgctxt "" +"Feedback dialog text, %1=Application name,%2=message with list of accepted " +"languages for the comment,%3=optional text to remind to balance the likes " +"and dislikes,%4=optional text to disallow feature requests." +msgid "" +"

You can provide to the developers a brief description of your opinions of " +"%1.
%2 %3%4

" +msgstr "

您可以提供開發者關於您的意見的簡短描述。
%2 %3%4

" -#, fuzzy -#~ msgid "Your email address:" -#~ msgstr "電子郵件:" +#: utils/likeback/likebackdialog.cpp:221 +msgid "" +"The email address you have entered is not valid, and cannot be used: '%1'" +msgstr "您輸入的電子郵件地址不合法,因此無法使用:%1" -#~ msgid "Your password:" -#~ msgstr "你的密碼" +#: utils/likeback/likebackdialog.cpp:295 +msgctxt "Dialog box text" +msgid "" +"

Your comment has been sent successfully.It will help us improve the " +"application!

Thanks for your time.

" +msgstr "

您的意見已成功傳送。相信這個軟體會越來越好!

感謝您!

" -#~ msgid "Display picture:" -#~ msgstr "顯示圖片:" +#: utils/likeback/likebackdialog.cpp:298 +msgctxt "Dialog box title" +msgid "Comment Sent" +msgstr "意見已傳送" -#~ msgid "Don't show a displa&y picture" -#~ msgstr "不顯示圖片(&y)" +#: utils/likeback/likebackdialog.cpp:309 +msgctxt "Dialog box text" +msgid "" +"

There has been an error while trying to send the report.

Please, " +"try again later.

" +msgstr "

傳送報告時發生錯誤。

請稍後再試一次。

" -#~ msgid "Status to set at login:" -#~ msgstr "登入時設定的狀態:" +#: utils/likeback/likebackdialog.cpp:311 +msgctxt "Dialog box title" +msgid "Comment Sending Error" +msgstr "意見傳送錯誤" -#~ msgid "Show notifications when you recei&ve an email" -#~ msgstr "當你收到一封 email 時,顯示通知" +#~ msgid "Conversations Filter" +#~ msgstr "對話過濾器" -#~ msgid "Organize chat folders by:" -#~ msgstr "以何種方式排列聊天紀錄資料夾:" +#~ msgid "Filter by &conversation" +#~ msgstr "以對話過濾(&c)" -#~ msgid "&Show graphics in chat messages" -#~ msgstr "在聊天訊息中顯示圖示(&S)" +#~ msgid "Select an account you wish to modify, then click here" +#~ msgstr "請選擇您要變更的帳號,然後按這裡" -#~ msgid "Use Hotmail" -#~ msgstr "使用 Hotmail" +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The nudge to %1 could not be sent." +#~ msgstr "給 %1 的來電振動無法傳送。" -#~ msgid "says:" -#~ msgstr "說:" +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The wink to %1 could not be sent." +#~ msgstr "給 %1 的動畫快遞無法傳送。" -#~ msgid "Current name: " -#~ msgstr "目前的名稱" +#~ msgctxt "Error message shown in chat, %1 is the contact's friendly name" +#~ msgid "The drawing to %1 could not be sent." +#~ msgstr "給 %1 的手繪圖案無法傳送。" -#, fuzzy -#~ msgid "" -#~ "KMess could not connect to the MSN Messenger service.\n" -#~ "Please, be sure to be connected to the internet.\n" -#~ "reason: %1." -#~ msgstr "" -#~ "KMess 無法連結到 MSN Messenger 服務。\n" -#~ "請確認有連接到網際網路。\n" -#~ "系統錯誤:%1 (錯誤碼 %2)" - -#~ msgid "The remote server has closed the connection." -#~ msgstr "遠端伺服器已關閉連線" - -#~ msgid "Show MSN Messenger Service status?" -#~ msgstr "顯示 MSN Messenger 服務狀態?" - -#~ msgid "Received user confirmation" -#~ msgstr "取得使用者確認" - -#~ msgid "Transfer to notification server" -#~ msgstr "傳送到通知伺服器" - -#~ msgid "The server is too busy" -#~ msgstr "伺服器忙碌" - -#~ msgid "The server is unavailable" -#~ msgstr "伺服器不可用" - -#~ msgid "KMess received an unknown error message from the server: %1" -#~ msgstr "KMess 從伺服器收到一個未知的錯誤訊息:%1" - -#~ msgid "Warning: Server closes for maintenance in 1 minute!" -#~ msgstr "警告:伺服器在一分鐘後將關閉維護!" - -#~ msgid "Add contact" -#~ msgstr "新增聯絡人" - -#, fuzzy -#~ msgid "KMess Notification" -#~ msgstr "電子郵件提示" - -#~ msgid "" -#~ msgstr "<在此輸入你的個人訊息>" - -#~ msgid "" -#~ "_: NAME OF TRANSLATORS\n" -#~ "Your names" -#~ msgstr "" -#~ "%1_:譯者姓名\n" -#~ "你的大名" - -#~ msgid "" -#~ "_: EMAIL OF TRANSLATORS\n" -#~ "Your emails" -#~ msgstr "" -#~ "_:譯者的電子郵件\n" -#~ "你的電子郵件" - -#~ msgid "Show/Hide &Contact Sidebar" -#~ msgstr "顯示/隱藏 聯絡人狀態列(&C)" - -#~ msgid "Away - Idle" -#~ msgstr "離開-發呆" - -#~ msgid "chat-style-text" -#~ msgstr "交談形式文字" - -#~ msgid "The e-mail address given was invalid!" -#~ msgstr "此電子郵件無效" - -#~ msgid "(Away)" -#~ msgstr "(離開)" - -#~ msgid "(Be Right Back)" -#~ msgstr "(馬上回來)" - -#~ msgid "(Busy)" -#~ msgstr "(忙啦)" - -#~ msgid "(Invisible)" -#~ msgstr "(隱形)" - -#~ msgid "(Away - Idle)" -#~ msgstr "(離開-發呆)" - -#~ msgid "(Out to Lunch)" -#~ msgstr "(外出午餐)" - -#~ msgid "(On the Phone)" -#~ msgstr "(噓...電話中)" - -#~ msgid "The current status of your contact." -#~ msgstr "你連絡人目前的狀態。" - -#, fuzzy -#~ msgid "The contact is listening to music" -#~ msgstr "此聯絡人並不在您的聯絡人名單裡" +#~ msgctxt "" +#~ "Error message shown in chat, %1 is the sent message, %2 is the contact's " +#~ "friendly name" +#~ msgid "The message '%1' to %2 could not be sent." +#~ msgstr "給 %2 的訊息'%1' 無法傳送。" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b1644a8..9c5581e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,5 @@ -INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ) +INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${QT_INCLUDES} ${QCA2_INCLUDE_DIR} ) ########### next target ############### @@ -10,17 +10,16 @@ SET(kmess_SOURCES chat/chatview.cpp chat/chat.cpp chat/chatwindow.cpp - chat/contactaction.cpp chat/contactframe.cpp - chat/contactsidebar.cpp - chat/emoticonsidebar.cpp + chat/contactswidget.cpp + chat/emoticonswidget.cpp chat/inkedit.cpp + chat/chatstatusbar.cpp chat/xsltransformation.cpp + chat/winkswidget.cpp contact/contactbase.cpp contact/contact.cpp contact/contactextension.cpp - contact/contactlist.cpp - contact/contactlistmodelitem.cpp contact/group.cpp contact/invitedcontact.cpp contact/msnobject.cpp @@ -28,11 +27,18 @@ SET(kmess_SOURCES dialogs/addcontactdialog.cpp dialogs/addemoticondialog.cpp dialogs/awaymessagedialog.cpp + dialogs/chathistorydialog.cpp dialogs/contactaddeduserdialog.cpp + dialogs/contactentry.cpp dialogs/contactpropertiesdialog.cpp + dialogs/invitedialog.cpp + dialogs/listexportdialog.cpp dialogs/userpicturesdialog.cpp dialogs/transferentry.cpp dialogs/transferwindow.cpp + model/contactlist.cpp + model/contactlistmodelitem.cpp + model/contactlistmodelfilter.cpp network/chatinformation.cpp network/chatmessage.cpp network/mimemessage.cpp @@ -64,11 +70,14 @@ SET(kmess_SOURCES network/extra/directconnectionpool.cpp network/extra/msndirectconnection.cpp network/extra/msnftpconnection.cpp + network/extra/msnwebcamconnection.cpp network/extra/p2pfragmenttracker.cpp + network/soap/addressbookservice.cpp network/soap/httpsoapconnection.cpp network/soap/msnappdirectoryservice.cpp network/soap/offlineimservice.cpp network/soap/passportloginservice.cpp + network/soap/roamingservice.cpp network/soap/soapmessage.cpp network/upnp/igdcontrolpoint.cpp network/upnp/layer3forwardingservice.cpp @@ -81,13 +90,11 @@ SET(kmess_SOURCES notification/contactstatusnotification.cpp notification/notificationmanager.cpp notification/newemailnotification.cpp - notification/passivepopup.cpp - notification/passivepopupview.cpp - notification/passivepopupwidget.cpp + notification/systemtraywidget.cpp settings/accountpage.cpp settings/accountsettingsdialog.cpp settings/accountsmanagerpage.cpp - settings/alertspage.cpp + settings/contactlistpage.cpp settings/chatloggingpage.cpp settings/chatstylepage.cpp settings/emoticonspage.cpp @@ -97,6 +104,8 @@ SET(kmess_SOURCES utils/idletimer.cpp utils/kmessconfig.cpp utils/kmessdbus.cpp + utils/kmessdbusadaptor.cpp + utils/kmessdbusdatatypes.cpp utils/kmessshared.cpp utils/nowlisteningclient.cpp utils/richtextparser.cpp @@ -106,8 +115,6 @@ SET(kmess_SOURCES account.cpp accountaction.cpp accountsmanager.cpp - contactlistviewdelegate.cpp - contactlistmodelfilter.cpp currentaccount.cpp emoticon.cpp emoticonmanager.cpp @@ -117,31 +124,33 @@ SET(kmess_SOURCES kmess.cpp kmessdebug.cpp kmessinterface.cpp - kmesstest.cpp kmessview.cpp + kmessviewdelegate.cpp main.cpp - systemtraywidget.cpp ) SET(kmess_UI_FILES initialview.ui kmessview.ui - chat/chatview.ui chat/chatwindow.ui chat/contactframe.ui + chat/contactswidget.ui chat/inkedit.ui dialogs/addcontactdialog.ui dialogs/addemoticondialog.ui dialogs/awaymessagedialog.ui + dialogs/chathistorydialog.ui dialogs/contactaddeduserdialog.ui dialogs/transferentry.ui dialogs/transferwindow.ui + dialogs/contactentry.ui dialogs/contactpropertiesdialog.ui + dialogs/invitedialog.ui + dialogs/listexportdialog.ui dialogs/userpicturesdialog.ui - notification/passivepopupview.ui settings/accountpage.ui settings/accountsmanagerpage.ui - settings/alertspage.ui + settings/contactlistpage.ui settings/chatloggingpage.ui settings/chatstylepage.ui settings/emoticonspage.ui @@ -154,20 +163,39 @@ SET(kmess_LIBS ${KDE4_KIO_LIBS} ${KDE4_KHTML_LIBS} ${KDE4_KNOTIFYCONFIG_LIBS} + ${KDE4_KNEWSTUFF2_LIBS} ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} + ${QCA2_LIBRARIES} + ${QT_QTTEST_LIBRARY} ) # If we're compiling in debug mode: -IF( ${KMESS_ENABLE_DEBUG_OUTPUT} ) +IF( ${KMESS_ENABLE_DEBUG_OUTPUT} EQUAL 1 ) # Enable the Network Window SET(kmess_SOURCES ${kmess_SOURCES} dialogs/networkwindow.cpp) SET(kmess_UI_FILES ${kmess_UI_FILES} dialogs/networkwindow.ui) + # Enable the Null Socket + SET(kmess_SOURCES ${kmess_SOURCES} network/msnsocketnull.cpp) + # Enable the testing class + SET(kmess_SOURCES ${kmess_SOURCES} kmesstest.cpp) + # Enable the old parser + SET(kmess_SOURCES ${kmess_SOURCES} ../tests/old_richtextparser.cpp) # Enable the Models tester IF( CMAKE_BUILD_TYPE STREQUAL debugfull ) SET( kmess_SOURCES ${kmess_SOURCES} ../tests/modeltest/modeltest.cpp ) ENDIF( CMAKE_BUILD_TYPE STREQUAL debugfull ) -ENDIF( ${KMESS_ENABLE_DEBUG_OUTPUT} ) + + # Enable LikeBack + SET( kmess_SOURCES ${kmess_SOURCES} + utils/likeback/likeback.cpp + utils/likeback/likebackbar.cpp + utils/likeback/likebackdialog.cpp ) + SET( kmess_UI_FILES ${kmess_UI_FILES} + utils/likeback/likebackbar.ui + utils/likeback/likebackdialog.ui ) + +ENDIF( ${KMESS_ENABLE_DEBUG_OUTPUT} EQUAL 1 ) # Enable BinReloc for Autopackage support. Also requires libpthread IF( UNIX AND KMESS_ENABLE_BINRELOC EQUAL 1 ) @@ -183,9 +211,6 @@ ENDIF( X11_Xscreensaver_FOUND ) # Define the app icon for Windows / Mac OS KDE4_ADD_APP_ICON( kmess_SOURCES ../data/icons/hi*-app-kmess.png ) -# Define DBus adaptor for org.kmess.remoteControl -QT4_ADD_DBUS_ADAPTOR( kmess_SOURCES utils/kmessdbus.xml utils/kmessdbus.h KMessDBus ) - # Define all files KDE4_ADD_UI_FILES( kmess_SOURCES ${kmess_UI_FILES} ) KDE4_ADD_EXECUTABLE( kmess ${kmess_SOURCES} ) @@ -194,3 +219,11 @@ KDE4_ADD_EXECUTABLE( kmess ${kmess_SOURCES} ) TARGET_LINK_LIBRARIES( kmess ${kmess_LIBS} ) INSTALL( TARGETS kmess DESTINATION ${BIN_INSTALL_DIR}) + +INSTALL( FILES chat/chatwindowui.rc DESTINATION ${DATA_INSTALL_DIR}/kmess ) +INSTALL( FILES kmessinterfaceui.rc DESTINATION ${DATA_INSTALL_DIR}/kmess ) + +IF( LIBKONQ_FOUND ) + ADD_SUBDIRECTORY( utils/kmess-send ) +ENDIF( LIBKONQ_FOUND ) + diff --git a/src/account.cpp b/src/account.cpp index 92e3784..4260e7c 100644 --- a/src/account.cpp +++ b/src/account.cpp @@ -34,7 +34,8 @@ #ifdef KMESSDEBUG_ACCOUNT #define KMESSDEBUG_ACCOUNT_GENERAL - #define KMESSDEBUG_ACCOUNT_DIRTY +// #define KMESSDEBUG_ACCOUNT_DIRTY +// #define KMESSDEBUG_ACCOUNT_MSNOBJECT #endif @@ -47,13 +48,6 @@ Account::Account() contactListDisplayMode_(VIEW_MIXED), deleted_(false), dirty_(false), - doNotifyContactsOnline_(true), - doNotifyContactsStatus_(false), - doNotifyContactsChatStart_(true), - doNotifyContactsChatMessages_(false), - doNotifyContactsOffline_(true), - doNotifyInboxEmails_(true), - doNotifyOtherEmails_(false), emailSupported_(true), // Assume true (for new accounts), until the msn server proves the opposite emoticonStyle_("KMess-new"), fontColor_("#000000"), @@ -61,15 +55,21 @@ Account::Account() guestAccount_(true), groupFollowupMessages_(true), handle_( i18n("you@hotmail.com") ), + hideNotificationsWhenBusy_(false), idleTime_(5), initialStatus_(STATUS_ONLINE), listPictureSize_(0), notificationDuration_(10), saveChats_(false), + saveChatsToFile_(false), + saveChatsFormat_(EXPORT_HTML), savedChatDirectoryStructure_( 0 ), savePassword_(false), shakeNudge_(true), showAllowedContacts_(false), + showChatUserPicture_(false), + showContactEmail_(false), + showContactListBird_(true), showEmail_(true), showEmptyGroups_(true), showMessageTime_(true), @@ -77,8 +77,13 @@ Account::Account() showOfflineContacts_(true), showOtherFolders_(true), showRemovedContacts_(false), - showSidebar_(true), + showHistoryBox_(false), + showSearchBar_(true), + showSessionInfo_(false), + showWinks_(true), tabbedChatMode_( 0 ), + timestampShowSeconds_(false), + timestampShowDate_(false), useAutologin_(false), useContactFont_(false), useEmoticons_(true), @@ -92,8 +97,6 @@ Account::Account() showPicture_(true), msnObject_(0) { - QDir homeDir; - font_.setFamily("Arial"); font_.setBold(false); font_.setItalic(false); @@ -105,8 +108,7 @@ Account::Account() contactFont_.setItalic(false); contactFont_.setUnderline(false); - homeDir = QDir::home(); - saveChatPath_ = homeDir.absolutePath(); + saveChatPath_ = QDir::home().absolutePath(); } @@ -127,111 +129,84 @@ Account::~Account() // Copy an account void Account::copyAccount( const Account *account ) { - // This method is called to write information from a global Account - // object to the CurrentAccount and visa-versa. - // See also: copyAccountUISettings() for properties only changed by the GUI. +#ifdef KMESSDEBUG_ACCOUNT_GENERAL + kDebug() << "Copying account data..."; +#endif - setListPictureSize ( account->getListPictureSize() ); - setLoginInformation ( account->getHandle(), - account->getFriendlyName( STRING_ORIGINAL ), - account->getPassword() ); - setShowAllowedContacts ( account->getShowAllowedContacts() ); - setContactListDisplayMode ( account->getContactListDisplayMode() ); - setShowOfflineContacts ( account->getShowOfflineContacts() ); - setShowRemovedContacts ( account->getShowRemovedContacts() ); - setShowEmptyGroups ( account->getShowEmptyGroups () ); - setEmoticonStyle ( account->getEmoticonStyle() ); + // This method is used to clone the settings of an Account to the CurrentAccount, + // or vice-versa. - setAlertsInformation ( account->getUseIdleTimer(), - account->getIdleTime(), - account->getShakeNudge(), - account->getShowNowListening(), - account->getShowWinks() ); - setNotificationsInformation( account->getNotifyContactsOnline(), - account->getNotifyContactsStatus(), - account->getNotifyContactsChatStart(), - account->getNotifyContactsChatMessages(), - account->getNotifyContactsOffline(), - account->getNotifyInboxEmails(), - account->getNotifyOtherEmails(), - account->getNotificationDuration(), - account->getHideNotificationsWhenBusy() ); - setChatInformation ( account->getUseContactFont(), - account->getUseEmoticons(), - account->getUseFontEffects(), - account->getUseListFormatting(), - account->getUseChatFormatting(), - account->getShowMessageTime(), - account->getGroupFollowupMessages(), - account->getTabbedChatMode(), - account->getChatStyle() ); - setChatLoggingInformation ( account->getSaveChats(), - account->getSaveChatPath(), - account->getSavedChatDirectoryStructure() ); - setEmailInformation ( account->getShowEmail(), - account->getShowOtherFolders() ); - setEmailSupported ( account->getEmailSupported() ); - setFontInformation ( account->getFont(), - account->getFontColor(), - account->getContactFont(), - account->getContactFontColor() ); - setPersonalMessage ( account->getPersonalMessage( STRING_ORIGINAL ) ); + // The method calls update all properties for which + // we need to send signals to the rest of the application. + setChatInformation ( account->getUseContactFont(), + account->getUseEmoticons(), + account->getShowWinks(), + account->getUseFontEffects(), + account->getUseChatFormatting(), + account->getShakeNudge(), + account->getShowMessageTime(), + account->getTimestampShowDate(), + account->getTimestampShowSeconds(), + account->getGroupFollowupMessages(), + account->getTabbedChatMode(), + account->getChatStyle() ); + setContactListDisplayMode ( account->getContactListDisplayMode() ); + setContactListOptions ( account->getShowNowListening(), + account->getShowContactEmail(), + account->getUseListFormatting() ); + setEmailInformation ( account->getShowEmail(), + account->getShowOtherFolders() ); + setEmoticonStyle ( account->getEmoticonStyle() ); + setFontInformation ( account->getFont(), + account->getFontColor(), + account->getContactFont(), + account->getContactFontColor() ); + setGuestAccount ( account->isGuestAccount() ); + setListPictureSize ( account->getListPictureSize() ); + setLoginInformation ( account->getHandle(), + account->getFriendlyName( STRING_ORIGINAL ), + account->getPassword() ); + setPersonalMessage ( account->getPersonalMessage( STRING_ORIGINAL ) ); + setShowAllowedContacts ( account->getShowAllowedContacts() ); + setShowChatUserPicture ( account->getShowChatUserPicture() ); + setShowContactListBird ( account->getShowContactListBird() ); + setShowEmptyGroups ( account->getShowEmptyGroups () ); + setShowOfflineContacts ( account->getShowOfflineContacts() ); + setShowRemovedContacts ( account->getShowRemovedContacts() ); + setStatusOptions ( account->getUseIdleTimer(), + account->getIdleTime(), + account->getHideNotificationsWhenBusy() ); - setUseAutologin ( account->getUseAutologin() ); - setAutoreplyMessage ( account->getAutoreplyMessage() ); - setShowSidebar ( account->getShowSidebar() ); - setInitialStatus ( account->getInitialStatus() ); - setGuestAccount ( account->isGuestAccount() ); + // With direct copying we can quickly duplicate those properties + // for which we don't need to send updates + autoreplyMessage_ = account->autoreplyMessage_; + deleted_ = account->deleted_; + dirty_ = account->dirty_; + displayPicturePath_ = account->displayPicturePath_; + emailSupported_ = account->emailSupported_; + initialStatus_ = account->initialStatus_; + originalDisplayPicturePath_ = account->originalDisplayPicturePath_; + saveChats_ = account->saveChats_; + saveChatsToFile_ = account->saveChatsToFile_; + saveChatsFormat_ = account->saveChatsFormat_; + saveChatPath_ = account->saveChatPath_; + savedChatDirectoryStructure_ = account->savedChatDirectoryStructure_; + savePassword_ = account->savePassword_; + showHistoryBox_ = account->showHistoryBox_; + showPicture_ = account->showPicture_; + showSearchBar_ = account->showSearchBar_; + showSessionInfo_ = account->showSessionInfo_; + tabbedChatMode_ = account->tabbedChatMode_; + temporaryPassword_ = account->temporaryPassword_; + useAutologin_ = account->useAutologin_; + verified_ = account->verified_; - setShowPicture ( account->getShowPicture() ); - setTemporaryPassword ( account->getTemporaryPassword() ); - setVerified ( account->isVerified() ); - - dirty_ = account->isDirty(); - displayPicturePath_ = account->displayPicturePath_; + // The MSN object needs to be replaced updateMsnObject(); } -// Copy an account's user-interface, not settings, changable properties -void Account::copyAccountUISettings( const Account *account ) -{ - // All properties that are modified through the main gui are listed here. - - // Contact list menu's - setListPictureSize( account->getListPictureSize() ); - setShowAllowedContacts( account->getShowAllowedContacts() ); - setShowOfflineContacts( account->getShowOfflineContacts() ); - setShowRemovedContacts( account->getShowRemovedContacts() ); - setContactListDisplayMode( account->getContactListDisplayMode() ); - setShowEmptyGroups ( account->getShowEmptyGroups () ); - - // Contact list header - setPersonalMessage ( account->getPersonalMessage( STRING_ORIGINAL ) ); - setAutoreplyMessage ( account->getAutoreplyMessage() ); - - // Login - setGuestAccount ( account->isGuestAccount() ); - setEmailSupported ( account->getEmailSupported() ); - setVerified ( account->isVerified() ); - password_ = account->getPassword(); - - // Chat settings - setShowSidebar ( account->getShowSidebar() ); - setFontInformation ( account->getFont(), - account->getFontColor(), - account->getContactFont(), - account->getContactFontColor() ); - - - // Settings - displayPicturePath_ = account->displayPicturePath_; - dirty_ = account->isDirty(); -} - - - // Set the account as deleted void Account::setDeleted() { @@ -343,70 +318,6 @@ const int& Account::getIdleTime() const -// Return the time popup windows are shown. -const int& Account::getNotificationDuration() const -{ - return notificationDuration_; -} - - - -// Return if popup notifications will be shown for contacts which come online. -bool Account::getNotifyContactsOnline() const -{ - return doNotifyContactsOnline_; -} - - - -// Return if popup notifications will be shown for contacts which change their msn status. -bool Account::getNotifyContactsStatus() const -{ - return doNotifyContactsStatus_; -} - - - -// Return if popup notifications will be shown for contacts which start a chat with you. -bool Account::getNotifyContactsChatStart() const -{ - return doNotifyContactsChatStart_; -} - - - -// Return if popup notifications will be shown for all received chat messages. -bool Account::getNotifyContactsChatMessages() const -{ - return doNotifyContactsChatMessages_; -} - - - -// Return if popup notifications will be shown for contacts which go offline. -bool Account::getNotifyContactsOffline() const -{ - return doNotifyContactsOffline_; -} - - - -// Return if popup notifications will be shown for mail incoming in the Inbox. -bool Account::getNotifyInboxEmails() const -{ - return doNotifyInboxEmails_; -} - - - -// Return if popup notifications will be shown for mail incoming in other folders. -bool Account::getNotifyOtherEmails() const -{ - return doNotifyOtherEmails_; -} - - - // Return whether now listening information should be displayed. bool Account::getShowNowListening() const { @@ -463,6 +374,22 @@ bool Account::getSaveChats() const +// Return whether or not to save chats to external files +bool Account::getSaveChatsToFile() const +{ + return saveChatsToFile_; +} + + + +// Return the format in which chats will be saved +Account::ChatExportFormat Account::getSaveChatsFormat() const +{ + return saveChatsFormat_; +} + + + // Return the base directory to which chats are saved. const QString& Account::getSaveChatPath() const { @@ -503,6 +430,30 @@ bool Account::getShowAllowedContacts() const +// Read whether to show the user picture in chat windows +bool Account::getShowChatUserPicture() const +{ + return showChatUserPicture_; +} + + + +// Read whether or not to show the email of contacts in the contact list instead of their friendly name +bool Account::getShowContactEmail() const +{ + return showContactEmail_; +} + + + +// Get whether to show the contact list background image +bool Account::getShowContactListBird() const +{ + return showContactListBird_; +} + + + // Read whether the email information should be shown in the main view. bool Account::getShowEmail() const { @@ -519,6 +470,14 @@ bool Account::getShowEmptyGroups() const +// Read whether or not to show the contact list history box +bool Account::getShowHistoryBox() const +{ + return showHistoryBox_; +} + + + // Read whether message times should be shown. bool Account::getShowMessageTime() const { @@ -551,10 +510,18 @@ bool Account::getShowRemovedContacts() const -// Read whether or not the sidebar should be shown in chats -bool Account::getShowSidebar() const +// Read whether or not we need to show a search bar in the contact list +bool Account::getShowSearchBar() const { - return showSidebar_; + return showSearchBar_; +} + + + +// Read whether or not to show join/part messages in chat +bool Account::getShowSessionInfo() const +{ + return showSessionInfo_; } @@ -583,6 +550,22 @@ const QString & Account::getTemporaryPassword() const +// Returns whether the seconds should be shown in message timestamp +bool Account::getTimestampShowDate() const +{ + return timestampShowDate_; +} + + + +// Returns whether the seconds should be shown in message timestamp +bool Account::getTimestampShowSeconds() const +{ + return timestampShowSeconds_; +} + + + // Return whether or not to autologin with this profile. bool Account::getUseAutologin() const { @@ -678,6 +661,14 @@ const QString Account::getPicturePath() const +// Return location of the display picture original +const QString Account::getOriginalPicturePath() const +{ + return originalDisplayPicturePath_; +} + + + // Returns the string representation of the MsnObject const QString Account::getMsnObjectString() const { @@ -753,13 +744,7 @@ void Account::readProperties( const QString &handle ) contactListDisplayMode_ = (Account::ContactListDisplayMode) profileGroup.readEntry( "contactListDisplayMode", (int)VIEW_MIXED ); displayPicturePath_ = profileGroup.readEntry( "displayPicturePath", "" ); - doNotifyContactsOnline_ = profileGroup.readEntry( "doNotifyContactsOnline", true ); - doNotifyContactsStatus_ = profileGroup.readEntry( "doNotifyContactsStatus", false ); - doNotifyContactsChatStart_ = profileGroup.readEntry( "doNotifyContactsChatStart", true ); - doNotifyContactsChatMessages_ = profileGroup.readEntry( "doNotifyContactsChatMessages", false ); - doNotifyContactsOffline_ = profileGroup.readEntry( "doNotifyContactsOffline", true ); - doNotifyInboxEmails_ = profileGroup.readEntry( "doNotifyInboxEmails", true ); - doNotifyOtherEmails_ = profileGroup.readEntry( "doNotifyOtherEmails", false ); + originalDisplayPicturePath_ = profileGroup.readEntry( "originalDisplayPicturePath", "" ); emailSupported_ = profileGroup.readEntry( "emailSupported", true ); emoticonStyle_ = profileGroup.readEntry( "emoticonStyle", "KMess-new" ); font_.setFamily ( profileGroup.readEntry( "fontfamily", "Arial" ) ); @@ -768,7 +753,7 @@ void Account::readProperties( const QString &handle ) font_.setPointSize ( profileGroup.readEntry( "fontpointsize", 12 ) ); font_.setUnderline ( profileGroup.readEntry( "fontunderline", false ) ); fontColor_ = profileGroup.readEntry( "fontColor" , "#000000" ); - friendlyName_.setString ( profileGroup.readEntry( "friendlyName" , "" ) ); + friendlyName_.setString ( profileGroup.readEntry( "friendlyName", handle_ ) ); groupFollowupMessages_ = profileGroup.readEntry( "groupfollowupmessages", true ); hideNotificationsWhenBusy_ = profileGroup.readEntry( "hideNotificationsWhenBusy", false ); idleTime_ = profileGroup.readEntry( "idleTime", 5 ); @@ -778,20 +763,30 @@ void Account::readProperties( const QString &handle ) personalMessage_.setString ( profileGroup.readEntry( "personalMessage", "" ) ); saveChatPath_ = profileGroup.readEntry( "saveChatPath", defaultPath ); saveChats_ = profileGroup.readEntry( "saveChats", false ); + saveChatsToFile_ = profileGroup.readEntry( "saveChatsToFile", false ); + saveChatsFormat_ = (ChatExportFormat)profileGroup.readEntry( "saveChatsFormat", (int) EXPORT_HTML ); savedChatDirectoryStructure_ = profileGroup.readEntry( "savedChatDirectoryStructure", 0 ); savePassword_ = profileGroup.readEntry( "savePassword", false ); shakeNudge_ = profileGroup.readEntry( "shakeNudge", true ); showAllowedContacts_ = profileGroup.readEntry( "showAllowed", false ); + showChatUserPicture_ = profileGroup.readEntry( "showChatUserPicture", false ); + showContactEmail_ = profileGroup.readEntry( "showContactEmail", false ); + showContactListBird_ = profileGroup.readEntry( "showContactListBird", true ); showEmail_ = profileGroup.readEntry( "showEmail", true ); showEmptyGroups_ = profileGroup.readEntry( "showEmptyGroups", true ); + showHistoryBox_ = profileGroup.readEntry( "showHistoryBox", false ); showPicture_ = profileGroup.readEntry( "showPicture", true ); showMessageTime_ = profileGroup.readEntry( "showMessageTime", true ); showNowListening_ = profileGroup.readEntry( "showNowListening", false ); showOfflineContacts_ = profileGroup.readEntry( "showOfflineContacts", true ); showOtherFolders_ = profileGroup.readEntry( "showOtherFolders", true ); showRemovedContacts_ = profileGroup.readEntry( "showRemoved", false ); - showSidebar_ = profileGroup.readEntry( "showSidebar", true ); + showSearchBar_ = profileGroup.readEntry( "showSearchBar", true ); + showSessionInfo_ = profileGroup.readEntry( "showSessionInfo", false ); + showWinks_ = profileGroup.readEntry( "showWinks", true ); tabbedChatMode_ = profileGroup.readEntry( "tabbedChatMode", 2 ); + timestampShowDate_ = profileGroup.readEntry( "timestampShowDate", false ); + timestampShowSeconds_ = profileGroup.readEntry( "timestampShowSeconds", false ); useAutologin_ = profileGroup.readEntry( "useAutologin", false ); useChatFormatting_ = profileGroup.readEntry( "useChatFormatting", false ); useContactFont_ = profileGroup.readEntry( "useContactFont", false ); @@ -814,7 +809,7 @@ void Account::readProperties( const QString &handle ) // This default is "Fresh" as of 1.5 final, to improve the first impression a user gets. // The previous "Default" theme has been renamed to "Classic". // This code also makes the migration from 1.5-pre2 to 1.5 (and beyond) easier. - if( KGlobal::dirs()->findResource( "data", "kmess/styles/" + chatStyle_ + "/" + chatStyle_ + ".xsl" ).isEmpty() ) + if( KGlobal::dirs()->findResource( "data", "kmess/styles/" + chatStyle_ + '/' + chatStyle_ + ".xsl" ).isEmpty() ) { #ifdef KMESSDEBUG_ACCOUNT_DIRTY kDebug() << "Auto-corrected chat & setting, setting 'dirty' to true."; @@ -836,10 +831,12 @@ void Account::saveProperties() if( guestAccount_ ) { kWarning() << "Application attempted to save a guest account!"; + return; } if( deleted_ ) { kWarning() << "Application attempted to save the deleted account again!"; + return; } // Choose the main group @@ -862,13 +859,7 @@ void Account::saveProperties() profileGroup.writeEntry( "contactfontcolor", contactFontColor_ ); profileGroup.writeEntry( "contactListDisplayMode", (int)contactListDisplayMode_ ); profileGroup.writeEntry( "displayPicturePath", displayPicturePath_ ); - profileGroup.writeEntry( "doNotifyContactsOnline", doNotifyContactsOnline_ ); - profileGroup.writeEntry( "doNotifyContactsStatus", doNotifyContactsStatus_ ); - profileGroup.writeEntry( "doNotifyContactsChatStart", doNotifyContactsChatStart_ ); - profileGroup.writeEntry( "doNotifyContactsChatMessages", doNotifyContactsChatMessages_ ); - profileGroup.writeEntry( "doNotifyContactsOffline", doNotifyContactsOffline_ ); - profileGroup.writeEntry( "doNotifyInboxEmails", doNotifyInboxEmails_ ); - profileGroup.writeEntry( "doNotifyOtherEmails", doNotifyOtherEmails_ ); + profileGroup.writeEntry( "originalDisplayPicturePath", originalDisplayPicturePath_ ); profileGroup.writeEntry( "emailSupported", emailSupported_ ); profileGroup.writeEntry( "emoticonStyle", emoticonStyle_ ); profileGroup.writeEntry( "fontfamily", font_.family() ); @@ -881,26 +872,35 @@ void Account::saveProperties() profileGroup.writeEntry( "groupfollowupmessages", groupFollowupMessages_ ); profileGroup.writeEntry( "hideNotificationsWhenBusy", hideNotificationsWhenBusy_ ); profileGroup.writeEntry( "idleTime", idleTime_ ); - profileGroup.writeEntry( "listPictureSize", listPictureSize_ ); + profileGroup.writeEntry( "listPictureSize", listPictureSize_ ); profileGroup.writeEntry( "notification", notificationDuration_ ); profileGroup.writeEntry( "personalMessage", personalMessage_.getOriginal()); profileGroup.writeEntry( "saveChatPath", saveChatPath_ ); profileGroup.writeEntry( "saveChats", saveChats_ ); + profileGroup.writeEntry( "saveChatsToFile", saveChatsToFile_ ); + profileGroup.writeEntry( "saveChatsFormat", (int) saveChatsFormat_ ); profileGroup.writeEntry( "savePassword", savePassword_ ); profileGroup.writeEntry( "savedChatDirectoryStructure", savedChatDirectoryStructure_ ); profileGroup.writeEntry( "shakeNudge", shakeNudge_ ); profileGroup.writeEntry( "showAllowed", showAllowedContacts_ ); + profileGroup.writeEntry( "showChatUserPicture", showChatUserPicture_ ); + profileGroup.writeEntry( "showContactEmail", showContactEmail_ ); + profileGroup.writeEntry( "showContactListBird", showContactListBird_ ); profileGroup.writeEntry( "showEmail", showEmail_ ); profileGroup.writeEntry( "showEmptyGroups", showEmptyGroups_ ); + profileGroup.writeEntry( "showHistoryBox", showHistoryBox_ ); profileGroup.writeEntry( "showMessageTime", showMessageTime_ ); profileGroup.writeEntry( "showNowListening", showNowListening_ ); profileGroup.writeEntry( "showOfflineContacts", showOfflineContacts_ ); profileGroup.writeEntry( "showOtherFolders", showOtherFolders_ ); profileGroup.writeEntry( "showRemoved", showRemovedContacts_ ); - profileGroup.writeEntry( "showSidebar", showSidebar_ ); + profileGroup.writeEntry( "showSearchBar", showSearchBar_ ); + profileGroup.writeEntry( "showSessionInfo", showSessionInfo_ ); profileGroup.writeEntry( "showWinks", showWinks_ ); profileGroup.writeEntry( "initialStatus", (int)initialStatus_ ); profileGroup.writeEntry( "tabbedChatMode", tabbedChatMode_ ); + profileGroup.writeEntry( "timestampShowDate", timestampShowDate_ ); + profileGroup.writeEntry( "timestampShowSeconds", timestampShowSeconds_ ); profileGroup.writeEntry( "useAutologin", useAutologin_ ); profileGroup.writeEntry( "useChatFormatting", useChatFormatting_ ); profileGroup.writeEntry( "useContactFont", useContactFont_ ); @@ -938,24 +938,31 @@ void Account::saveTemporaryPassword() if( ! temporaryPassword_.isEmpty() && temporaryPassword_ != password_ ) { password_ = temporaryPassword_; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kDebug() << "Setting 'dirty' to true."; -#endif } } -// Set common alerts information -void Account::setAlertsInformation( bool useIdleTimer, int idleTime, bool shakeNudge, bool showNowListening, bool showWinks ) +/** +* +* @brief Set contact list options +* +* @param showNowListening whether to show the song played at the moment +* @param useListFormatting whether or not to enable MSN Plus! formatting in the contact list +* @param showContactEmail whether to show contact email instead of friendly name in the contact list +*/ +void Account::setContactListOptions( bool showNowListening, bool showContactEmail, bool useListFormatting ) { - useIdleTimer_ = useIdleTimer; - idleTime_ = idleTime; - shakeNudge_ = shakeNudge; - showWinks_ = showWinks; + if( useListFormatting_ != useListFormatting + || showContactEmail_ != showContactEmail ) + { + useListFormatting_ = useListFormatting; + showContactEmail_ = showContactEmail; + + //let the contact list update to reflect the new changes + emit changedContactListOptions(); + } - emit changedNotificationsSettings(); emit changedTimerSettings(); if( showNowListening_ != showNowListening ) @@ -976,30 +983,6 @@ void Account::setAlertsInformation( bool useIdleTimer, int idleTime, bool shakeN -// Set notification alerts information -void Account::setNotificationsInformation( bool doNotifyContactsOnline, bool doNotifyContactsStatus, bool doNotifyContactsChatStart, - bool doNotifyContactsChatMessages, bool doNotifyContactsOffline, bool doNotifyInboxEmails, bool doNotifyOtherEmails, int notificationDuration, bool hideWhenBusy ) -{ - doNotifyContactsOnline_ = doNotifyContactsOnline; - doNotifyContactsStatus_ = doNotifyContactsStatus; - doNotifyContactsChatStart_ = doNotifyContactsChatStart; - doNotifyContactsChatMessages_ = doNotifyContactsChatMessages; - doNotifyContactsOffline_ = doNotifyContactsOffline; - doNotifyInboxEmails_ = doNotifyInboxEmails; - doNotifyOtherEmails_ = doNotifyOtherEmails; - notificationDuration_ = notificationDuration; - hideNotificationsWhenBusy_ = hideWhenBusy; - - emit changedNotificationsSettings(); - - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kDebug() << "Setting 'dirty' to true."; -#endif -} - - - // Set the auto-reply message. void Account::setAutoreplyMessage( const QString& autoreplyMessage) { @@ -1015,21 +998,33 @@ void Account::setAutoreplyMessage( const QString& autoreplyMessage) -// Set chat information -void Account::setChatInformation( bool useContactFont, bool useEmoticons, bool useFontEffects, - bool useListFormatting, bool useChatFormatting, - bool showMessageTime, bool groupFollowupMessages, int tabbedChatMode, - const QString& chatStyle ) +/** +* +* @brief Set chat information +* +* Set options related to chatting +* @param useChatFormatting whether to show MSN Plus formatting in chat +* @param shakeNudge whether the chat window should shake when a nudge is received or sent +* +*/ + void Account::setChatInformation( bool useContactFont, bool useEmoticons, bool showWinks, + bool useFontEffects, bool useChatFormatting, bool shakeNudge, + bool showMessageTime, bool timestampShowDate, + bool timestampShowSeconds, bool groupFollowupMessages, + int tabbedChatMode, const QString &chatStyle ) { - bool changedSettings = (useContactFont_ != useContactFont) - || (useEmoticons_ != useEmoticons) - || (useFontEffects_ != useFontEffects) - || (useListFormatting_ != useListFormatting) - || (useChatFormatting_ != useChatFormatting) - || (showMessageTime_ != showMessageTime) - || (groupFollowupMessages_ != groupFollowupMessages) - || (tabbedChatMode_ != tabbedChatMode) - || (chatStyle_ != chatStyle); + bool changedSettings = ( useContactFont_ != useContactFont ) + || ( useEmoticons_ != useEmoticons ) + || ( showWinks_ != showWinks ) + || ( useFontEffects_ != useFontEffects ) + || ( useChatFormatting_ != useChatFormatting ) + || ( shakeNudge_ != shakeNudge ) + || ( showMessageTime_ != showMessageTime ) + || ( timestampShowDate_ != timestampShowDate ) + || ( timestampShowSeconds_ != timestampShowSeconds ) + || ( groupFollowupMessages_ != groupFollowupMessages ) + || ( tabbedChatMode_ != tabbedChatMode ) + || ( chatStyle_ != chatStyle ); // Avoid signals because the chat windows will regenerate all messages. if( ! changedSettings ) @@ -1040,9 +1035,11 @@ void Account::setChatInformation( bool useContactFont, bool useEmoticons, bool u useContactFont_ = useContactFont; useEmoticons_ = useEmoticons; useFontEffects_ = useFontEffects; - useListFormatting_ = useListFormatting; useChatFormatting_ = useChatFormatting; + shakeNudge_ = shakeNudge; showMessageTime_ = showMessageTime; + timestampShowDate_ = timestampShowDate; + timestampShowSeconds_ = timestampShowSeconds; groupFollowupMessages_ = groupFollowupMessages; tabbedChatMode_ = tabbedChatMode; chatStyle_ = chatStyle; @@ -1058,20 +1055,29 @@ void Account::setChatInformation( bool useContactFont, bool useEmoticons, bool u // Set chat logging information -void Account::setChatLoggingInformation( bool saveChats, const QString& saveChatPath, const int& directoryStructure ) +void Account::setChatLoggingInformation( bool saveChats, bool saveChatsToFile, Account::ChatExportFormat saveChatsFormat, + const QString& saveChatPath, int directoryStructure ) { - if( saveChats_ != saveChats - || saveChatPath_ != saveChatPath - || savedChatDirectoryStructure_ != directoryStructure ) + if( saveChats_ == saveChats + && saveChatsToFile_ == saveChatsToFile + && saveChatsFormat_ == saveChatsFormat + && saveChatPath_ == saveChatPath + && savedChatDirectoryStructure_ == directoryStructure ) { - saveChats_ = saveChats; - saveChatPath_ = saveChatPath; - savedChatDirectoryStructure_ = directoryStructure; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kDebug() << "Setting 'dirty' to true."; -#endif + return; } + + saveChats_ = saveChats; + saveChatsToFile_ = saveChatsToFile; + saveChatsFormat_ = saveChatsFormat; + saveChatPath_ = saveChatPath; + savedChatDirectoryStructure_ = directoryStructure; + + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif } @@ -1120,7 +1126,7 @@ void Account::setEmailSupported(bool emailSupported) dirty_ = true; } - emailSupported_ = emailSupported; + emailSupported_ = emailSupported; } @@ -1157,7 +1163,6 @@ void Account::setFontColor( const QString& fontColor ) - // Set the fonts and font colors void Account::setFontInformation( const QFont& font, const QString &fontColor, const QFont& contactFont, const QString &contactFontColor) { @@ -1288,9 +1293,9 @@ void Account::setLoginInformation( QString handle, QString friendlyName, QString handle = handle.toLower(); - if( handle_ == handle - && friendlyName_.getOriginal() == friendlyName - && ( password.isEmpty() || password == password_ ) ) + if( handle_ == handle + && friendlyName_.getOriginal() == friendlyName + && password == password_ ) { return; } @@ -1318,72 +1323,10 @@ void Account::setLoginInformation( QString handle, QString friendlyName, QString -// Set whether to show popup notifications when contacts come online. -void Account::setNotifyContactsOnline( bool doNotifyContactsOnline ) -{ - doNotifyContactsOnline_ = doNotifyContactsOnline; -} - - - -// Set whether to show popup notifications when contacts change their msn status. -void Account::setNotifyContactsStatus( bool doNotifyContactsStatus ) -{ - doNotifyContactsStatus_ = doNotifyContactsStatus; -} - - - -// Set whether to show popup notifications when contacts start a chat with you. -void Account::setNotifyContactsChatStart( bool doNotifyContactsChatStart ) -{ - doNotifyContactsChatStart_ = doNotifyContactsChatStart; -} - - - -// Set whether to show popup notifications for all received chat messages. -void Account::setNotifyContactsChatMessages( bool doNotifyContactsChatMessages ) -{ - doNotifyContactsChatMessages_ = doNotifyContactsChatMessages; -} - - - -// Set whether to show popup notifications when contacts go offline. -void Account::setNotifyContactsOffline( bool doNotifyContactsOffline ) -{ - doNotifyContactsOffline_ = doNotifyContactsOffline; -} - - - -// Set whether to show popup notifications for mail incoming in the Inbox. -void Account::setNotifyInboxEmails( bool doNotifyInboxEmails ) -{ - doNotifyInboxEmails_ = doNotifyInboxEmails; -} - - - -// Set whether to show popup notifications for mail incoming in other folders. -void Account::setNotifyOtherEmails( bool doNotifyOtherEmails ) -{ - doNotifyOtherEmails_ = doNotifyOtherEmails; -} - - - // Set the account's login password void Account::setPassword( const QString &password ) { password_ = password; - - dirty_ = true; - -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kDebug() << "Setting 'dirty' to true."; -#endif } @@ -1407,6 +1350,7 @@ void Account::setPersonalMessage(const QString& newMessage) } + // Set the display picture file void Account::setPicturePath( const QString& picturePath ) { @@ -1429,6 +1373,25 @@ void Account::setPicturePath( const QString& picturePath ) +// Save the location of the display picture original +void Account::setOriginalPicturePath( const QString& picturePath ) +{ + if( originalDisplayPicturePath_ == picturePath ) + { + return; + } + + originalDisplayPicturePath_ = picturePath; + + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + // Set if the password must be stored void Account::setSavePassword( bool savePassword ) { @@ -1459,6 +1422,45 @@ void Account::setShowAllowedContacts( bool showAllowedContacts ) +// Set whether to show the user picture in chat windows +void Account::setShowChatUserPicture( bool showChatUserPicture ) +{ + if( showChatUserPicture == showChatUserPicture_ ) + { + return; + } + + showChatUserPicture_ = showChatUserPicture; + emit changedMsnObject(); + + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + +} + + + +// Set whether to show the contact list background image +void Account::setShowContactListBird( bool showBird ) +{ + if( showBird == showContactListBird_ ) + { + return; + } + + showContactListBird_ = showBird; + emit changedContactListOptions(); + + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif + +} + + // Set whether empty groups are shown void Account::setShowEmptyGroups( bool showEmptyGroups ) @@ -1479,6 +1481,24 @@ void Account::setShowEmptyGroups( bool showEmptyGroups ) +// Set whether or not to show the contact list history box +void Account::setShowHistoryBox( bool showHistoryBox ) +{ + if ( showHistoryBox_ == showHistoryBox ) + { + return; + } + + showHistoryBox_ = showHistoryBox; + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + // Set whether offline contacts should be shown. void Account::setShowOfflineContacts( bool showOfflineContacts ) { @@ -1511,17 +1531,70 @@ void Account::setShowRemovedContacts( bool showRemovedContacts ) -// Set whether or not the sidebar should be shown in chats -void Account::setShowSidebar( bool showSidebar ) +// Set whether or not we need to show a search bar in the contact list at login +void Account::setShowSearchBar( bool showSearchBar ) { - if ( showSidebar_ != showSidebar ) + if ( showSearchBar_ == showSearchBar ) { - showSidebar_ = showSidebar; - dirty_ = true; -#ifdef KMESSDEBUG_ACCOUNT_DIRTY - kDebug() << "Setting 'dirty' to true."; -#endif + return; } + + showSearchBar_ = showSearchBar; + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +// Set whether or not to show join/part messages in chat +void Account::setShowSessionInfo( bool showSessionInfo ) +{ + if( showSessionInfo_ == showSessionInfo ) + { + return; + } + + showSessionInfo_ = showSessionInfo; + dirty_ = true; + +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif +} + + + +/** +* +* @brief Set the options on the status +* +* @param useIdleTimer whether to set the status as Idle after a while +* @param idleTime the time without activity before being marked as idle +* @param hideNotificationsWhenBusy whether to hide all the notifications when the status is set to Busy +* +*/ +void Account::setStatusOptions( bool useIdleTimer, int idleTime, bool hideNotificationsWhenBusy ) +{ + if( useIdleTimer_ == useIdleTimer + && idleTime_ == idleTime + && hideNotificationsWhenBusy_ == hideNotificationsWhenBusy ) + { + return; + } + + useIdleTimer_ = useIdleTimer; + idleTime_ = idleTime; + hideNotificationsWhenBusy_ = hideNotificationsWhenBusy; + + emit changedViewMode(); + + dirty_ = true; +#ifdef KMESSDEBUG_ACCOUNT_DIRTY + kDebug() << "Setting 'dirty' to true."; +#endif } @@ -1614,13 +1687,13 @@ void Account::updateMsnObject() QString picturePath( getPicturePath() ); if( picturePath != displayPicturePath_ ) { -#ifdef KMESSDEBUG_ACCOUNT_GENERAL +#ifdef KMESSDEBUG_ACCOUNT_MSNOBJECT kDebug() << "Replacing picture" << displayPicturePath_ << "with" << picturePath; #endif displayPicturePath_ = picturePath; } -#ifdef KMESSDEBUG_ACCOUNT_GENERAL +#ifdef KMESSDEBUG_ACCOUNT_MSNOBJECT kDebug() << "Show the picture?" << showPicture_ << "- Set picture path:" << displayPicturePath_; #endif @@ -1644,7 +1717,7 @@ void Account::updateMsnObject() // Detect if there was a change. if(oldMsnString != newMsnString) { -#ifdef KMESSDEBUG_ACCOUNT_GENERAL +#ifdef KMESSDEBUG_ACCOUNT_MSNOBJECT kDebug() << "result is: '" << newMsnString << "'"; #endif emit changedMsnObject(); diff --git a/src/account.h b/src/account.h index 1f1d215..04b91b2 100644 --- a/src/account.h +++ b/src/account.h @@ -47,13 +47,20 @@ class Account : public QObject friend class KMessTest; - public: // Public methods + public: // Public enumerations // Directory structure constants enum ChatDirectoryStructure { SINGLEDIRECTORY = 0 , BYYEAR = 1 , BYMONTH = 2 , BYDAY = 3 }; + /// Available chat exporting formats + enum ChatExportFormat + { + EXPORT_XML /// Export the chat to XML + , EXPORT_HTML /// Export the chat to HTML + , EXPORT_TEXT /// Export the chat to text + }; // Contact List view organization constants enum ContactListDisplayMode { @@ -62,14 +69,13 @@ class Account : public QObject , VIEW_MIXED }; + public: // Public methods // The constructor Account(); // The destructor virtual ~Account(); // Copy an account virtual void copyAccount( const Account *account ); - // Copy an account's user-interface, not settings, changable properties - void copyAccountUISettings( const Account *account ); // Set the account as deleted void setDeleted(); // Read the auto-reply message. @@ -100,36 +106,28 @@ class Account : public QObject Status getInitialStatus() const; // Returns display mode used to show pictures in contact list. int getListPictureSize() const; - // Return the time popup windows are shown. - const int& getNotificationDuration() const; - // Return if popup notifications will be shown for contacts which come online. - bool getNotifyContactsOnline() const; - // Return if popup notifications will be shown for contacts which change their msn status. - bool getNotifyContactsStatus() const; - // Return if popup notifications will be shown for contacts which start a chat with you. - bool getNotifyContactsChatStart() const; - // Return if popup notifications will be shown for all received chat messages. - bool getNotifyContactsChatMessages() const; - // Return if popup notifications will be shown for contacts which go offline. - bool getNotifyContactsOffline() const; - // Return if popup notifications will be shown for mail incoming in the Inbox. - bool getNotifyInboxEmails() const; - // Return if popup notifications will be shown for mail incoming in other folders. - bool getNotifyOtherEmails() const; // Return the user's password QString getPassword() const; // Return the personal message QString getPersonalMessage( FormattingMode mode = STRING_CLEANED ) const; - // Return whether or not to save chats. + // Return whether or not to save chats bool getSaveChats() const; + // Return whether or not to save chats to external files + bool getSaveChatsToFile() const; + // Return the format in which chats will be saved + ChatExportFormat getSaveChatsFormat() const; // Return the base directory to which chats are saved. const QString& getSaveChatPath() const; // Return the code of the structure used to save chats. const int& getSavedChatDirectoryStructure() const; // Read whether or not allowed contacts are shown. bool getShowAllowedContacts() const; + // Read whether to show the user picture in chat windows + bool getShowChatUserPicture() const; // Read whether the email information should be shown in the main view. bool getShowEmail() const; + // Read whether to show the contact list background image + bool getShowContactListBird() const; // Read the selected emoticon's list number const QString& getEmoticonStyle() const; // Read whether to hide notifications when busy @@ -138,8 +136,12 @@ class Account : public QObject bool getSavePassword() const; // Read whether the chat window should shake when a nudge is received or sent. bool getShakeNudge() const; + // Read whether or not to show the email of contacts in the contact list instead of their friendly name + bool getShowContactEmail() const; // Read whether empty groups are shown bool getShowEmptyGroups() const; + // Read whether or not to show the contact list history box + bool getShowHistoryBox() const; // Read whether offline contacts should be shown. bool getShowOfflineContacts() const; // Read property of bool showMessageTime. @@ -150,14 +152,20 @@ class Account : public QObject bool getShowOtherFolders() const; // Read whether or not removed (reverse) contacts are shown. bool getShowRemovedContacts() const; - // Read whether or not the sidebar should be shown in chats - bool getShowSidebar() const; + // Read whether or not we need to show a search bar in the contact list + bool getShowSearchBar() const; + // Read whether or not to show join/part messages in chat + bool getShowSessionInfo() const; // Read whether to show winks bool getShowWinks() const; // Read the way the chats will be grouped together int getTabbedChatMode() const; // Return the a temporary password for the account for login attempts from the initialview dialog const QString & getTemporaryPassword() const; + // Returns whether to show seconds in message timestamp + bool getTimestampShowSeconds() const; + // Returns whether to show date in message timestamp + bool getTimestampShowDate() const; // Return whether or not to autologin with this profile. bool getUseAutologin() const; // Return whether or not to enable MSN Plus! formatting in chat @@ -176,6 +184,8 @@ class Account : public QObject bool getShowPicture() const; // Return the path to the *current* display picture const QString getPicturePath() const; + // Return location of the display picture original + const QString getOriginalPicturePath() const; // Returns the string representation of the MsnObject const QString getMsnObjectString() const; // Whether the account is marked to be deleted @@ -192,16 +202,16 @@ class Account : public QObject void saveProperties(); // The login succeeded with the new password. Save the temporary password as new account password. void saveTemporaryPassword(); - // Set alert information - void setAlertsInformation( bool useIdleTimer, int idleTime, bool shakeNudge, bool showNowListening, bool showWinks ); // Set the auto-reply message. void setAutoreplyMessage( const QString& autoreplyMessage); // Set chat information - void setChatInformation( bool useContactFont, bool useEmoticons, bool useFontEffects, bool useListFormatting, bool useChatFormatting, bool showMessageTime, bool groupFollowupMessages, int tabbedChatMode, const QString& chatStyle ); + void setChatInformation( bool useContactFont, bool useEmoticons, bool showWinks, bool useFontEffects, bool useChatFormatting, bool shakeNudge, bool showMessageTime, bool timestampShowDate, bool timestampShowSeconds, bool groupFollowupMessages, int tabbedChatMode, const QString& chatStyle ); // Set chat logging information - void setChatLoggingInformation( bool saveChats, const QString& saveChatPath, const int& directoryStructure ); + void setChatLoggingInformation( bool saveChats, bool saveChatsToFile, ChatExportFormat saveChatsFormat, const QString& saveChatPath, int directoryStructure ); // Set how contacts are shown, by group, by online/offline, or mixed. void setContactListDisplayMode( ContactListDisplayMode displayMode ); + // Set contact list appearance options + void setContactListOptions( bool showNowListening, bool showContactEmail, bool useListFormatting ); // Set email information void setEmailInformation( bool showEmail, bool showOtherFolders ); // Set the font @@ -223,41 +233,35 @@ class Account : public QObject // change the personal message void setPersonalMessage( const QString& newMessage ); // Set basic account data - void setLoginInformation( QString handle, QString friendlyName, QString password = "" ); - // Set notification alerts information - void setNotificationsInformation( bool doNotifyContactsOnline, bool doNotifyContactsStatus, - bool doNotifyContactsChatStart, bool doNotifyContactsChatMessages, - bool doNotifyContactsOffline, bool doNotifyInboxEmails, bool doNotifyOtherEmails, int notificationDuration, bool hideWhenBusy ); - // Set whether to show popup notifications when contacts come online. - void setNotifyContactsOnline( bool doNotifyContactsOnline ); - // Set whether to show popup notifications when contacts change their msn status. - void setNotifyContactsStatus( bool doNotifyContactsStatus ); - // Set whether to show popup notifications when contacts start a chat with you. - void setNotifyContactsChatStart( bool doNotifyContactsChatStart ); - // Set whether to show popup notifications for all received chat messages. - void setNotifyContactsChatMessages( bool doNotifyContactsChatMessages ); - // Set whether to show popup notifications when contacts go offline. - void setNotifyContactsOffline( bool doNotifyContactsOffline ); - // Set whether to show popup notifications for mail incoming in the Inbox. - void setNotifyInboxEmails( bool doNotifyInboxEmails ); - // Set whether to show popup notifications for mail incoming in other folders. - void setNotifyOtherEmails( bool doNotifyOtherEmails ); + void setLoginInformation( QString handle, QString friendlyName, QString password = QString() ); // Set the account's login password void setPassword( const QString &password ); // Set the display picture file void setPicturePath( const QString& picturePath ); + // Save the location of the display picture original + void setOriginalPicturePath( const QString& picturePath ); // Set if the password must be stored void setSavePassword( bool savePassword ); // Set whether or not allowed contacts are shown. void setShowAllowedContacts( bool showAllowedContacts ); + // Set whether to show the user picture in chat windows + void setShowChatUserPicture( bool showChatUserPicture ); + // Set whether to show the contact list background image + void setShowContactListBird( bool showBird ); + // Set whether or not to show the contact list history box + void setShowHistoryBox( bool showHistoryBox ); // Set whether empty groups are shown void setShowEmptyGroups( bool showEmptyGroups ); // Set whether offline contacts should be shown. void setShowOfflineContacts( bool showOfflineContacts ); // Set whether or not removed (reverse) contacts are shown. void setShowRemovedContacts( bool showRemovedContacts ); - // Set whether or not the sidebar should be shown in chats - void setShowSidebar( bool showSidebar ); + // Set whether or not we need to show a search bar in the contact list at login + void setShowSearchBar( bool showSearchBar ); + // Set the status options + void setStatusOptions( bool useIdleTimer, int idleTime, bool hideNotificationsWhenBusy ); + // Set whether or not to show join/part messages in chat + void setShowSessionInfo( bool showSessionInfo ); // Set the way the chats will be grouped together void setTabbedChatMode( int tabbedChatMode ); // Set a temporary password for the account for login attempts from the initialview dialog @@ -298,20 +302,8 @@ class Account : public QObject bool dirty_; // Path of the display picture set by the user QString displayPicturePath_; - // Show a notification when contacts come online? - bool doNotifyContactsOnline_; - // Show a notification when contacts change their status? - bool doNotifyContactsStatus_; - // Show a notification when contacts start a chat? - bool doNotifyContactsChatStart_; - // Show a notification everywhen contacts send you messages? - bool doNotifyContactsChatMessages_; - // Show a notification when contacts go offline? - bool doNotifyContactsOffline_; - // Show a notification when receiving new mail in the inbox? - bool doNotifyInboxEmails_; - // Show a notification when receiving new mail in other folders? - bool doNotifyOtherEmails_; + // Path of the display picture original + QString originalDisplayPicturePath_; // Whether the user can receive email notifications (hotmail.com or msn.com account) bool emailSupported_; // The directory of a selected emoticon @@ -345,6 +337,10 @@ class Account : public QObject QString saveChatPath_; // Whether or not to save chat files. bool saveChats_; + // Whether or not to save chat files to external files + bool saveChatsToFile_; + // The format to use to save chat files + ChatExportFormat saveChatsFormat_; // Whether saved chats are organized by year, month, day, or all in a single directory int savedChatDirectoryStructure_; // If the password must be stored @@ -353,6 +349,12 @@ class Account : public QObject bool shakeNudge_; // Whether or not allowed contacts should be visible. bool showAllowedContacts_; + // Whether or not to show our display picture in chat + bool showChatUserPicture_; + // Whether or not to show the email of contacts in the contact list instead of their friendly name + bool showContactEmail_; + // Whether to show the contact list background image + bool showContactListBird_; // Whether or not to show any email notifications (the user may not // have a hotmail account). bool showEmail_; @@ -368,14 +370,22 @@ class Account : public QObject bool showOtherFolders_; // Whether or not removed (or reverse) contacts should be visible. bool showRemovedContacts_; - // Whether or not the sidebar should be shown in chats - bool showSidebar_; + // Whether or not to show the history box + bool showHistoryBox_; + // Whether or not to show the search bar at login + bool showSearchBar_; + // Whether or not to show join/part messages in chat + bool showSessionInfo_; // whether to show winks bool showWinks_; // The state of the tabbed chatting feature int tabbedChatMode_; // A temporary password for the account for login attempts from the initialview dialog QString temporaryPassword_; + // Whether to show seconds in message timestamps + bool timestampShowSeconds_; + // Whether to show date in message timestamps + bool timestampShowDate_; // Whether or not to autologin with this user. bool useAutologin_; // Whether or not the contact's font should be forced to some value. @@ -402,6 +412,8 @@ class Account : public QObject signals: // Public signals // Signal that the chat style settings have been changed void changedChatStyleSettings(); + // Signal that the contact list settings have been changed + void changedContactListOptions(); // Signal that group/contact display settings have been changed void changedDisplaySettings(); // Signal that the user changed email display settings @@ -422,8 +434,6 @@ class Account : public QObject void changedTimerSettings(); // Signal that the view mode has changed void changedViewMode(); - // Signal that tray notifications settings were changed - void changedNotificationsSettings(); }; #endif diff --git a/src/accountaction.cpp b/src/accountaction.cpp index fd6370f..74df846 100644 --- a/src/accountaction.cpp +++ b/src/accountaction.cpp @@ -27,7 +27,7 @@ AccountAction::AccountAction(Account *account, QWidget *parent ) : KAction(parent), account_(account) { - setObjectName( "AccountAction[" + account->getHandle() + "]" ); + setObjectName( "AccountAction[" + account->getHandle() + ']' ); // The idea is to have an action that sends the account when its // normal "activated" signal is sent. diff --git a/src/accountaction.h b/src/accountaction.h index 9cbc0d3..53bc591 100644 --- a/src/accountaction.h +++ b/src/accountaction.h @@ -39,7 +39,7 @@ class AccountAction : public KAction public: // The constructor - AccountAction( Account *account, QWidget *parent = 0 ); + explicit AccountAction( Account *account, QWidget *parent = 0 ); // The destructor ~AccountAction(); diff --git a/src/accountsmanager.cpp b/src/accountsmanager.cpp index 657c554..3cf2e98 100644 --- a/src/accountsmanager.cpp +++ b/src/accountsmanager.cpp @@ -25,7 +25,9 @@ #include +#include #include +#include #ifdef KMESSDEBUG_ACCOUNTSMANAGER @@ -45,6 +47,8 @@ AccountsManager* AccountsManager::instance_(0); AccountsManager::AccountsManager() : passwordManager_( 0 ) { + // Load the saved accounts from disk and create them + readProperties(); } @@ -56,6 +60,9 @@ AccountsManager::~AccountsManager() qDeleteAll( accounts_ ); accounts_.clear(); + // Delete the password manager instance + delete passwordManager_; + #ifdef KMESSDEBUG_ACCOUNTSMANAGER kDebug() << "DESTROYED."; #endif @@ -81,10 +88,12 @@ void AccountsManager::addAccount( Account *account ) // An account's settings have been changed void AccountsManager::changeAccount( Account *account, QString oldHandle, QString oldFriendlyName ) { - QString newHandle = account->getHandle(); + if( KMESS_NULL( account ) ) return; + + QString newHandle( account->getHandle() ); // We're saving settings for a new account - if( ! accounts_.contains( account ) ) + if( getAccountByHandle( oldHandle ) == 0 ) { #ifdef KMESSDEBUG_ACCOUNTSMANAGER kDebug() << "Saving settings for new account" << newHandle; @@ -100,20 +109,6 @@ void AccountsManager::changeAccount( Account *account, QString oldHandle, QStrin } #endif - - CurrentAccount *currentAccount = CurrentAccount::instance(); - - // If it's the current account that has been changed, copy the account settings there - if( newHandle == currentAccount->getHandle() ) - { - // Copy the account settings to the current account -#ifdef KMESSDEBUG_ACCOUNTSMANAGER - kDebug() << "Copying modified Account settings to CurrentAccount."; -#endif - - currentAccount->copyAccount( account ); - } - // If the account is set to use autologin, make sure that all other accounts do not if( ! account->isDeleted() && account->getUseAutologin() ) { @@ -133,7 +128,7 @@ void AccountsManager::changeAccount( Account *account, QString oldHandle, QStrin kDebug() << "Moving account dir from" << oldHandle << "to" << newHandle; #endif - QString accountsPath = KMessConfig::instance()->getAccountsDirectory(); + QString accountsPath( KMessConfig::instance()->getAccountsDirectory() ); QDir accountsDir( accountsPath ); @@ -161,6 +156,12 @@ void AccountsManager::changeAccount( Account *account, QString oldHandle, QStrin // Verify is there is a saved account with the specified handle bool AccountsManager::contains( Account *account ) const { + if( account == CurrentAccount::instance() ) + { + kWarning() << "Called contains() on the current account!"; + return true; + } + return accounts_.contains( account ); } @@ -173,19 +174,15 @@ void AccountsManager::deleteAccount( Account *account ) emit accountDeleted( account ); - QString handle = account->getHandle(); + QString handle( account->getHandle() ); KMessApplication *kmessApp = static_cast( kapp ); - if( ( handle == CurrentAccount::instance()->getHandle() ) && kmessApp->getContactListWindow()->isConnected() ) + if( kmessApp->getContactListWindow()->isConnected() + && CurrentAccount::instance()->getHandle() == handle ) { #ifdef KMESSDEBUG_ACCOUNTSMANAGER - kDebug() << "Not deleting account " << handle << " yet."; + kDebug() << "Cannot delete current account:" << handle; #endif - - // Already delete account data. - // NOTE: when more classes have an Account* object, consider creating a setDeleted(true) - // method, and let deleteAccountData() fire a deleteAccount(this) signal. - account->setDeleted(); return; } @@ -223,6 +220,11 @@ void AccountsManager::destroy() // Return the account for a given handle Account *AccountsManager::getAccountByHandle( const QString &handle ) { + if( handle.isEmpty() ) + { + return 0; + } + foreach( Account *account, accounts_ ) { if( account->getHandle() == handle ) @@ -264,11 +266,8 @@ void AccountsManager::initializePasswordManager( bool block ) { // Open KWallet (synchronously - blocks KMess until the password is given) passwordManager_ = KWallet::Wallet::openWallet( KWallet::Wallet::LocalWallet(), wId, KWallet::Wallet::Synchronous ); - if( passwordManager_ == 0 ) - { - kWarning() << "Opening KWallet failed!"; - return; - } + + // Call the slot manually slotWalletOpen( true ); return; } @@ -276,14 +275,18 @@ void AccountsManager::initializePasswordManager( bool block ) { // Open KWallet (asynchronously - the slot will be called when - and if - the wallet will be open) passwordManager_ = KWallet::Wallet::openWallet( KWallet::Wallet::LocalWallet(), wId, KWallet::Wallet::Asynchronous ); - connect( passwordManager_, SIGNAL( walletOpened(bool) ), - this, SLOT ( slotWalletOpen(bool) ) ); - } - // An internal KWallet error has occurred - if( passwordManager_ == 0 ) - { - kWarning() << "Opening KWallet failed!"; + if( passwordManager_ ) + { + connect( passwordManager_, SIGNAL( walletOpened(bool) ), + this, SLOT ( slotWalletOpen(bool) ) ); + } + else + { + // If the wallet service is not available, initialize the plain text password storage + slotWalletOpen( false ); + return; + } } } @@ -292,22 +295,53 @@ void AccountsManager::initializePasswordManager( bool block ) // Read the passwords from the just opened wallet void AccountsManager::slotWalletOpen( bool success ) { - if( ! success ) + KConfigGroup passwordGroup( KMessConfig::instance()->getGlobalConfig( "Passwords" ) ); + QStringList passwordAccountList( passwordGroup.keyList() ); + + if( ! success || passwordManager_ == 0 ) { #ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET - kDebug() << "Wallet opening failed, aborting."; + kDebug() << "Wallet opening failed, falling back to plain text passwords."; + QStringList readPasswords; #endif + // First delete the manager, as it won't be needed anymore delete passwordManager_; passwordManager_ = 0; + + // Read the passwords from the KMess config file + foreach( const QString &accountHandle, passwordAccountList ) + { + Account *account = getAccountByHandle( accountHandle ); + + // Skip passwords for invalid and deleted accounts, and remove them too + if( account == 0 ) + { + passwordGroup.deleteEntry( accountHandle ); + continue; + } + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + readPasswords << accountHandle; +#endif + + account->setPassword( passwordGroup.readEntry( accountHandle, QString() ) ); + } + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Passwords have been read for accounts" << readPasswords <<", emitting ready signal."; +#endif + + emit passwordsReady(); + return; } // Opening the wallet has failed, due to the user entering a wrong wallet password for example - if( passwordManager_ == 0 || ! passwordManager_->isOpen() ) + if( ! passwordManager_->isOpen() ) { #ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET - kDebug() << "Opening KWallet failed, ref is" << passwordManager_; + kDebug() << "Opening KWallet failed!"; #endif return; } @@ -327,8 +361,100 @@ void AccountsManager::slotWalletOpen( bool success ) return; } + // Wallet is open: verify if the user has any useable plaintext password set. + // If so, ask if they should be deleted or copied to the wallet :) + if( ! passwordAccountList.isEmpty() ) + { + bool hasValidAccounts = false; + + foreach( const QString &accountHandle, passwordAccountList ) + { + Account *account = getAccountByHandle( accountHandle ); + + // Skip passwords for invalid and deleted accounts, and remove them too + if( account == 0 ) + { + passwordGroup.deleteEntry( accountHandle ); + continue; + } + + hasValidAccounts = true; + } + + // There are some accounts passwords. Ask the user + if( hasValidAccounts ) + { + int res = KMessageBox::questionYesNoCancel( 0, + i18n( "Some insecure account passwords have been found.
" + "Do you want to import the passwords to the KDE Wallet " + "named '%1', keep the insecure passwords, or delete " + "them permanently?

" + "Note: it is not recommended to use insecure passwords " + "if the KDE Wallet is available, because your passwords " + "will be easily readable in the KMess configuration files.", + KWallet::Wallet::LocalWallet() ), + i18nc( "Dialog box caption", "Secure Password Storage" ), + KGuiItem( i18nc( "Dialog button: Import passwords to a KDE wallet", + "Import" ), + "document-import" ), // Yes option + KGuiItem( i18nc( "Dialog button: Delete insecure passwords", + "Delete" ), + "edit-delete-shred" ), // No option + KGuiItem( i18nc( "Dialog button: Keep insecure passwords", + "Keep" ), + "mail-mark-notjunk" ), // Cancel option + "insecurePasswordsDetected" ); + switch( res ) + { + case KMessageBox::Yes: + // Import passwords to the wallet, and remove the plaintext ones + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Importing plaintext passwords to the wallet."; +#endif + foreach( const QString &accountHandle, passwordAccountList ) + { + Account *account = getAccountByHandle( accountHandle ); + if( account != 0 ) + { + passwordManager_->writePassword( accountHandle, passwordGroup.readEntry( accountHandle, QString() ) ); + passwordGroup.deleteEntry( accountHandle ); +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Imported password for account:" << accountHandle; +#endif + } + } + break; + + case KMessageBox::No: + // Only delete the plain text passwords + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Deleting plain text account passwords."; +#endif + foreach( const QString &accountHandle, passwordAccountList ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Deleting plaintext password for account:" << accountHandle; +#endif + passwordGroup.deleteEntry( accountHandle ); + } + break; + + case KMessageBox::Cancel: + // Do nothing (useful if you wish to postpone the decision) + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "No action against plaintext passwords will be taken now."; +#endif + break; + } + } + } + #ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET kDebug() << "KWallet successfully opened, reading passwords."; + QStringList readPasswords; #endif QString password; @@ -338,18 +464,20 @@ void AccountsManager::slotWalletOpen( bool success ) { if( passwordManager_->readPassword( account->getHandle(), password ) != 0 || password.isEmpty() ) { -#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET - kDebug() << "Couldn't read password for account" << account->getHandle(); -#endif continue; } +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + readPasswords << account->getHandle(); +#endif + account->setPassword( password ); } #ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET - kDebug() << "Passwords have been read, emitting ready signal."; + kDebug() << "Passwords have been read for accounts" << readPasswords <<", emitting ready signal."; #endif + emit passwordsReady(); return; @@ -381,7 +509,7 @@ void AccountsManager::readProperties() QStringList accountList( KMessConfig::instance()->getAccountsList() ); // Add each one of the saved accounts to the internal list - foreach( QString handle, accountList ) + foreach( const QString &handle, accountList ) { if( Account::isValidEmail( handle ) ) { @@ -423,6 +551,13 @@ void AccountsManager::showAccountSettings( Account *account, QWidget *parentWind bool isCurrentAccount = ( account->getHandle() == currentAccount->getHandle() ); bool isConnectedCurrentAccount = isCurrentAccount && ( kmess->isConnected() ); + // If we are changing the current account, directly change the CurrentAccount object + // instead of the stored account object + if( isConnectedCurrentAccount ) + { + account = currentAccount; + } + // Show the settings dialog AccountSettingsDialog *accountSettingsDialog = AccountSettingsDialog::instance( parentWindow ); @@ -431,14 +566,6 @@ void AccountsManager::showAccountSettings( Account *account, QWidget *parentWind connect( accountSettingsDialog, SIGNAL( changedSettings(Account*,QString,QString) ), this, SLOT ( changeAccount(Account*,QString,QString) ) ); - // If it's the current account, copy some UI settings from the current account to the account - if( isConnectedCurrentAccount ) - { -#ifdef KMESSDEBUG_ACCOUNTSMANAGER - kDebug() << "Copying UI settings from CurrentAccount to the Account object."; -#endif - account->copyAccountUISettings( currentAccount ); - } accountSettingsDialog->loadSettings( account, isConnectedCurrentAccount, startingPage ); accountSettingsDialog->show(); @@ -451,42 +578,84 @@ void AccountsManager::showAccountSettings( Account *account, QWidget *parentWind void AccountsManager::storeAccountsPasswords() { QString handle; - QString password; + bool savePassword; - // If the user didn't activate the KWallet, do nothing as it isn't available now if( passwordManager_ == 0 ) { #ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET - kDebug() << "KWallet is not ready, not saving passwords."; + kDebug() << "KWallet is not available: saving passwords in plain text."; #endif + + KConfigGroup passwordGroup( KMessConfig::instance()->getGlobalConfig( "Passwords" ) ); + + // Store the password for each account + foreach( const Account *account, accounts_ ) + { + handle = account->getHandle(); + + if( passwordGroup.hasKey( handle ) ) + { + // If the password should not be saved, then delete any already saved password + if( account->getSavePassword() == false || account->getPassword().isEmpty() ) + { +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Password for account" << handle << "removed"; +#endif + + passwordGroup.deleteEntry( handle ); + continue; + } + } + else + { + // Save the password only if it wasn't already + passwordGroup.writeEntry( handle, account->getPassword() ); + +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + kDebug() << "Password for account" << handle << "saved."; +#endif + } + } + return; } +#ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET + else + { + kDebug() << "KWallet is available: saving passwords in the user wallet."; + } +#endif // Store the password for each account foreach( Account *account, accounts_ ) { - handle = account->getHandle(); - password = account->getPassword(); + handle = account->getHandle(); + savePassword = ( account->getSavePassword() && ! account->getPassword().isEmpty() ); - // If the password is empty, delete the whole account entry from the wallet - if( passwordManager_->hasEntry( handle ) && password.isEmpty() ) + if( passwordManager_->hasEntry( handle ) ) { + // If the password should not be saved, then delete any already saved password + if( savePassword == false ) + { #ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET - kDebug() << "Account" << handle << "removed from kwallet"; + kDebug() << "Removing account" << handle << "from wallet"; #endif - passwordManager_->removeEntry( handle ); - continue; + passwordManager_->removeEntry( handle ); + continue; + } } - - // Store the password - if( passwordManager_->writePassword( handle, password ) != 0 ) + // Store the password only if it wasn't already + else if( savePassword == true && passwordManager_->writePassword( handle, account->getPassword() ) != 0 ) { #ifdef KMESSDEBUG_ACCOUNTSMANAGER_KWALLET kDebug() << "Couldn't store password for account" << handle; #endif } } + + // Save the passwords to disk now + passwordManager_->sync(); } diff --git a/src/chat/chat.cpp b/src/chat/chat.cpp index a385767..1ff3c41 100644 --- a/src/chat/chat.cpp +++ b/src/chat/chat.cpp @@ -20,11 +20,14 @@ #include "../contact/contact.h" #include "../contact/contactextension.h" #include "../contact/contactbase.h" -#include "../contact/contactlist.h" +#include "../contact/invitedcontact.h" +#include "../contact/msnstatus.h" +#include "../model/contactlist.h" #include "../network/chatinformation.h" #include "../network/chatmessage.h" #include "../network/msnswitchboardconnection.h" -#include "../network/specialgroups.h" +#include "../utils/kmessconfig.h" +#include "../utils/kmessshared.h" #include "../utils/richtextparser.h" #include "../utils/xmlfunctions.h" #include "../accountaction.h" @@ -34,8 +37,7 @@ #include "../kmess.h" #include "chatmessageview.h" #include "chatwindow.h" -#include "contactaction.h" -#include "contactsidebar.h" +#include "contactswidget.h" #include #include @@ -43,8 +45,8 @@ #include #include +#include #include -#include @@ -56,20 +58,12 @@ #endif -/** - * Define the maximum interval (in seconds) between each update of - * the status bar label, when displaying "contact is typing" messages. - */ -#define CHAT_MAXIMUM_TYPING_TIME 5 - - // The constructor Chat::Chat( QWidget *parent ) : ChatView( parent ) , firstMessage_( true ) , initialized_( false ) -, lastContact_( QString() ) , msnSwitchboardConnection_( 0 ) { hide(); @@ -121,7 +115,9 @@ QString Chat::chooseContact() default: // Multiple contacts in the chat. // TODO: The official client opens a contact-choose dialog here, and starts a new chat with the selected contact. - KMessageBox::sorry( this, i18n("You can't start this invitation because there are multiple contacts in this chat.") ); + KMessageBox::sorry( this, i18nc( "Error dialog box text", + "You can't send invitations when there are multiple contacts in a chat. " + "Please open a chat screen with the recipient, then re-send your invitation." ) ); return QString(); } } @@ -129,156 +125,172 @@ QString Chat::chooseContact() // A contact joined the chat -void Chat::contactJoined(QString handle, QString friendlyName) +void Chat::contactJoined( ContactBase* contact ) { - ContactAction *contactAction; + QString handle ( contact->getHandle() ); + QString friendlyName( contact->getFriendlyName( STRING_CLEANED_ESCAPED ) ); + const QStringList &participants( getParticipants() ); - if( ! participants_.contains( handle ) ) - { - participants_.prepend( handle ); - } - - lastContact_ = QString::null; - - contactAction = getContactActionByHandle( handle ); - if ( contactAction != 0 ) - { - contactAction->setInChat( true ); - } - - // Show message when the user has the sidebar disabled, + // Show message when the user has the contacts widget disabled, // or when a multi-chat has started. - bool isSidebarVisible = contactSidebar_->isVisible(); - if( ( ! isSidebarVisible && ! currentAccount_->getShowSidebar() ) - || ( msnSwitchboardConnection_ && msnSwitchboardConnection_->getContactsInChat().size() > 1 ) ) + if( ( ! contactsWidget_->isVisible() && currentAccount_->getShowSessionInfo() ) + || ( participants.count() > 1 ) ) { showMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, - ChatMessage::CONTENT_NOTIFICATION_PRESENCE, - false, - i18n("%1 has joined the chat.", Qt::escape( friendlyName ) ), - handle, - friendlyName ) ); + ChatMessage::CONTENT_NOTIFICATION_JOINED, + false, + i18n("%1 has joined the chat.", friendlyName ), + handle, + friendlyName ) ); } - // Change the chat title emit chatInfoChanged(); - // Allow future changes in the nickname to update the chat title again - ContactBase *contact = currentAccount_->getContactByHandle( handle ); + // Allow future changes in the nickname and status to update the chat informations if( contact ) { - connect( contact, SIGNAL( changedFriendlyName() ), this, SIGNAL( chatInfoChanged() ) ); + // disconnect any old signals, just to be sure + disconnect( contact, 0, this, 0 ); + + connect( contact, SIGNAL( changedStatus() ), + this, SLOT ( slotContactChangedStatus() ) ); + connect( contact, SIGNAL( changedStatus() ), + this, SIGNAL( chatInfoChanged() ) ); + connect( contact, SIGNAL( changedFriendlyName() ), + this, SIGNAL( chatInfoChanged() ) ); } } // A contact left the chat -void Chat::contactLeft(QString handle, bool isChatIdle ) +void Chat::contactLeft( ContactBase *contact, bool isChatIdle ) { + QString handle ( contact->getHandle() ); + const QStringList &participants( getParticipants() ); + #ifdef KMESSDEBUG_CHAT_GENERAL - kDebug() << "contact '" << handle << "' has left" << (isChatIdle ? " due to inactivity." : "") << "."; + kDebug() << "contact '" << handle << "' has left" << (isChatIdle ? " due to inactivity" : "") << "."; #endif - ContactAction *contactAction = getContactActionByHandle( handle ); - - if ( contactAction != 0 ) + // A contact has left the chat. + // Group chats: it gets disconnected completely from it + // 1-on-1 chats: the chat UI will still show the contact, so don't disconnect its update signals + if( participants.count() > 1 ) { - contactAction->setInChat( false ); + disconnect( contact, 0, this, 0 ); } - participants_.removeAll( handle ); - - // This was the last participant, save it as the last being in so we can - // still recognize this window as a chat with this contact - if( participants_.isEmpty() ) - { - lastContact_ = handle; - } - - // Show message when the user has the sidebar disabled, + // Show message when the user has the contacts widget hidden, // or a user left a multi-chat - bool isSidebarVisible = contactSidebar_->isVisible(); - if( ( ! isSidebarVisible && ! currentAccount_->getShowSidebar() ) - || ( msnSwitchboardConnection_ && msnSwitchboardConnection_->getContactsInChat().size() > 0 ) ) + if( ( ! contactsWidget_->isVisible() && currentAccount_->getShowSessionInfo() ) + || ( participants.count() > 1 ) ) { - QString contactName = currentAccount_->getContactFriendlyNameByHandle( handle ); + QString contactName( contact->getFriendlyName( STRING_CLEANED_ESCAPED ) ); QString message; if( isChatIdle ) { - message = i18n( "The conversation went idle, %1 has left the chat.", Qt::escape( contactName ) ); + message = i18nc( "Message shown in chat, %1 is the contact's friendly name", + "The chat went idle, %1 has left the chat.", + contactName ); } else { - message = i18n( "%1 has left the chat.", Qt::escape( contactName ) ); + message = i18nc( "Message shown in chat, %1 is the contact's friendly name", + "%1 has left the chat.", + contactName ); } showMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, - ChatMessage::CONTENT_NOTIFICATION_PRESENCE, - false, - message, - handle, - contactName ) ); + ChatMessage::CONTENT_NOTIFICATION_LEFT, + false, + message, + handle, + contactName ) ); } // Change the caption to remove the contact who has left emit chatInfoChanged(); - - // Disconnect the contact to avoid it updating the chat title - ContactBase *contact = currentAccount_->getContactByHandle( handle ); - if( contact ) - { - disconnect( contact, SIGNAL( changedFriendlyName() ), this, SIGNAL( chatInfoChanged() ) ); - } } // A contact is typing // If called without arguments, it will only update the list of typing contacts. -void Chat::contactTyping( const QString &handle, const QString &friendlyName, bool forceExpiration ) +void Chat::contactTyping( ContactBase *contact, bool forceExpiration ) { int secsTo; - int nextUpdate = CHAT_MAXIMUM_TYPING_TIME; // Allow a maximum number of seconds between each update + int nextUpdate = CHAT_TYPING_EXPIRATION_TIME; // Allow a maximum number of seconds between each update + QString handle; + QString friendlyName; + + if( contact != 0 ) + { + handle = contact->getHandle(); + friendlyName = contact->getFriendlyName( STRING_CLEANED ); + + if( friendlyName.isEmpty() ) // If the contact has no friendlyName, use its handle as name + { + friendlyName = handle; + } + } #ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES - kDebug() << "Called with handle=" << handle << ", friendlyName=" << friendlyName; - kDebug() << "Current list:" << typingContacts_; + kDebug() << "Called with forceExpiration=" << forceExpiration << ", handle=" << handle << ", friendlyName=" << friendlyName; + kDebug() << "Current list:" << typingContactsNames_.keys(); #endif // Do not add anything to the list if the friendly name is empty - if( ! friendlyName.isEmpty() ) + if( ! handle.isEmpty() ) { QTime startTime = QTime::currentTime(); // If a contact is still typing, re-insert it in the list, so that the typing start time is updated - if( typingContacts_.contains( friendlyName ) ) + if( typingContactsNames_.contains( handle ) ) { - typingContacts_.remove( friendlyName ); +#ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES + kDebug() << "Removing" << handle << "from the list."; +#endif + typingContactsNames_.remove( handle ); + typingContactsTimes_.remove( handle ); } // When we receive a message from this contact, we only remove it from the typing contacts if( ! forceExpiration ) { +#ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES + kDebug() << "Adding" << handle << "to the list."; +#endif // Add this contact to the list of contacts which are typing, and record when it has started writing startTime.start(); - typingContacts_.insert( friendlyName, startTime ); + typingContactsNames_.insert( handle, friendlyName ); + typingContactsTimes_.insert( handle, startTime ); } +#ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES + else + { + kDebug() << "Removal from the list was forced."; + } +#endif } // Update the list to remove expired typing events - QMutableMapIterator it( typingContacts_ ); + QMutableMapIterator it( typingContactsTimes_ ); while( it.hasNext() ) { it.next(); secsTo = (int) ( it.value().elapsed() * .001 ); // Only keep the seconds // If the typing event has expired, stop displaying it - if( secsTo >= CHAT_MAXIMUM_TYPING_TIME ) + if( secsTo >= CHAT_TYPING_EXPIRATION_TIME ) { - typingContacts_.remove( it.key() ); +#ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES + kDebug() << "Removing" << handle << "from the list due to expiration."; +#endif + typingContactsNames_.remove( it.key() ); + typingContactsTimes_.remove( it.key() ); } // Find the typing event which will expire first, so we can next update when it expires @@ -289,13 +301,13 @@ void Chat::contactTyping( const QString &handle, const QString &friendlyName, bo } #ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES - kDebug() << "List after cleanup and update:" << typingContacts_; + kDebug() << "List after cleanup and update:" << typingContactsNames_.keys(); #endif // The more time passes from the last update, the more we get close to the next update - if( nextUpdate < 5 ) + if( nextUpdate < CHAT_TYPING_EXPIRATION_TIME ) { - nextUpdate = CHAT_MAXIMUM_TYPING_TIME - nextUpdate; + nextUpdate = CHAT_TYPING_EXPIRATION_TIME - nextUpdate; } #ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES @@ -303,13 +315,13 @@ void Chat::contactTyping( const QString &handle, const QString &friendlyName, bo #endif // Update the user interface - if( typingContacts_.contains( friendlyName ) ) + if( typingContactsNames_.contains( handle ) ) { - contactSidebar_->contactTyping( handle, friendlyName ); + contactsWidget_->contactTyping( contact ); } else { - contactSidebar_->messageReceived( handle ); + contactsWidget_->messageReceived( handle ); } #ifdef KMESSDEBUG_CHAT_TYPING_MESSAGES @@ -320,7 +332,7 @@ void Chat::contactTyping( const QString &handle, const QString &friendlyName, bo emit gotTypingMessage( this ); // Activate the timer for the next update if needed - if( ! typingContacts_.isEmpty() ) + if( ! typingContactsTimes_.isEmpty() ) { typingTimer_.start( nextUpdate * 1000 ); } @@ -331,45 +343,36 @@ void Chat::contactTyping( const QString &handle, const QString &friendlyName, bo // Return a list of the contacts in the chat to be used as window caption QString Chat::getCaption() { - QStringList activeContacts; - - // The chat has no switchboard connection.. it is not even a chat! + // When there's no SB, we can't retrieve the contact names if( msnSwitchboardConnection_ == 0 ) { - // If the last contact is empty, it's probably a test chat window. - if( ! lastContact_.isEmpty() ) - { - activeContacts << lastContact_; - } - } - else - { - // Query the switchboard for the list of participants - activeContacts = msnSwitchboardConnection_->getContactsInChat(); + return QString(); } + const QStringList &participants( getParticipants() ); + // How many people are there in here? - switch( activeContacts.count() ) + switch( participants.count() ) { - // The chat is empty + // The chat is completely empty - it is not even a chat! case 0: return QString(); // One contact is connected; or the only contact of the session has left case 1: - return Qt::escape( currentAccount_->getContactFriendlyNameByHandle( activeContacts[0], STRING_CLEANED ) ); + return currentAccount_->getContactFriendlyNameByHandle( participants[0], STRING_CLEANED ); // Two contacts are connected case 2: return i18nc( "Name of a chat tab", "%1 and %2", - Qt::escape( currentAccount_->getContactFriendlyNameByHandle( activeContacts[0], STRING_CLEANED ) ), - Qt::escape( currentAccount_->getContactFriendlyNameByHandle( activeContacts[1], STRING_CLEANED ) ) + currentAccount_->getContactFriendlyNameByHandle( participants[0], STRING_CLEANED ), + currentAccount_->getContactFriendlyNameByHandle( participants[1], STRING_CLEANED ) ); // Three or more contacts are connected default: return i18nc( "Name of a chat tab", "%1 et al.", - Qt::escape( currentAccount_->getContactFriendlyNameByHandle( activeContacts[0], STRING_CLEANED ) ) + currentAccount_->getContactFriendlyNameByHandle( participants[0], STRING_CLEANED ) ); } } @@ -379,7 +382,7 @@ QString Chat::getCaption() // Return the chat window which currently contains this Chat ChatWindow *Chat::getChatWindow() { - return static_cast( window() ); + return qobject_cast( window() ); } @@ -387,14 +390,38 @@ ChatWindow *Chat::getChatWindow() // Return the list of contacts in the chat QStringList Chat::getParticipants() { - // If all contacts have left the chat, return the last contact as being in chat, - // even if it's not technically true - if( participants_.isEmpty() ) + if( msnSwitchboardConnection_ == 0 ) { - return QStringList() << lastContact_; + return lastKnownContacts_; } - return participants_; + return msnSwitchboardConnection_->getContactsInChat(); +} + + + +// Return the icon to use in the tab icon chat +KIcon Chat::getParticipantsTabIcon() +{ + const QStringList &participants( getParticipants() ); + + // If there are more participants use group icon + if( participants.count() != 1 ) + { + return KIcon( "system-users" ); + } + + // Else use the status icon of the current contact + QString handle( participants.first() ); + + // Find the contact, if it isn't in the contact list, use the "unknown" tab icon + const ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if( contact == 0 ) + { + return KIcon( "view-media-artist" ); + } + + return KIcon( MsnStatus::getIcon( contact->getStatus() ) ); } @@ -402,7 +429,15 @@ QStringList Chat::getParticipants() // Return the list of contacts which are typing QStringList Chat::getTypingContacts() { - return typingContacts_.keys(); + return typingContactsNames_.values(); +} + + + +// Return the date and time the chat has started +QDateTime Chat::getStartTime() const +{ + return QDateTime( startDate_, startTime_ ); } @@ -430,21 +465,24 @@ bool Chat::initialize( MsnSwitchboardConnection *switchboardConnection ) return false; } - // Connect the sidebar slots - connect( contactSidebar_, SIGNAL( setContactAllowed(QString) ), - this, SIGNAL( setContactAllowed(QString) ) ); - connect( contactSidebar_, SIGNAL( setContactAdded(QString,bool) ), - this, SIGNAL( setContactAdded(QString,bool) ) ); - connect( contactSidebar_, SIGNAL( setContactBlocked(QString,bool) ), - this, SIGNAL( setContactBlocked(QString,bool) ) ); + // Connect the contacts widget's signals + const ContactList *contactList = currentAccount_->getContactList(); + connect( contactsWidget_, SIGNAL( contactAllowed(QString) ), + this, SIGNAL( contactAllowed(QString) ) ); + connect( contactsWidget_, SIGNAL( contactAdded(QString,bool) ), + this, SIGNAL( contactAdded(QString,bool) ) ); + connect( contactsWidget_, SIGNAL( contactBlocked(QString,bool) ), + this, SIGNAL( contactBlocked(QString,bool) ) ); + connect( contactsWidget_, SIGNAL( startPrivateChat( const QString ) ), + this, SIGNAL( startPrivateChat( const QString ) ) ); + connect( contactList, SIGNAL( contactAdded(Contact*) ), + contactsWidget_, SLOT ( contactAdded(Contact*) ) ); + connect( contactList, SIGNAL( contactRemoved(Contact*) ), + contactsWidget_, SLOT ( contactRemoved(Contact*) ) ); // Save the switchboard connection setSwitchboardConnection( switchboardConnection ); - // Pre-register the contacts as participants to this chat. - lastContact_ = switchboardConnection->getFirstContact(); - participants_ = switchboardConnection->getContactsInChat(); - // Save the date/time the chat started. // Use it to save a chatlog later. startDate_ = QDate::currentDate(); @@ -460,14 +498,21 @@ bool Chat::initialize( MsnSwitchboardConnection *switchboardConnection ) // Invite a contact to the chat -void Chat::inviteContact( QString handle ) +void Chat::inviteContacts( const QStringList &contacts ) { if( msnSwitchboardConnection_ == 0 ) { return; } - msnSwitchboardConnection_->inviteContact( handle ); + // Invite each selected contact, if it's not in chat already + foreach( const QString &handle, contacts ) + { + if( ! isContactInChat( handle, false ) ) + { + msnSwitchboardConnection_->inviteContact( handle ); + } + } } @@ -481,46 +526,39 @@ bool Chat::isChatFirstMessage() // Return whether or not the contact is in this chat. -bool Chat::isContactInChat( const QString &handle ) +bool Chat::isContactInChat( const QString &handle, bool isExclusiveChatWithContact ) { + const QStringList &participants( getParticipants() ); + #ifdef KMESSDEBUG_CHAT_CONTACTS - kDebug() << "Checking handle " << handle << " - participants: " << participants_.join(",") << " - lastContact: " << lastContact_; + kDebug() << "Is" << handle << "in chat" << this << "?" + << "1-on-1 required?" << isExclusiveChatWithContact + << "Participants:" << participants + << "Has switchboard?" << ( msnSwitchboardConnection_ != 0 ) + << "Last known contacts:" << lastKnownContacts_; #endif - if( participants_.isEmpty() ) + if( participants.isEmpty() ) { -#ifdef KMESSDEBUG_CHAT_CONTACTS - kDebug() << "returning " << ( lastContact_ == handle ? "true" : "false" ); -#endif - return ( lastContact_ == handle ); + return false; + } + + bool check = false; + + // Check if the contact is one of the participants to this chat. + check = participants.contains( handle ); + + // Check if is exclusive chat with the contact passed as the argument + if( check && isExclusiveChatWithContact ) + { + check = ( participants.count() == 1 ); } #ifdef KMESSDEBUG_CHAT_CONTACTS - kDebug() << "returning " << ( participants_.contains( handle ) ? "true" : "false" ); + kDebug() << "Returning" << check; #endif - return participants_.contains( handle ); -} - - -// Return whether or not this is an exclusive chat with the given contact -bool Chat::isExclusiveChatWithContact( const QString& handle ) -{ -#ifdef KMESSDEBUG_CHAT_CONTACTS - kDebug() << "Checking handle " << handle << " - participants: " << participants_.join(",") << " - lastContact: " << lastContact_; -#endif - if( participants_.isEmpty() ) - { -#ifdef KMESSDEBUG_CHAT_CONTACTS - kDebug() << "returning " << ( lastContact_ == handle ? "true" : "false" ); -#endif - return ( lastContact_ == handle ); - } - -#ifdef KMESSDEBUG_CHAT_CONTACTS - kDebug() << "returning " << ( participants_.contains(handle) && participants_.count() < 2 ? "true" : "false" ); -#endif - return ( participants_.contains(handle) && participants_.count() < 2 ); + return check; } @@ -592,19 +630,15 @@ void Chat::receivedMessage(const ChatMessage &message) kDebug() << "First message = " << firstMessage_ << "."; #endif - // Find if it's the first message of the chat - bool isFirstMessage = isEmpty(); - showMessage( message ); - // If this is the first message received... - if( firstMessage_ ) + // Do not notify about some message content classes + ChatMessage::ContentsClass contents = message.getContentsClass(); + if( contents == ChatMessage::CONTENT_NOTIFICATION_STATUS + || contents == ChatMessage::CONTENT_NOTIFICATION_LEFT + || contents == ChatMessage::CONTENT_NOTIFICATION_JOINED ) { - // Change the first message property only when we're actually receiving the second message; - // this way the notification balloons can work correctly. (and maybe future features requiring - // correct detection of the first message!) - if( ! isFirstMessage ) - firstMessage_ = false; + return; } // Update the date of the last received message. Only allowed for contacts on the contact list. @@ -618,17 +652,17 @@ void Chat::receivedMessage(const ChatMessage &message) if( currentAccount_ != 0 && msnSwitchboardConnection_ != 0 && currentAccount_->getAutoreply() - && ( lastSentAutoMessage_.isNull() || lastSentAutoMessage_.elapsed() > 30000 ) ) + && ( lastSentAutoMessage_.isNull() || lastSentAutoMessage_.elapsed() > 120000 ) ) { - // Send an auto away message every 30 sec (if the contact keeps writing) + // Send an auto away message every two minutes (if the contact keeps writing) #ifdef KMESSDEBUG_CHAT_GENERAL kDebug() << "Sending auto reply to chat message."; #endif - QString awayMessage = i18nc( "Automatic reply message", - "%1 (This message was sent automatically)", - currentAccount_->getAutoreplyMessage() ); + QString awayMessage( i18nc( "Automatic reply message", + "%1 (This message was sent automatically)", + currentAccount_->getAutoreplyMessage() ) ); // Send the autoreply message to the contact(s) msnSwitchboardConnection_->sendChatMessage( awayMessage ); @@ -639,7 +673,7 @@ void Chat::receivedMessage(const ChatMessage &message) false, awayMessage, currentAccount_->getHandle(), - currentAccount_->getFriendlyName(), + currentAccount_->getFriendlyName( STRING_ORIGINAL ), currentAccount_->getPicturePath(), currentAccount_->getFont(), currentAccount_->getFontColor() ); @@ -649,30 +683,32 @@ void Chat::receivedMessage(const ChatMessage &message) lastSentAutoMessage_.start(); } - // Remove this contact from the list of typing messages - contactTyping( message.getContactHandle(), message.getContactName(), true ); + // Remove this contact from the list of typing messages and let the parent window to update + // this chat's typing information + contactTyping( sourceContact, true ); // Emit the new message signal so that the user will receive a notification emit gotChatMessage( message, this ); - // Put back the focus to the message edit box - getMessageEditField()->setFocus(); + // If this was the first received message, clear the flag + if( firstMessage_ ) + { + firstMessage_ = false; + } } -// Save the chat if necessary -void Chat::saveChatAutomatically() +/** + * Save the chat if needed. + * + * The boolean argument should not be used, as it's used to recurse once when + * the chat should also be saved to an external file. + */ +void Chat::saveChatAutomatically( bool saveExternalFile ) { - QTime currentTime; - QDate currentDate; - QString basePath, year, month, day, hour, minute, time, file, savePath; - QDir dir; - int saveStructure; - - // Check if "save chats" is enabled - if ( ! currentAccount_->getSaveChats() ) + if( ! currentAccount_->getSaveChats() ) { #ifdef KMESSDEBUG_CHAT_GENERAL kDebug() << "User has save chats disabled, not saving chat."; @@ -680,9 +716,8 @@ void Chat::saveChatAutomatically() return; } - - // Check if the message area is not empty - if(isEmpty() ) + // Check if the message area is empty, we won't save empty chats + if( isEmpty() ) { #ifdef KMESSDEBUG_CHAT_GENERAL kDebug() << "Message area is empty, not saving chat."; @@ -690,103 +725,229 @@ void Chat::saveChatAutomatically() return; } - // Get the base path - basePath = currentAccount_->getSaveChatPath(); - - dir.setPath( basePath ); - if( ! dir.exists() ) - { - // TODO: Add a message box to notify the chat log folder does not exist (and avoid displaying it when KMess is forced to quit). - kWarning() << "Base directory '" << basePath << "' doesn't exist. Check your settings."; - return; - } - #ifdef KMESSDEBUG_CHAT_GENERAL - kDebug() << "Automatically saving the chat."; -#endif - - // Get date strings with numbers padded. - year .sprintf("%04d", startDate_.year() ); - month .sprintf("%02d", startDate_.month() ); - day .sprintf("%02d", startDate_.day() ); - hour .sprintf("%02d", startTime_.hour() ); - minute .sprintf("%02d", startTime_.minute() ); - time = hour + ":" + minute; - -#ifdef KMESSDEBUG_CHAT_GENERAL - kDebug() << "Date is " << year << "/" << month << "/" << day << " " << hour << ":" << minute << "."; -#endif - - // Determine the path to save - saveStructure = currentAccount_->getSavedChatDirectoryStructure(); - - switch(saveStructure) + if( ! saveExternalFile ) { - case Account::BYYEAR : - { - // save as chatpath/yyyy/mmdd hh:mm contactemail.html - if(! dir.exists(year)) dir.mkdir(year); - dir.cd(year); - file = "/" + month + "-" + day + " "; - break; - } - case Account::BYMONTH : - { - // save as chatpath/yyyy/mm/dd hh:mm contactemail.html - if(! dir.exists(year)) dir.mkdir(year); - dir.cd(year); - if(! dir.exists(month)) dir.mkdir(month); - dir.cd(month); - file = "/" + day + " "; - break; - } - case Account::BYDAY : - { - // save as chatpath/yyyy/mm/dd/hh:mm contactemail.html - if(! dir.exists(year)) dir.mkdir(year); - dir.cd(year); - if(! dir.exists(month)) dir.mkdir(month); - dir.cd(month); - if(! dir.exists(day)) dir.mkdir(day); - dir.cd(day); - file = "/"; - break; - } - case Account::SINGLEDIRECTORY : - default : - { - // save as chatpath/yyyymmdd hh:mm contactemail.html - file = "/" + year + "-" + month + "-" + day + " "; - } - } - - savePath = dir.absolutePath() + file + time + " "; - if( participants_.isEmpty() ) - { - savePath += lastContact_; + kDebug() << "Automatically saving the XML log file."; } else { - savePath += participants_.first(); + kDebug() << "Automatically saving the external log file."; + } +#endif + + QDir dir; + QString fileName, extension; + Account::ChatExportFormat format; + + // Set the base file name, same for all logs + const QStringList &participants( getParticipants() ); + if( participants.isEmpty() ) + { + // Should never, never, ever happen. + fileName = "KMess"; + } + else + { + fileName = participants.first(); } - - // Make sure chat logs are not automatically overwritten. - if( QFile::exists( savePath + ".html" ) ) + if( ! saveExternalFile ) { - kWarning() << "Chat log " << savePath << ".html already exists!"; - for( int i = 1; i < 100; i++ ) + extension = "xml"; + format = Account::EXPORT_XML; + dir.setPath( KMessConfig::instance()->getAccountDirectory( currentAccount_->getHandle() ) + + "/chatlogs" ); + } + else + { + dir.setPath( currentAccount_->getSaveChatPath() ); + format = currentAccount_->getSaveChatsFormat(); + switch( format ) { - if( ! QFile::exists(savePath + "." + QString::number(i) + ".html") ) - { - savePath += "." + QString::number(i); + case Account::EXPORT_TEXT: + extension = "txt"; + break; + case Account::EXPORT_HTML: + extension = "html"; + break; + default: + kWarning() << "Extension is unknown for save format" << format << "! Using \"html\"."; + extension = "html"; + format = Account::EXPORT_HTML; + break; + } + + QString year ( startDate_.toString( "yyyy" ) ); + QString month( startDate_.toString( "MM" ) ); + QString day ( startDate_.toString( "dd" ) ); + + // Determine the path where to save the log file + switch( currentAccount_->getSavedChatDirectoryStructure() ) + { + // Save as /yyyy/contactemail.ext + case Account::BYYEAR: + if( ! dir.exists( year ) ) dir.mkdir( year ); + dir.cd( year ); + break; + + // Save as /yyyy/mm/contactemail.ext + case Account::BYMONTH: + if( ! dir.exists( year ) ) dir.mkdir( year ); + dir.cd( year ); + if( ! dir.exists( month ) ) dir.mkdir( month ); + dir.cd( month ); + break; + + // Save as /yyyy/mm/dd/contactemail.ext + case Account::BYDAY: + if( ! dir.exists( year ) ) dir.mkdir( year ); + dir.cd( year ); + if( ! dir.exists( month ) ) dir.mkdir( month ); + dir.cd( month ); + if( ! dir.exists( day ) ) dir.mkdir( day ); + dir.cd( day ); + break; + + // Save as /contactemail.ext + case Account::SINGLEDIRECTORY: + default: break; - } } } - // Save the chat - saveChatToFile( savePath + ".html" ); + // Try creating the directory if it doesn't exist + if( ! dir.exists() ) + { + dir.mkpath( dir.absolutePath() ); + } + if( ! dir.exists() ) // It couldn't be created + { + KMessApplication *kmessApp = static_cast( kapp ); + if( ! kmessApp->quitSelected() ) + { + KMessageBox::sorry( getChatWindow(), + i18n( "KMess could not save the log for this chat:
" + "The chat logs directory, '%1', does not exist.", + dir.absolutePath() ) ); + } + // TODO: show a KDE save file dialog + + // Always warn via debug log, too + kWarning() << "Unable to save the chat log. The base directory" << dir.absolutePath() << "doesn't exist."; + return; + } + + int fileNumber = 0; + QString fileCount; + QString savePath( dir.absolutePath() + "/" ); + + bool nextFileExists = KMessShared::selectNextFile( savePath, fileName, fileCount, extension, fileNumber ); + QFile file( savePath + fileName + fileCount + "." + extension ); + + // There are log files already for this contact: verify if we can + // append to the last one: logs should not be too big + if( nextFileExists && file.size() > 2000000L ) + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Last file" << file.fileName() << "is too big, choosing next one"; +#endif + // Find the first file after the one we can't append to + KMessShared::selectNextFile( savePath, fileName, fileCount, extension, fileNumber ); + file.setFileName( savePath + fileName + "." + QString::number( fileNumber ) + "." + extension ); + } + +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Chat file:" << file.fileName(); +#endif + + // Save the chat in the format requested by the user + if( ! saveChatToFile( file.fileName(), format, + false, /* Don't overwrite */ + false /* No user interaction */ ) ) + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Save failed. Trying next file name"; +#endif + // If saving fails (due to a corrupted file for example) just save the chat + // with the next available file name + + KMessShared::selectNextFile( savePath, fileName, fileCount, extension, fileNumber ); + file.setFileName( savePath + fileName + "." + QString::number( fileNumber ) + "." + extension ); + + // This time warn the user if saving fails again + saveChatToFile( file.fileName(), format, true, true ); + } + + if( saveExternalFile == false && currentAccount_->getSaveChatsToFile() ) + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Done, saving external file too..."; +#endif + saveChatAutomatically( true ); + } +} + + + +// Send a message to the current chat +void Chat::sendChatMessage( const QString &message ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( msnSwitchboardConnection_ ); +#endif + + // If we send the first message of the chat, clear the first message status + if( firstMessage_ ) + { + firstMessage_ = false; + } + + msnSwitchboardConnection_->sendChatMessage( message ); +} + + + +// Send an ink drawing to the current chat +void Chat::sendInkMessage( const QByteArray &inkData ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( msnSwitchboardConnection_ ); +#endif + + msnSwitchboardConnection_->sendInk( inkData ); +} + + + +// Send an "user is typing" message to the contacts +void Chat::sendTypingMessage() +{ + if( KMESS_NULL(msnSwitchboardConnection_) ) return; + + msnSwitchboardConnection_->sendTypingMessage(); +} + + + +// Send an wink to the current chat +void Chat::sendWink( const QString &message ) +{ + msnSwitchboardConnection_->sendWink( message ); + // TODO show the sended wink on the chat + receivedMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, + ChatMessage::CONTENT_NOTIFICATION_WINK, + true, + i18n( "You have sent a wink" ), + "" ) ); +} + + + +// The user wants to block or unblock a contact. +void Chat::setContactBlocked( QString handle, bool isBlocked ) +{ + emit contactBlocked( handle, isBlocked ); } @@ -800,6 +961,16 @@ void Chat::setEnabled( bool isEnabled ) setSwitchboardConnection( 0 ); } + if( ! isEnabled ) + { + getChatWindow()->showStatusMessage( ChatStatusBar::Disconnected, i18n("The chat has been disabled because you are no longer connected to the MSN server." )); + } + else + { + getChatWindow()->showStatusMessage( ChatStatusBar::DefaultType, " " ); + } + + // Do not reactivate if there is no switchboard connection (ChatMaster will recreate it for us) if( isEnabled && msnSwitchboardConnection_ == 0 ) { @@ -814,9 +985,6 @@ void Chat::setEnabled( bool isEnabled ) // Change the switchboard connection used by the chat window. void Chat::setSwitchboardConnection( MsnSwitchboardConnection *newConnection ) { - QStringList participants; - QStringList::Iterator it; - // Everything is connected already. #ifdef KMESSDEBUG_CHAT_GENERAL if( msnSwitchboardConnection_ == 0 ) @@ -835,82 +1003,173 @@ void Chat::setSwitchboardConnection( MsnSwitchboardConnection *newConnection ) // Notify that all contacts have left the chat if( ! msnSwitchboardConnection_->isEmpty() ) { - // getContactsInChat() returns the last contact if the SB is empty. - participants = msnSwitchboardConnection_->getContactsInChat(); + const QStringList &participants( getParticipants() ); + #ifdef KMESSDEBUG_CHAT_GENERAL kDebug() << "Removing old switchboard's participants from the chat:" << participants; #endif - foreach( QString handle, participants ) + foreach( const QString &handle, participants ) { - contactSidebar_->contactLeft( handle, false ); + ContactBase* contact = currentAccount_->getContactByHandle( handle ); + if( contact == 0 ) + { + contact = currentAccount_->addInvitedContact( handle ); + } + + // NOTE: This slot doesn't use the second parameter + contactsWidget_->contactLeft( contact, false ); } } // Delete all signals between us and the old switchboard disconnect( this, 0, msnSwitchboardConnection_, 0 ); - disconnect( msnSwitchboardConnection_, 0, contactSidebar_, 0 ); + disconnect( msnSwitchboardConnection_, 0, contactsWidget_, 0 ); disconnect( msnSwitchboardConnection_, 0, this, 0 ); - // Also delete the old connection, if we're setting up a new one + // We are switching switchboards, clean up if( msnSwitchboardConnection_ != newConnection ) { + // Some info of the previous switchboard must be recorded to allow + // retrieving details about the chat when no switchboard is present + lastKnownContacts_ = msnSwitchboardConnection_->getContactsInChat(); + + // Also delete the old connection msnSwitchboardConnection_->deleteLater(); } } msnSwitchboardConnection_ = newConnection; + // The old connection has been removed, we're done if( newConnection == 0 ) { - connect( this, SIGNAL( sendMessageToContact(QString) ), - this, SLOT ( slotSendingFailed(QString) ) ); return; } - else - { - disconnect( this, SIGNAL( sendMessageToContact(QString) ), - this, SLOT ( slotSendingFailed(QString) ) ); - } // Make the new signals connections - connect( msnSwitchboardConnection_, SIGNAL( contactJoinedChat(QString, QString) ), - contactSidebar_, SLOT ( contactJoined(QString, QString) ) ); - connect( msnSwitchboardConnection_, SIGNAL( contactLeftChat(QString,bool) ), - contactSidebar_, SLOT ( contactLeft(QString,bool) ) ); - connect( msnSwitchboardConnection_, SIGNAL( contactTyping(QString, QString) ), - contactSidebar_, SLOT ( contactTyping(QString, QString) ) ); + connect( msnSwitchboardConnection_, SIGNAL( contactJoinedChat(ContactBase*) ), + contactsWidget_, SLOT ( contactJoined(ContactBase*) ) ); + connect( msnSwitchboardConnection_, SIGNAL( contactLeftChat(ContactBase*, bool) ), + contactsWidget_, SLOT ( contactLeft(ContactBase*, bool) ) ); + connect( msnSwitchboardConnection_, SIGNAL( contactTyping(ContactBase*) ), + contactsWidget_, SLOT ( contactTyping(ContactBase*) ) ); - connect( msnSwitchboardConnection_, SIGNAL( contactJoinedChat(QString, QString) ), - this, SLOT ( contactJoined(QString, QString) ) ); - connect( msnSwitchboardConnection_, SIGNAL( contactLeftChat(QString,bool) ), - this, SLOT ( contactLeft(QString,bool) ) ); - connect( msnSwitchboardConnection_, SIGNAL( contactTyping(QString, QString) ), - this, SLOT ( contactTyping(QString, QString) ) ); + connect( msnSwitchboardConnection_, SIGNAL( contactJoinedChat(ContactBase*) ), + this, SLOT ( contactJoined(ContactBase*) ) ); + connect( msnSwitchboardConnection_, SIGNAL( contactLeftChat(ContactBase*, bool) ), + this, SLOT ( contactLeft(ContactBase*, bool) ) ); + connect( msnSwitchboardConnection_, SIGNAL( contactTyping(ContactBase*) ), + this, SLOT ( contactTyping(ContactBase*) ) ); connect( msnSwitchboardConnection_, SIGNAL( chatMessage(const ChatMessage&) ), this, SLOT ( receivedMessage(const ChatMessage&) ) ); - connect( msnSwitchboardConnection_, SIGNAL( receivedNudge(const QString&) ), - this, SLOT ( slotReceivedNudge(const QString&) ) ); - connect( msnSwitchboardConnection_, SIGNAL( sendingFailed(QString) ), - this, SLOT ( slotSendingFailed(QString) ) ); + connect( msnSwitchboardConnection_, SIGNAL( receivedNudge(ContactBase*) ), + this, SLOT ( slotReceivedNudge(ContactBase*) ) ); + connect( msnSwitchboardConnection_, SIGNAL( sendingFailed(const QString&,const MimeMessage&)), + this, SLOT ( slotSendingFailed(const QString&,const MimeMessage&)) ); + connect( msnSwitchboardConnection_, SIGNAL( showWarning(MsnSwitchboardConnection::WarningType,ContactBase*)), + this, SLOT ( showWarning(MsnSwitchboardConnection::WarningType,ContactBase*)) ); connect( msnSwitchboardConnection_, SIGNAL( deleteMe(MsnSwitchboardConnection*) ), this, SLOT ( setSwitchboardConnection() ) ); - connect( this, SIGNAL( sendMessageToContact(QString) ), - msnSwitchboardConnection_, SLOT ( sendChatMessage(QString) ) ); - connect( this, SIGNAL( sendInkToContact(QByteArray) ), - msnSwitchboardConnection_, SLOT ( sendInk(QByteArray) ) ); - connect( this, SIGNAL( userIsTyping() ), - msnSwitchboardConnection_, SLOT ( sendTypingMessage() ) ); - - // Add to the sidebar all the contacts that are present in the new switchboard - participants = msnSwitchboardConnection_->getContactsInChat(); + // Add to the contacts widget all the contacts that are present in the new switchboard + const QStringList &participants( getParticipants() ); #ifdef KMESSDEBUG_CHAT_GENERAL kDebug() << "Adding new switchboard's participants to the chat:" << participants; #endif - foreach( QString handle, participants ) + foreach( const QString &handle, participants ) { - contactSidebar_->contactJoined( handle, QString() ); // The sidebar slot doesn't use the second parameter + ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if( contact == 0 ) + { + contact = currentAccount_->addInvitedContact( handle ); + } + + contactsWidget_->contactJoined( contact ); + } +} + + + +// A warning from the switchboard has been received, display it +void Chat::showWarning( MsnSwitchboardConnection::WarningType type, ContactBase *contact ) +{ + QString handle, friendlyName; + if( contact == 0 ) + { + handle = currentAccount_->getHandle(); + friendlyName = currentAccount_->getFriendlyName( STRING_CLEANED_ESCAPED ); + } + else + { + handle = contact->getHandle(); + friendlyName = contact->getFriendlyName( STRING_CLEANED_ESCAPED ); + } + + switch( type ) + { + case MsnSwitchboardConnection::WARNING_CONNECTION_DROP: + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_SYSTEM_ERROR, + true, + i18nc( "Warning message shown in chat", + "There has been a connection problem." ), + handle, + friendlyName ) ); + break; + + case MsnSwitchboardConnection::WARNING_TOO_MANY_EMOTICONS: + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_SYSTEM_ERROR, + true, + i18nc( "Warning message shown in chat", + "There were too many different custom emoticons in your last message. Only the first 7 will be sent." ), + handle, + friendlyName ) ); + break; + + case MsnSwitchboardConnection::WARNING_UNSUPPORTED_VOICECLIP: +#ifdef KMESSTEST + KMESS_ASSERT( contact != 0 ); +#endif + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_SYSTEM_ERROR, + true, + i18nc( "Warning message shown in chat, %1 is the contact's friendly name", + "%1 has sent you a voice clip, but KMess does not support voice clips yet, so you can't listen to it now.", + friendlyName ), + handle, + friendlyName ) ); + break; + + case MsnSwitchboardConnection::WARNING_UNSUPPORTED_ACTIONMESSAGE: +#ifdef KMESSTEST + KMESS_ASSERT( contact != 0 ); +#endif + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_SYSTEM_ERROR, + true, + i18nc( "Warning message shown in chat, %1 is the contact's friendly name", + "%1 has sent you an action message, but KMess does not support action messages yet.", + friendlyName ), + handle, + friendlyName ) ); + break; + + case MsnSwitchboardConnection::WARNING_UNSUPPORTED_UNKNOWN: +#ifdef KMESSTEST + KMESS_ASSERT( contact != 0 ); +#endif + default: + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_SYSTEM_ERROR, + true, + i18nc( "Warning message shown in chat, %1 is the contact's friendly name", + "%1 has sent you an MSN feature that KMess does not support yet.", + friendlyName ), + handle, + friendlyName ) ); + break; } } @@ -923,161 +1182,74 @@ void Chat::showWink( const QString &handle, const QString &filename, const QStri kDebug() << "Processing received wink data."; #endif - QString friendlyName = currentAccount_->getContactFriendlyNameByHandle(handle); + const QString& friendlyName( currentAccount_->getContactFriendlyNameByHandle( handle, STRING_CLEANED_ESCAPED ) ); // If we aren't showing winks, notify the user that we got one but don't actually display the animation. if( ! currentAccount_->getShowWinks() ) { - receivedMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, - ChatMessage::CONTENT_NOTIFICATION_WINK, - true, - i18n( "You received a wink from %1.", Qt::escape( friendlyName ) ), - handle, - friendlyName ) ); + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_SYSTEM_ERROR, + false, + i18nc( "Message shown in the chat window, %1 is the contact's friendly name", + "You received a wink from %1, but displaying winks has been disabled in the account options. " + "You can re-enable them in the
account configuration.", friendlyName ), + handle ) ); return; } - // TODO: move the processing of wink files to a special "WinkArchive" class. - // Test whether the file exists, before cabextract fails. - if( ! QFile::exists(filename) ) + if( ! QFile::exists( filename ) ) { kWarning() << "file not found: " << filename << "!"; return; } - // Remove extension - QString dirName = QString(filename).remove( QRegExp("\\.[a-z]+$") ); + QString html; + WinksWidget::CABEXTRACTOR value = WinksWidget::getHtmlFromWink( filename, html ); - QFile metaFile(dirName + "/content.xml"); - - // See if the file was extracted already - if( ! metaFile.exists() ) + switch( value ) { - // Run cabextract to get the contents of the file - // -q: quiet, only print errors, -d: output dir, -l: force lowercase (avoiding incompatibilities because win32 is case-insensitive) - KProcess cabextract(this); - cabextract.closeReadChannel( QProcess::StandardOutput ); - cabextract.closeReadChannel( QProcess::StandardError ); - cabextract << "cabextract" << "-q" << "-d" << dirName << filename; - bool done = cabextract.execute( 5000 ); - // TODO: capture `cabextract` error messages, display nicely. + case WinksWidget::SUCCESS: + break; - if( done != 0 ) - { + case WinksWidget::NOTINSTALLED: showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_ERROR, - false, - i18n("The wink could not be displayed. Make sure you have 'cabextract' installed."), - handle ) ); + ChatMessage::CONTENT_SYSTEM_ERROR, + false, + i18nc( "Message shown in the chat window, %1 is the contact's friendly name", + "You received a wink from %1, but it could not be displayed. Make sure you have" + " the 'cabextract' program installed. Check your distributions package manager for more help.", friendlyName ), + handle ) ); return; - } - if( cabextract.exitStatus() != QProcess::NormalExit || ! metaFile.exists() ) - { + + case WinksWidget::FAILED: showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_ERROR, - false, - i18n("The wink could not be displayed. The data could not be read."), - handle ) ); + ChatMessage::CONTENT_SYSTEM_ERROR, + false, + i18nc( "Message shown in the chat window, %1 is the contact's friendly name", + "You received a wink from %1, but it could not be displayed, because extracting the wink" + " package with 'cabextract' failed.", friendlyName ), + handle ) ); + return; + + case WinksWidget::UNKNOW: + default: + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_SYSTEM_ERROR, + false, + i18nc( "Message shown in the chat window, %1 is the contact's friendly name", + "You received a wink from %1, but it could not be displayed. The data could not be" + " read.", friendlyName ), + handle ) ); + return; - } } - // Open the file - if( ! metaFile.open( QIODevice::ReadOnly ) ) - { - kWarning() << "file could not be opened: " << metaFile.fileName() << "!"; - return; - } - - // Parse the XML - QString xmlErrorMessage; - QDomDocument xml; - if( ! xml.setContent(&metaFile, true, &xmlErrorMessage) ) - { - kWarning() << "parsing of wink XML failed: " << xmlErrorMessage << "!"; - return; - } - - // Get the package nodes - QDomElement packageNode = xml.namedItem("package").toElement(); - if( packageNode.isNull() ) - { - kWarning() << "XML element /package not found!"; - return; - } - - if( packageNode.attribute("type") != "wink" ) - { - kWarning() << "XML element /package/@type is not 'wink'!"; - return; - } - - if( packageNode.attribute("contenttype") != "D" ) - { - kWarning() << "XML element /package/@contenttype is not 'D'!"; - } - - // Get the child nodes - QString thumbnail; - QString animation; - QString animationType; - QDomNodeList packageItems = packageNode.childNodes(); - for(int i = 0; i < packageItems.count(); i++) - { - QDomElement child = packageItems.item(i).toElement(); - if( child.tagName() == "item" ) - { - QString type = child.attribute("type"); - if( type == "animation" ) - { - animation = child.attribute("file"); - animationType = child.attribute("mimetype"); - } - else if( type == "thumbnail-show" || type == "thumbnail" ) - { - thumbnail = child.attribute("file"); - // Type not stored. There are winks with mimetype="image/png" while they're sending a JPG. - } - else - { - kWarning() << "unknown wink element type: '" << type << "'!"; - } - } - } - - // TODO: clean up weird characters from wink file name. - - if( thumbnail.isEmpty() || animation.isEmpty() || animationType.isEmpty() ) - { - kWarning() << "XML elements are missing, could not play wink!"; - return; - } - - // Escape data for inclusion in HTML. - animation = Qt::escape(animation).replace("'", "'"); // quotes are not escaped by QStyleSheet::escape(). - animationType = animationType.remove( QRegExp("[^a-zA-Z0-9\\-/]") ); - - // Height of 150 is a lot, but most winks are designed to be full-screen, so they can hardly be displayed smaller. - QString html = "
" - "" - "" - "" - "" - "" - "" - "" - "" - "
"; - // Show a notification receivedMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, ChatMessage::CONTENT_NOTIFICATION_WINK, true, - i18n( "You have received a wink from %1", Qt::escape( friendlyName ) ) + html, + i18n( "%1 has sent you a wink!", friendlyName ) + html, handle, friendlyName ) ); // TODO: include contact meta data in ChatMessage() constructor to show wink nicer @@ -1085,21 +1257,85 @@ void Chat::showWink( const QString &handle, const QString &filename, const QStri +// Display a message to notify of a contact status change +void Chat::slotContactChangedStatus() +{ + ContactBase *contact = static_cast( sender() ); + if( KMESS_NULL( contact ) ) return; + + // Make sure this contact is in chat + if( ! isContactInChat( contact->getHandle(), false ) ) + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Received a status change signal from a contact not in chat!"; +#endif + return; + } + + QString message; + const QString &friendlyName( contact->getFriendlyName( STRING_CLEANED_ESCAPED ) ); + + // Display a message when the user goes offline. + if( contact->isOffline() ) + { + // Show a different one depending if this is an exclusive chat (which means we send offline IMs) + if( getParticipants().size() == 1 ) + { + message = i18n( "%1 has gone offline. Any messages you send will be delivered the next time he or she signs in.", + friendlyName ); + } + else if( currentAccount_->getShowSessionInfo() ) + { + message = i18n( "%1 has gone offline.", + friendlyName ); + } + else + { + return; + } + } + else if( currentAccount_->getShowSessionInfo() ) + { + message = i18n( "%1 has changed his or her status to \"%2\"", + friendlyName, + MsnStatus::getName( contact->getStatus() ) ); + } + else + { + return; + } + + receivedMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, + ChatMessage::CONTENT_NOTIFICATION_STATUS, + true, + message, + contact->getHandle() ) ); +} + + + // Notify the user of a received nudge -void Chat::slotReceivedNudge(const QString &handle) +void Chat::slotReceivedNudge( ContactBase *contact ) { #ifdef KMESSDEBUG_CHAT_GENERAL kDebug() << "Received a nudge."; #endif // Get friendly name - QString friendlyName = currentAccount_->getContactFriendlyNameByHandle(handle); - receivedMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, - ChatMessage::CONTENT_NOTIFICATION_NUDGE, - true, - i18n( "You received a nudge from %1!", Qt::escape( friendlyName ) ), - handle, - friendlyName ) ); + QString friendlyName( contact->getFriendlyName( STRING_CLEANED_ESCAPED ) ); + + ChatMessage message( ChatMessage::TYPE_NOTIFICATION, + ChatMessage::CONTENT_NOTIFICATION_NUDGE, + true, + i18n( "%1 has sent you a nudge!", friendlyName ), + contact->getHandle(), + friendlyName ); + + receivedMessage( message ); + + + // Emit the new message signal so that the user will receive a notification + emit gotChatMessage( message, this ); // Start the buzz effect. emit gotNudge(); @@ -1108,17 +1344,83 @@ void Chat::slotReceivedNudge(const QString &handle) // Signal that a message could not be sent to the switchboard -void Chat::slotSendingFailed( QString message ) +void Chat::slotSendingFailed( const QString &handle, const MimeMessage &message ) { - message = ( message.length() > 16 ) ? ( message.left( 16 ) + "..." ) : message; + QString errorMessage; + QString friendlyName; + QString contentType( message.getValue( "Content-Type" ) ); + +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Showing a sending failure notice."; +#endif + + // It's possible that a message could not be delivered to any of the contacts in chat: + // in this case, the handle is * + if( handle == "*" ) + { + friendlyName = i18nc( "Phrase to be inserted in place of a contact name, when a message can't be delivered " + "to any of the recipients", + "all contacts" ); + } + else + { + friendlyName = currentAccount_->getContactFriendlyNameByHandle( handle, STRING_CLEANED_ESCAPED ); + } + + if( contentType.startsWith( "text/x-msnmsgr-datacast" ) ) + { + switch( message.getValue( "ID" ).toInt() ) + { + case 1: // Nudge + errorMessage = i18nc( "Error message shown in chat, %1 is the contact's friendly name", + "Failed to send the nudge to %1.", + friendlyName ); + break; + case 2: // Wink + errorMessage = i18nc( "Error message shown in chat, %1 is the contact's friendly name", + "Failed to send the wink to %1..", + friendlyName ); + break; + default: // Unsupported datacast?! + kWarning() << "Failed sending datacast message: no sending failure chat message available!"; + return; + } + } + else if( contentType.startsWith( "image/gif" ) ) + { + errorMessage = i18nc( "Error message shown in chat, %1 is the contact's friendly name", "Failed to send the drawing to %1.", + friendlyName ); + } + else if( contentType.startsWith( "text/plain" ) && ! message.getBody().isEmpty() ) + { + QString body( Qt::escape( message.getBody() ) ); + + // Cut down the message a bit if needed + if( body.length() > 16 ) + { + body.truncate( 16 ); + body += "..."; + } + + errorMessage = i18nc( "Error message shown in chat, %1 is the sent message, %2 is the contact's friendly name", + "Failed to send the message to %2:
%1", + body, + friendlyName ); + } + else + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kDebug() << "Not displaying a sending failure notice for messages of type" << contentType; +#endif + return; + } - // We're assuming the chat is empty or broken, so we won't query the switchboard for the contact handle showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_ERROR, - false, - i18n("The message '%1' could not be sent.", Qt::escape( message ) ), - lastContact_ ) ); - + ChatMessage::CONTENT_SYSTEM_ERROR, + false, + errorMessage, + handle, + friendlyName ) ); } @@ -1126,42 +1428,82 @@ void Chat::slotSendingFailed( QString message ) // Send a file to a contact. void Chat::startFileTransfer( QList fileList ) { -#ifdef KMESSDEBUG_CHAT_FILETRANSFER - kDebug(); -#endif if( KMESS_NULL(msnSwitchboardConnection_) ) return; // Ask for a contact - QString handle = chooseContact(); + QString handle( chooseContact() ); + + // If no contact can be chosen, stop + if( handle.isEmpty() ) + { +#ifdef KMESSDEBUG_CHAT_FILETRANSFER + kDebug() << "Unable to find a contact to send files to. Aborting."; +#endif + return; + } + +#ifdef KMESSDEBUG_CHAT_FILETRANSFER + kDebug() << "File list contents:" << fileList; + kDebug() << "Chosen handle:" << handle; +#endif if( fileList.isEmpty() ) { #ifdef KMESSDEBUG_CHAT_FILETRANSFER - kDebug() << "asking for a file to send"; + kDebug() << "Asking for a file to send"; #endif // If no file names were given, ask for a filename - QString filename = KFileDialog::getOpenFileName( KUrl("kfiledialog:///:fileupload" ) ); + KUrl fileName( KFileDialog::getOpenUrl( KUrl( "kfiledialog:///:fileupload" ) ) ); // Stop if no file was selected - if( filename.isEmpty() ) + if( fileName.isEmpty() ) { return; } - // Ask the ChatMaster to initiate the file transfer. If there are multiple contacts - // in this chat, it needs to create a new chat session for that contact. - emit requestFileTransfer( handle, filename ); + fileList.append( fileName ); } - else + + foreach( const QUrl &fileUrl, fileList ) { - foreach( QUrl file, fileList ) + KUrl localFileUrl( KIO::NetAccess::mostLocalUrl( fileUrl, this ) ); + + // If the url can't be translated to a local file, copy it to disk + if( ! localFileUrl.isLocalFile() ) { #ifdef KMESSDEBUG_CHAT_FILETRANSFER - kDebug() << "Sending file " << file; + kDebug() << "Not a local file, copying it locally."; #endif - emit requestFileTransfer( handle, file.toLocalFile() ); + // Download the remote file to a temporary folder + QString localFilePath; + if( ! KIO::NetAccess::download( fileUrl, localFilePath, this ) ) + { +#ifdef KMESSDEBUG_CHAT_FILETRANSFER + kDebug() << "Copy failed."; +#endif + // Show a message to the user + showMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, + ChatMessage::CONTENT_APP_FAILED, + false, + i18n( "The file '%1' could not be found on " + "your computer, and the download failed.", + localFileUrl.prettyUrl() ), + handle ) ); + continue; + } + + // TODO Remove the temporary file after the transfer + localFileUrl.setUrl( localFilePath ); } + +#ifdef KMESSDEBUG_CHAT_FILETRANSFER + kDebug() << "Original file URL:" << fileUrl << "-- Local file URL:" << localFileUrl; +#endif + + // Ask the ChatMaster to initiate the file transfer. If there are multiple contacts + // in this chat, it needs to create a new chat session for that contact. + emit requestFileTransfer( handle, localFileUrl.toLocalFile() ); } } @@ -1175,26 +1517,28 @@ void Chat::slotSendNudge() return; } - // Display message + // Show a more detailed message if we're in an active chat + QString messageText; const QStringList &contactsInChat = msnSwitchboardConnection_->getContactsInChat(); - QString message; if( contactsInChat.count() == 1 && msnSwitchboardConnection_->isConnected() ) { - message = i18n( "You've sent a nudge to %1!", - Qt::escape( currentAccount_->getContactFriendlyNameByHandle( contactsInChat.first() ) ) - ); + messageText = i18nc( "Message shown in chat window, %1 is the contact's friendly name", + "You've sent a nudge to %1!", + currentAccount_->getContactFriendlyNameByHandle( contactsInChat.first(), STRING_CLEANED_ESCAPED ) ); } else { // Chat is either empty (should resume), or a multi-chat - message = i18n( "You've sent a nudge!" ); + messageText = i18n( "You've sent a nudge!" ); } - showMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, - ChatMessage::CONTENT_NOTIFICATION_NUDGE, - false, - message, - QString::null ) ); + // Display message + ChatMessage message( ChatMessage::TYPE_NOTIFICATION, + ChatMessage::CONTENT_NOTIFICATION_NUDGE, + false, + messageText, + QString::null ); + showMessage( message ); // Send nudge msnSwitchboardConnection_->sendNudge(); @@ -1216,33 +1560,41 @@ void Chat::startChat() return; } - if( ! msnSwitchboardConnection_->isInactive() ) - { #ifdef KMESSDEBUG_CHAT_GENERAL - kDebug() << "Opening a normal chat."; + kDebug() << "Opening a chat of type:" << ( msnSwitchboardConnection_->isInactive() ? "Offline" : "Active" ); #endif - // Initialize an online chat - } - else - { -#ifdef KMESSDEBUG_CHAT_GENERAL - kDebug() << "Opening an offline chat."; -#endif - // Initialize an offline chat - QString handle = msnSwitchboardConnection_->getLastContact(); - } // Add the participant contacts to the chat, even if they're offline - QStringList participants = msnSwitchboardConnection_->getContactsInChat(); + const QStringList &participants( msnSwitchboardConnection_->getContactsInChat() ); + #ifdef KMESSDEBUG_CHAT_GENERAL kDebug() << "Adding initial chat participants to the chat:" << participants; #endif - foreach( QString handle, participants ) + + foreach( const QString &handle, participants ) { - contactSidebar_->contactJoined( handle, QString() ); // The sidebar slot doesn't use the second parameter + ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if( contact == 0 ) + { + contact = currentAccount_->addInvitedContact( handle ); + } + contactsWidget_->contactJoined( contact ); } - getMessageEditField()->setFocus(); + // if this is an offline chat, inform the user. + if( getParticipants().size() == 1 && msnSwitchboardConnection_->isInactive() ) + { + ContactBase *contact = currentAccount_->getContactByHandle( getParticipants().first() ); + if( contact && contact->isOffline() ) + { + receivedMessage( ChatMessage( ChatMessage::TYPE_NOTIFICATION, + ChatMessage::CONTENT_SYSTEM_NOTICE, + false, + i18n( "%1 is currently offline. Any messages you send will be delivered the next time he or she signs in.", + contact->getFriendlyName( STRING_CLEANED_ESCAPED ) ), + contact->getHandle() ) ); + } + } } @@ -1268,7 +1620,7 @@ void Chat::startConversation() void Chat::startMeeting() { // Choose the contact. - QString handle = chooseContact(); + QString handle( chooseContact() ); if( KMESS_NULL(msnSwitchboardConnection_) ) { @@ -1283,4 +1635,22 @@ void Chat::startMeeting() +// Send webcam data to a contact. +void Chat::startWebcamTransfer() +{ + // Choose the contact. + QString handle( chooseContact() ); + + if( KMESS_NULL(msnSwitchboardConnection_) ) + { +#ifdef KMESSDEBUG_CHAT_GENERAL + kWarning() << "Tried to open a meeting with \'" << handle << "\' without a switchboard!"; +#endif + return; + } + + emit requestWebcamTransfer(handle); +} + + #include "chat.moc" diff --git a/src/chat/chat.h b/src/chat/chat.h index a307d2a..7e1618d 100644 --- a/src/chat/chat.h +++ b/src/chat/chat.h @@ -18,16 +18,15 @@ #ifndef CHAT_H #define CHAT_H +#include "../contact/contactbase.h" #include "chatview.h" +#include "../network/msnswitchboardconnection.h" -//#include #include #include #include #include -//#include - // Forward declarations class ChatInformation; @@ -35,14 +34,23 @@ class ChatMessage; class ChatView; class ChatWindow; class ContactBase; -class ContactAction; class KMessTest; -class MsnSwitchboardConnection; +class MimeMessage; class QDir; +/** + * Time before a typing message expires + * + * Expressed in seconds, this value determines for how long the chat window's status bar messages + * "Contact is typing..." are displayed. + */ +#define CHAT_TYPING_EXPIRATION_TIME 5 + + + /** * @brief Manage an active chat * @@ -70,22 +78,36 @@ class Chat : public ChatView ChatWindow *getChatWindow(); // Return the list of contacts in the chat QStringList getParticipants(); + // Return the icon to use in the tab icon chat + KIcon getParticipantsTabIcon(); + // Return the date and time the chat has started + QDateTime getStartTime() const; // Return the list of contacts which are typing QStringList getTypingContacts(); // Initialize the object bool initialize( MsnSwitchboardConnection *switchboardConnection ); // Return the switchboard connection used by the chat window. MsnSwitchboardConnection * getSwitchboardConnection() const; - // Return whether or not the contact is in this chat. - bool isContactInChat( const QString &handle ); - // Return whether or not this is an exclusive chat with the given contact - bool isExclusiveChatWithContact( const QString& handle ); + // Invite a contact to the chat + void inviteContacts( const QStringList &contacts ); + // Return whether or not the contact is in this chat. Check also if the chat is exclusive with the contact. + bool isContactInChat( const QString &handle, bool isExclusiveChatWithContact = false ); // Return whether or not the chat is at its first incoming message bool isChatFirstMessage(); // The application is exiting void queryExit(); // The chat is closing void queryClose(); + // Send a text message to the current chat + void sendChatMessage( const QString &message ); + // Send an ink drawing to the current chat + void sendInkMessage( const QByteArray &inkData ); + // Send an "user is typing" message to the contacts + void sendTypingMessage(); + // Send an wink to the current chat + void sendWink( const QString &message ); + // The user wants to block or unblock a contact. + void setContactBlocked( QString handle, bool isBlocked ); // Enable or disable the parts of the window which allow user interaction void setEnabled( bool isEnabled ); // Start a chat @@ -106,56 +128,60 @@ class Chat : public ChatView void startConversation(); // Start GnomeMeeting with a contact. void startMeeting(); + // Send webcam data to a contact. + void startWebcamTransfer(); private: // Private methods - // Check if the user enabled an auto-reply, and send it - void checkAutoReply(); // Choose the contact to start an invitation with. QString chooseContact(); - // Save the chat if necessary - void saveChatAutomatically(); + // Save the chat if needed + void saveChatAutomatically( bool saveExternalFile = false ); private slots: // Private slots // A contact joined the chat - void contactJoined(QString handle, QString friendlyName); + void contactJoined( ContactBase *contact ); // A contact left the chat - void contactLeft(QString handle, bool isChatIdle); + void contactLeft ( ContactBase *contact, bool isChatIdle ); // A contact is typing - void contactTyping( const QString &handle = QString(), const QString &friendlyName = QString(), bool forceExpiration = false ); - // Invite a contact to the chat - void inviteContact(QString handle); + void contactTyping( ContactBase *contact = 0, bool forceExpiration = false ); + // A warning from the switchboard has been received, display it + void showWarning( MsnSwitchboardConnection::WarningType type, ContactBase* contact ); + // Display a message to notify of a contact status change + void slotContactChangedStatus(); // Notify the user of a received nudge - void slotReceivedNudge(const QString &handle); - // Signal that a message could not be sent to the switchboard - void slotSendingFailed( QString message ); + void slotReceivedNudge( ContactBase* contact ); + // Notify that a message could not be sent by the switchboard + void slotSendingFailed( const QString &handle, const MimeMessage &message ); private: // Private attributes // Whether or not the incoming message is the first incoming message bool firstMessage_; // Whether or not the object was initialized bool initialized_; - // The last contact that left the chat. - QString lastContact_; + // The last contacts known to have been in the chat. Kept for emergency, when there's no switchboard + QStringList lastKnownContacts_; // The last time an automessage has been sent QTime lastSentAutoMessage_; // The object that connects to the switchboard server. MsnSwitchboardConnection *msnSwitchboardConnection_; - // The list of participants to this chat - QStringList participants_; // The date/time the chat started QDate startDate_; QTime startTime_; - // The list of users which are currently typing - QMap typingContacts_; + // The list of names of contacts which are currently typing + QMap typingContactsNames_; + // The list of times when the contacts have started typing + QMap typingContactsTimes_; // A timer to update the typing information QTimer typingTimer_; + // Handle a command from ChatView (e.g. '/online') + bool handleCommand( QString command ); - signals: // Public signals + signals: // Signal that some chat details (like the number of active contacts) have changed void chatInfoChanged(); - // Signal that the chat is about to close. - void closing(QObject *object); + // Signal that this chat is about to close. + void closing( Chat *chat ); // Signal the presence of a new incoming chat message void gotChatMessage( const ChatMessage &message, Chat *chat ); // Signal that a typing message has been received @@ -166,12 +192,16 @@ class Chat : public ChatView void requestFileTransfer(const QString &handle, const QString &filename); // Signal that the ChatMaster should start a newmeeting session. void requestNetMeeting(const QString &handle); + // Signal that the ChatMaster should start a webcam transfer. + void requestWebcamTransfer(const QString &handle); // The user wants to add or remove a contact. - void setContactAdded( QString handle, bool isAdded ); + void contactAdded( QString handle, bool isAdded ); // The user wants to allow a contact to see his/hers online status. - void setContactAllowed( QString handle ); - // The user wants to block or unblock a contact. - void setContactBlocked( QString handle, bool isBlocked ); + void contactAllowed( QString handle ); + // The user wants to block or unblock a contact. + void contactBlocked( QString handle, bool isBlocked ); + // The user wants to start private chat + void startPrivateChat( const QString &handle ); }; #endif diff --git a/src/chat/chatmaster.cpp b/src/chat/chatmaster.cpp index 0c5c493..3bc411e 100644 --- a/src/chat/chatmaster.cpp +++ b/src/chat/chatmaster.cpp @@ -19,16 +19,17 @@ #include "../contact/contact.h" #include "../contact/contactextension.h" -#include "../contact/contactlist.h" #include "../contact/msnobject.h" +#include "../model/contactlist.h" #include "../network/applications/applicationlist.h" #include "../network/applications/mimeapplication.h" -#include "../network/applications/msnobjecttransferp2p.h" #include "../network/applications/p2papplication.h" #include "../network/applications/filetransfer.h" #include "../network/applications/filetransferp2p.h" #include "../network/applications/gnomemeeting.h" #include "../network/applications/inktransferp2p.h" +#include "../network/applications/msnobjecttransferp2p.h" +#include "../network/applications/webcamtransferp2p.h" #include "../network/chatmessage.h" #include "../network/msnswitchboardconnection.h" #include "../currentaccount.h" @@ -40,10 +41,16 @@ #include #include +#include +#include #include +// Settings for debugging +#define CHATMASTER_SEND_FILES_MSNFTP 0 + + // The constructor ChatMaster::ChatMaster(QObject *parent) @@ -61,6 +68,7 @@ ChatMaster::~ChatMaster() disconnected(); // Delete all open windows + kDebug() << chatWindows_; qDeleteAll( chatWindows_ ); chatWindows_.clear(); @@ -74,6 +82,7 @@ ChatMaster::~ChatMaster() } + // The connection has been established void ChatMaster::connected() { @@ -92,23 +101,63 @@ void ChatMaster::connected() // Go through all the chats and reactivate them foreach( Chat *chat, chats_ ) { - QStringList participants = chat->getParticipants(); + // Reactivate right away chats which have a connection already. Should never happen though. + if( chat->getSwitchboardConnection() != 0 ) + { + chat->setEnabled( true ); + + // Mark this chat's window for reactivation + if( ! windowsList.contains( chat->getChatWindow() ) ) + { + windowsList.append( chat->getChatWindow() ); + } + + continue; + } + + const QStringList& participants( chat->getParticipants() ); + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Reactivating chat:" << participants; +#endif + + // Check if the participants list is empty: if so, there's something fishy going on. + if( participants.isEmpty() ) + { + kWarning() << "Tried to reactivate chat with no contacts - has a window?" << ( chat->getChatWindow() != 0 ); + chat->getChatWindow()->removeChatTab( chat ); + continue; + } // Do not re-enable group chats, as they need a new invitation to work again if( participants.count() > 1 ) { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "This is a group chat, closing it."; +#endif + chat->getChatWindow()->removeChatTab( chat ); continue; } + const QString &handle( participants.first() ); + // Only reactivate the chat if this contact is in the connected account's list - if( CurrentAccount::instance()->getContactByHandle( participants.first() ) == 0 ) + if( currentAccount_->getContactByHandle( handle ) == 0 ) { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "This chat is with a non-listed contact, closing it."; +#endif + chat->getChatWindow()->removeChatTab( chat ); continue; } +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Reactivating chat with listed contact:" << handle; +#endif + // Create a new switchboard, setting it as empty but with an hint about // who to call if the user wants to chat again. - MsnSwitchboardConnection *switchboard = createSwitchboardConnection( 0, participants.first() ); + MsnSwitchboardConnection *switchboard = createSwitchboardConnection( 0, handle ); if( switchboard ) { chat->setSwitchboardConnection( switchboard ); @@ -125,7 +174,7 @@ void ChatMaster::connected() // Go through all the windows and reactivate them foreach( ChatWindow *window, windowsList ) { - window->setEnabled( true ); + window->setUIState( ChatWindow::Connected ); } } @@ -133,17 +182,6 @@ void ChatMaster::connected() // The user has disconnected, so close all open switchboard connections and disable the chats void ChatMaster::disconnected() { - if( ! switchboardConnections_.isEmpty() ) - { -#ifdef KMESSDEBUG_CHATMASTER - kDebug() << "Closing" << switchboardConnections_.count() << "open switchboards."; -#endif - - // Cleanup switchboard connections. - qDeleteAll( switchboardConnections_ ); - switchboardConnections_.clear(); - } - // Don't waste time disabling the chats when exiting. KMessApplication *kmessApp = static_cast( kapp ); if( kmessApp->quitSelected() ) @@ -161,7 +199,7 @@ void ChatMaster::disconnected() foreach( ChatWindow *window, chatWindows_ ) { // Disable the chats so they can't receive user input anymore - window->setEnabled( false ); + window->setUIState( ChatWindow::Disconnected ); } } @@ -177,6 +215,50 @@ void ChatMaster::disconnected() chat->setEnabled( false ); } } + + if( ! switchboardConnections_.isEmpty() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Closing" << switchboardConnections_.count() << "open switchboards."; +#endif + + // Cleanup switchboard connections. + qDeleteAll( switchboardConnections_ ); + switchboardConnections_.clear(); + } +} + + + +// KMess is establishing a connection. +void ChatMaster::connecting() +{ + // There are no chats modify. + if( chats_.isEmpty() ) + { + return; + } + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Disabling reconnect button of" << chats_.count() << "open chats."; +#endif + + QList windowsList; + + // Go through all the chats and add their window. + foreach( Chat *chat, chats_ ) + { + if( ! windowsList.contains( chat->getChatWindow() ) ) + { + windowsList.append( chat->getChatWindow() ); + } + } + + // Go through all the windows and disable their reconnect button. + foreach( ChatWindow *window, windowsList ) + { + window->setUIState( ChatWindow::Connecting ); + } } @@ -195,7 +277,7 @@ void ChatMaster::forwardRequestNewSwitchboard( QString handle ) // Forward a request to add or remove a contact from the contactlist, which comes from the ContactFrame. -void ChatMaster::forwardSetContactAdded( QString handle, bool isAdded ) +void ChatMaster::forwardContactAdded( QString handle, bool isAdded ) { if( isAdded ) { @@ -210,7 +292,7 @@ void ChatMaster::forwardSetContactAdded( QString handle, bool isAdded ) // Forward a request to block or unblock a contact, which comes from the ContactFrame. -void ChatMaster::forwardSetContactBlocked( QString handle, bool isBlocked ) +void ChatMaster::forwardContactBlocked( QString handle, bool isBlocked ) { if( isBlocked ) { @@ -230,9 +312,15 @@ ApplicationList * ChatMaster::getApplicationList(const QString &handle) ApplicationList *appList = 0; // Get the contact. - ContactBase *contact = CurrentAccount::instance()->getContactByHandle(handle); + ContactBase *contact = currentAccount_->getContactByHandle(handle); if(KMESS_NULL(contact)) return 0; + if( handle == currentAccount_->getHandle() ) + { + kWarning() << "Cannot start applications with yourself."; + return 0; + } + // Get the application list if( contact->hasApplicationList() ) { @@ -297,7 +385,7 @@ Chat *ChatMaster::getContactsChat( const QString &handle, bool privateChat ) // Look through the chats for an exclusive one with the contact given foreach( Chat *chat, chats_ ) { - if( chat->isExclusiveChatWithContact( handle ) ) + if( chat->isContactInChat( handle, true ) ) { return chat; // best candidate found } @@ -390,12 +478,25 @@ bool ChatMaster::initialize() return false; } - // Connect the contact. - CurrentAccount *currentAccount = CurrentAccount::instance(); - const ContactList *contactList = currentAccount->getContactList(); + // Save the current account reference + currentAccount_ = CurrentAccount::instance(); + + // Get the tabbed chat settings + chatTabbedMode_ = currentAccount_->getTabbedChatMode(); + + // Connect the contact list + const ContactList *contactList = currentAccount_->getContactList(); connect( contactList, SIGNAL( contactChangedMsnObject(Contact*) ), this, SLOT ( slotContactChangedMsnObject(Contact*) ) ); + // Update chat grouping when settings are changed + connect( currentAccount_, SIGNAL( changedChatStyleSettings() ), + this, SLOT ( updateChatGrouping() ) ); + // If the user has added him/herself as a contact, we need to update its picture + // when a new display picture is set + connect( currentAccount_, SIGNAL( changedMsnObject() ), + this, SLOT ( slotContactChangedMsnObject() ) ); + initialized_ = true; return true; } @@ -416,6 +517,13 @@ void ChatMaster::requestChat( QString handle ) { ChatInformation::ConnectionType connectionType; + // Forbid chatting with yourself + if( handle == currentAccount_->getHandle() ) + { + kWarning() << "Cannot chat with yourself."; + return; + } + // Look through the chats for an exclusive chat with the given contact Chat *chat = getContactsChat( handle, true ); @@ -427,13 +535,14 @@ void ChatMaster::requestChat( QString handle ) } // Get the contact, see if it's online - CurrentAccount *currentAccount = CurrentAccount::instance(); + CurrentAccount *currentAccount = currentAccount_; ContactBase *contact = currentAccount->getContactByHandle( handle ); - if( ( contact && contact->getStatus() == STATUS_OFFLINE ) - || ( currentAccount->getStatus() == STATUS_INVISIBLE ) ) + // TODO we shouldn't decide if the chat will be in offline mode, + // we should see if the CAL return value from SB is 217 + if( contact && contact->getStatus() == STATUS_OFFLINE ) { - // Either we are invisible, or the contact is offline or invisible. + // Either the contact is offline or invisible. // We'll start an offline chat. connectionType = ChatInformation::CONNECTION_OFFLINE; @@ -454,24 +563,28 @@ void ChatMaster::requestChat( QString handle ) MsnSwitchboardConnection *switchboard = getContactSwitchboardConnection( handle, true ); if( switchboard != 0 ) { - createChat( switchboard ); + // The user request chat with user that have already opened one SB + // So, re-use the SB and force the raise of chat! + createChat( switchboard, true ); return; } + // Append the requested chat with handle to the list + // So when the chat will be created it will be raised + requestedChats_.append( handle ); emit requestSwitchboard( handle, connectionType ); } // A chat is closing -void ChatMaster::slotChatClosing( QObject *chatObject ) +void ChatMaster::slotChatClosing( Chat *chat ) { #ifdef KMESSDEBUG_CHATMASTER kDebug() << "Marking chat as closing."; #endif // Make sure this chat window don't receive new messages. - Chat *chat = static_cast( chatObject ); closingChats_.append( chat ); // The contains check avoids deleting references to old switchboards which may be outdated and don't exist anymore. @@ -592,8 +705,7 @@ void ChatMaster::raiseChat( Chat *chat, bool force ) // Making windows raise and get focus interrupts the user... it's better to make them appear minimized, // and let them just flash in the taskbar. - - if( chatWindow->isVisible() && chatWindow->hasFocus() ) + if( chatWindow->isVisible() && ! force ) { #ifdef KMESSDEBUG_CHATMASTER kDebug() << "Window has focus already."; @@ -601,19 +713,25 @@ void ChatMaster::raiseChat( Chat *chat, bool force ) return; } - // Set the window on the current desktop - KWindowSystem::setOnDesktop( chatWindow->winId(), KWindowSystem::currentDesktop() ); - - // Activate the selected tab - chatWindow->setCurrentChat( chat ); + // Move the window on the current desktop if it wasn't shown before or if we're forcing its raise + if( ! chatWindow->isVisible() || force ) + { + KWindowSystem::setOnDesktop( chatWindow->winId(), KWindowSystem::currentDesktop() ); + } if( ! force ) { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Showing minimized window."; +#endif // Required for new chats chatWindow->showMinimized(); return; } + // Activate the selected tab + chatWindow->setCurrentChat( chat ); + // Notify about the new window and force it to show and receive focus. Only use upon user request. #ifdef KMESSDEBUG_CHATMASTER @@ -623,10 +741,16 @@ void ChatMaster::raiseChat( Chat *chat, bool force ) // Show the chat's window if( chatWindow->isMinimized() ) { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Window was minimized, showing it."; +#endif chatWindow->showNormal(); } else { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Window was not minimized, showing it again."; +#endif chatWindow->show(); } @@ -793,7 +917,7 @@ void ChatMaster::showSpecialMessage( const ChatMessage &message, const MsnSwitch { // Create a new offline switchboard connection to deliver the message. It can be converted to an // online switchboard one if needed. - switchboard = startSwitchboard( ChatInformation( 0, handle, 0, ChatInformation::CONNECTION_OFFLINE ) ); + switchboard = startSwitchboard( ChatInformation( 0, handle, "", 0, "", "", ChatInformation::CONNECTION_OFFLINE ) ); if( switchboard == 0 ) { #ifdef KMESSDEBUG_CHATMASTER @@ -829,7 +953,6 @@ void ChatMaster::showMsnObject( const QString &handle, const MsnObject &msnObjec // Note I don't use msnObject.getCreator, because I don't want to trust the other client! ContactBase *contact = 0; Contact *msnContact = 0; - Chat *chatUpdate = 0; // Get msn object filename fileName = KMessConfig::instance()->getMsnObjectFileName( msnObject ); @@ -840,7 +963,7 @@ void ChatMaster::showMsnObject( const QString &handle, const MsnObject &msnObjec case MsnObject::DISPLAYPIC: // Get the real MSN contact from the MSN contact list. // Picture is stored in the ContactExtension because it's not an official property of the contact (not stored server-side). - msnContact = CurrentAccount::instance()->getContactList()->getContactByHandle(handle); + msnContact = currentAccount_->getContactList()->getContactByHandle(handle); if(KMESS_NULL(msnContact)) return; msnContact->getExtension()->setContactPicturePath( fileName ); pendingDisplayPictures_.removeAll( handle ); @@ -854,13 +977,13 @@ void ChatMaster::showMsnObject( const QString &handle, const MsnObject &msnObjec case MsnObject::EMOTICON: // Inform the contact that a custom emoticon can be parsed. - contact = CurrentAccount::instance()->getContactByHandle(handle); + contact = currentAccount_->getContactByHandle(handle); if(KMESS_NULL(contact)) return; emoticonCode = contact->getEmoticonCode(msnObject.getDataHash()); // always put before addEmoticonFile()! contact->addEmoticonFile( msnObject.getDataHash(), fileName ); // Update all chats where the contact is present - foreach( chatUpdate, chats_ ) + foreach( Chat *chatUpdate, chats_ ) { if( chatUpdate->isContactInChat( handle ) ) { @@ -885,7 +1008,31 @@ void ChatMaster::showMsnObject( const QString &handle, const MsnObject &msnObjec // Determine what to do when a contact changed it's picture. void ChatMaster::slotContactChangedMsnObject( Contact *contact ) { - QString handle = contact->getHandle(); + // Avoid trying to download our own display picture, if the user has added him/herself; + // instead simply use the current one. + // This method can be called to update the user's own picture in list from two places: + // 1)on login when the contact is first received, 2)when the user changes the display pic. + if( contact == 0 ) + { + contact = currentAccount_->getContactList()->getContactByHandle( currentAccount_->getHandle() ); + + // When the connection starts, this method gets called + // but the contact list is not ready yet. Cancel. + if( contact == 0 ) + { + return; + } + } + if( contact->getHandle() == currentAccount_->getHandle() ) + { + contact->getExtension()->setContactPicturePath( currentAccount_->getPicturePath() ); +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Updated user's own display picture"; +#endif + return; + } + + QString handle( contact->getHandle() ); // If the contact no longer likes to display an msn object, remove it if( contact->getMsnObject() == 0 ) @@ -901,7 +1048,7 @@ void ChatMaster::slotContactChangedMsnObject( Contact *contact ) MsnObject msnObject( *contact->getMsnObject() ); // See if the file already exists. - QString objectFileName = KMessConfig::instance()->getMsnObjectFileName( msnObject ); + QString objectFileName( KMessConfig::instance()->getMsnObjectFileName( msnObject ) ); if( QFile::exists( objectFileName ) ) { bool imageInvalid = QImageReader::imageFormat( objectFileName ).isEmpty(); @@ -970,12 +1117,14 @@ void ChatMaster::slotContactChangedMsnObject( Contact *contact ) // A contact joined to one of our switchboard sessions. -void ChatMaster::slotContactJoinedChat(QString handle) +void ChatMaster::slotContactJoinedChat( ContactBase *contact ) { // Get switchboard connection from slot sender MsnSwitchboardConnection *connection = static_cast( const_cast( sender() ) ); if(KMESS_NULL(connection)) return; + QString handle( contact->getHandle() ); + // Send any pending messages, if any if( pendingMimeMessages_.count() > 0 ) { @@ -1004,12 +1153,12 @@ void ChatMaster::slotContactJoinedChat(QString handle) // Check whether the contact picture is outdated. // Use getContactByHandle() from the MSN contact list to get the msn object. - const Contact *contact = CurrentAccount::instance()->getContactList()->getContactByHandle( handle ); - if( contact != 0 && contact->hasP2PSupport() ) + const Contact *fullContact = currentAccount_->getContactList()->getContactByHandle( handle ); + if( fullContact != 0 && fullContact->hasP2PSupport() ) { - if( contact->getMsnObject() != 0 ) + if( fullContact->getMsnObject() != 0 ) { - startMsnObjectDownload( contact->getHandle(), contact->getMsnObject(), 0 ); + startMsnObjectDownload( fullContact->getHandle(), fullContact->getMsnObject(), 0 ); } } } @@ -1028,7 +1177,7 @@ void ChatMaster::slotDeliverAppCommand(QString cookie, QString handle, QString c Application *app = 0; // Get the contact. - ContactBase *contact = CurrentAccount::instance()->getContactByHandle(handle); + ContactBase *contact = currentAccount_->getContactByHandle(handle); if(KMESS_NULL(contact)) return; // Get the application list @@ -1071,7 +1220,7 @@ void ChatMaster::slotDeliverMimeMessage(const MimeMessage &message, const QStrin kDebug() << "Delivering application message for '" << handle << "' to switchboard."; #endif #ifdef KMESSTEST - QString contentType = message.getValue("Content-Type"); + QString contentType( message.getValue("Content-Type") ); KMESS_ASSERT( contentType == "application/x-msnmsgrp2p" || contentType == "text/x-msmsgsinvite" || contentType.section(';', 0, 0) == "text/x-msmsgsinvite" ); // for ; charset= suffix @@ -1136,15 +1285,15 @@ void ChatMaster::slotGotInkMessage( const QString &inkData, const QString &conta } // Use the ink data as inline image. - QString inkUrlData = QString( inkData ).replace( "base64:", "base64," ); + QString inkUrlData( QString( inkData ).replace( "base64:", "base64," ) ); // Get the contact data QString friendlyName; QString contactPicture; - const ContactBase *contact = CurrentAccount::instance()->getContactByHandle( contactHandle ); + const ContactBase *contact = currentAccount_->getContactByHandle( contactHandle ); if( contact != 0 ) { - friendlyName = contact->getFriendlyName(); + friendlyName = contact->getFriendlyName( STRING_ORIGINAL ); contactPicture = contact->getContactPicturePath(); } @@ -1194,7 +1343,7 @@ void ChatMaster::slotGotMessage(const P2PMessage &message, const QString &handle void ChatMaster::slotGotMsnObject(const QString &msnObjectData, const QString &handle) { // Get the contact. - ContactBase *contact = CurrentAccount::instance()->getContactByHandle(handle); + ContactBase *contact = currentAccount_->getContactByHandle(handle); if(KMESS_NULL(contact)) return; // Get the switchboard connection where the emoticon/wink/voiceclip was posted @@ -1208,8 +1357,8 @@ void ChatMaster::slotGotMsnObject(const QString &msnObjectData, const QString &h // Parse the msn object MsnObject msnObject(msnObjectData); - // Get the contact name, - QString friendlyName = Qt::escape( CurrentAccount::instance()->getContactFriendlyNameByHandle( handle ) ); + // Get the contact name + QString friendlyName( currentAccount_->getContactFriendlyNameByHandle( handle, STRING_CLEANED_ESCAPED ) ); // Determine the statusmessage to display. QString statusMessage; @@ -1303,7 +1452,7 @@ void ChatMaster::slotSwitchboardReady() // A switchboard is still available. // If the contact applications were paused, resume them now. - ContactBase *contact = CurrentAccount::instance()->getContactByHandle( contacts[0] ); + ContactBase *contact = currentAccount_->getContactByHandle( contacts[0] ); if( contact != 0 && contact->hasApplicationList() ) { contact->getApplicationList()->resumeApplications(isPrivateChat); @@ -1419,7 +1568,7 @@ MsnSwitchboardConnection *ChatMaster::startSwitchboard( const ChatInformation &c // Start a chat with the information gathered from a switchboard connection -Chat *ChatMaster::createChat( MsnSwitchboardConnection *switchboard ) +Chat *ChatMaster::createChat( MsnSwitchboardConnection *switchboard, bool requestedByUser ) { #ifdef KMESSTEST KMESS_ASSERT( switchboard != 0 ); @@ -1429,7 +1578,25 @@ Chat *ChatMaster::createChat( MsnSwitchboardConnection *switchboard ) ChatWindow *newChatWindow; // If the new chat is a group chat, find existing group chat windows; else find private chats - newChat = getContactsChat( switchboard->getContactsInChat(), true ); + QStringList partecipants = switchboard->getContactsInChat(); + newChat = getContactsChat( partecipants, true ); + + // Check if the chat was required by the user + if( ! requestedByUser ) + { + // Else check if it's a single chat + if( partecipants.count() < 2 ) + { + // Grep the contact handle and check if it is in the list + QString handle( partecipants.first() ); + requestedByUser = requestedChats_.contains( handle ); + if( requestedByUser ) + { + // Remove it if we found the handle + requestedChats_.removeAll( handle ); + } + } + } if( newChat != 0 ) { @@ -1440,8 +1607,7 @@ Chat *ChatMaster::createChat( MsnSwitchboardConnection *switchboard ) // If we've requested a chat window, raise it forcing it open over other KMess' windows; // if some contact wants to chat with us, the chat window will open minimized. - raiseChat( newChat, switchboard->getUserStartedChat() ); - + raiseChat( newChat, requestedByUser ); return newChat; } @@ -1465,7 +1631,7 @@ Chat *ChatMaster::createChat( MsnSwitchboardConnection *switchboard ) newChatWindow = createChatWindow( newChat ); // Create the first tab in the chat - newChat = newChatWindow->addChatTab( newChat ); + newChat = newChatWindow->addChatTab( newChat, switchboard->getUserStartedChat() ); if( newChat == 0 ) { kWarning() << "Couldn't add the initial chat."; @@ -1475,20 +1641,26 @@ Chat *ChatMaster::createChat( MsnSwitchboardConnection *switchboard ) // Connect the chat's request signals connect( newChat, SIGNAL( gotChatMessage(const ChatMessage&,Chat*) ), this, SIGNAL( newChatMessage(const ChatMessage&,Chat*) ) ); - connect( newChat, SIGNAL( setContactAllowed(QString) ), + connect( newChat, SIGNAL( contactAllowed(QString) ), this, SIGNAL( allowContact(QString) ) ); - connect( newChat, SIGNAL( setContactAdded(QString,bool) ), - this, SLOT ( forwardSetContactAdded(QString,bool) ) ); - connect( newChat, SIGNAL( setContactBlocked(QString,bool) ), - this, SLOT ( forwardSetContactBlocked(QString,bool) ) ); + connect( newChat, SIGNAL( addContact(QString) ), + this, SIGNAL( addContact(QString) ) ); + connect( newChat, SIGNAL( contactAdded(QString,bool) ), + this, SLOT ( forwardContactAdded(QString,bool) ) ); + connect( newChat, SIGNAL( contactBlocked(QString,bool) ), + this, SLOT ( forwardContactBlocked(QString,bool) ) ); + connect( newChat, SIGNAL( startPrivateChat(const QString&) ), + this, SLOT ( requestChat(QString) ) ); connect( newChat, SIGNAL( appCommand(QString,QString,QString) ), this, SLOT ( slotDeliverAppCommand(QString,QString,QString) ) ); connect( newChat, SIGNAL( requestFileTransfer(const QString&,const QString&) ), this, SLOT ( startFileTransfer(const QString&,const QString&) ) ); connect( newChat, SIGNAL( requestNetMeeting(const QString&) ), this, SLOT ( startNetMeeting(const QString&) ) ); - connect( newChat, SIGNAL( closing(QObject*) ), - this, SLOT ( slotChatClosing(QObject*) ) ); + connect( newChat, SIGNAL( requestWebcamTransfer(const QString&) ), + this, SLOT ( startWebcamTransfer(const QString&) ) ); + connect( newChat, SIGNAL( closing(Chat*) ), + this, SLOT ( slotChatClosing(Chat*) ) ); connect( newChat, SIGNAL( destroyed(QObject*) ), this, SLOT ( slotChatDestroyed(QObject*) ) ); connect( this, SIGNAL( updateApplicationMessage(const QString&,const QString&) ), @@ -1502,7 +1674,7 @@ Chat *ChatMaster::createChat( MsnSwitchboardConnection *switchboard ) // If we've requested a chat window, raise it forcing it open over other KMess' windows; // if some contact wants to chat with us, the chat window will open minimized. - raiseChat( newChat, switchboard->getUserStartedChat() ); + raiseChat( newChat, requestedByUser ); return newChat; } @@ -1512,55 +1684,8 @@ Chat *ChatMaster::createChat( MsnSwitchboardConnection *switchboard ) // Create a new chat window or retrieve an existing one if tabbed chatting is enabled ChatWindow *ChatMaster::createChatWindow( Chat *chat ) { - ChatWindow *window = 0; - CurrentAccount *currentAccount = CurrentAccount::instance(); - - if( ! chatWindows_.empty() ) - { -#ifdef KMESSDEBUG_CHATMASTER - kDebug() << "At least one chat window is already open: checking the tabbed chatting settings."; -#endif - - if( currentAccount->getTabbedChatMode() == 0 ) // Always group in tabs - { - // Pick the last open chat window - window = chatWindows_.last(); -#ifdef KMESSDEBUG_CHATMASTER - kDebug() << "Always group in tabs. Picking the last created window."; -#endif - } - else if( currentAccount->getTabbedChatMode() == 1 ) // Group tabs by initial contact's group - { -#ifdef KMESSDEBUG_CHATMASTER - kDebug() << "Group in tabs by contact group. Choosing a window."; -#endif - QString handle( chat->getSwitchboardConnection()->getFirstContact() ); - Contact *contact = currentAccount->getContactList()->getContactByHandle( handle ); - - if( contact && ! contact->getGroupIds().isEmpty() ) - { - QString group = contact->getGroupIds().first(); -#ifdef KMESSDEBUG_CHATMASTER - kDebug() << "Searching chats for one whose first contact is in the same group as the new one's."; -#endif - foreach( Chat *chatItem, chats_ ) - { - QString handle( chatItem->getSwitchboardConnection()->getFirstContact() ); - Contact *contact = currentAccount->getContactList()->getContactByHandle( handle ); - - if( contact && ! contact->getGroupIds().isEmpty() - && contact->getGroupIds().first() == group ) - { -#ifdef KMESSDEBUG_CHATMASTER - kDebug() << "Match found!"; -#endif - window = chatItem->getChatWindow(); - break; - } - } - } - } - } + // Search a window for the chat according to the users grouping settings + ChatWindow *window = findWindowForChat( chat ); // Found a window to use, return that if( window != 0 ) @@ -1584,7 +1709,9 @@ ChatWindow *ChatMaster::createChatWindow( Chat *chat ) // Connect its signals connect( window, SIGNAL( destroyed(QObject*) ), - this, SLOT ( slotChatWindowDestroyed(QObject*) ) ); + this, SLOT ( slotChatWindowDestroyed(QObject*) ) ); + connect( window, SIGNAL( reconnect() ), + this, SIGNAL( reconnect() ) ); // Add the new chat window to our list chatWindows_.append( window ); @@ -1622,8 +1749,8 @@ MsnSwitchboardConnection *ChatMaster::createSwitchboardConnection( MsnSwitchboar switchboardConnections_.append( switchboard ); // Connect the switchboard's signals to the Chat Master. - connect(switchboard, SIGNAL( contactJoinedChat(QString, QString) ), - this, SLOT ( slotContactJoinedChat(QString) )); + connect(switchboard, SIGNAL( contactJoinedChat(ContactBase*) ), + this, SLOT ( slotContactJoinedChat(ContactBase*) )); connect(switchboard, SIGNAL( gotMessage(const MimeMessage&, const QString&) ), this, SLOT ( slotGotMessage(const MimeMessage&, const QString&) )); connect(switchboard, SIGNAL( gotMessage(const P2PMessage&, const QString&) ), @@ -1653,23 +1780,17 @@ void ChatMaster::startFileTransfer( const QString &handle, const QString &filena if(KMESS_NULL(appList)) return; // Get the contact properties, see how we can transfer the file. - const ContactBase *contact = CurrentAccount::instance()->getContactByHandle( handle ); + const ContactBase *contact = currentAccount_->getContactByHandle( handle ); // If the contact is offline (that is, not online nor invisible), refuse to start the file transfer MsnSwitchboardConnection *connection = getContactSwitchboardConnection( handle, true ); if( ! connection || ( contact && contact->isOffline() && connection->isInactive() ) ) { - kWarning() << "Attempted to start a file transfer with an offline contact!"; +// kWarning() << "Attempted to start a file transfer with an offline contact!"; return; } - if( contact != 0 && contact->hasP2PSupport() ) - { - // The contact supports file transfer over MSNP2P - P2PApplication *app = new FileTransferP2P(appList, filename); - startApplication(app); - } - else + if( contact == 0 || ! contact->hasP2PSupport() ) { // This should be so rare that it justifies a warning message. if( contact == 0 ) @@ -1684,7 +1805,36 @@ void ChatMaster::startFileTransfer( const QString &handle, const QString &filena // The contact only supports file transfer the old way MimeApplication *app = new FileTransfer(handle, filename); startApplication(app); + return; } + +#if CHATMASTER_SEND_FILES_MSNFTP + kWarning() << "Sending files is forced over MSNFTP for debugging, using old MIME invitations."; + MimeApplication *app = new FileTransfer(handle, filename); + startApplication(app); +#else + // The contact supports file transfer over MSNP2P + P2PApplication *app = new FileTransferP2P(appList, filename); + startApplication(app); +#endif +} + + + +// Start a chat and send a file to the contact +void ChatMaster::startChatAndFileTransfer( const QString &handle, const QString &filename ) +{ + requestChat( handle ); + int i = 0; + + // FIXME: Workaround needed, because the filetransfer is "lost" when the Switchboard is not open yet. + // suggested workarround: passing an "initial action" to requestChat(). + while( !getContactSwitchboardConnection( handle, true ) && i++ < 75 ) + { + QTest::qWait(200); + } + + startFileTransfer( handle, filename ); } @@ -1697,7 +1847,7 @@ void ChatMaster::startNetMeeting(const QString &handle) if(KMESS_NULL(appList)) return; // Get the contact - const ContactBase *contact = CurrentAccount::instance()->getContactByHandle( handle ); + const ContactBase *contact = currentAccount_->getContactByHandle( handle ); if(KMESS_NULL(contact)) return; // Create the application @@ -1728,11 +1878,11 @@ void ChatMaster::startMsnObjectDownload( const QString &handle, const MsnObject } // Get the picture filename, perhaps from a cache - QString objectFileName = KMessConfig::instance()->getMsnObjectFileName( *msnObject ); + QString objectFileName( KMessConfig::instance()->getMsnObjectFileName( *msnObject ) ); bool fileExists = QFile::exists( objectFileName ); - // Check if the image can be read. - if( fileExists ) + // Check if the image can be read. ( TODO this step is skipped for WINK for the moment ) + if( fileExists && msnObject->getType() != MsnObject::WINK ) { bool imageCorrupt = QImageReader::imageFormat( objectFileName ).isEmpty(); if( imageCorrupt || ! msnObject->verifyFile( objectFileName ) ) @@ -1775,6 +1925,27 @@ void ChatMaster::startMsnObjectDownload( const QString &handle, const MsnObject +// Start a webcam transfer with the contact +void ChatMaster::startWebcamTransfer( const QString &handle ) +{ + ApplicationList *appList = getApplicationList(handle); + if(KMESS_NULL(appList)) return; + + // Get the contact properties, see how we can transfer the file. + const ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if( contact == 0 || ! contact->hasP2PSupport() ) + { + kWarning() << "Contact" << handle << "does not support P2P transfers, using old MIME invitations instead."; + return; + } + + // The contact supports file transfer over MSNP2P + P2PApplication *app = new WebcamTransferP2P(appList); + startApplication(app); +} + + + /** * Periodically called method for update commands. * @@ -1787,7 +1958,7 @@ void ChatMaster::startMsnObjectDownload( const QString &handle, const MsnObject void ChatMaster::timedUpdate() { // Handle the queue of display pictures to download, but only if we're not hidden - if( pendingDisplayPictures_.count() == 0 || CurrentAccount::instance()->getStatus() == STATUS_INVISIBLE ) + if( pendingDisplayPictures_.count() == 0 || currentAccount_->getStatus() == STATUS_INVISIBLE ) { return; } @@ -1803,7 +1974,7 @@ void ChatMaster::timedUpdate() while( requestCount > 0 && ! pendingDisplayPictures_.isEmpty() ) { // Unshift the first handle of the list. - QString handle = pendingDisplayPictures_.first(); + QString handle( pendingDisplayPictures_.first() ); pendingDisplayPictures_.removeAll( handle ); #ifdef KMESSDEBUG_CHATMASTER @@ -1814,7 +1985,7 @@ void ChatMaster::timedUpdate() // First get the contact. // Using getContactList()->.. because it skips the InvitedContact objectss returned by CurrentAccount::getContactByHandle() - Contact *contact = CurrentAccount::instance()->getContactList()->getContactByHandle( handle ); + Contact *contact = currentAccount_->getContactList()->getContactByHandle( handle ); if( contact == 0 ) { #ifdef KMESSDEBUG_CHATMASTER @@ -1853,7 +2024,7 @@ void ChatMaster::timedUpdate() } // See if the object already exists in the cache - QString objectFileName = KMessConfig::instance()->getMsnObjectFileName( *msnObject ); + QString objectFileName( KMessConfig::instance()->getMsnObjectFileName( *msnObject ) ); if( QFile::exists( objectFileName ) && ! QImageReader::imageFormat( objectFileName ).isEmpty() && msnObject->verifyFile( objectFileName ) ) @@ -1907,4 +2078,139 @@ void ChatMaster::timedUpdate() +// Update the grouping of chats/tabs. +void ChatMaster::updateChatGrouping() +{ + if( currentAccount_->getTabbedChatMode() == chatTabbedMode_ ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Chat grouping mode not changed, nothing to update"; +#endif + return; + } + +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Updating Chat grouping"; +#endif + chatTabbedMode_ = currentAccount_->getTabbedChatMode(); + + if( chatWindows_.empty() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "No ChatWindows, nothing to update"; +#endif + return; + } + + ChatWindow *currentWindow; + ChatWindow *window; + + foreach( Chat *chat, chats_ ) + { + currentWindow = chat->getChatWindow(); + window = findWindowForChat( chat); + + if( window == 0) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "No suited window found for chat" << chat; +#endif + + ChatWindow* newChatWindow = createChatWindow( chat); + + newChatWindow->addChatTab( chat, false ); + currentWindow->removeChatTab( chat); + currentWindow->checkAndCloseWindow(); + + raiseChat( chat, false ); + } + else if( window != currentWindow ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Moving chat" << chat << "to other window" << window; +#endif + + window->addChatTab( chat, false ); + currentWindow->removeChatTab( chat); + currentWindow->checkAndCloseWindow(); + + raiseChat( chat, false ); + } + } +} + + + +// Search the appropriate window for a chat. +ChatWindow *ChatMaster::findWindowForChat( Chat *chat ) +{ + ChatWindow *window = 0; + ChatWindow *otherGroupWindow = 0; + CurrentAccount *currentAccount = currentAccount_; + + if( ! chatWindows_.empty() ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "At least one chat window is already open: checking the tabbed chatting settings."; +#endif + + if( currentAccount->getTabbedChatMode() == 0 ) // Always group in tabs + { + // Pick the last open chat window + window = chatWindows_.last(); +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Always group in tabs. Picking the last created window."; +#endif + } + else if( currentAccount->getTabbedChatMode() == 1 ) // Group tabs by initial contact's group + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Group in tabs by contact group. Choosing a window."; +#endif + QString handle( chat->getSwitchboardConnection()->getFirstContact() ); + Contact *contact = currentAccount->getContactList()->getContactByHandle( handle ); + + if( contact && ! contact->getGroupIds().isEmpty() ) + { + QString group( contact->getGroupIds().first() ); +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Searching chats for one whose first contact is in the same group as the new one's."; +#endif + foreach( Chat *chatItem, chats_ ) + { + QString handle( chatItem->getSwitchboardConnection()->getFirstContact() ); + Contact *contact = currentAccount->getContactList()->getContactByHandle( handle ); + + if( contact && ! contact->getGroupIds().isEmpty() + && contact->getGroupIds().first() == group ) + { +#ifdef KMESSDEBUG_CHATMASTER + kDebug() << "Match found!"; +#endif + window = chatItem->getChatWindow(); + + // We found a possibly suited window. + // Check if it already displays tabs of another group. + // If so, we can't use it. + if( otherGroupWindow == window ) + { + window = 0; + } + + break; + } + else + { + // Keep track of the window used by another group. + otherGroupWindow = chatItem->getChatWindow(); + } + } + } + } + } + return window; +} + + + #include "chatmaster.moc" diff --git a/src/chat/chatmaster.h b/src/chat/chatmaster.h index 00bf823..c2a4a58 100644 --- a/src/chat/chatmaster.h +++ b/src/chat/chatmaster.h @@ -34,6 +34,7 @@ class Chat; class ChatWindow; class Contact; class ContactBase; +class CurrentAccount; class MimeApplication; class MimeMessage; class P2PApplication; @@ -69,8 +70,10 @@ class ChatMaster : public QObject void connected(); // The user has disconnected, so close all open switchboard connections and disable the chats void disconnected(); + // KMess is establishing a connection. + void connecting(); // Raise an existing chat window - void raiseChat( Chat *chat, bool force = false ); + void raiseChat( Chat *chat, bool force ); // Verify if a new chat can be opened and requests a switchboard void requestChat( QString handle ); // Deliver an application or offline message to the chat window (can be submitted by an Application or Offline-IM from MsnNotificationConnection). @@ -79,22 +82,24 @@ class ChatMaster : public QObject MsnSwitchboardConnection *startSwitchboard( const ChatInformation &chatInfo ); // Start a file transfer with the information from the Chat void startFileTransfer( const QString &handle, const QString &filename ); + // Start a chat and send a file to the contact + void startChatAndFileTransfer( const QString &handle, const QString &filename ); // Periodically update events. It's based on the pings sent by MsnNotificationConnection. void timedUpdate(); private slots: // Private slots // Start a chat with the information gathered from a switchboard connection - Chat *createChat( MsnSwitchboardConnection *switchboard ); + Chat *createChat( MsnSwitchboardConnection *switchboard, bool requestedByUser = false ); // Create a new chat window or retrieve an existing one if tabbed chatting is enabled ChatWindow *createChatWindow( Chat *chat ); // Forward a new switchboard server request signal coming from an existing switchboard connection void forwardRequestNewSwitchboard( QString handle ); // Forward a request to add or remove a contact from the contactlist, which comes from the ContactFrame. - void forwardSetContactAdded( QString handle, bool isAdded ); + void forwardContactAdded( QString handle, bool isAdded ); // Forward a request to block or unblock a contact, which comes from the ContactFrame. - void forwardSetContactBlocked( QString handle, bool isBlocked ); + void forwardContactBlocked( QString handle, bool isBlocked ); // A chat is closing - void slotChatClosing( QObject *chatObject ); + void slotChatClosing( Chat *chat ); // A chat was destroyed void slotChatDestroyed( QObject *chatObject ); // A chat window was destroyed @@ -102,9 +107,9 @@ class ChatMaster : public QObject // A new application was created for a contact. void slotConnectApplication(Application *application); // Determine what to do when a contact changed it's picture. - void slotContactChangedMsnObject( Contact *contact ); + void slotContactChangedMsnObject( Contact *contact = 0 ); // A contact joined to one of our switchboard sessions. - void slotContactJoinedChat(QString handle); + void slotContactJoinedChat( ContactBase *contact ); // Deliver an application command to the correct application void slotDeliverAppCommand(QString cookie, QString handle, QString command); // Deliver a message from a Application to the switchboard connection. @@ -125,6 +130,12 @@ class ChatMaster : public QObject void slotSwitchboardReady(); // Start a netmeeting invitation void startNetMeeting(const QString &handle); + // Start a webcam transfer with the contact + void startWebcamTransfer( const QString &handle ); + // Update the grouping of chats/tabs. + void updateChatGrouping(); + // Search the appropriate window for a chat. + ChatWindow *findWindowForChat( Chat *chat ); private: // private methods // Create and register a new switchboard @@ -170,14 +181,20 @@ class ChatMaster : public QObject QList chatWindows_; // The pointers to chats which are closing QList closingChats_; + // Current account reference + CurrentAccount *currentAccount_; // Whether or not the object was initialized bool initialized_; // The list of contacts whose DPs must be downloaded QStringList pendingDisplayPictures_; // A list of mime messages that should be sent to the contact when connection is reestablished QList pendingMimeMessages_; + // A list of requested chat with one contact ( handle ) + QStringList requestedChats_; // The pointers to the switchboard server connections QList switchboardConnections_; + // The current tabbed chat setting + int chatTabbedMode_; signals: // Public signals // Ask the Notification connection to add a contact @@ -196,6 +213,8 @@ class ChatMaster : public QObject void unblockContact( QString handle ); // Signal for ChatMessageView to replace an application's accept/reject/cancel links with another text void updateApplicationMessage( const QString &messageId, const QString &newMessage ); + // Signal a reconnect request. + void reconnect(); }; #endif diff --git a/src/chat/chatmessagestyle.cpp b/src/chat/chatmessagestyle.cpp index 81801b2..d7dcd5f 100644 --- a/src/chat/chatmessagestyle.cpp +++ b/src/chat/chatmessagestyle.cpp @@ -19,8 +19,8 @@ #include "../contact/contactbase.h" #include "../utils/richtextparser.h" +#include "../utils/kmessshared.h" #include "../currentaccount.h" -#include "../emoticon.h" #include "../emoticonmanager.h" #include "../kmessdebug.h" #include "xsltransformation.h" @@ -40,7 +40,9 @@ // The constructor ChatMessageStyle::ChatMessageStyle() : QObject(0) + , canConvert_(false) , contactFontColor_("#000000") + , groupFollowupMessages_(false) , showTime_(true) , useContactFont_(false) , useEmoticons_(true) @@ -60,6 +62,14 @@ ChatMessageStyle::~ChatMessageStyle() +// Return whether XSL conversion works with the current style +bool ChatMessageStyle::canConvert() const +{ + return canConvert_; +} + + + // Convert a chat message to HTML string QString ChatMessageStyle::convertMessage(const ChatMessage &message) { @@ -79,8 +89,8 @@ QString ChatMessageStyle::convertMessage(const ChatMessage &message) } else { - QString xmlMessage = createMessageXml(message); - QString parsedMessage = xslTransformation_->convertXmlString(xmlMessage); + QString xmlMessage ( convertMessageToXml( message ) ); + QString parsedMessage( xslTransformation_->convertXmlString(xmlMessage) ); // Strip DOCTYPE because it should only appear in convertMessageRoot() output parsedMessage = stripDoctype(parsedMessage); @@ -135,7 +145,7 @@ QString ChatMessageStyle::convertMessageList(const QList &messageL bool hasStyle = (xslTransformation_ != 0 && xslTransformation_->hasStylesheet()); QString parsedMessage; - // Avoid all the trouble when we can't create + // Avoid all the trouble when we can't create if( ! hasStyle ) { #ifdef KMESSDEBUG_CHATVIEW @@ -146,15 +156,30 @@ QString ChatMessageStyle::convertMessageList(const QList &messageL else { // Create XML string. - QString xmlMessage = "\n"; + QDateTime lastMessageDate; + QString xmlMessage( "\n" ); while( it.hasNext() ) { - xmlMessage += createMessageXml( *it.next() ) + "\n"; + const ChatMessage &message = *it.next(); + + // Do not group messages which are distant in time by more than 10 minutes + if( lastMessageDate.isValid() + && lastMessageDate.secsTo( message.getDateTime() ) > 600 ) + { + // Flush the XML to the parser, then start again for the next messages + xmlMessage += "\n"; + parsedMessage += xslTransformation_->convertXmlString( xmlMessage ); + xmlMessage = "\n"; + } + + xmlMessage += convertMessageToXml( message ) + "\n"; + + lastMessageDate = message.getDateTime(); } xmlMessage += "\n"; - // Convert - parsedMessage = xslTransformation_->convertXmlString(xmlMessage); + // Convert the current messages + parsedMessage += xslTransformation_->convertXmlString(xmlMessage); // Strip DOCTYPE because it should only appear in convertMessageRoot() output parsedMessage = stripDoctype(parsedMessage); @@ -190,14 +215,56 @@ QString ChatMessageStyle::convertMessageList(const QList &messageL +// Convert a string with XML to HTML +QString ChatMessageStyle::convertXmlMessageList( const QString &xmlMessagesList ) +{ + QString parsedMessage; + if( xslTransformation_ != 0 && xslTransformation_->hasStylesheet() ) + { + // Convert + parsedMessage = xslTransformation_->convertXmlString( xmlMessagesList ); + + // Strip DOCTYPE because it should only appear in convertMessageRoot() output + parsedMessage = stripDoctype( parsedMessage ); + + if( parsedMessage.isNull() ) + { +#ifdef KMESSDEBUG_CHATVIEW + kWarning() << "XSL conversion failed (theme=" << name_ << "), cannot convert."; +#endif + } + else if( isEmptyResult( parsedMessage ) ) + { +#ifdef KMESSDEBUG_CHATVIEW + kWarning() << "XSL conversion returned no data (theme=" << name_ << "), cannot convert."; +#endif + } + else + { + // Received expected result + return parsedMessage; + } + } + +#ifdef KMESSDEBUG_CHATVIEW + kWarning() << "no XSL theme loaded (theme=" << name_ << "), cannot convert."; +#endif + + // Conversion failed, return the original string. + // TODO: Parse the XML (using QDom classes or regexps) and create + // ChatMessages to send to createFallbackMessage(). + return parsedMessage; +} + + + // Convert the message root. QString ChatMessageStyle::convertMessageRoot() { - bool hasStyle = (xslTransformation_ != 0 && xslTransformation_->hasStylesheet()); QString parsedMessage; - // Avoid all the trouble when we can't create - if( ! hasStyle ) + // Avoid all the trouble when we can't create a style + if( ! hasStyle() ) { #ifdef KMESSDEBUG_CHATVIEW kWarning() << "no XSL theme loaded."; @@ -206,8 +273,8 @@ QString ChatMessageStyle::convertMessageRoot() else { // Not much to add here yet.. - QString xmlMessage = "" - ""; + QString xmlMessage( "" + "" ); // Convert parsedMessage = xslTransformation_->convertXmlString(xmlMessage); @@ -238,10 +305,10 @@ QString ChatMessageStyle::createFallbackMessage(const ChatMessage &message) { QString color; int type = message.getType(); - QString handle = message.getContactHandle(); - QString name = message.getContactName(); - QString body = message.getBody(); - QString fontDir = body.isRightToLeft() ? "rtl" : "ltr"; + QString handle ( message.getContactHandle() ); + QString name ( message.getContactName() ); + QString body ( message.getBody() ); + QString fontDir ( body.isRightToLeft() ? "rtl" : "ltr" ); // Reset state, changed by parseMsnString pendingEmoticonTags_.clear(); @@ -287,8 +354,15 @@ QString ChatMessageStyle::createFallbackMessage(const ChatMessage &message) // Misc variables if( showTime_ ) { - QTime messageTime = message.getTime(); - time = KGlobal::locale()->formatTime( messageTime, true ); + QDateTime messageTime = message.getDateTime(); + if ( showDate_ ) + { + time = KGlobal::locale()->formatDateTime( messageTime, KLocale::ShortDate, showSeconds_ ); + } + else + { + time = KGlobal::locale()->formatTime( messageTime.time(), showSeconds_ ); + } } color = (type == ChatMessage::TYPE_INCOMING || type == ChatMessage::TYPE_OFFLINE_INCOMING) ? "666699" : "666666"; @@ -303,8 +377,7 @@ QString ChatMessageStyle::createFallbackMessage(const ChatMessage &message) else if( type == ChatMessage::TYPE_SYSTEM ) { // Red system message - Emoticon::htmlEscape( body ); - parseBody(body); + parseBody( KMessShared::htmlEscape( body ) ); return "

" "" + body + "" "
"; @@ -313,15 +386,13 @@ QString ChatMessageStyle::createFallbackMessage(const ChatMessage &message) || type == ChatMessage::TYPE_APPLICATION_FILE || type == ChatMessage::TYPE_APPLICATION_AUDIO ) { // Blue application message - Emoticon::htmlEscape( body ); - parseBody(body); + parseBody( KMessShared::htmlEscape( body ) ); return "
" + body + "
"; } else { - // Purple notification message - Emoticon::htmlEscape( body ); - parseBody(body); + // Purple notification message + parseBody( KMessShared::htmlEscape( body ) ); return "
" + body + "
"; } } @@ -329,10 +400,9 @@ QString ChatMessageStyle::createFallbackMessage(const ChatMessage &message) // Convert the message as XML. -QString ChatMessageStyle::createMessageXml(const ChatMessage &message) +QString ChatMessageStyle::convertMessageToXml( const ChatMessage &message, bool isHistory ) { - QString date; - QString time; + uint timestamp; QString fontBefore; QString fontAfter; QString xmlMessage; @@ -343,11 +413,11 @@ QString ChatMessageStyle::createMessageXml(const ChatMessage &message) // Get message info int type = message.getType(); - QString handle = message.getContactHandle(); - QString name = message.getContactName(); - QString body = message.getBody(); + QString handle ( message.getContactHandle() ); + QString name ( message.getContactName() ); + QString body ( message.getBody() ); bool isRtl = body.isRightToLeft(); - bool nameIsRtl = name.isRightToLeft(); + bool nameIsRtl = name.isRightToLeft(); // See if this is a contact's message and not the user @@ -390,8 +460,7 @@ QString ChatMessageStyle::createMessageXml(const ChatMessage &message) { // Get the time const QDateTime &messageDate = message.getDateTime(); - date = KGlobal::locale()->formatDate( messageDate.date(), KLocale::ShortDate ); - time = KGlobal::locale()->formatTime( messageDate.time(), KLocale::ShortDate ); + timestamp = messageDate.toTime_t(); } @@ -419,11 +488,32 @@ QString ChatMessageStyle::createMessageXml(const ChatMessage &message) // Create an XML message for the XSL theme conversion // "" - xmlMessage = "\n"; + if ( isHistory ) + { + xmlMessage = "\n"; + } + else + { + QString timeS; + QDateTime datetime = QDateTime::fromTime_t( timestamp ); + + if ( showDate_ ) + { + timeS = KGlobal::locale()->formatDateTime( datetime, KLocale::ShortDate, showSeconds_ ); + } + else + { + timeS = KGlobal::locale()->formatTime( datetime.time(), showSeconds_ ); + } + + xmlMessage = "\n"; + } // The contact can be empty for some notification messges if(! message.getContactHandle().isEmpty() ) @@ -448,14 +538,15 @@ QString ChatMessageStyle::createMessageXml(const ChatMessage &message) // Add message xmlMessage += " " + Qt::escape( body ) + "\n" // escape again for XML "\n"; return xmlMessage; @@ -495,10 +586,25 @@ const QString& ChatMessageStyle::getContactFontColor() const +// Return the xsl stylesheet. Return null if there is none. +QString ChatMessageStyle::getStyleSheet() const +{ + QString xslFile( baseFolder_ + name_ + ".xsl" ); + + if( ! hasStyle() || ! QFile::exists( xslFile ) ) + { + return QString(); + } + + return xslFile; +} + + + // Return the css file attached to the stylesheet. Return null if there is none. QString ChatMessageStyle::getCssFile() const { - QString cssFile = baseFolder_ + name_ + ".css"; + QString cssFile( baseFolder_ + name_ + ".css" ); if( ! QFile::exists(cssFile) ) { return QString::null; @@ -511,6 +617,22 @@ QString ChatMessageStyle::getCssFile() const +// Return the currently used emoticon style +const QString &ChatMessageStyle::getEmoticonStyle() const +{ + return emoticonStyle_; +} + + + +// Return the grow follow up messages +bool ChatMessageStyle::getGroupFollowupMessages() const +{ + return groupFollowupMessages_; +} + + + // Return the name of the style. const QString & ChatMessageStyle::getName() const { @@ -519,6 +641,30 @@ const QString & ChatMessageStyle::getName() const +// Return if the date is displayed in messages +bool ChatMessageStyle::getShowMessageDate() const +{ + return showDate_; +} + + + +// Return if the seconds are displayed in the message times +bool ChatMessageStyle::getShowMessageSeconds() const +{ + return showSeconds_; +} + + + +// Return if the time is displayed in messages +bool ChatMessageStyle::getShowMessageTime() const +{ + return showTime_; +} + + + // Return the ID's of inserted tags for the pending emoticons. const QStringList & ChatMessageStyle::getPendingEmoticonTagIds() const { @@ -526,6 +672,15 @@ const QStringList & ChatMessageStyle::getPendingEmoticonTagIds() const } + +// Return whether or not to show text formatting in chat messages +bool ChatMessageStyle::getUseChatFormatting() const +{ + return useFormatting_; +} + + + // Return whether or not to show contact messages in the stored font. bool ChatMessageStyle::getUseContactFont() const { @@ -534,6 +689,30 @@ bool ChatMessageStyle::getUseContactFont() const +// Return whether or not the emoticons are visible +bool ChatMessageStyle::getUseEmoticons() const +{ + return useEmoticons_; +} + + + +// Return whether or not the font effects are visible +bool ChatMessageStyle::getUseFontEffects() const +{ + return useFontEffects_; +} + + + +// Return whether or not the formatting is visible +bool ChatMessageStyle::getUseFormatting() const +{ + return useFormatting_; +} + + + // Return whether the given result is empty bool ChatMessageStyle::isEmptyResult( const QString &parsedMessage ) { @@ -574,12 +753,12 @@ void ChatMessageStyle::parseEffects(QString &text) const // Process bold, italics, underline const char* effectHtml = "biu"; // bold, italic, underline - QString effectCharacters = "*/_"; + QString effectCharacters( "*/_" ); for( int i = 0; i < 3; i++ ) { effectsCharacter = QRegExp::escape( effectCharacters.mid(i, 1) ); - effectsSearch.setPattern( effectsCharacter + "([\\w\\s]+)" + effectsCharacter ); + effectsSearch.setPattern( effectsCharacter + "([\\d\\w\\s]+)" + effectsCharacter ); offset = 0; @@ -637,8 +816,8 @@ void ChatMessageStyle::parseEffects(QString &text) const } else if( effectHtml[i] == 'u' ) { - // For underline, re-use the line, don't add an _ outside. - replacement = " " + effectsSearch.cap(1) + " "; + // Same for underline + replacement = "_" + effectsSearch.cap(1) + "_"; } // Replace and change offset @@ -671,15 +850,18 @@ void ChatMessageStyle::parseFont(const ChatMessage &message, QFont &font, QStrin // Include the dir="rtl" tag to the font so the text is at least displayed in the right direction. // To make it align right as well, the dir needs to be assigned to a block element. // This can't be done here as it would influence the chat style. - QString fontDir = message.getBody().isRightToLeft() ? "rtl" : "ltr"; + QString fontDir( message.getBody().isRightToLeft() ? "rtl" : "ltr" ); + + // Set the font size, be it the user's or the contacts' + QString size( " style=\"font-size:" + QString::number( font.pointSize() ) + "pt\"" ); // Create the font HTML for the message - fontBefore = ""; - fontAfter = ""; + fontBefore.clear(); + fontAfter.clear(); if( font.bold() ) fontBefore += ""; if( font.italic() ) fontBefore += ""; if( font.underline() ) fontBefore += ""; - fontBefore += ""; + fontBefore += ""; fontAfter += ""; if( font.underline() ) fontAfter += ""; if( font.italic() ) fontAfter += ""; @@ -704,6 +886,21 @@ void ChatMessageStyle::setContactFontColor(const QString &fontColor) +// Set the emoticon style +void ChatMessageStyle::setEmoticonStyle( const QString &style ) +{ + emoticonStyle_ = style; +} + + + +// Set grow follow up messages +void ChatMessageStyle::setGroupFollowupMessages( bool groupFollowupMessages ) +{ + groupFollowupMessages_ = groupFollowupMessages; +} + + // Set the show time state void ChatMessageStyle::setShowTime(bool showTime) { @@ -712,11 +909,33 @@ void ChatMessageStyle::setShowTime(bool showTime) +// Set the show date state +void ChatMessageStyle::setShowDate(bool showDate) +{ + showDate_ = showDate; +} + + + +// Set the show seconds state +void ChatMessageStyle::setShowSeconds(bool showSeconds) +{ + showSeconds_ = showSeconds; +} + + + // Set the message style, return false if it failed bool ChatMessageStyle::setStyle(const QString &style) { + // Avoid reloading the same style again + if( style == name_ ) + { + return hasStyle(); + } + KStandardDirs *dirs = KGlobal::dirs(); - QString path = dirs->findResource( "data", "kmess/styles/" + style + "/" + style + ".xsl" ); + QString path( dirs->findResource( "data", "kmess/styles/" + style + "/" + style + ".xsl" ) ); if(path.isNull()) { @@ -739,10 +958,22 @@ bool ChatMessageStyle::setStyle(const QString &style) QMap parameters; parameters["basepath"] = baseFolder_; parameters["csspath"] = getCssFile(); - xslTransformation_->setParameters(parameters); - } + xslTransformation_->setParameters(parameters); + +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Style" << style << "loaded from path:" << path << ". Base folder:" << baseFolder_; +#endif + } +#ifdef KMESSDEBUG_CHATVIEW + else + { + kDebug() << "Unable to load style:" << style << "from path:" << path; + } +#endif + + // Also verify if the XSL conversion works with the new style + canConvert_ = ( ! xslTransformation_->convertXmlString( "" ).isEmpty() ); - // Indicate whether the stylesheet could be loaded return styleSheetLoaded; } diff --git a/src/chat/chatmessagestyle.h b/src/chat/chatmessagestyle.h index 8d50143..829495e 100644 --- a/src/chat/chatmessagestyle.h +++ b/src/chat/chatmessagestyle.h @@ -46,12 +46,18 @@ class ChatMessageStyle : public QObject // The destructor virtual ~ChatMessageStyle(); + // Return whether XSL conversion works with the current style + bool canConvert() const; // Convert a chat message to HTML string QString convertMessage(const ChatMessage &message); + // Convert a chat message to XML + QString convertMessageToXml( const ChatMessage &message, bool isHistory = false ); // Convert a group of chat message to HTML string QString convertMessageList(const QList &messageList); // Convert the message root. QString convertMessageRoot(); + // Convert a string with XML to HTML + QString convertXmlMessageList( const QString &xmlMessagesList ); // Return the base folder of the style. const QString & getBaseFolder() const; // Return the font used for contact messages, if forced to. @@ -60,12 +66,32 @@ class ChatMessageStyle : public QObject const QString& getContactFontColor() const; // Return the css file attached to the stylesheet. Return null if there is none. QString getCssFile() const; + // Return the currently used emoticon style + const QString &getEmoticonStyle() const; + // Return the grow follow up messages + bool getGroupFollowupMessages() const; // Return the name of the style. const QString & getName() const; + // Return if the date is displayed in messages + bool getShowMessageDate() const; + // Return if the seconds are displayed in the message times + bool getShowMessageSeconds() const; + // Return if the time is displayed in messages + bool getShowMessageTime() const; // Return the ID's of inserted tags for the pending emoticons. const QStringList & getPendingEmoticonTagIds() const; + // Return the xsl stylesheet. Return null if there is none. + QString getStyleSheet() const; + // Return whether or not to show text formatting in chat messages + bool getUseChatFormatting() const; // Return whether or not to show contact messages in the stored font. bool getUseContactFont() const; + // Return whether or not the emoticons are visible + bool getUseEmoticons() const; + // Return whether or not the font effects are visible + bool getUseFontEffects() const; + // Return whether or not the formatting is visible + bool getUseFormatting() const; // Return whether an style is loaded. bool hasStyle() const; @@ -74,8 +100,16 @@ class ChatMessageStyle : public QObject void setContactFont(const QFont &font); // The the contact font color void setContactFontColor(const QString &fontColor); + // Set the emoticon style + void setEmoticonStyle( const QString &style ); + // Set grow follow up messages + void setGroupFollowupMessages( bool groupFollowupMessages ); // Set the show time state void setShowTime(bool showTime); + // Sets whether the date should be shown in the timestamp + void setShowDate(bool showDate); + // Sets whether the seconds should be shown in the timestamp + void setShowSeconds(bool showSeconds); // Set the message style, return false if it failed bool setStyle(const QString &style); // Enable or disable contact font overrides @@ -92,8 +126,6 @@ class ChatMessageStyle : public QObject // Convert the message as HTML, fallback method when XML fails. QString createFallbackMessage(const ChatMessage &message); - // Convert the message as XML. - QString createMessageXml(const ChatMessage &message); // Escape the strings for use in XML attributes QString escapeAttribute(const QString &value) const; // Return whether the given result is empty @@ -104,10 +136,6 @@ class ChatMessageStyle : public QObject void parseEffects(QString &text) const; // Parse the font tags. void parseFont(const ChatMessage &message, QFont &font, QString &color, QString& fontBefore, QString& fontAfter) const; - // Replace the Messenger Plus characters with HTML markup - void parseMsnPlusString(QString &text) const; - // Replace the MSN characters with HTML markup - void parseMsnString(QString &text, const QString &handle = QString::null, bool alwaysShowEmoticons = false); // Strip the DOCTYPE tag from the message QString stripDoctype( const QString &parsedMessage ); @@ -115,16 +143,26 @@ class ChatMessageStyle : public QObject private: // private properties // The base folder of the style QString baseFolder_; + // Whether the XSL converter is working + bool canConvert_; // The contact font QFont contactFont_; // The contact font color QString contactFontColor_; + // Current emoticon style + QString emoticonStyle_; + // Group follow up messages + bool groupFollowupMessages_; // The name of the style QString name_; // A list of IDs of pending emoticons QStringList pendingEmoticonTags_; // Whether the time should be displayed bool showTime_; + // Whether the date should be displayed + bool showDate_; + // Whether the seconds should be displayed + bool showSeconds_; // Whether the contact font should be used bool useContactFont_; // Whether emoticons should be used diff --git a/src/chat/chatmessageview.cpp b/src/chat/chatmessageview.cpp index 8b3dfe6..05362c6 100644 --- a/src/chat/chatmessageview.cpp +++ b/src/chat/chatmessageview.cpp @@ -18,14 +18,16 @@ #include "chatmessageview.h" #include "../dialogs/addemoticondialog.h" +#include "../utils/kmessshared.h" #include "../currentaccount.h" #include "../emoticonmanager.h" -#include "../emoticontheme.h" #include "../kmessdebug.h" +#include "chatmessagestyle.h" #include #include +#include #include #include #include @@ -33,22 +35,27 @@ #include - // The constructor ChatMessageView::ChatMessageView( QWidget *parent ) - : KHTMLPart( parent, 0, BrowserViewGUI ) + : KHTMLPart( parent, 0, DefaultGUI ) + , chatClearingMark_(0) , isEmpty_(true) , lastMessageId_(0) { - // Disable features that might do harm + // Disable features that might do harm or are not useful setJScriptEnabled(false); setJavaEnabled(false); setMetaRefreshEnabled(false); - setOnlyLocalReferences(false); // enable for winks - setPluginsEnabled(true); // enable for winks + setOnlyLocalReferences( true ); + setSuppressedPopupIndicator( false ); - // Load a standard empty HTML page. - setStandardHtml(QString::null); + // Enable winks + setPluginsEnabled( true ); + +#if KDE_IS_VERSION( 4, 1, 0 ) + // Add smooth scrolling when possible + view()->setSmoothScrollingMode( KHTMLView::SSMWhenEfficient ); +#endif // Connect signals for browsing connect( browserExtension(), SIGNAL( openUrlRequestDelayed(const KUrl&,const KParts::OpenUrlArguments&,const KParts::BrowserArguments&) ), @@ -59,6 +66,15 @@ ChatMessageView::ChatMessageView( QWidget *parent ) // Set a border to the view view()->setFrameStyle( QFrame::Sunken | QFrame::StyledPanel ); + + // Initialize the chat style parser + chatStyle_ = new ChatMessageStyle(); + + // Initialize the current account + currentAccount_ = CurrentAccount::instance(); + + // Everything has been initialized: now load a standard empty HTML page + clearView(); } @@ -66,6 +82,10 @@ ChatMessageView::ChatMessageView( QWidget *parent ) // The destructor ChatMessageView::~ChatMessageView() { + // Delete the saved chat messages. + qDeleteAll( chatMessages_ ); + chatMessages_.clear(); + lastContactMessages_.clear(); } @@ -159,21 +179,265 @@ void ChatMessageView::addHtmlMessage(const QString &text) messageRoot.appendChild( document().createTextNode("\n") ); isEmpty_ = false; +} - // Call the scroll function a bit later, - // so Qt/kde get a chance to update the height before the scrolling starts. - QTimer::singleShot(50, this, SLOT(scrollChatToBottom())); + + +// Delete the viewed contents, and optionally the saved message history, too +void ChatMessageView::clearView( bool clearHistory ) +{ + // Remove any content currently shown, by setting up a new empty HTML page + setHtml( QString() ); + + lastContactMessages_.clear(); + + // Also delete the saved messages + if( clearHistory ) + { + qDeleteAll( chatMessages_ ); + chatMessages_.clear(); + + chatClearingMark_ = 0; + lastMessageId_ = 0; + isEmpty_ = true; + } + else if( ! chatMessages_.isEmpty() ) + { + // Set the chat clearing marker. When the 'clear chat history' action is + // triggered, the message following this one will be the first shown + chatClearingMark_ = chatMessages_.last(); + } } // Return the HTML source of the page. -QString ChatMessageView::getHtml() const +QString ChatMessageView::getHistory( Account::ChatExportFormat format, bool &append, QString &appendPoint ) { - return document().toString().string(); + QString chatHistory; + QString handle( chatMessages_.first()->getContactHandle() ); + uint date ( chatMessages_.first()->getDateTime().toTime_t() ); + + switch( format ) + { + case Account::EXPORT_XML: + { + // Convert every message in the history to XML + // TODO - Make this extremely slow process faster by caching the chat's XML. + QList groupedMessages; + QListIterator it( chatMessages_ ); + + while( it.hasNext() ) + { + ChatMessage *chatMessage = it.next(); + + // Chat messages from the same person are always grouped together + if( chatMessage->isNormalMessage() ) + { + if( groupedMessages.isEmpty() ) + { + groupedMessages.append( chatMessage ); + continue; + } + + ChatMessage *lastContactMessage = groupedMessages.last(); + + // Check for contact handle and message type, so offline messages won't be + // grouped with normal incoming messages. + if( lastContactMessage->getContactHandle() == chatMessage->getContactHandle() + && lastContactMessage->getType() == chatMessage->getType() ) + { + groupedMessages.append( chatMessage ); + continue; + } + } + + // There are messages to flush + if( ! groupedMessages.isEmpty() ) + { + // Do not add message groups with only one message + if( groupedMessages.count() > 1 ) + { + chatHistory += "\n"; + foreach( ChatMessage *groupMessage, groupedMessages ) + { + chatHistory += chatStyle_->convertMessageToXml( *groupMessage, true ); + } + chatHistory += "\n"; + } + else + { + chatHistory += chatStyle_->convertMessageToXml( *( groupedMessages.first() ), true ); + } + groupedMessages.clear(); + } + + // All chat messages are grouped, special messages never are + if( chatMessage->isNormalMessage() ) + { + groupedMessages.append( chatMessage ); + } + else + { + chatHistory += chatStyle_->convertMessageToXml( *chatMessage, true ); + } + } + + // Flush the last group of messages, if any + if( ! groupedMessages.isEmpty() ) + { + chatHistory += "\n"; + foreach( ChatMessage *groupMessage, groupedMessages ) + { + chatHistory += chatStyle_->convertMessageToXml( *groupMessage, true ); + } + chatHistory += "\n"; + } + + chatHistory = "\n\n" + chatHistory + "\n"; + + if( append ) + { + // Tell the caller where this chat should be inserted + appendPoint = ""; + + return chatHistory; + } + + // Not appending: also add a root element to the history + return "\n" + "getStyleSheet() + "\" media=\"all\" ?>\n" + "\n" + "\n" + + chatHistory + + "\n\n"; + } + + case Account::EXPORT_HTML: + { + chatHistory += "\n
" + + i18nc( "Header of a chat file saved in HTML: %1 is the contact, %2 the date and time", + "Chat with %1
Started on: %2", + handle, + KGlobal::locale()->formatDateTime( QDateTime::fromTime_t( date ), KLocale::ShortDate ) ) + + "\n
\n"; + + chatHistory += rebuildHistory( true ); + + // When appending is on, the job is a lot quicker :) + if( append ) + { + appendPoint = ""; + return chatHistory; + } + + // Get a (deep) copy of the current page source + // TODO: document().cloneNode( true ) doesn't work, so this workaround is + // required. Test if it's been fixed, and add a #define to exclude the + // workaround on fixed KHTML versions. + DOM::Document copy( document().implementation().createHTMLDocument( "" ) ); + copy.removeChild( copy.documentElement() ); + copy.appendChild( copy.importNode( document().documentElement(), true ) ); + + // Replace the html body with the chat history to be saved + DOM::HTMLElement messageRoot( copy.getElementById( "messageRoot" ) ); + if( messageRoot.isNull() ) + { + kWarning() << "Current style does not define the 'messageRoot' element!"; + return chatHistory; + } + messageRoot.setInnerHTML( "\n" + chatHistory + "\n" ); + + return copy.toString().string(); + + } + + case Account::EXPORT_TEXT: + { + // Convert every message in the history to text + QString lastHandle; + bool groupFollowups = currentAccount_->getGroupFollowupMessages(); + + // Before the first message, add a simple header + chatHistory += "\n\n" + + i18nc( "Header of a single chat saved as plain text chat log: %1 is the chat date and time", + "Chat started on: %2", + KGlobal::locale()->formatDateTime( QDateTime::fromTime_t( date ), KLocale::ShortDate ) ) + + "\n------------------------------------------------------------\n"; + + QListIterator it( chatMessages_ ); + while( it.hasNext() ) + { + const ChatMessage *chatMessage = it.next(); + + // Add chat messages + if( chatMessage->isNormalMessage() ) + { + if( groupFollowups && lastHandle == chatMessage->getContactHandle() ) + { + chatHistory += " " + chatMessage->getBody().trimmed() + "\n"; + } + else + { + chatHistory += "(" + chatMessage->getTime().toString( Qt::DefaultLocaleShortDate ) + ")" + " " + chatMessage->getContactHandle() + ":\n" + " " + chatMessage->getBody().trimmed() + "\n"; + } + lastHandle = chatMessage->getContactHandle(); + } + // Add system messages etc + else + { + chatHistory += "(" + chatMessage->getTime().toString( Qt::DefaultLocaleShortDate ) + ")" + " " + chatMessage->getBody().trimmed() + "\n"; + lastHandle = QString(); + } + } + + // NOTE If appending is on, the chat will be inserted anyways at the end of file: + // so the append point is kept empty to instantly match at the last line of the file. + + // Add an header to the file if needed + if( ! append ) + { + chatHistory.prepend( i18nc( "Header of a chat file saved in plain text: %1 is the contact", + "Saved KMess chats with %1" ) + + "\n######################################################################\n" ); + } + + return chatHistory; + } + + default: + kWarning() << "Invalid export format: code" << format; + break; + } + + return QString(); } + +// Return a pointer to the message style parser +ChatMessageStyle *ChatMessageView::getStyle() const +{ + return chatStyle_; +} + + + +// Return a tag to use to compare styles and their options +QString ChatMessageView::getStyleTag() const +{ + return "KMess-Style: " + + chatStyle_->getName() + "-" + + ( chatStyle_->getUseEmoticons() ? "1" : "0" ) + + ( chatStyle_->getUseFontEffects() ? "1" : "0" ) + + ( chatStyle_->getUseFormatting() ? "1" : "0" ); +} + + + // Whether or not the message area is empty bool ChatMessageView::isEmpty() const { @@ -182,25 +446,194 @@ bool ChatMessageView::isEmpty() const +// Generate a new HTML chat log +QString ChatMessageView::rebuildHistory( bool fullHistory ) +{ + // Support grouping of follow-up messages. + bool groupFollowups = currentAccount_->getGroupFollowupMessages(); + lastContactMessages_.clear(); + + // Recreate the entire chat history + QString newHtml; + bool clearingMarkReached = false; + QListIterator it(chatMessages_); + while( it.hasNext() ) + { + ChatMessage *chatMessage = it.next(); + + if( chatClearingMark_ && ! fullHistory && ! clearingMarkReached ) + { + if( chatMessage == chatClearingMark_ ) + { + clearingMarkReached = true; + } + else + { + continue; + } + } + + if( groupFollowups && chatMessage->isNormalMessage() ) + { + // See if the message should be added to the queue. + // There could be another follow-up message later. + if( ! lastContactMessages_.isEmpty() ) + { + // Check whether the contact differs or it's a different type, + // the handle to difference between "offline_incoming" and "incoming" messages. + ChatMessage *lastMessage = lastContactMessages_.last(); + if( lastMessage->getType() != chatMessage->getType() + || lastMessage->getContactHandle() != chatMessage->getContactHandle() ) + { + // New message should not be added to queue, + // so previous message was the last one. Flush the queue. + newHtml += "\n
" + + chatStyle_->convertMessageList( lastContactMessages_ ) + + "
\n"; + lastContactMessages_.clear(); + } + } + + // Append new contact message to the queue. + lastContactMessages_.append(chatMessage); + } + else + { + // Not a contact message. + // First flush the queue, then add the new message. + if( ! lastContactMessages_.isEmpty() ) + { + newHtml += "\n
" + + chatStyle_->convertMessageList( lastContactMessages_ ) + + "
\n"; + lastContactMessages_.clear(); + } + + // Convert the current message. + newHtml += "\n
" + + chatStyle_->convertMessage( *chatMessage ) + + "
\n"; + } + } + + // If there are still grouped messages, add them after setHtml(). + // This allows the chatMessageView_ to replace them later with replaceLastMessage(); + if( ! lastContactMessages_.isEmpty() ) + { + newHtml += "\n
" + + chatStyle_->convertMessageList( lastContactMessages_ ) + + "
\n"; + lastContactMessages_.clear(); + } + + return newHtml; +} + + + +// Delete an emoticon from the chat. +void ChatMessageView::removeCustomEmoticon( const QString &shortcut ) +{ +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Deleting emoticons with shortcut:" << shortcut; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( ! shortcut.isEmpty() ); +#endif + + // Process all IMG tags +#if KDE_IS_VERSION( 4, 1, 0 ) + DOM::NodeList emoticonTags( htmlDocument().getElementsByClassName( "customEmoticon" ) ); +#else + // See below (within the loop) for the actual filtering by class name + DOM::NodeList emoticonTags( htmlDocument().getElementsByTagName( "img" ) ); +#endif + + // Get the original (non-HTML) shortcut + QString originalShortcut( KMessShared::htmlUnescape( shortcut ) ); + + // Proceed one by one: while removing elements, the list shortens too + for( unsigned long item = emoticonTags.length(); item > 0; --item ) + { + DOM::HTMLElement img( emoticonTags.item( item - 1 ) ); + +#if KDE_IS_VERSION( 4, 1, 0 ) +#else + // KDE4.0's KHTML DOM didn't have getElementsByClassName(). We therefore + // have to filter the class name here. + if( ! img.className().string().contains( "customEmoticon" ) ) + { + continue; + } +#endif + + // Check if the element is valid + if( img.isNull() ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Skipped null element."; +#endif + continue; + } + + // Get the image's alternative text attribute; if it's not our custom emoticon, skip + // HACK: Search both by the html and plain version, to avoid skipping strange shortcuts + QString altAttribute( img.getAttribute("alt").string() ); + if( altAttribute != shortcut && altAttribute != originalShortcut ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Skipped element:" << img.getAttribute("alt").string() << "while searching for" << originalShortcut; +#endif + continue; + } + + // We've found one of the emoticons to delete + + DOM::HTMLElement parent( img.parentNode() ); + + // If the emoticon is contained in a link, remove both. + if( parent.tagName().string() == "a" ) + { + img = parent; + parent = parent.parentNode(); + } + + // The text should be that of the original shortcut, not the html-encoded one + DOM::Text textNode( htmlDocument().createTextNode( originalShortcut ) ); + + // Replace the link with the image inside with the simple text + parent.replaceChild( textNode, img ); + + // Force updating the view to instantly display the new image + view()->updateContents( img.getRect() ); + } +} + + + // Replace the last message with a new contents. void ChatMessageView::replaceLastMessage(const QString &text) { // Fetch the HTML node - QString lastId = "message" + QString::number(lastMessageId_); - DOM::HTMLElement lastNode = htmlDocument().getElementById(lastId); + QString lastId( "message" + QString::number( lastMessageId_ ) ); + DOM::HTMLElement lastNode( htmlDocument().getElementById( lastId ) ); if( lastNode.isNull() || ! lastNode.isHTMLElement() ) { - kWarning() << "message block with id='" + lastId + "' not found, appending message instead."; - addHtmlMessage(text); + kWarning() << "message block with id" + lastId + "not found, appending message instead."; + addHtmlMessage( text ); return; } // Replace contents - lastNode.setInnerHTML(text); + lastNode.setInnerHTML( text ); +} - // Call the scroll function a bit later, - // so Qt/kde get a chance to update the height before the scrolling starts. - QTimer::singleShot(50, this, SLOT(scrollChatToBottom())); + + +// Scroll forward or backward within the chat browser +void ChatMessageView::scrollChat( bool forward, bool fast ) +{ + view()->scrollBy( 0, ( forward ? +1 : -1 ) * view()->visibleHeight() / ( fast ? 1 : 2 ) ); } @@ -208,73 +641,207 @@ void ChatMessageView::replaceLastMessage(const QString &text) // Scroll to the bottom of the chat browser void ChatMessageView::scrollChatToBottom() { - // Make sure the browser scrolls to the bottom - view()->scrollBy( 0, view()->contentsHeight() ); + int contentsHeight = view()->contentsHeight(); + int visibleHeight = view()->visibleHeight(); + + // If the user has scrolled up more than one viewport of height, don't move + if( contentsHeight - ( view()->contentsY() + visibleHeight ) > visibleHeight ) + { + return; + } + + view()->scrollBy( 0, contentsHeight ); } // Replace the entire contents with new HTML code -void ChatMessageView::setHtml(const QString &htmlRoot, const QString &htmlBody) +void ChatMessageView::setHtml( const QString &newHtmlBody ) { - // Write root elements - begin(); - write(htmlRoot); + // Reset state variables + lastMessageId_ = 0; - // Also insert the given HTML body. - DOM::HTMLElement messageRoot = document().getElementById("messageRoot"); - if( messageRoot.isNull() ) + // If the style is not working, prepare a standard HTML page + if( ! chatStyle_->canConvert() ) { - kWarning() << "chat style does not define the 'messageRoot' element."; - messageRoot = htmlDocument().body(); + QString cssFile ( chatStyle_->getCssFile () ); + QString baseFolder( chatStyle_->getBaseFolder() ); + + if( ! cssFile.isEmpty() ) + { + cssFile = " \n"; + } + if( ! baseFolder.isEmpty() ) + { + baseFolder = " \n"; + } + + begin(); + + // Force standard colors, because chat messages will not work + // correctly with the (dark) color scheme anyway. + write( "\n" + " \n" + " \n" + " \n" + + baseFolder + + " \n" + + cssFile + + " \n" + " \n" + "
\n" + + newHtmlBody + + "
\n" + " \n" + "\n" ); + end(); + + return; + } + + begin(); + + // Write the style's root elements + write( chatStyle_->convertMessageRoot() ); + + // Add the style tag + DOM::NodeList list( document().getElementsByTagName("head") ); + if( ! list.isNull() ) + { + DOM::Node head = list.item( 0 ); + head.insertBefore( document().createComment( getStyleTag() ), head.firstChild() ); + } + + + // Insert under root the given HTML body, but do nothing if we're just clearing it up + // (the new page is empty already) + if( ! newHtmlBody.isEmpty() ) + { + DOM::HTMLElement messageRoot = document().getElementById( "messageRoot" ); + if( messageRoot.isNull() ) + { + kWarning() << "Chat style does not define the 'messageRoot' element!"; + messageRoot = htmlDocument().body(); + } + messageRoot.setInnerHTML( "\n" + newHtmlBody + "\n" ); } - messageRoot.setInnerHTML( "\n" + htmlBody + "\n" ); // Complete loading end(); - - // Reset state variables. - lastMessageId_ = 0; } -// Replace the body contents with new HTML -void ChatMessageView::setStandardHtml(const QString &htmlBody, const QString &cssFile, const QString &baseFolder) + +// Replace the entire contents with a new chat in XML +void ChatMessageView::setXml( const QString &newXmlBody ) { - // no: htmlDocument().body().setInnerHTML(html); - // Write new contents and css links all at once. document().addStyleSheet() is supported since KDE 3.4. + setHtml( chatStyle_->convertXmlMessageList( newXmlBody ) ); +} - // include import if css file is given. - QString cssImport = (cssFile.isNull() ? QString::null : "\n\n @import \"" + cssFile + "\";\n"); - QString baseHref = (baseFolder.isNull() ? QString::null : " \n"); - // Force standard colors, because chat messages will not work - // correctly with the (dark) color scheme anyway. - begin(); - write( "\n" - " \n" - + baseHref + - " \n" - "\n" - "\n" - "
\n" - + htmlBody + - "
\n" - "\n" - "\n" ); - end(); +// Add the given message to the message browser. +void ChatMessageView::showMessage( const ChatMessage &message ) +{ + // Avoid duplicating the same notification message. + if( message.getContentsClass() == ChatMessage::CONTENT_NOTIFICATION_LEFT + && ! chatMessages_.isEmpty() ) + { + ChatMessage *lastChatMessage = chatMessages_.last(); + if( lastChatMessage->getContentsClass() == ChatMessage::CONTENT_NOTIFICATION_LEFT + && lastChatMessage->getContactHandle() == message.getContactHandle() ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Not showing 'contact left' message for the same contact again."; +#endif + return; + } + } - // Reset state variables. - lastMessageId_ = 0; + // Clone the message so it can be stored in the local qlist objects. + ChatMessage *chatMessage = message.clone(); + QString messageHtml; + + // See if the same contact sent the previous message too. + // In that case, we combine both messages for the chat style. + // Otherwise the lastContactMessages_ list is reset. + if( chatMessage->isNormalMessage() && chatStyle_->getGroupFollowupMessages() ) + { + if( ! lastContactMessages_.isEmpty() ) + { + ChatMessage *lastContactMessage = lastContactMessages_.last(); + + // Check for contact handle and message type, so offline messages won't be + // grouped with normal incoming messages. + if( lastContactMessage->getContactHandle() == chatMessage->getContactHandle() + && lastContactMessage->getType() == chatMessage->getType() ) + { + lastContactMessages_.append(chatMessage); + } + else + { + lastContactMessages_.clear(); + } + } + } + else + { + lastContactMessages_.clear(); + } + + // Convert the message, add to the browser. + if( lastContactMessages_.count() > 1 ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "replacing last contact message with new contents."; +#endif + + messageHtml = chatStyle_->convertMessageList(lastContactMessages_); + replaceLastMessage( messageHtml ); + } + else + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "appending new message."; +#endif + + messageHtml = chatStyle_->convertMessage( *chatMessage ); + addHtmlMessage( messageHtml ); + + if( chatMessage->isNormalMessage() ) + { + lastContactMessages_.append( chatMessage ); + } + } + + // If the parser found custom emoticons, add them. + // The pending list of chatStyle is erased with each new convertMessage() call. + const QStringList &emoticonTags = chatStyle_->getPendingEmoticonTagIds(); + if( ! emoticonTags.isEmpty() ) + { + // Copy to the internal list + foreach( const QString &tag, emoticonTags ) + { + pendingEmoticonTags_.append( tag ); + } + } + + // Add to memory, this is used for: + // - changing chat styles + // - regenerating messages to group them + // - regenerating messages for received custom emoticons. + chatMessages_.append( chatMessage ); + + // Call the scroll function a bit later, + // so Qt/kde get a chance to update the height before the scrolling starts. + QTimer::singleShot( 50, this, SLOT( scrollChatToBottom() ) ); } @@ -300,9 +867,72 @@ void ChatMessageView::updateApplicationMessage( const QString &messageId, const +// Update the chat style +void ChatMessageView::updateChatStyle() +{ +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "updating style."; +#endif + + if(KMESS_NULL(chatStyle_)) return; + if(KMESS_NULL(currentAccount_)) return; + + // If the contact font settings have not changed, avoid doing useless work + if( currentAccount_->getUseContactFont() == chatStyle_->getUseContactFont() + && currentAccount_->getContactFont() == chatStyle_->getContactFont() + && currentAccount_->getContactFontColor() == chatStyle_->getContactFontColor() + && currentAccount_->getGroupFollowupMessages() == chatStyle_->getGroupFollowupMessages() + && currentAccount_->getShowMessageTime() == chatStyle_->getShowMessageTime() + && currentAccount_->getTimestampShowSeconds() == chatStyle_->getShowMessageSeconds() + && currentAccount_->getTimestampShowDate() == chatStyle_->getShowMessageDate() + && currentAccount_->getUseContactFont() == chatStyle_->getUseContactFont() + && currentAccount_->getUseEmoticons() == chatStyle_->getUseEmoticons() + && currentAccount_->getUseFontEffects() == chatStyle_->getUseFontEffects() + && currentAccount_->getUseChatFormatting() == chatStyle_->getUseChatFormatting() + && currentAccount_->getChatStyle() == chatStyle_->getName() + && currentAccount_->getEmoticonStyle() == chatStyle_->getEmoticonStyle() ) + { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Update not needed."; +#endif + return; + } + + // Load new settings in the chat style object + chatStyle_->setStyle ( currentAccount_->getChatStyle() ); + chatStyle_->setContactFont ( currentAccount_->getContactFont() ); + chatStyle_->setContactFontColor ( currentAccount_->getContactFontColor() ); + chatStyle_->setEmoticonStyle ( currentAccount_->getEmoticonStyle() ); + chatStyle_->setShowTime ( currentAccount_->getShowMessageTime() ); + chatStyle_->setShowSeconds ( currentAccount_->getTimestampShowSeconds() ); + chatStyle_->setShowDate ( currentAccount_->getTimestampShowDate() ); + chatStyle_->setUseContactFont ( currentAccount_->getUseContactFont() ); + chatStyle_->setUseEmoticons ( currentAccount_->getUseEmoticons() ); + chatStyle_->setUseFontEffects ( currentAccount_->getUseFontEffects() ); + chatStyle_->setUseFormatting ( currentAccount_->getUseChatFormatting() ); + chatStyle_->setGroupFollowupMessages( currentAccount_->getGroupFollowupMessages() ); + + // Change the view with the updated HTML + setHtml( rebuildHistory( false ) ); + + // If there are still grouped messages, add them after setHtml(). + // This allows the chatMessageView_ to replace them later with replaceLastMessage(); + if( ! lastContactMessages_.isEmpty() ) + { + addHtmlMessage( chatStyle_->convertMessageList(lastContactMessages_) ); + // Don't clear queue here, so replaceLastMessage() will be called. + } + + // Call the scroll function a bit later, + // so Qt/kde get a chance to update the height before the scrolling starts. + QTimer::singleShot( 50, this, SLOT( scrollChatToBottom() ) ); +} + + + // Update an emoticon image placeholder tag with the real replacement. void ChatMessageView::updateCustomEmoticon( const QString &code, const QString &replacement, - const QString &handle, const QStringList &pendingEmoticonTagIds ) + const QString &handle ) { #ifdef KMESSDEBUG_CHATMESSAGEVIEW kDebug() << "Replacing emoticon '" << code << "' with '" << replacement << "' for '" << handle << "'"; @@ -321,18 +951,18 @@ void ChatMessageView::updateCustomEmoticon( const QString &code, const QString & } // The pattern used to find if the new custom emoticon is already in our theme - QString customEmoticonsPattern = EmoticonManager::instance()->getHtmlPattern( true ).pattern(); + QString customEmoticonsPattern( EmoticonManager::instance()->getHtmlPattern( true ).pattern() ); // Process all pending tags, avoid parsing all tags DOM::HTMLDocument document = htmlDocument(); - for( QStringList::const_iterator it = pendingEmoticonTagIds.begin(); it != pendingEmoticonTagIds.end(); ++it) + foreach( const QString &tag, pendingEmoticonTags_ ) { #ifdef KMESSDEBUG_CHATMESSAGEVIEW - kDebug() << "Checking DOM element '" << *it << "'"; + kDebug() << "Checking DOM element '" << tag << "'"; #endif // Check if the element is valid - DOM::HTMLElement img = document.getElementById(*it); + DOM::HTMLElement img = document.getElementById( tag ); if( img.isNull() ) { #ifdef KMESSDEBUG_CHATMESSAGEVIEW @@ -342,14 +972,14 @@ void ChatMessageView::updateCustomEmoticon( const QString &code, const QString & } // Get the image's alternative text attribute - QString imageAltText = img.getAttribute("alt").string(); + QString imageAltText( img.getAttribute("alt").string() ); // Before converting the alt attribute, save it; we'll use it later - QString originalCode = imageAltText; + QString originalCode( imageAltText ); // KHTML's DOM converts all HTML entities to text; so we have to convert them back, // to be able to compare the image's code to the emoticon's (which is already encoded) - Emoticon::htmlEscape( imageAltText ); + KMessShared::htmlEscape( imageAltText ); // See if this element's ALT attribute matches the shortcut if( img.isNull() || imageAltText != code ) @@ -408,9 +1038,12 @@ void ChatMessageView::updateCustomEmoticon( const QString &code, const QString & // Allow the user to "steal" this emoticon - bool isNewEmoticon = ! customEmoticonsPattern.contains( code ); - if( handle != CurrentAccount::instance()->getHandle() && isNewEmoticon ) + if( handle != CurrentAccount::instance()->getHandle() + && ! customEmoticonsPattern.contains( code ) ) { +#ifdef KMESSDEBUG_CHATMESSAGEVIEW + kDebug() << "Inserting emoticon addition link"; +#endif // Copy the original image to a new one we'll modify DOM::HTMLElement newImage = img.cloneNode( true ); @@ -420,13 +1053,13 @@ void ChatMessageView::updateCustomEmoticon( const QString &code, const QString & // URL-encode the shortcut, so the emoticon adding dialog will get a correct representation, // even if it contains characters which would fool the link parser. - QString urlCode = KUrl::toPercentEncoding( code ); + QString urlCode( KUrl::toPercentEncoding( code ) ); // Create a new 'link' element // The name attribute is required as, if the user adds the emoticon, we'll want to make all links like this unclickable DOM::HTMLElement newLink = document.createElement("a"); newLink.setAttribute( "name", "newEmoticon_" + urlCode ); - newLink.setAttribute( "title", i18n( "Add this emoticon: %1", originalCode ) ); + newLink.setAttribute( "title", i18n( "Add this emoticon: %1", code ) ); // Not escaped for " or ', KHTML does it newLink.setAttribute( "href", "kmess://emoticon/" + handle + "/" + urlCode + "/" + KUrl::toPercentEncoding( newImage.getAttribute("src").string() ) ); @@ -439,11 +1072,12 @@ void ChatMessageView::updateCustomEmoticon( const QString &code, const QString & } // Force updating the view to display instantly the new image - view()->repaintContents( QRect( view()->contentsX(), - view()->contentsY(), - view()->visibleWidth(), - view()->visibleHeight() ) ); + view()->updateContents( QRect( view()->contentsX(), + view()->contentsY(), + view()->visibleWidth(), + view()->visibleHeight() ) ); } + #include "chatmessageview.moc" diff --git a/src/chat/chatmessageview.h b/src/chat/chatmessageview.h index 58c84ee..3e34830 100644 --- a/src/chat/chatmessageview.h +++ b/src/chat/chatmessageview.h @@ -18,10 +18,15 @@ #ifndef CHATMESSAGEVIEW_H #define CHATMESSAGEVIEW_H +#include "account.h" + #include #include +class ChatMessage; +class ChatMessageStyle; +class CurrentAccount; class QStringList; @@ -43,36 +48,74 @@ class ChatMessageView : public KHTMLPart ChatMessageView( QWidget *parent ); // The destructor virtual ~ChatMessageView(); - - // Add the given html to the chat browser and scroll to the end - void addHtmlMessage(const QString &text); - // Return the HTML source of the page. - QString getHtml() const; + // Return the chat history in a specified format + QString getHistory( Account::ChatExportFormat format, bool &append, QString &appendPoint ); + // Return a pointer to the message style parser + ChatMessageStyle *getStyle() const; + // Return a tag to use to compare styles and their options + QString getStyleTag() const; // Whether or not the message area is empty bool isEmpty() const; - // Replace the last message with a new contents. - void replaceLastMessage(const QString &text); - // Replace the entire contents with new HTML code - void setHtml(const QString &htmlRoot, const QString &htmlBody); - // Replace the body contents with new HTML - void setStandardHtml(const QString &htmlBody, const QString &cssFile = QString::null, const QString &baseFolder = QString::null); - void updateCustomEmoticon( const QString &code, const QString &replacement, - const QString &handle, const QStringList &pendingEmoticonTagIds ); + // Delete an emoticon from the chat. + void removeCustomEmoticon( const QString &shorctut ); + // Update a custom emoticon placeholder with the emoticon + void updateCustomEmoticon( const QString &code, const QString &replacement, const QString &handle ); + // Replace the entire contents with a new chat in XML + void setXml( const QString &newXmlBody ); public slots: // Finds the links to add a custom emoticon, and remove them because we've already added that emoticon void addedEmoticon( QString shortcut ); + // Delete the viewed contents, and optionally the saved message history, too + void clearView( bool clearHistory = false ); + /** + * Scroll forward or backward within the chat browser. + * + * The parameter controls the amount and direction of the scrolling operation. + * A forward argument set to true moves the chat viewport down, a false one goes back in + * the chat history. If argument fast is true, the movement goes twice as far than with + * the same argument set to false. + * @param forward Whether to scroll forward or backward in the chat history + * @param fast Whether to scroll at normal speed or faster + */ + void scrollChat( bool forward, bool fast ); // Scroll to the bottom of the chat browser void scrollChatToBottom(); + // Add the given message to the message browser. + void showMessage( const ChatMessage &message ); // Replace an application's accept/reject/cancel links with another text void updateApplicationMessage( const QString &messageId, const QString &newMessage ); + // Update the chat style + void updateChatStyle(); + + private: // Private methods + // Add the given html to the chat browser and scroll to the end + void addHtmlMessage( const QString &text ); + // Generate a new HTML chat log + QString rebuildHistory( bool fullHistory ); + // Replace the last message with a new contents. + void replaceLastMessage( const QString &text ); + // Replace the entire contents with new HTML code + void setHtml( const QString &newHtmlBody ); private: // private properties + // Message which was last deleted by a Clear Chat action + ChatMessage *chatClearingMark_; + // The chat contents; every user, contact or kmess message is contained here + QList chatMessages_; + // The XSL transformation handler + ChatMessageStyle *chatStyle_; + // A pointer to the instance of the current account + CurrentAccount *currentAccount_; // Whether or not the chat message area is empty bool isEmpty_; + // The last messages sent by the same contact. This is used to combine them + QList lastContactMessages_; // The last message id, for replaceLastMessage() int lastMessageId_; + // The list of custom emoticons which haven't been received yet + QStringList pendingEmoticonTags_; signals: // Signal that there's an application command diff --git a/src/chat/chatstatusbar.cpp b/src/chat/chatstatusbar.cpp new file mode 100644 index 0000000..02e5097 --- /dev/null +++ b/src/chat/chatstatusbar.cpp @@ -0,0 +1,375 @@ +/*************************************************************************** + chatstatusbar.cpp - description + ------------------- + begin : Wed Okt 8 2008 + copyright : (C) 2008 by Ruben Vandamme + email : ruben@kmess.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + + +#include "chatstatusbar.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + + + +// The constructor +ChatStatusBar::ChatStatusBar( QWidget* parent ) + : QWidget( parent ), + type_( DefaultType ), + state_( DefaultState ), + illumination_( 0 ), + minTextHeight_( -1 ), + timer_( 0 ), + button_( 0 ) +{ + setMinimumHeight( KIconLoader::SizeSmall ); + + timer_ = new QTimer( this ); + connect( timer_, SIGNAL( timeout() ), this, SLOT( timerDone() ) ); + + button_ = new QPushButton(i18nc("@action:button", "Reconnect"), this); + button_->hide(); + connect(button_, SIGNAL(clicked()), this, SLOT(buttonClicked())); + + setMinimumTextHeight(KIconLoader::SizeSmall + 8); +} + +// The destructor +ChatStatusBar::~ChatStatusBar() +{ +} + + + +// Shows a message in the status label. +void ChatStatusBar::setMessage( MessageType type, const QString& text ) +{ + if ( ( text == text_ ) && ( type == type_ ) ) + { + return; + } + + text_ = text; + type_ = type; + + timer_->stop(); + illumination_ = 0; + state_ = DefaultState; + + const char* iconName = 0; + + switch ( type ) + { + case Disconnected: + iconName = "network-disconnect"; + + timer_->start( 100 ); + state_ = Illuminate; + + updateCloseButtonPosition(); + button_->setEnabled( true ); + button_->show(); + break; + + case ContactTyping: + iconName = "input-keyboard"; + + button_->hide(); + break; + + case DefaultType: + default: + button_->hide(); + break; + } + + pixmap_ = ( iconName == 0 ) ? QPixmap() : SmallIcon( iconName ); + QTimer::singleShot( GeometryTimeout, this, SLOT( assureVisibleText() ) ); + update(); +} + + + +// Set the minimum text height. +void ChatStatusBar::setMinimumTextHeight( int min ) +{ + if ( min != minTextHeight_ ) + { + minTextHeight_ = min; + setMinimumHeight( min ); + if ( button_->height() > min ) + { + button_->setFixedHeight( min ); + } + } +} + + + +// Enable or disable the button for the specified message type. +void ChatStatusBar::setButtonEnabled ( MessageType type, bool enable ) +{ + if( type == type_ ) + { + button_->setEnabled( enable ); + } +} + + + +// Paint the statusbar. +void ChatStatusBar::paintEvent( QPaintEvent* /* event */ ) +{ + QPainter painter( this ); + + if ( illumination_ > 0 ) + { + // At this point, a: we are a second label being drawn over the already + // painted status area, so we can be translucent, and b: our palette's + // window color (bg only) seems to be wrong (always black) + + KColorScheme scheme( palette().currentColorGroup(), KColorScheme::Window ); + QColor backgroundColor( scheme.background( KColorScheme::NegativeBackground ).color() ); + backgroundColor.setAlpha( qMin( 255, illumination_ * 2 ) ); + + painter.setBrush( backgroundColor ); + painter.setPen ( Qt::NoPen ); + painter.drawRect( QRect( 0, 0, width(), height() ) ); + } + + // Draw pixmap + int x = BorderGap; + const int y = ( minTextHeight_ - pixmap_.height() ) / 2; + + if ( !pixmap_.isNull() ) + { + painter.drawPixmap( x, y, pixmap_ ); + x += pixmap_.width() + BorderGap; + } + + // Draw text + painter.setPen( palette().windowText().color() ); + int flags = Qt::AlignVCenter; + + if ( height() > minTextHeight_ ) + { + flags = flags | Qt::TextWordWrap; + } + + painter.drawText( QRect( x, 0, availableTextWidth(), height() ), flags, text_ ); + painter.end(); +} + + + +// Statusbar is resized, update it. +void ChatStatusBar::resizeEvent( QResizeEvent* event ) +{ + QWidget::resizeEvent( event ); + updateCloseButtonPosition(); + QTimer::singleShot( GeometryTimeout, this, SLOT( assureVisibleText() ) ); +} + + + +// Update the background color. +void ChatStatusBar::timerDone() +{ + switch ( state_ ) + { + case Illuminate: + { + // increase the illumination + const int illumination_max = 128; + if ( illumination_ < illumination_max ) + { + illumination_ += 32; + if ( illumination_ > illumination_max ) + { + illumination_ = illumination_max; + } + update(); + } + else + { + state_ = Illuminated; + timer_->start( 5000 ); + } + break; + } + case Illuminated: + // start desaturation + state_ = Desaturate; + timer_->start( 100 ); + break; + + case Desaturate: + // desaturate + if ( illumination_ > 0 ) + { + illumination_ -= 5; + update(); + } + else + { + state_ = DefaultState; + timer_->stop(); + } + break; + + default: + break; + } +} + + + +// Increases the height of the message label so that the given text fits into given area. +void ChatStatusBar::assureVisibleText() +{ + if ( text_.isEmpty() ) + { + return; + } + + int requiredHeight = minTextHeight_; + + if ( type_ != DefaultType && type_ != ContactTyping ) + { + // Calculate the required height of the widget thats + // needed for having a fully visible text. Note that for certain + // statusbar types increasing the text height is not wanted, + // as this might rearrange the layout of items. + + const QFontMetrics& fontMetrics( font() ); + const QRect bounds( fontMetrics.boundingRect( 0, 0, availableTextWidth(), height(), + Qt::AlignVCenter | Qt::TextWordWrap, text_ ) ); + requiredHeight = bounds.height(); + + if ( requiredHeight < minTextHeight_ ) + { + requiredHeight = minTextHeight_; + } + } + + // Increase/decrease the current height of the widget to the + // required height. The increasing/decreasing is done in several + // steps to have an animation if the height is modified + // (see ChatStatusBar::resizeEvent()) + + const int gap = minTextHeight_ / 2; + int minHeight = minimumHeight(); + + if ( minHeight < requiredHeight ) + { + minHeight += gap; + + if ( minHeight > requiredHeight ) + { + minHeight = requiredHeight; + } + + setMinimumHeight(minHeight); + updateGeometry(); + } + else if ( minHeight > requiredHeight ) + { + minHeight -= gap; + + if ( minHeight < requiredHeight ) + { + minHeight = requiredHeight; + } + + setMinimumHeight( minHeight ); + updateGeometry(); + } + + updateCloseButtonPosition(); +} + + + + +// Returns the available width in pixels for the text. +int ChatStatusBar::availableTextWidth() const +{ + const int buttonWidth = ( button_->isVisible() ) ? button_->width() + BorderGap : 0; + return width() - pixmap_.width() - ( BorderGap * 4 ) - buttonWidth; +} + + + +// Moves the close button to the upper right corner of the message label. +void ChatStatusBar::updateCloseButtonPosition() +{ + const int x = width() - button_->width() - BorderGap; + const int y = ( height() - button_->height() ) / 2; + + button_->move( x, y ); +} + + + +// User requested an action. +void ChatStatusBar::buttonClicked() +{ + emit reconnect(); +} + + + +// Resets the message label properties. +void ChatStatusBar::reset() +{ + text_.clear(); + button_->setEnabled( true ); + type_ = DefaultType; +} + + + +// Returns the type of the status message. +inline ChatStatusBar::MessageType ChatStatusBar::type() const +{ + return type_; +} + + + +// Returns the text in the statusbar. +inline const QString& ChatStatusBar::text() const +{ + return text_; +} + + + +// Returns the minimum text height. +inline int ChatStatusBar::minimumTextHeight() const +{ + return minTextHeight_; +} + + + +#include "chatstatusbar.moc" diff --git a/src/chat/chatstatusbar.h b/src/chat/chatstatusbar.h new file mode 100644 index 0000000..00ec551 --- /dev/null +++ b/src/chat/chatstatusbar.h @@ -0,0 +1,120 @@ +/*************************************************************************** + chatstatusbar.h - description + ------------------- + begin : Wed Okt 8 2008 + copyright : (C) 2008 by Ruben Vandamme + email : ruben@kmess.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + + +#ifndef STATUSBAR_H +#define STATUSBAR_H + +#include + +class QPaintEvent; +class QResizeEvent; +class QPushButton; +class QTimer; + + + +class ChatStatusBar: public QWidget +{ + Q_OBJECT + + public: + // Types of messages + enum MessageType + { + DefaultType, + ContactTyping, + Disconnected + }; + + public: + // The constructor + explicit ChatStatusBar( QWidget *parent=0 ); + // The destructor + virtual ~ChatStatusBar(); + // Returns the text in the statusbar. + const QString &text() const; + // Returns the type of the status message. + MessageType type() const; + // Returns the minimum text height. + int minimumTextHeight() const; + // Enable or disable the button for the specified message type. + void setButtonEnabled( MessageType type, bool enable ); + // Shows a message in the status label. + void setMessage( MessageType type, const QString &text ); + // Set the minimum text height. + void setMinimumTextHeight( int min ); + // Resets the message label properties. + void reset(); + + protected: + // Paint the statusbar. + virtual void paintEvent ( QPaintEvent *event); + // Statusbar is resized, update it. + virtual void resizeEvent( QResizeEvent *event); + + private slots: + // Update the background color. + void timerDone(); + // Increases the height of the message label so that the given text fits into given area. + void assureVisibleText(); + // Returns the available width in pixels for the text. + int availableTextWidth() const; + // Moves the close button to the upper right corner of the message label. + void updateCloseButtonPosition(); + // User requested an action. + void buttonClicked(); + + private: // Private attributes + // States for background animation + enum State + { + DefaultState, + Illuminate, + Illuminated, + Desaturate + }; + + // Why enums? + enum { GeometryTimeout = 100 }; + enum { BorderGap = 2 }; + + // Type of current message. + MessageType type_; + // Current state in background animation. + State state_; + // Current background illumination. + int illumination_; + // Minimal text height + int minTextHeight_; + // Timer used for background animation + QTimer *timer_; + // Current text + QString text_; + // Current icon + QPixmap pixmap_; + // Button for user action. + QPushButton *button_; + + signals: // Public signals + void reconnect(); +}; + + + +#endif diff --git a/src/chat/chatview.cpp b/src/chat/chatview.cpp index 3847799..dcab66f 100644 --- a/src/chat/chatview.cpp +++ b/src/chat/chatview.cpp @@ -17,29 +17,24 @@ #include "chatview.h" -#include "../contact/contactbase.h" -#include "../contact/contactlist.h" +#include "../contact/contact.h" #include "../dialogs/addemoticondialog.h" -#include "../utils/kmessconfig.h" +#include "../model/contactlist.h" #include "../utils/kmessshared.h" #include "../currentaccount.h" +#include "../accountsmanager.h" #include "../emoticonmanager.h" #include "../kmess.h" #include "../kmessapplication.h" -#include "../kmessdebug.h" -#include "contactaction.h" -#include "chatmessagestyle.h" -#include "chatmessageview.h" -#include "contactsidebar.h" +#include "contactswidget.h" #include "inkedit.h" #include -#include #include #include -#include #include #include +#include #include #include @@ -49,29 +44,19 @@ #include #include #include -#include - - -#define TYPING_NOTIFICATION_TIME 4000 // The constructor ChatView::ChatView( QWidget *parent ) : QWidget( parent ) -, Ui::ChatView() -, contactSidebar_( 0 ) +// , Ui::ChatView() +, contactsWidget_( 0 ) , currentAccount_( 0 ) -, chatStyle_( 0 ) -, currentZoom_( 100 ) -, doSendTypingMessages_( true ) , initialized_( false ) { - // Setup the UI as first thing - setupUi( this ); - // Insert a KHTMLPart in the placeholder - chatMessageView_ = new ChatMessageView( static_cast( messageViewFrame_ ) ); + chatMessageView_ = new ChatMessageView( parent ); connect( chatMessageView_, SIGNAL( popupMenu(const QString&,const QPoint&) ), this, SLOT ( slotShowContextMenu(const QString&,const QPoint&) ) ); connect( chatMessageView_, SIGNAL( openUrlRequest(const KUrl&) ), @@ -80,119 +65,28 @@ ChatView::ChatView( QWidget *parent ) chatMessageView_, SLOT( updateApplicationMessage(const QString&,const QString&) ) ); // Create a layout to maximize the KHTMLPart - QBoxLayout *messageLayout = new QHBoxLayout( messageViewFrame_ ); - messageLayout->setSpacing( 0 ); - messageLayout->setContentsMargins( 0, 0, 0, 0 ); - messageLayout->addWidget( chatMessageView_->view() ); // Stretches widget - - // Create the ink editor and connect its signals - inkEdit_ = new InkEdit(); - inkEdit_->installEventFilter(this); - - inkEdit_->hide(); - editorFrame_->layout()->addWidget( inkEdit_ ); - - connect( inkEdit_, SIGNAL( inkModified(bool) ), - this, SLOT( slotInkModified(bool) ) ); - - // Connect the message edit so that if its displayed color changes, - // it checked to match the user's chosen color. - connect( messageEdit_, SIGNAL( currentColorChanged( const QColor & ) ), - this, SLOT ( editorColorChanged( const QColor & ) ) ); - - connect( messageEdit_, SIGNAL( textChanged() ), - this, SLOT ( messageTextChanged() ) ); - - connect( newLineButton_, SIGNAL( clicked() ), - this, SLOT ( newLineClicked() ) ); - - connect( sendButton_, SIGNAL( clicked() ), - this, SLOT ( sendClicked() ) ); - connect( switchButton_,SIGNAL( clicked() ), - this, SLOT ( slotSwitchEditor() ) ); - - // Set initial widget state - sendButton_ ->setEnabled( false ); - sendButton_ ->setFocusPolicy( Qt::NoFocus ); - newLineButton_->setFocusPolicy( Qt::NoFocus ); - switchButton_ ->setFocusPolicy( Qt::NoFocus ); - switchButton_ ->setIcon( KIcon( "draw-freehand" ) ); - - //Reset index for fast-retype - indexSentences_ = 0; - - // Enable drag&drop of files to the message box - messageEdit_->setAcceptDrops( true ); - messageEdit_->installEventFilter( this ); - messageEdit_->viewport()->installEventFilter( this ); + QVBoxLayout *layout = new QVBoxLayout( this ); + layout->setContentsMargins( 0, 6, 0, 0 ); + layout->addWidget( chatMessageView_->widget() ); // And to the messages view chatMessageView_->view()->setAcceptDrops( true ); chatMessageView_->view()->installEventFilter( this ); - // Lastly, initialize the "Typing notification" timer - userTypingTimer_.setInterval( TYPING_NOTIFICATION_TIME ); - userTypingTimer_.setSingleShot( true ); + // Create the containers for this chat's current text and drawing + inkEditContents_ = new InkImage(); + messageEditContents_ = new QTextDocument(); } + // The destructor ChatView::~ChatView() { - // Delete chat messages. Here we also delete the last contact messages which are links to items of chatMessages_ - qDeleteAll( chatMessages_ ); - chatMessages_.clear(); - lastContactMessages_.clear(); - - // Delete the contact actions - // Avoid crashing when the switchboard/contact fires a "contactLeftChat" signal. - qDeleteAll( contactActions_ ); - contactActions_.clear(); - - // Also erase the chat style parser - delete chatStyle_; -} - - - -// Set the zoom factor of the text -void ChatView::changeZoomFactor( bool increase ) -{ - int newZoom = chatMessageView_->zoomFactor(); - - if( increase ) - { - newZoom += 25; - } - else - { - newZoom -= 25; - } - - if( newZoom > 20 && newZoom < 300 ) - { - currentZoom_ = newZoom; - chatMessageView_->setZoomFactor( currentZoom_ ); - } -} - - - -// Create the contact actions -void ChatView::createContactActions() -{ - ContactAction *contactAction; - QHashIterator it( currentAccount_->getContactList()->getContactList() ); - Contact *contact; - - while ( it.hasNext() ) - { - contact = it.next().value(); - contactAction = new ContactAction( contact, inviteMenu_ ); - connect( contactAction, SIGNAL( activated(QString) ), - this, SLOT ( inviteContact(QString) ) ); - contactActions_.append( contactAction ); - } + // Delete the related widgets + delete contactsWidget_; + delete inkEditContents_; + delete messageEditContents_; } @@ -200,59 +94,14 @@ void ChatView::createContactActions() // Copy the currently selected text void ChatView::editCopy() { - // Get the cursor reference - QTextCursor cursor = messageEdit_->textCursor(); - - if( cursor.hasSelection() ) - { - messageEdit_->copy(); - } - else if( chatMessageView_->hasSelection() ) // never has focus, only selection. - { - kapp->clipboard()->setText( chatMessageView_->selectedText() ); - // setData() for HTML version. - } -} - - - -// The color in the text box changed. -void ChatView::editorColorChanged(const QColor &color) -{ -#ifdef KMESSTEST - KMESS_ASSERT( currentAccount_ != 0 ); -#endif - - // Whenever the QTextEdit's contents is entirely deleted, the font color spontaneously resets to black; - // if this happens, set the color back to the user's color. - // HACK: This possibly is a Qt <= 4.4 bug exposed. - if ( color.name() != currentAccount_->getFontColor() ) - { -#ifdef KMESSDEBUG_CHATVIEW - kDebug() << "Color was reset to" << color.name() << ". Restoring it to the account setting."; -#endif - messageEdit_->setTextColor( QColor( currentAccount_->getFontColor() ) ); - } -} - - -// The user pressed return in the message editor, so send the message -void ChatView::enterPressed() -{ - // If there's no typed messages, avoid sending empty message - if( messageEdit_->document()->isEmpty() ) + // The view never has focus, only selection. + if( ! chatMessageView_->hasSelection() ) { return; } - // Don't send any typing messages while preparing to send the message in the text box... - doSendTypingMessages_ = false; - - // Send the message. - sendMessage(); - - // Now messages can again be sent - doSendTypingMessages_ = true; + kapp->clipboard()->setText( chatMessageView_->selectedText() ); + // use selectedTextAsHTML() and setData() to copy HTML instead of text } @@ -261,80 +110,40 @@ void ChatView::enterPressed() // here since the message view has a NoFocus policy, which prevents it from having keyboard shortcut events. bool ChatView::eventFilter( QObject *obj, QEvent *event ) { - QStringList fileList; - QKeyEvent *keyEvent = 0; - QDragEnterEvent *dragEvent = 0; - QDropEvent *dropEvent = 0; - bool ctrl = false; - bool shift = false; - int key = 0; - - if( obj == inkEdit_ ) - { - // If key was pressed, check if it's return or - // switch the editor to messages editor. - if ( event->type() == QEvent::KeyPress ) - { - keyEvent = static_cast( event ); - key = keyEvent->key(); - if( key == Qt::Key_Return || key == Qt::Key_Enter ) - { - sendClicked(); - return false; - } - - slotSwitchEditor(); - - // Grep the key pressed and put into editor to continue - // the sentence started - if ( QChar( key ).isLetterOrNumber() ) - { - messageEdit_->insertPlainText ( QChar( key ) ); - } - } - return false; - } + Q_UNUSED( obj ); switch( event->type() ) { case QEvent::DragEnter: - dragEvent = static_cast( event ); + { + QDragEnterEvent *dragEvent = static_cast( event ); if( dragEvent->mimeData()->hasUrls() ) { dragEvent->acceptProposedAction(); + return true; } - break; - - case QEvent::WindowActivate: - if( messageEdit_->isVisible() ) + else if( dragEvent->mimeData()->hasFormat( "application/kmess.list.item" ) ) { - messageEdit_->setFocus(); - } - else - { - inkEdit_ ->inkFrame_->setFocus(); + dragEvent->acceptProposedAction(); + return true; } break; - - case QEvent::FocusOut: - case QEvent::Show: - if( isVisible() && obj == messageEdit_ ) - { - messageEdit_->setFocus( Qt::OtherFocusReason ); - } - break; + } case QEvent::Drop: - dropEvent = static_cast( event ); + { + QDropEvent *dropEvent = static_cast( event ); + const QMimeData *data = dropEvent->mimeData(); - // Process the drop only if it contains file URLs and comes from out of our application. - if( dropEvent->mimeData()->hasUrls() && dropEvent->source() == 0 ) + // Process a file transfer drop only if it contains file URLs + // and comes from out of our application. + if( data->hasUrls() && dropEvent->source() == 0 ) { - #ifdef KMESSDEBUG_CHATVIEW - kDebug() << "Drag'n'dropped files: " << dropEvent->mimeData()->urls(); - #endif +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Drag'n'dropped files:" << dropEvent->mimeData()->urls(); +#endif // Send the files to the contact startFileTransfer( dropEvent->mimeData()->urls() ); @@ -342,81 +151,37 @@ bool ChatView::eventFilter( QObject *obj, QEvent *event ) dropEvent->acceptProposedAction(); return true; } - break; - case QEvent::KeyPress: - // Get key information - keyEvent = static_cast( event ); - ctrl = keyEvent->modifiers() & Qt::ControlModifier; - shift = keyEvent->modifiers() & Qt::ShiftModifier; - key = keyEvent->key(); + if( data->hasFormat( "application/kmess.list.item" ) + && ! data->text().isEmpty() ) + { + // Invite the listed contacts, but check them a little + QStringList handles( data->text().split( "; " ) ); - // Detect enter press to send the message - if( key == Qt::Key_Return || key == Qt::Key_Enter ) - { - if( shift || ctrl ) + foreach( const QString &handle, handles ) { - // ctrl+enter or shift+enter, insert a new line instead. - messageEdit_->insertPlainText( "\n" ); - } - else - { - enterPressed(); - } - - // Blocks further handling of this event. - keyEvent->ignore(); - return true; - } - // Detect text copying from the Message View - else if( ctrl && key == Qt::Key_C ) - { - editCopy(); - } - // Detect 'save chat' command - else if( ctrl && key == Qt::Key_S ) - { - showSaveChatDialog(); - } - // Detect fast-retype ctlr+UpArrow or ctrl+DownArrow - else if( ctrl && key == Qt::Key_Up ) - { - if( indexSentences_ == chatMessages_.size() ) - { - // store the last sentence in writing - lastSentence_ = messageEdit_->toPlainText(); - } - - while( indexSentences_ > 0 ) - { - const ChatMessage *chatMessage = chatMessages_[ --indexSentences_ ]; - if( chatMessage->getType() == ChatMessage::TYPE_OUTGOING ) + // Don't try to invite random strings, nonexistent handles + if( ! Account::isValidEmail( handle ) + || currentAccount_->getContactByHandle( handle ) == 0 ) { - messageEdit_->setPlainText( chatMessage->getBody() ); - break; - } - } - } - else if( ctrl && key == Qt::Key_Down ) - { - while( indexSentences_ < ( chatMessages_.size() - 1 ) ) - { - const ChatMessage *chatMessage = chatMessages_[ ++indexSentences_ ]; - if( chatMessage->getType() == ChatMessage::TYPE_OUTGOING ) - { - messageEdit_->setPlainText( chatMessage->getBody() ); - break; + handles.removeAll( handle ); } } - if( indexSentences_ == ( chatMessages_.size() - 1 ) ) + // If any address has survived, it has gained itself the valhalla, an invitation to our chat + if( ! handles.isEmpty() ) { - messageEdit_->setPlainText( lastSentence_ ); - indexSentences_ = chatMessages_.size(); +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Drag'n'dropped addresses:" << handles; +#endif + inviteContacts( handles ); + dropEvent->acceptProposedAction(); + return true; } - } + break; + } default: break; @@ -427,73 +192,34 @@ bool ChatView::eventFilter( QObject *obj, QEvent *event ) -// Return the contact action with the given handle -ContactAction* ChatView::getContactActionByHandle( const QString& handle ) +// Return a pointer to this chat's Contacts Widget +ContactsWidget *ChatView::getContactsWidget() const { - foreach( ContactAction *contactAction, contactActions_ ) - { - if ( contactAction->getHandle() == handle ) - { - return contactAction; - } - } - - return 0; + return contactsWidget_; } -// Return a pointer to this chat's Contact Sidebar -ContactSidebar *ChatView::getContactSidebar() const +// Return a pointer to the ink image drawn by the user in this chat +InkImage *ChatView::getInkEditContents() const { - return contactSidebar_; + return inkEditContents_; } -// Return the encoding of the HTML document. -QString ChatView::getEncoding() const +// Return a pointer to the text typed by the user in this chat +QTextDocument *ChatView::getMessageEditContents() const { - return chatMessageView_->encoding(); + return messageEditContents_; } -// Return the HTML source of the page. -QString ChatView::getHtml() const +// Get the text zoom factor +int ChatView::getZoomFactor() { - return chatMessageView_->getHtml(); -} - - - -// Return a pointer to this chat's menu of inviteable contacts -KMenu *ChatView::getInviteMenu() const -{ - return inviteMenu_; -} - - - -// Give access to the message edit area. -KTextEdit * ChatView::getMessageEditField() const -{ - return messageEdit_; -} - - - -// Return the selected text in the message area. -QString ChatView::getSelectedText(bool asHtml) const -{ - if( asHtml ) - { - return chatMessageView_->selectedTextAsHTML(); - } - else - { - return chatMessageView_->selectedText(); - } + return chatMessageView_->zoomFactor(); } @@ -510,88 +236,37 @@ bool ChatView::initialize() kDebug() << "already initialized."; return false; } - if ( !initializeCurrentAccount() ) - { - return false; - } - if ( !initializeContactSidebar() ) - { - return false; - } - // Create a menu for the contact actions - inviteMenu_ = new KMenu( i18n("&Invite") ); - - // Create the contact actions - createContactActions(); - - // Get chat style - chatStyle_ = new ChatMessageStyle(); - updateChatStyle(); - - initialized_ = true; - return true; -} - - - -// Set up the contact sidebar -bool ChatView::initializeContactSidebar() -{ -#ifdef KMESSTEST - KMESS_ASSERT( contactSidebar_ == 0 ); -#endif - - // Create the sidebar - contactSidebar_ = new ContactSidebar( parentWidget() ); - // Initialize the sidebar - if ( !contactSidebar_->initialize() ) - { - kDebug() << "Couldn't initialize the contact sidebar."; - return false; - } - - // Hide the sidebar by default - contactSidebar_->hide(); - -#ifdef KMESSTEST - KMESS_ASSERT( contactSidebar_ != 0 ); -#endif - - return true; -} - - - -// Initialize the current account -bool ChatView::initializeCurrentAccount() -{ currentAccount_ = CurrentAccount::instance(); if ( currentAccount_ == 0 ) { kDebug() << "Couldn't get the instance of the current account."; return false; } + connect( currentAccount_, SIGNAL( changedFontSettings() ), - this, SLOT ( updateEditorFont() ) ); + chatMessageView_, SLOT ( updateChatStyle() ) ); connect( currentAccount_, SIGNAL( changedChatStyleSettings() ), - this, SLOT ( updateChatStyle() ) ); - updateEditorFont(); + chatMessageView_, SLOT ( updateChatStyle() ) ); + connect( currentAccount_, SIGNAL( changedEmoticonSettings() ), + chatMessageView_, SLOT ( updateChatStyle() ) ); + + // Create the widget + contactsWidget_ = new ContactsWidget( 0 ); + + // Hide it by default + contactsWidget_->hide(); + + // Update the chat view with the style settings + // from the current account + chatMessageView_->updateChatStyle(); + + initialized_ = true; return true; } -// Insert an emoticon into the message editor -void ChatView::insertEmoticon( QString emoticonText ) -{ - // Insert the text at the cursor. - messageEdit_->insertPlainText( emoticonText ); - messageEdit_->setFocus(); -} - - - // Whether or not the message area is empty bool ChatView::isEmpty() const { @@ -600,274 +275,106 @@ bool ChatView::isEmpty() const -// The message text changed, so the user is typing -void ChatView::messageTextChanged() -{ - // Disable or enable the send button depending on whether or not the message edit is empty - if ( messageEdit_->document()->isEmpty() ) - { - sendButton_->setEnabled( false ); - return; - } - - // Something has been typed, enable the button so the user can send the message - sendButton_->setEnabled( true ); - - // There's some text, but the user doesn't want us to send typing notifications to the contacts - if( ! doSendTypingMessages_ ) - { - return; - } - - // If the typing timer is already going, do nothing - if( userTypingTimer_.isActive() ) - { - return; - } - - // If the last character of the message is a newline, sending the typing signal would - // cause the actual text message to be received twice, so check the last character... - if( messageEdit_->toPlainText().right(1) == "\n" ) - { - return; - } - - emit userIsTyping(); - userTypingTimer_.start(); -} - - - -// The user clicked the new line button so insert a new line in the editor -void ChatView::newLineClicked() -{ - messageEdit_->insertPlainText( "\n" ); -} - - - -// Restore the window properties (called by the parent ChatWindow) -void ChatView::readProperties( const KConfigGroup &config ) -{ - KConfigGroup group; - - // Choose the config group if it was not given - if( &config == 0 ) - { - group = KMessConfig::instance()->getAccountConfig( currentAccount_->getHandle(), "ChatView" ); - } - else - { - group = config; - } - -#ifdef KMESSDEBUG_CHATVIEW - kDebug() << "Reading saved properties."; -#endif - - // Set the default widget sizes. The message editor has a default read size of 1 so it'll be - // as small as possible, without becoming invisible - int minChatViewHeight = messageViewFrame_->minimumSize().height(); - messageSplitter_->setSizes( group.readEntry( "MessageSplitterSizes", QList() << minChatViewHeight << 1 ) ); - - // Load the level of zoom - currentZoom_ = group.readEntry( "CurrentZoom", chatMessageView_->zoomFactor() ); - // Restore it in the chat messages view - chatMessageView_->setZoomFactor( currentZoom_ ); - // Read if the spelling check feature is enabled - messageEdit_->setCheckSpellingEnabled( group.readEntry( "UseSpellCheck", false ) ); -} - - - // Save the chat to the given file -void ChatView::saveChatToFile( const QString &path ) +bool ChatView::saveChatToFile( const QString &path, Account::ChatExportFormat format, bool overwriteContents, bool allowUserInteraction ) { #ifdef KMESSDEBUG_CHATVIEW kDebug() << "saving chat to '" << path << "'."; #endif - // Create and open the file. + // Find out if the file already exists QFile file( path ); - if( ! file.open( QIODevice::WriteOnly ) ) + bool isExistingFile = file.exists(); + + // Create and open the file. + if( ! file.open( QIODevice::ReadWrite ) ) { - kWarning() << "File save failed - couldn't open file '" << path << "'."; - KMessageBox::sorry( this, i18n("Could not save chat log. Make sure you have permission to write in the folder where logs are being saved.") ); - return; + if( ! allowUserInteraction ) + { + return false; + } + + QFileInfo info( file ); + kWarning() << "File save failed! Could not open file" << path << "."; + KMessageBox::sorry( chatMessageView_->view(), i18n( "Could not save chat log in directory '%1'.\n" + "Make sure you have permission to write in " + "the folder where logs are being saved.", + info.absolutePath() ) ); + return false; } - // Get the text - // Make the text show nicely when viewed in an editor. - QString text = getHtml(); - text = text.replace( QRegExp("
"), "
\n" ); + // Add a bit more security to the log file, if the platform supports it + file.setPermissions( QFile::ReadOwner | QFile::WriteOwner ); - // Output the HTML with the right text encoding - QTextStream textStream( &file ); - textStream.setCodec( QTextCodec::codecForLocale() ); - textStream << text; - file.close(); -} + QString fileData; + QString appendPoint; + bool willAppend = ( isExistingFile && ! overwriteContents ); - - -// Save the window properties (called by parent ChatWindow) -void ChatView::saveProperties( KConfigGroup &config ) -{ - KConfigGroup group; - - // Choose the config group if it was not given - if( &config == 0 ) + // Search for the style tag: we will append to this file only if the + // tag exists and is identical to the current tag. + // Text chat logs don't have any formatting nor tag, so this test must + // be skipped. + if( willAppend && format != Account::EXPORT_TEXT ) { - group = KMessConfig::instance()->getAccountConfig( currentAccount_->getHandle(), "ChatView" ); - } - else - { - group = config; + fileData = file.read( 512 ); + if( fileData.indexOf( chatMessageView_->getStyleTag() ) == -1 ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Style Tag not found in data:" << fileData; +#endif + return false; + } } + QString chatHistory( chatMessageView_->getHistory( format, willAppend, appendPoint ) ); + #ifdef KMESSDEBUG_CHATVIEW - kDebug() << "Saving properties."; + kDebug() << "Will append to current file?" << willAppend; #endif - group.writeEntry( "MessageSplitterSizes", messageSplitter_->sizes() ); - group.writeEntry( "CurrentZoom", currentZoom_ ); - group.writeEntry( "UseSpellCheck", messageEdit_->checkSpellingEnabled() ); -} - - - -// Scroll to the bottom of the chat browser -void ChatView::scrollChatToBottom() -{ - chatMessageView_->scrollChatToBottom(); -} - - - -// The user clicked send, so send the message -void ChatView::sendClicked() -{ - if( messageEdit_->isVisible() ) + if( willAppend ) { - sendMessage(); +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Appending to existing chat file..."; +#endif + + const qint16 maxReadSize = 256; + + // Read the last bytes of the file + file.seek( file.size() - maxReadSize ); + fileData = file.read( maxReadSize ); + int pos = fileData.lastIndexOf( appendPoint ); + + // The append point was not found: we'll fallback to creating a new file + if( pos < 0 ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Append process failed, insertion string not found."; +#endif + return false; + } + + // Seek the file to the insertion point + file.seek( file.size() - maxReadSize + pos ); + // Add to the chat history the current 'tail' of the file + chatHistory += fileData.mid( pos ); + // Insert the history and tail in the file, below } +#ifdef KMESSDEBUG_CHATVIEW else { - sendInk(); + kDebug() << "Creating new chat file..."; + file.resize( 0 ); // Truncate it (99% useless precaution) } +#endif - // Ensure the typing or draw area always gets focus, - // so the user can type or draw the next message directly. - // This area looses focus when you do other things like choosing emoticons. - if( messageEdit_->isVisible() ) - { - messageEdit_->setFocus(); - } - else - { - inkEdit_ ->inkFrame_->setFocus(); - } -} + // Output the chat history to the file, with the right text encoding + QTextStream textStream( &file ); + textStream.setCodec( QTextCodec::codecForLocale() ); + textStream << chatHistory; + file.close(); - - -// Send a ink via server -void ChatView::sendInk() -{ - // Get the image bytes and emit the signal - QByteArray ink = inkEdit_->getImageBytes(); - - emit sendInkToContact( ink ); - - // Clear and reset the state of send button - inkEdit_->clearImage(); - sendButton_->setEnabled( false ); - - // Show the message in the browser window - QString text = ""; - - ChatMessage message( ChatMessage::TYPE_OUTGOING, - ChatMessage::CONTENT_MESSAGE_INK, - false, - text, - currentAccount_->getHandle(), - currentAccount_->getFriendlyName(), - currentAccount_->getPicturePath()); - - showMessage(message); -} - - -// Send a message via the server -void ChatView::sendMessage() -{ - // Max length is fixed to 10 chunks ( multi-packet ) - int maxSendableMessageLength = 14000; - - // Get the message field's contents - QString text = messageEdit_->toPlainText(); - - // Don't send empty messages - if( text.isEmpty() ) - { - return; - } - - // If the text is longer than the sendable amount, put the remainder back in the text edit. - // Since the message will be sent as UTF8, it's the UTF8 length we have to consider. - QByteArray utf8Text = text.toUtf8(); - if( utf8Text.length() > maxSendableMessageLength ) - { - // If so, then divide the text into the first part and a remainder. - QByteArray remainder = utf8Text.right( utf8Text.length() - maxSendableMessageLength ); - text = QString::fromUtf8( utf8Text.left( maxSendableMessageLength ) ); - - // Return the remainder to the message edit. - QString remainingText = QString::fromUtf8( remainder ); - messageEdit_->setText( remainingText ); - lastSentence_ = remainingText; - } - else - { - // Remove the message from the message field (allowing undo) - lastSentence_.clear(); - - QTextCursor cursor = messageEdit_->textCursor(); - messageEdit_->setTextCursor( cursor ); - - cursor.beginEditBlock(); - cursor.select( QTextCursor::Document ); - cursor.removeSelectedText(); - cursor.endEditBlock(); - } - - // Replace "\n" with "\r\n" (to follow the Windows linebreak style followed by the MSN servers) - // @TODO Move this server stuff to the network/protocol code - text = text.replace( QRegExp("\r?\n"), "\r\n" ); - - // Ask the server to send the message to the contact(s) - emit sendMessageToContact( text ); - - // Reset the typing timer, so it restarts correctly - userTypingTimer_.stop(); - - - // Show the message in the browser window - ChatMessage message(ChatMessage::TYPE_OUTGOING, - ChatMessage::CONTENT_MESSAGE, - false, - text, - currentAccount_->getHandle(), - currentAccount_->getFriendlyName( STRING_ORIGINAL ), - currentAccount_->getPicturePath(), - currentAccount_->getFont(), - currentAccount_->getFontColor() ); - - showMessage(message); - - // Reset the last sentence counter. - // showMessage() updates chatMessages_ - indexSentences_ = chatMessages_.size(); + return true; } @@ -876,25 +383,12 @@ void ChatView::sendMessage() void ChatView::setEnabled( bool isEnabled ) { // Set the state of the main UI elements - contactSidebar_->setEnabled( isEnabled ); - inviteMenu_ ->setEnabled( isEnabled ); - inkEdit_ ->setEnabled( isEnabled ); - messageEdit_ ->setEnabled( isEnabled ); - newLineButton_ ->setEnabled( isEnabled ); - sendButton_ ->setEnabled( isEnabled ); - switchButton_ ->setEnabled( isEnabled ); - - // Clear the contact actions at the very moment they expire (on disconnection) - qDeleteAll( contactActions_ ); - contactActions_.clear(); + contactsWidget_->setEnabled( isEnabled ); // The chat is being enabled back, replace some stuff which changes // at every connection if( isEnabled ) { - // Recreate the contact actions - createContactActions(); - // Re-read the current account pointer // because it likely is a different one currentAccount_ = CurrentAccount::instance(); @@ -903,92 +397,24 @@ void ChatView::setEnabled( bool isEnabled ) -// Add the given message to the message browser. -void ChatView::showMessage(const ChatMessage &message) +// Set the zoom factor of the text +void ChatView::setZoomFactor( int percentage ) { - if(KMESS_NULL(chatStyle_)) return; + chatMessageView_->setZoomFactor( percentage ); +} - // Clone the message so it can be stored in the local qlist objects. - // @TODO-PORTING This shouldn't be this way... - ChatMessage *chatMessage = message.clone(); - QString messageHtml; - // See if the same contact sent the previous message too. - // In that case, we combine both messages for the chat style. - // Otherwise the lastContactMessages_ list is reset. - if( chatMessage->isNormalMessage() && currentAccount_->getGroupFollowupMessages() ) + +// Add the given message to the message browser. +void ChatView::showMessage( const ChatMessage &message ) +{ + // Send it to the message view to have it shown + chatMessageView_->showMessage( message ); + + // Notify the contacts widget, so that it updates the right contact frame + if( ! KMESS_NULL( contactsWidget_ ) ) { - if( ! lastContactMessages_.isEmpty() ) - { - ChatMessage *lastContactMessage = lastContactMessages_.last(); - - // Check for contact handle and message type, so offline messages won't be - // grouped with normal incoming messages. - if( lastContactMessage->getContactHandle() == chatMessage->getContactHandle() - && lastContactMessage->getType() == chatMessage->getType() ) - { - lastContactMessages_.append(chatMessage); - } - else - { - lastContactMessages_.clear(); - } - } - } - else - { - lastContactMessages_.clear(); - } - - // Convert the message, add to the browser. - if( lastContactMessages_.count() > 1 ) - { -#ifdef KMESSDEBUG_CHATVIEW - kDebug() << "replacing last contact message with new contents."; -#endif - - messageHtml = chatStyle_->convertMessageList(lastContactMessages_); - chatMessageView_->replaceLastMessage(messageHtml); - } - else - { -#ifdef KMESSDEBUG_CHATVIEW - kDebug() << "appending new message."; -#endif - - messageHtml = chatStyle_->convertMessage(*chatMessage); - chatMessageView_->addHtmlMessage(messageHtml); - - if( chatMessage->isNormalMessage() ) - { - lastContactMessages_.append( chatMessage ); - } - } - - - // If the parser found custom emoticons, add them. - // The pending list of chatStyle is erased with each new convertMessage() call. - const QStringList &emoticonTags = chatStyle_->getPendingEmoticonTagIds(); - if( ! emoticonTags.isEmpty() ) - { - // Copy to internal list. - for(QStringList::const_iterator it = emoticonTags.begin(); it != emoticonTags.end(); ++it) - { - pendingEmoticonTags_.append(*it); - } - } - - - // Add to memory, this is used for: - // - changing chat styles - // - regenerating messages to group them - // - regenerating messages for received custom emoticons. - chatMessages_.append( chatMessage ); - - // Also notify the sidebar, so that it updates the right contact frame - if( ! KMESS_NULL( contactSidebar_ ) ) - { - contactSidebar_->messageReceived( chatMessage->getContactHandle() ); + contactsWidget_->messageReceived( message.getContactHandle() ); } } @@ -998,14 +424,20 @@ void ChatView::showMessage(const ChatMessage &message) void ChatView::showSaveChatDialog() { QFileInfo targetFile; - int overwriteAllowed; - QString path = currentAccount_->getSaveChatPath() + "/kmess-chat.html"; // Default name for the saved chat + int overwriteAllowed; + + // Default name for the saved chat + QString path( currentAccount_->getSaveChatPath() + "/kmess-chat.html" ); // Repeat until a file is chosen or the operation is cancelled do { // Show a dialog to get a filename from the user. - path = KFileDialog::getSaveFileName( path, "*.html" ); + path = KFileDialog::getSaveFileName( path, + i18nc( "Chat log saving dialog, file type filter", + "*.html *.htm|Web Page (*.html)\n" + "*.txt|Plain Text Document (*.txt)\n" + "*.xml|XML Document (*.xml)" ) ); // Verify if the user has canceled the command if( path.isEmpty() ) @@ -1022,14 +454,63 @@ void ChatView::showSaveChatDialog() { overwriteAllowed = KMessageBox::warningContinueCancel( 0, - i18n( "The file '%1' already exists.\ndo you want to overwrite it?", targetFile.fileName() ), - i18n("Overwrite File"), - KGuiItem( i18n("Over&write") ) ); + i18n( "The file '%1' already exists.\nDo you want to overwrite it?", targetFile.fileName() ), + i18n( "Overwrite File" ), + KGuiItem( i18n( "Over&write" ) ) ); } - } while( overwriteAllowed == KMessageBox::Cancel ); + } + while( overwriteAllowed == KMessageBox::Cancel ); - saveChatToFile( path ); + Account::ChatExportFormat format; + if( targetFile.suffix() == "html" ) + { + format = Account::EXPORT_HTML; + } + else if( targetFile.suffix() == "xml" ) + { + format = Account::EXPORT_XML; + } + else + { + format = Account::EXPORT_TEXT; + } + + saveChatToFile( path, format, true ); +} + + + +/** + * Add a contact's email to the contact list + */ +void ChatView::slotAddContact() +{ + QString email( chatViewClickedUrl_.url() ); + + if( ! chatViewClickedUrl_.isValid() ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Not adding anything from invalid URL: " << email; +#endif + + return; + } + +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Adding contact from URL: " << email; +#endif + + // Strip the pseudo-protocol 'mail to' from the email address + if( email.left( 7 ) == "mailto:" ) + { + email = email.mid( 7 ); + } + + emit addContact( email ); + + // Reset the url + chatViewClickedUrl_.clear(); } @@ -1053,7 +534,7 @@ void ChatView::slotAddNewEmoticon() * kmess://emoticon/contactHandle/urlEncodedShortcut/urlEncodedPicturePath */ - QString path = chatViewClickedUrl_.path().mid( 1 ); // remove first / + QString path( chatViewClickedUrl_.path().mid( 1 ) ); // remove first / #ifdef KMESSTEST KMESS_ASSERT( ! path.isEmpty() ); @@ -1062,9 +543,9 @@ void ChatView::slotAddNewEmoticon() // Reset the url chatViewClickedUrl_.clear(); - QString handle = path.section( "/", 0, 0 ); // First parameter: contact handle - QString shortcut = path.section( "/", 1, 1 ); // Second parameter: emoticon shortcut - QString picture = path.section( "/", 2 ); // Third parameter: emoticon picture path + QString handle ( path.section( "/", 0, 0 ) ); // First parameter: contact handle + QString shortcut( path.section( "/", 1, 1 ) ); // Second parameter: emoticon shortcut + QString picture ( path.section( "/", 2 ) ); // Third parameter: emoticon picture path const ContactBase *contact = CurrentAccount::instance()->getContactByHandle( handle ); if( contact == 0 ) @@ -1076,7 +557,6 @@ void ChatView::slotAddNewEmoticon() return; } - // URL-Decode the encoded strings picture = KUrl::fromPercentEncoding( picture.toAscii() ); shortcut = KUrl::fromPercentEncoding( shortcut.toAscii() ); @@ -1086,10 +566,10 @@ void ChatView::slotAddNewEmoticon() #endif // Finally, show the dialog, preselecting the picture file and shortcut - AddEmoticonDialog *addDialog = new AddEmoticonDialog( EmoticonManager::instance()->getTheme( true ), this ); + AddEmoticonDialog *addDialog = new AddEmoticonDialog( EmoticonManager::instance()->getTheme( true ), chatMessageView_->view() ); connect( addDialog, SIGNAL( addedEmoticon(QString) ), - chatMessageView_, SLOT( addedEmoticon(QString) ) ); + chatMessageView_, SLOT ( addedEmoticon(QString) ) ); addDialog->preSelect( picture, shortcut ); @@ -1097,20 +577,10 @@ void ChatView::slotAddNewEmoticon() -// The user are drawing a ink -void ChatView::slotInkModified( bool erasered ) +// Clear the chat's contents +void ChatView::slotClearChat() { - if( ! erasered ) - { - if( ! sendButton_->isEnabled() ) - { - sendButton_->setEnabled( true ); - } - } - else - { - sendButton_->setEnabled( false ); - } + chatMessageView_->clearView( false ); } @@ -1118,7 +588,7 @@ void ChatView::slotInkModified( bool erasered ) // The user clicked the "copy address" or "copy email" option in the context menu void ChatView::slotCopyAddress() { - QString url = chatViewClickedUrl_.url(); + QString url( chatViewClickedUrl_.url() ); if( ! chatViewClickedUrl_.isValid() ) { @@ -1150,7 +620,8 @@ void ChatView::slotCopyAddress() // The user clicked the "copy text" option in the context menu. void ChatView::slotCopyChatText() { - kapp->clipboard()->setText( this->getSelectedText( false ) ); +// For HTML use selectedTextAsHTML(); + kapp->clipboard()->setText( chatMessageView_->selectedText() ); } @@ -1163,6 +634,63 @@ void ChatView::slotFindChatText() +/** + * Add an emoticon from the chat to the contact's emoticon blacklist. + * + * The user can add a contact's emoticons into a black list: KMess will not display + * blacklisted emoticons, and keep the shortcut as text. Useful for contacts + * having annoying emoticons. + */ +void ChatView::slotIgnoreEmoticon() +{ + if( ! chatViewClickedUrl_.isValid() || chatViewClickedUrl_.protocol() != "kmess" || chatViewClickedUrl_.host() != "emoticon" ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Ignoring request for invalid URL: " << chatViewClickedUrl_; +#endif + + return; + } + +/* + * KMess' internal emoticon URLs are in the form + * kmess://emoticon/contactHandle/urlEncodedShortcut/urlEncodedPicturePath + */ + + QString path( chatViewClickedUrl_.path().mid( 1 ) ); // remove first / + +#ifdef KMESSTEST + KMESS_ASSERT( ! path.isEmpty() ); +#endif + + // Reset the url + chatViewClickedUrl_.clear(); + + QString handle ( path.section( "/", 0, 0 ) ); // First parameter: contact handle + QString shortcut( path.section( "/", 1, 1 ) ); // Second parameter: emoticon shortcut + + ContactBase *contact = CurrentAccount::instance()->getContactByHandle( handle ); + if( contact == 0 ) + { +#ifdef KMESSDEBUG_CHATVIEW + kDebug() << "Contact handle not found: " << handle; +#endif + + return; + } + + // URL-Decode the encoded strings + shortcut = KUrl::fromPercentEncoding( shortcut.toAscii() ); + + // Add the emoticon to the contact's blacklist and update the chat + if( contact->manageEmoticonBlackList( true, shortcut ) ) + { + chatMessageView_->removeCustomEmoticon( shortcut ); + } +} + + + // Open a new url clicked in the khtml widget void ChatView::slotOpenURLRequest( const KUrl &url ) { @@ -1184,6 +712,12 @@ void ChatView::slotOpenURLRequest( const KUrl &url ) // Add a new emoticon slotAddNewEmoticon(); } + else if( url.host() == "accountconfig" ) + { + // Show the account config dialog + AccountsManager::instance()->showAccountSettings( + currentAccount_, window(), AccountSettingsDialog::PageChatStyle ); + } } else if( url.protocol() == "file" ) { @@ -1203,6 +737,22 @@ void ChatView::slotOpenURLRequest( const KUrl &url ) +// Scroll the view forward or backward +void ChatView::scrollTo( bool forward, bool fast ) +{ + chatMessageView_->scrollChat( forward, fast ); +} + + + +// Scroll the view down to the last line +void ChatView::scrollToBottom() +{ + chatMessageView_->scrollChatToBottom(); +} + + + // The user clicked the "select all" option in the context menu. void ChatView::slotSelectAllChatText() { @@ -1231,12 +781,12 @@ void ChatView::slotSendAppCommand() * kmess://application/responseType/accountHandle?cookieId */ - QString path = chatViewClickedUrl_.path().mid( 1 ); // remove first / - QString query = chatViewClickedUrl_.query().mid( 1 ); // Remove the ? + QString path ( chatViewClickedUrl_.path() .mid( 1 ) ); // remove first / + QString query ( chatViewClickedUrl_.query().mid( 1 ) ); // Remove the ? - QString method = path.section( "/", 0, 0 ); // First parameter: response type - QString contact = path.section( "/", 1, 1 ); // Second parameter: contact handle - QString cookie = query; // Third parameter: transfer cookie ID + QString method ( path.section( "/", 0, 0 ) ); // First parameter: response type + QString contact( path.section( "/", 1, 1 ) ); // Second parameter: contact handle + QString cookie ( query ); // Third parameter: transfer cookie ID #ifdef KMESSTEST KMESS_ASSERT( ! path.isEmpty() ); @@ -1258,7 +808,7 @@ void ChatView::slotShowContextMenu( const QString &clickedUrl, const QPoint &poi KAction *urlAction = 0; // Add items to this context menu - KMenu *contextMenu = new KMenu( this ); + KMenu *contextMenu = new KMenu( chatMessageView_->view() ); // Analyze incoming URL, if present if( ! clickedUrl.isEmpty() ) @@ -1271,29 +821,33 @@ void ChatView::slotShowContextMenu( const QString &clickedUrl, const QPoint &poi if( url.protocol() == "kmess" && url.host() == "emoticon" ) { -// urlAction = new KAction( i18n("Add this &Emoticon..."), "list-add", 0, this, SLOT(slotAddNewEmoticon()), this, "addemoticon" ); urlAction = new KAction( KIcon( "list-add" ), i18n("Add this &Emoticon..."), this ); connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotAddNewEmoticon()) ); contextMenu->addAction( urlAction ); + urlAction = new KAction( KIcon( "list-remove" ), i18n("Ignore this &Emoticon"), this ); + connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotIgnoreEmoticon()) ); + contextMenu->addAction( urlAction ); } else if( url.protocol().left( 6 ) == "mailto" ) { -// urlAction = new KAction( i18n("Send &Email"), "mail", 0, this, SLOT(slotVisitAddress()), this, "sendemail" ); urlAction = new KAction( KIcon( "mail" ), i18n("Send &Email"), this ); connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotVisitAddress()) ); contextMenu->addAction( urlAction ); -// urlAction = new KAction( i18n("Copy E&mail"), "copy", 0, this, SLOT(slotCopyAddress()), this, "copyemail" ); - urlAction = new KAction( KIcon( "copy" ), i18n("Copy E&mail"), this ); + + urlAction = new KAction( KIcon( "list-add-user" ), i18n("Add &Contact"), this ); + connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotAddContact()) ); + contextMenu->addAction( urlAction ); + + urlAction = new KAction( KIcon( "copy" ), i18n("Copy E&mail Address"), this ); connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotCopyAddress()) ); contextMenu->addAction( urlAction ); } else { -// urlAction = new KAction( i18n("Visit &Link"), "launch", 0, this, SLOT(slotVisitAddress()), this, "visiturl" ); urlAction = new KAction( KIcon( "launch" ), i18n("Visit &Link"), this ); connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotVisitAddress()) ); contextMenu->addAction( urlAction ); -// urlAction = new KAction( i18n("Copy &Address"), "copy", 0, this, SLOT(slotCopyAddress()), this, "copyurl" ); + urlAction = new KAction( KIcon( "edit-copy" ), i18n("Copy &Address"), this ); connect( urlAction, SIGNAL(triggered(bool)), this, SLOT(slotCopyAddress()) ); contextMenu->addAction( urlAction ); @@ -1303,16 +857,18 @@ void ChatView::slotShowContextMenu( const QString &clickedUrl, const QPoint &poi } // Create items - KAction *copyAction = KStandardAction::copy( this, SLOT(slotCopyChatText()), 0 ); // , actionCollection() ); - KAction *selectAllAction = KStandardAction::selectAll( this, SLOT(slotSelectAllChatText()), 0 ); // , actionCollection() ); - KAction *saveToFileAction = KStandardAction::save( this, SLOT(showSaveChatDialog()), 0 ); // , actionCollection() ); + KAction *copyAction = KStandardAction::copy( this, SLOT(slotCopyChatText()), 0 ); + KAction *clearChatAction = KStandardAction::clear( this, SLOT(slotClearChat()), 0 ); + KAction *selectAllAction = KStandardAction::selectAll( this, SLOT(slotSelectAllChatText()), 0 ); + KAction *saveToFileAction = KStandardAction::save( this, SLOT(showSaveChatDialog()), 0 ); KAction *findAction = KStandardAction::find( this, SLOT(slotFindChatText()), 0 ); // Update the labels a bit though - copyAction ->setText( i18n("&Copy text") ); + copyAction ->setText( i18n("&Copy Text") ); selectAllAction ->setText( i18n("Select &All") ); - findAction ->setText( i18n("Find &Text" ) ); - saveToFileAction->setText( i18n("Save chat to &File") ); + findAction ->setText( i18n("Find &Text..." ) ); + clearChatAction ->setText( i18n("C&lear Chat") ); + saveToFileAction->setText( i18n("Save Chat to &File...") ); // Add a separator to divide the context-depending entries from the rest of the menu if( urlAction != 0 ) @@ -1324,6 +880,7 @@ void ChatView::slotShowContextMenu( const QString &clickedUrl, const QPoint &poi contextMenu->addAction( selectAllAction ); contextMenu->addAction( findAction ); contextMenu->addSeparator(); + contextMenu->addAction( clearChatAction ); contextMenu->addAction( saveToFileAction ); // Set items disabled, depending on the text selection @@ -1336,6 +893,9 @@ void ChatView::slotShowContextMenu( const QString &clickedUrl, const QPoint &poi copyAction->setEnabled( false ); } + // Only enable the clear chat action if it contains messages + clearChatAction->setEnabled( ! isEmpty() ); + // Show the menu contextMenu->exec( point ); delete contextMenu; @@ -1344,50 +904,6 @@ void ChatView::slotShowContextMenu( const QString &clickedUrl, const QPoint &poi -// Switch the editor between ink editor and text editor -void ChatView::slotSwitchEditor() -{ - // TODO Create inkEdit only on request - bool isMessageEditVisible = messageEdit_->isVisible(); - messageEdit_->setVisible( ! isMessageEditVisible ); - inkEdit_ ->setVisible( isMessageEditVisible ); - - if( isMessageEditVisible ) - { - // The inkEdit is visible - if( inkEdit_->isEmpty() ) - { - sendButton_->setEnabled( false ); - } - else - { - sendButton_->setEnabled( true ); - } - - switchButton_->setIcon( KIcon( "preferences-desktop-font" ) ); - inkEdit_ ->inkFrame_->setFocus(); - newLineButton_->setEnabled( false); - } - else - { - // The messageEdit is visible - if( messageEdit_->document()->isEmpty() ) - { - sendButton_->setEnabled( false ); - } - else - { - sendButton_->setEnabled( true ); - } - - messageEdit_ ->setFocus(); - switchButton_->setIcon( KIcon( "draw-freehand" ) ); - newLineButton_->setEnabled( true ); - } -} - - - // The user clicked the "visit address" or "send email" option in the context menu, or clicked a link in the ChatMessageView void ChatView::slotVisitAddress() { @@ -1405,111 +921,17 @@ void ChatView::slotVisitAddress() #endif // Launch the browser for the given URL - KMessShared::openBrowser( chatViewClickedUrl_ ); - - // Reset the url - chatViewClickedUrl_.clear(); -} - - - -// Update the chat style -void ChatView::updateChatStyle() -{ -#ifdef KMESSDEBUG_CHATVIEW - kDebug() << "updating style."; -#endif - - if(KMESS_NULL(chatStyle_)) return; - if(KMESS_NULL(currentAccount_)) return; - - // Load new settings in the chat style object - chatStyle_->setStyle ( currentAccount_->getChatStyle() ); - chatStyle_->setContactFont ( currentAccount_->getContactFont() ); - chatStyle_->setContactFontColor( currentAccount_->getContactFontColor() ); - chatStyle_->setShowTime ( currentAccount_->getShowMessageTime() ); - chatStyle_->setUseContactFont ( currentAccount_->getUseContactFont() ); - chatStyle_->setUseEmoticons ( currentAccount_->getUseEmoticons() ); - chatStyle_->setUseFontEffects ( currentAccount_->getUseFontEffects() ); - chatStyle_->setUseFormatting ( currentAccount_->getUseChatFormatting() ); - - // Support grouping of follow-up messages. - bool groupFollowups = currentAccount_->getGroupFollowupMessages(); - lastContactMessages_.clear(); - - // Replace the entire contents with the new style. - QString newHtml; - QListIterator it(chatMessages_); - while( it.hasNext() ) + if( chatViewClickedUrl_.protocol() == "mailto" ) { - ChatMessage *chatMessage = it.next(); - - if( groupFollowups && chatMessage->isNormalMessage() ) - { - // See if the message should be added to the queue. - // There could be another follow-up message later. - if( ! lastContactMessages_.isEmpty() ) - { - // Check whether the contact differs or it's a different type, - // the handle to difference between "offline_incoming" and "incoming" messages. - ChatMessage *lastMessage = lastContactMessages_.last(); - if( lastMessage->getType() != chatMessage->getType() - || lastMessage->getContactHandle() != chatMessage->getContactHandle() ) - { - // New mesage should not be added to queue, - // so previous mesage was last the one. Flush the queue. - newHtml += "\n
" - + chatStyle_->convertMessageList(lastContactMessages_) - + "
\n"; - lastContactMessages_.clear(); - } - } - - // Append new contact message to the queue. - lastContactMessages_.append(chatMessage); - } - else - { - // Not a contact message. - // First flush the queue, then add the new message. - if( ! lastContactMessages_.isEmpty() ) - { - newHtml += "\n
" - + chatStyle_->convertMessageList(lastContactMessages_) - + "
\n"; - lastContactMessages_.clear(); - } - - // Convert the current message. - newHtml += "\n
" - + chatStyle_->convertMessage(*chatMessage) - + "
\n"; - } - } - - QString messageRoot = chatStyle_->convertMessageRoot(); - if( messageRoot.isNull() ) - { - // Assign standard HTML - chatMessageView_->setStandardHtml( newHtml, chatStyle_->getCssFile(), chatStyle_->getBaseFolder() ); + currentAccount_->openMailAtCompose( chatViewClickedUrl_.url().mid( 7 ) ); } else { - // Assign the custom HTML root - chatMessageView_->setHtml( messageRoot, newHtml ); + KMessShared::openBrowser( chatViewClickedUrl_ ); } - // If there are still grouped messages, add them after setHtml(). - // This allows the chatMessageView_ to replace them later with replaceLastMessage(); - if( ! lastContactMessages_.isEmpty() ) - { - chatMessageView_->addHtmlMessage( chatStyle_->convertMessageList(lastContactMessages_) ); - // Don't clear queue here, so replaceLastMessage() will be called. - } - - // Call the scroll function a bit later, - // so Qt/kde get a chance to update the height before the scrolling starts. - QTimer::singleShot(50, chatMessageView_, SLOT(scrollChatToBottom())); + // Reset the url + chatViewClickedUrl_.clear(); } @@ -1532,43 +954,9 @@ void ChatView::updateCustomEmoticon( const QString &handle, const QString &code const ContactBase *contact = currentAccount_->getContactByHandle(handle); if(KMESS_NULL(contact)) return; - // Get emoticon replacement, instruct chatMesasgeView to replace it. + // Get emoticon replacement, instruct chatMessageView to replace it. const QString &replacement = contact->getEmoticonReplacements()[code]; - chatMessageView_->updateCustomEmoticon( code, replacement, handle, pendingEmoticonTags_ ); -} - - - -// Update the editor's font to match the account's font -void ChatView::updateEditorFont() -{ -#ifdef KMESSTEST - KMESS_ASSERT( currentAccount_ != 0 ); -#endif - QColor color; - - if( currentAccount_ == 0 ) - { - return; - } - - // Change the color to the user's color - color.setNamedColor( currentAccount_->getFontColor() ); - messageEdit_->setTextColor( color ); - messageEdit_->setFont( currentAccount_->getFont() ); - messageEdit_->setCurrentFont( currentAccount_->getFont() ); - messageEdit_->setFontPointSize( currentAccount_->getFont().pointSize() ); - - // If the contact font settings changed, regenerate the messages. - if( chatStyle_ != 0 ) - { - if( currentAccount_->getUseContactFont() != chatStyle_->getUseContactFont() - || currentAccount_->getContactFont() != chatStyle_->getContactFont() - || currentAccount_->getContactFontColor() != chatStyle_->getContactFontColor() ) - { - updateChatStyle(); - } - } + chatMessageView_->updateCustomEmoticon( code, replacement, handle ); } diff --git a/src/chat/chatview.h b/src/chat/chatview.h index 3dfb47e..40af254 100644 --- a/src/chat/chatview.h +++ b/src/chat/chatview.h @@ -19,29 +19,20 @@ #define CHATVIEW_H #include "../network/chatmessage.h" - -#include "ui_chatview.h" - -#include -#include -#include - -#include -#include -#include +#include "../account.h" +#include "chatmessageview.h" // Forward declarations -class KMenu; +class QTextDocument; class ChatMessageStyle; class ChatMessageView; -class ContactAction; -class ContactSidebar; +class ContactsWidget; class CurrentAccount; -class InkEdit; +class EmoticonsWidget; +class InkImage; class KMessTest; -class KTextEdit; @@ -51,7 +42,7 @@ class KTextEdit; * @author Mike K. Bennett * @ingroup Chat */ -class ChatView : public QWidget, private Ui::ChatView +class ChatView : public QWidget { Q_OBJECT @@ -59,163 +50,109 @@ class ChatView : public QWidget, private Ui::ChatView public: // The constructor - ChatView( QWidget *parent=0 ); + ChatView( QWidget *parent = 0 ); // The destructor virtual ~ChatView(); // Copy the currently selected text void editCopy(); // Initialize the object bool initialize(); - // Return the contact action with the given handle - ContactAction *getContactActionByHandle(const QString& handle); - // Return a pointer to this chat's menu of inviteable contacts - KMenu *getInviteMenu() const; - // Return a pointer to this chat's Contact Sidebar - ContactSidebar *getContactSidebar() const; - // Return the encoding of the HTML document. - QString getEncoding() const; - // Return the HTML source of the page. - QString getHtml() const; - // Give access to the message edit area. - KTextEdit *getMessageEditField() const; - // Return the selected text in the message area. - QString getSelectedText(bool asHtml) const; + // Return a pointer to this chat's Contacts Widget + ContactsWidget *getContactsWidget() const; + // Return a pointer to the ink image drawn by the user in this chat + InkImage *getInkEditContents() const; + // Return a pointer to the text typed by the user in this chat + QTextDocument *getMessageEditContents() const; + // Get the text zoom factor + int getZoomFactor(); // Whether or not the message area is empty bool isEmpty() const; + // Scroll the view forward or backward + void scrollTo( bool forward, bool fast ); + // Scroll the view down to the last line + void scrollToBottom(); + // Change the text zoom factor + void setZoomFactor( int percentage ); // Update the messages which contain custom emoticons void updateCustomEmoticon( const QString &handle, const QString &code ); - // Change the text zoom factor - void changeZoomFactor( bool increase ); - // Restore the window properties (called by the parent ChatWindow) - void readProperties( const KConfigGroup &config = *((const KConfigGroup*)0) ); - // Save the window properties (called by the parent ChatWindow) - void saveProperties( KConfigGroup &config = *((KConfigGroup*)0) ); public slots: - // Insert an emoticon into the message editor - void insertEmoticon( QString emoticonText ); - // Scroll to the bottom of the chat browser - void scrollChatToBottom(); // Enable or disable the parts of the chat which allow user interaction void setEnabled( bool isEnabled ); // Add the given message to the message browser. void showMessage( const ChatMessage &message ); // Show a dialog to save the chat. void showSaveChatDialog(); + // The user clicked the "find text" option in the context menu + void slotFindChatText(); // Save the chat to the given file - void saveChatToFile(const QString &path ); + bool saveChatToFile( const QString &path, Account::ChatExportFormat format, bool overwriteContents, bool allowUserInteraction = true ); + // Clear the chat's contents + void slotClearChat(); private: // Private methods - // Create the contact actions - void createContactActions(); // Event filter to detect special actions in the message editor. bool eventFilter( QObject *obj, QEvent *event ); - // Set up the contact sidebar - bool initializeContactSidebar(); + // Set up the contacts widget + bool initializeContactsWidget(); // Initialize the current account bool initializeCurrentAccount(); - // Send a ink via server - void sendInk(); - // Send a message via the server - void sendMessage(); + // Invite a contact to the chat + virtual void inviteContacts( const QStringList &contacts ) = 0; // Send a file to a contact. virtual void startFileTransfer( QList fileList = QList() ) = 0; private slots: // Private slots - // The user pressed return in the message editor, so send the message - void enterPressed(); - // The message text changed, so the user is typing - void messageTextChanged(); - // The user clicked the new line button so insert a new line in the editor - void newLineClicked(); - // The user clicked send, so send the message - void sendClicked(); + // Add a contact's email to the contact list + void slotAddContact(); // Open a dialog to add a new custom emoticon seen in the chat void slotAddNewEmoticon(); - // The user are drawing a ink - void slotInkModified( bool erasered ); // The user clicked a kmess internal link in the ChatMessageView void slotSendAppCommand(); // The user clicked the "copy address" or "copy email" option in the context menu void slotCopyAddress(); // The user clicked the "copy text" option in the context menu. void slotCopyChatText(); - // The user clicked the "find text" option in the context menu - void slotFindChatText(); + // Add an emoticon from the chat to the contact's emoticon blacklist + void slotIgnoreEmoticon(); // Open a new url clicked in the khtml widget void slotOpenURLRequest( const KUrl &url ); // The user clicked the "select all" option in the context menu. void slotSelectAllChatText(); // The user right clicked at the KHTMLPart to show a popup. void slotShowContextMenu(const QString &url, const QPoint &point); - // Switch the editor between ink editor and text editor - void slotSwitchEditor(); // The user clicked the "visit address" or "send email" option in the context menu, or clicked a link in the ChatMessageView void slotVisitAddress(); - // Update the editor's font to match the account's font - void updateEditorFont(); - protected: // Protected attributes - // The contact sidebar, which goes in the sidebar - ContactSidebar *contactSidebar_; + // The contacts widget, containing the contacts present in this chat + ContactsWidget *contactsWidget_; // A pointer to the instance of the current account CurrentAccount *currentAccount_; private: // Private attributes - QList chatMessages_; // The embedded khtml part ChatMessageView *chatMessageView_; - // The XSL transformation handler - ChatMessageStyle *chatStyle_; // URL address which has been right-clicked KUrl chatViewClickedUrl_; - // The contact actions in the invite menu - QList contactActions_; - // Stores the current level of zoom - int currentZoom_; - // Whether or not typing messages should be sent (true except the very moment a text message is sent) - bool doSendTypingMessages_; + // The text typed by the user in this chat + InkImage *inkEditContents_; // Whether or not the object was initialized bool initialized_; - // The ink editor - InkEdit *inkEdit_; - // The list of invitable contacts - KMenu *inviteMenu_; - // The last messages sent by the same contact. This is used to combine them - QList lastContactMessages_; - // The messages that contain custom emoticons - QStringList pendingEmoticonTags_; - // A timer to time whether a "user is typing" message should be sent. - QTimer userTypingTimer_; - // Index for fast-retype - int indexSentences_; - // Last sentence in writing - QString lastSentence_; - - private slots: - // The color in the text box changed. - void editorColorChanged(const QColor &color); - // Update the chat style - void updateChatStyle(); - // Invite a contact to the chat - virtual void inviteContact(QString handle) = 0; + // The text typed by the user in this chat + QTextDocument *messageEditContents_; signals: // Public signals + // Signal that the user wants to add a new contact email, seen in the chat log + void addContact( QString handle ); // Signal that the user wants to add a new custom emoticon copying it from a friend's - void addEmoticon(QString handle, QString shortcut); + void addEmoticon(QString handle, QString shortcut); // Signal that there's an application command void appCommand(QString cookie, QString contact, QString method); - // Signal that the given text should be sent as a message - void sendMessageToContact(QString text); - // Signal that the given ink should be sent as a message - void sendInkToContact( QByteArray ink ); // Signal that the user wants to transfer some files void sendFiles( QList urls ); // Signal for ChatMessageView to replace an application's accept/reject/cancel links with another text void updateApplicationMessage( const QString &messageId, const QString &newMessage ); - // Signal that the user is typing - void userIsTyping(); }; #endif diff --git a/src/chat/chatview.ui b/src/chat/chatview.ui deleted file mode 100644 index b92ce2f..0000000 --- a/src/chat/chatview.ui +++ /dev/null @@ -1,231 +0,0 @@ - - ChatView - - - - 0 - 0 - 289 - 281 - - - - - 0 - - - 0 - - - - - - 0 - 0 - - - - 0 - - - Qt::Vertical - - - 4 - - - false - - - - - 0 - 100 - - - - - 250 - 175 - - - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - - - - 0 - 0 - - - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - - 1 - - - 0 - - - - - - 0 - 0 - - - - - 200 - 70 - - - - - 32767 - 32767 - - - - Qt::NoFocus - - - QFrame::NoFrame - - - QFrame::Sunken - - - - 0 - - - 0 - - - - - - 1 - 0 - - - - - 200 - 70 - - - - - 32767 - 32767 - - - - Qt::WheelFocus - - - QFrame::StyledPanel - - - false - - - - - - - - - - 4 - - - - - - - - - - - - Qt::Horizontal - - - - 18 - 17 - - - - - - - - - 0 - 0 - - - - Ne&w Line - - - Alt+W - - - - - - - - 0 - 0 - - - - S&end - - - Alt+E - - - - - - - - - - - - - qPixmapFromMimeSource - - - KTextEdit - QTextEdit -
ktextedit.h
-
-
- - -
diff --git a/src/chat/chatwindow.cpp b/src/chat/chatwindow.cpp index cfb31ff..2ecda10 100644 --- a/src/chat/chatwindow.cpp +++ b/src/chat/chatwindow.cpp @@ -17,19 +17,29 @@ #include "chatwindow.h" +#include "../contact/contact.h" +#include "../contact/msnobject.h" +#include "../contact/invitedcontact.h" +#include "../dialogs/invitedialog.h" +#include "../model/contactlist.h" #include "../network/msnswitchboardconnection.h" #include "../utils/richtextparser.h" #include "../utils/kmessconfig.h" +#include "../utils/kmessshared.h" #include "../currentaccount.h" #include "../kmess.h" #include "../kmessapplication.h" #include "../kmessdebug.h" #include "chat.h" #include "config-kmess.h" -#include "contactsidebar.h" -#include "emoticonsidebar.h" +#include "contactswidget.h" +#include "emoticonswidget.h" +#include "inkedit.h" +#include "winkswidget.h" +#include #include +#include #include #include @@ -48,76 +58,138 @@ #ifdef KMESSDEBUG_CHATWINDOW -// #define KMESSDEBUG_CHATWINDOW_TYPING_MESSAGES + #define KMESSDEBUG_CHATWINDOW_TYPING_MESSAGES #endif +#define TYPING_NOTIFICATION_TIME 4000 + + // The constructor ChatWindow::ChatWindow( QWidget *parent ) -: KMainWindow( parent ) +: KXmlGuiWindow( parent ) , Ui::ChatWindow() +, actionCollection_( actionCollection() ) +, blinkToUpper_( true ) , currentAccount_( 0 ) -, currentInviteMenu_( 0 ) -, customEmoticonSidebar_( 0 ) +, doSendTypingMessages_( true ) +, indexSentences_( 0 ) , initialized_( false ) -, isSidebarTemporary_( false ) -, lastActiveChatIndex_( -1 ) -, standardEmoticonSidebar_( 0 ) +, zoomLevel_( 100 ) { + setObjectName( "ChatWindow#" ); + // Create the interface QWidget *mainWidget = new QWidget( this ); setupUi( mainWidget ); setCentralWidget( mainWidget ); - // Create the menus - initMenus(); + // Connect the UI signals + connect( sendButton_, SIGNAL( clicked() ), + this, SLOT ( slotSendButtonClicked() ) ); + connect( newLineButton_, SIGNAL( clicked() ), + this, SLOT ( slotNewLineButtonClicked() ) ); + connect( messageEdit_, SIGNAL( textChanged() ), + this, SLOT ( slotMessageChanged() ) ); + connect( inkEdit_, SIGNAL( inkChanged() ), + this, SLOT ( slotMessageChanged() ) ); + connect( textButton_, SIGNAL( clicked() ), + this, SLOT ( slotSwitchEditor() ) ); + connect( inkButton_, SIGNAL( clicked() ), + this, SLOT ( slotSwitchEditor() ) ); + connect( winksButton_, SIGNAL( clicked() ), + this, SLOT ( slotSwitchEditor() ) ); + connect( standardEmoticonButton_, SIGNAL( clicked() ), + this, SLOT ( slotSwitchEditor() ) ); + connect( customEmoticonButton_, SIGNAL( clicked() ), + this, SLOT ( slotSwitchEditor() ) ); - // Create the tabs bar - tabBar_ = new KTabBar( this ); - tabBar_->setElideMode( Qt::ElideRight ); - tabBar_->setDrawBase( false ); - tabBar_->setUsesScrollButtons( false ); -#if KDE_IS_VERSION(4,0,70) - tabBar_->setCloseButtonEnabled( true ); + // Create the contacts dock + contactsDock_ = new QDockWidget( i18n( "Contacts" ), this ); + contactsDock_->setObjectName( "ContactsDockWidget" ); + contactsDock_->setAllowedAreas( Qt::AllDockWidgetAreas ); + contactsDock_->setFeatures( QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable ); + + // Create the standard emoticons dock + standardEmoticonsDock_ = new QDockWidget( i18n( "Emoticons" ), this ); + standardEmoticonsDock_->setObjectName( "StandardEmoticonsDockWidget" ); + standardEmoticonsDock_->setAllowedAreas( Qt::AllDockWidgetAreas ); + standardEmoticonsDock_->setFeatures( QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable ); + standardEmoticonsDock_->hide(); // Hide it by default + + // Create the custom emoticons dock + customEmoticonsDock_ = new QDockWidget( i18n( "My Emoticons" ), this ); + customEmoticonsDock_->setObjectName( "CustomEmoticonsDockWidget" ); + customEmoticonsDock_->setAllowedAreas( Qt::AllDockWidgetAreas ); + customEmoticonsDock_->setFeatures( QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable ); + customEmoticonsDock_->hide(); // Hide it by default + + // Add them to the window + setDockOptions( QMainWindow::AnimatedDocks | QMainWindow::AllowTabbedDocks ); + addDockWidget( Qt::RightDockWidgetArea, contactsDock_ ); + addDockWidget( Qt::RightDockWidgetArea, standardEmoticonsDock_ ); + addDockWidget( Qt::RightDockWidgetArea, customEmoticonsDock_ ); + + //Install the event filters to catch events + installEventFilter( this ); + inkEdit_ ->installEventFilter( this ); + messageEdit_->installEventFilter( this ); + messageEdit_->viewport()->installEventFilter( this ); + + // Set the button icons + standardEmoticonButton_->setIcon( KIcon( "face-smile" ) ); + customEmoticonButton_ ->setIcon( KIcon( "face-smile-gearhead-female" ) ); + inkButton_ ->setIcon( KIcon( "draw-brush" ) ); + winksButton_ ->setIcon( KIcon( "applications-toys" ) ); + textButton_ ->setIcon( KIcon( "draw-text" ) ); + + // Connect the message edit so that if its displayed color changes, + // it's checked to match the user's chosen color. + connect( messageEdit_, SIGNAL( currentColorChanged(const QColor&) ), + this, SLOT ( editorColorChanged(const QColor&) ) ); + // Connect the docks signals + connect( standardEmoticonsDock_, SIGNAL( visibilityChanged(bool) ), + this, SLOT ( slotEmoticonDocksToggled() ) ); + connect( customEmoticonsDock_, SIGNAL( visibilityChanged(bool) ), + this, SLOT ( slotEmoticonDocksToggled() ) ); + // And the tab widget signals + connect( chatTabs_, SIGNAL( mouseMiddleClick(QWidget*) ), + this, SLOT ( slotTabRemoved(QWidget*) ) ); + connect( chatTabs_, SIGNAL( closeRequest(QWidget*) ), + this, SLOT ( slotTabRemoved(QWidget*) ) ); + connect( chatTabs_, SIGNAL( currentChanged(int) ), + this, SLOT ( slotTabChanged(int) ) ); + + // Workaround for tab close buttons in KDE 4.0: Enable the buttons on hover +#if KDE_IS_VERSION( 4, 1, 0 ) + chatTabs_->setCloseButtonEnabled( true ); #else - tabBar_->setHoverCloseButton( true ); - tabBar_->setHoverCloseButtonDelayed( true ); + chatTabs_->setHoverCloseButton( true ); + chatTabs_->setHoverCloseButtonDelayed( true ); #endif - tabFrame_->layout()->addWidget( tabBar_ ); - connect( tabBar_, SIGNAL( currentChanged(int) ), - this, SLOT ( slotSwitchTab(int) ) ); - connect( tabBar_, SIGNAL( closeRequest(int) ), - this, SLOT ( slotSwitchAndDeleteTab(int) ) ); - connect( tabBar_, SIGNAL( mouseMiddleClick(int) ), - this, SLOT ( slotSwitchAndDeleteTab(int) ) ); - connect( tabBar_, SIGNAL( wheelDelta(int) ), - this, SLOT ( slotWheelMouseMoved(int) ) ); - - // Associate the keyboard shortcuts - new QShortcut( QKeySequence("Esc"), this, SLOT( queryClose() ) ); - new QShortcut( QKeySequence("Shift+Esc"), this, SLOT( queryCloseAll() ) ); - new QShortcut( QKeySequence(QKeySequence::NextChild), this, SLOT( slotSwitchToRightTab() ) ); - new QShortcut( QKeySequence(QKeySequence::PreviousChild), this, SLOT( slotSwitchToLeftTab() ) ); - new QShortcut( QKeySequence(QKeySequence::Forward), this, SLOT( slotSwitchToRightTab() ) ); - new QShortcut( QKeySequence(QKeySequence::Back), this, SLOT( slotSwitchToLeftTab() ) ); - - // Create the status bar - statusLabel_ = new KSqueezedTextLabel( this ); - statusLabel_->setTextFormat( Qt::PlainText ); + statusLabel_ = new ChatStatusBar( this ); statusBar()->addWidget( statusLabel_, 1 ); - // NOTE: Workaround - if the next statement is omitted, the first status message ever shown never appears - showStatusMessage( " " ); - // Install a filter to catch window activation events, to stop title blinking - installEventFilter( this ); + // Create the menus and actions + createMenus(); + // Build the gui from xml + setupGUI( Default, "chatwindowui.rc" ); + + + // Lastly, initialize the "Typing notification" timer + userTypingTimer_.setInterval( TYPING_NOTIFICATION_TIME ); + userTypingTimer_.setSingleShot( true ); + + + // Forward reconnect signal + connect( statusLabel_, SIGNAL( reconnect() ), + this, SIGNAL( reconnect() ) ); // Setup the window title blinking timer - blinkTimer_.setSingleShot( false ); connect( &blinkTimer_, SIGNAL( timeout() ), this, SLOT ( slotBlinkCaption() ) ); - // Setup the status bar text timer statusTimer_.setSingleShot( true ); connect( &statusTimer_, SIGNAL( timeout() ), @@ -139,110 +211,377 @@ ChatWindow::~ChatWindow() -// Show the "about KDE" message. -void ChatWindow::aboutKDE() -{ - helpMenu_->aboutKDE(); -} - - - -// Show the "about KMess" message. -void ChatWindow::aboutKMess() -{ - helpMenu_->aboutApplication(); -} - - - // Add a new chat tab -Chat *ChatWindow::addChatTab( Chat *newChat ) +Chat *ChatWindow::addChatTab( Chat *newChat, bool foreground ) { - // Add the new tab to the list of chats - chats_.append( newChat ); - - // Also create a tab for the new chat - tabBar_->addTab( newChat->getCaption() ); - - // If there's more than one tab, show the bar and the Close All option - bool moreThanOneTabs = ( chats_.count() > 1 ); - tabBar_->setVisible( moreThanOneTabs ); - closeAllAction_->setVisible( moreThanOneTabs ); - // Connect its main signals connect( newChat, SIGNAL( chatInfoChanged() ), - this, SLOT ( slotChatInfoChanged() ) ); + this, SLOT ( slotUpdateChatInfo() ) ); connect( newChat, SIGNAL( gotNudge() ), this, SLOT ( slotGotNudge() ) ); - connect( newChat, SIGNAL( sendMessageToContact(QString) ), - this, SLOT ( slotUserSentMessage() ) ); connect( newChat, SIGNAL( gotChatMessage(const ChatMessage&,Chat*) ), this, SLOT ( slotGotChatMessage(const ChatMessage&,Chat*) ) ); connect( newChat, SIGNAL( gotTypingMessage(Chat*) ), this, SLOT ( slotGotTypingMessage(Chat*) ) ); - // Add the chat's view and contact sidebar to the window's frames - chatFrame_->layout()->addWidget( newChat ); - contactSidebarFrame_->layout()->addWidget( newChat->getContactSidebar() ); + // Also create a tab for the new chat + int newTabIndex = chatTabs_->addTab( newChat, QString() ); + slotUpdateChatInfo( newChat ); + + // The chat is the new active one: raise it and update the chat window + if( foreground ) + { + chatTabs_->setCurrentIndex( newTabIndex ); + } + + // Set the appropriate parent of the contactswidget. + // This is needed when a chat is moved to another window. + newChat->getContactsWidget()->setParent( contactsDock_ ); + + // Apply the window's settings to the tab + newChat->getContactsWidget()->setDockWidget( contactsDock_, dockWidgetArea( contactsDock_ ) ); + newChat->setZoomFactor( zoomLevel_ ); + + // If there's more than one tab now, enable the Close All option + bool hasMultipleTabs = ( chatTabs_->count() > 1 ); + closeAllAction_->setEnabled( hasMultipleTabs ); + prevTabAction_->setEnabled( hasMultipleTabs ); + nextTabAction_->setEnabled( hasMultipleTabs ); + + // Tab grouping is disabled, hide the bar + chatTabs_->setTabBarHidden( currentAccount_->getTabbedChatMode() == 2 ); return newChat; } -// Make the caption blink if the window still doesn't have focus -void ChatWindow::slotBlinkCaption() +// Set the zoom factor of the text +void ChatWindow::changeZoomFactor( bool increase ) { - // If the window now has focus, stop blinking - if( isActiveWindow() ) - { - // Stop the timer - blinkTimer_.stop(); + int newZoom = zoomLevel_; - // Reset the caption to normal - setWindowTitle(); + if( increase ) + { + newZoom += 25; + } + else + { + newZoom -= 25; + } + + if( newZoom < 20 || newZoom > 300 ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Zoom level out of bounds, not updating."; +#endif return; } - // Make the caption alternate case - if ( blinkToUpper_ ) - { - setWindowTitle( QString( "* " + caption_.toUpper() ) ); - } - else - { - setWindowTitle( QString( "* " + caption_.toLower() ) ); - } + // Apply the zoom level to all chats + zoomLevel_ = newZoom; - blinkToUpper_ = ! blinkToUpper_; + for( int i = 0; i < chatTabs_->count(); i++ ) + { + getChat( i )->setZoomFactor( zoomLevel_ ); + } } -// Toggle the sidebar based on account preferences -void ChatWindow::checkSidebarPreferences() +// Check if the window must be closed +bool ChatWindow::checkAndCloseWindow() { - if( KMESS_NULL( sidebar_ ) ) return; - if( KMESS_NULL( currentAccount_ ) ) return; - - if( currentAccount_->getShowSidebar() ) + // Check how many chat are still opened + int chatsNumber = chatTabs_->count(); + if( chatsNumber > 0 ) { - isSidebarTemporary_ = false; - sidebar_->show(); + // If there's more than one tab, show the Close All option and close button + bool hasMultipleTabs = ( chatTabs_->count() > 1 ); + closeAllAction_->setEnabled( hasMultipleTabs ); + prevTabAction_->setEnabled( hasMultipleTabs ); + nextTabAction_->setEnabled( hasMultipleTabs ); + return false; + } + + // Save GUI settings if needed + if ( settingsDirty() && autoSaveSettings() ) + { + saveAutoSaveSettings(); + } + + // Kill this window + hide(); + deleteLater(); + + return true; +} + + + +// The chat window is closing +bool ChatWindow::closeAllTabs() +{ + if( chatTabs_->count() > 1 ) + { + int res = KMessageBox::questionYesNoCancel( this, + i18n( "There are multiple tabs opened in this chat window. Do you want to close the " + "current tab only, or all tabs?

" + "Note: You can close all tabs at once by pressing Alt+F4." ), + i18nc( "Dialog box caption: closing a chatwindow with a single tab", "Closing a Chat Tab" ), + KGuiItem( i18n( "Close All Tabs" ), "window-close" ), // Yes option + KGuiItem( i18n( "Close Current Tab" ), "tab-close" ), // No option + KStandardGuiItem::cancel(), + "closeOneChatTabInfo" ); + switch( res ) + { + case KMessageBox::Yes : break; + case KMessageBox::No : return closeTab(); + case KMessageBox::Cancel: + default : return false; + } + } + + // Just close all tabs one by one, until the last one closes the window too + while( chatTabs_->count() > 0 ) + { + closeTab(); + } + + return true; +} + + + +// A chat tab is closing +bool ChatWindow::closeTab() +{ +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Close request detected."; +#endif + + Chat *currentChat = getCurrentChat(); + if( currentChat != 0 ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Closing current chat tab " << currentChat; +#endif + + if( ! slotTabRemoved( currentChat ) ) + { + kWarning() << "Unable to close the current chat!"; + } + } + + // If there still are open tabs, don't close + return checkAndCloseWindow(); +} + + + +// Close any open widget or close the tab +void ChatWindow::closeWidgetOrTab() +{ + // if the Esc button was pressend on emoticon/ink editor then + // set the editor to Message Editor + if( ! messageEdit_->isVisible() ) + { + slotSwitchEditor(); } else { - isSidebarTemporary_ = true; - sidebar_->hide(); + // Else close the current tab + closeTab(); } } -// put the marked text/object into the clipboard +// Create the menus. +void ChatWindow::createMenus() +{ + KAction *closeAction, *saveAction, *quitAction; + KAction *copy, *findAction, *zoomIn, *zoomOut, *clearChatAction; + QAction *contactsDockAction, *standardEmoticonsDockAction, *customEmoticonsDockAction; + + + // Create the actions for "Chat" menu + inviteButton_ = new KAction ( KIcon("list-add-user"), i18n("&Invite..."), this ); + sendAction_ = new KAction ( KIcon("folder-remote"), i18n("Send a &File..."), this ); + webcamAction_ = new KAction ( KIcon("webcamsend"), i18n("Webcam Chat"), this ); + meetingAction_ = new KAction ( KIcon("gnomemeeting"), i18n("Start a &Meeting"), this ); + nudgeAction_ = new KAction ( KIcon("preferences-desktop-notification-bell"), i18n("Send a &Nudge!"), this ); + saveAction = new KAction ( KIcon("document-save"), i18n("Save Chat..."), this ); + closeAllAction_ = new KAction ( KIcon("dialog-close"), i18n("Close &All Tabs"), this ); + closeAction = KStandardAction::close ( this, SLOT( closeWidgetOrTab() ) , actionCollection_ ); + quitAction = KStandardAction::quit ( kapp, SLOT( quit() ), actionCollection_ ); + + // Create the actions for "Edit" menu + changeFontAction_ = new KAction ( KIcon("preferences-desktop-font"), i18n("Change &Font"), this ); + changeFontColorAction_ = new KAction ( KIcon("format-stroke-color"), i18n("Change Font &Color"), this ); + cutAction_ = KStandardAction::cut ( messageEdit_, SLOT( cut() ), actionCollection_ ); + copy = KStandardAction::copy ( messageEdit_, SLOT( copy() ), actionCollection_ ); + pasteAction_ = KStandardAction::paste ( messageEdit_, SLOT( paste() ), actionCollection_ ); + findAction = KStandardAction::find ( this, SLOT( editFind() ), actionCollection_ ); + + // Create the actions for "View" menu + emoticonAction_ = new KToggleAction( KIcon("face-smile-big"), i18n("Show &Emoticons"), this ); + sessionInfoAction_ = new KToggleAction( KIcon("flag-green"), i18n("Show S&tatus Messages"), this ); + zoomIn = KStandardAction::zoomIn ( this, SLOT( viewZoomIn() ), actionCollection_ ); + zoomOut = KStandardAction::zoomOut( this, SLOT( viewZoomOut() ), actionCollection_ ); + prevTabAction_ = KStandardAction::back ( this, SLOT( slotSwitchToLeftTab() ), actionCollection_ ); + nextTabAction_ = KStandardAction::forward( this, SLOT( slotSwitchToRightTab() ), actionCollection_ ); + clearChatAction = KStandardAction::clear ( this, SLOT( viewClearChat() ), actionCollection_ ); + panelsMenuAction_ = new KActionMenu ( KIcon("view-choose"), i18n("&Panels"), this ); + + // Create the actions for "Settings" menu + spellCheckAction_ = new KToggleAction( KIcon("tools-check-spelling"), i18n("Use &Spell Checking"), this ); + showMenuBar_ = KStandardAction::showMenubar( this, SLOT( showMenuBar() ), actionCollection_ ); + + // Add shorter texts for the toolbar items + meetingAction_->setIconText( i18n("Meeting") ); + nudgeAction_ ->setIconText( i18n("Nudge") ); + sendAction_ ->setIconText( i18n("Send a &File") ); + + // Rename the tab navigation actions for clarity + prevTabAction_->setText ( i18n("P&revious Tab") ); + prevTabAction_->setIconText( i18n("P&revious Tab") ); + nextTabAction_->setText ( i18n("Ne&xt Tab") ); + nextTabAction_->setIconText( i18n("Ne&xt Tab") ); + + // Enable some default action shortcuts (preserve the original ones where needed) + nudgeAction_->setShortcut( QKeySequence( "Alt+Z" ) ); + closeAction->setShortcuts( QList() << QKeySequence( "Ctrl+W" ) << QKeySequence( "Esc" ) << closeAction->shortcut() ); + closeAllAction_->setShortcuts( QList() << QKeySequence( "Ctrl+Q" ) << closeAllAction_->shortcut() ); + prevTabAction_->setShortcuts( QList() << QKeySequence( QKeySequence::PreviousChild ) << prevTabAction_->shortcut() ); + nextTabAction_->setShortcuts( QList() << QKeySequence( QKeySequence::NextChild ) << nextTabAction_->shortcut() ); + + // Set up the dock actions + contactsDockAction = contactsDock_ ->toggleViewAction(); + standardEmoticonsDockAction = standardEmoticonsDock_->toggleViewAction(); + customEmoticonsDockAction = customEmoticonsDock_ ->toggleViewAction(); + + contactsDockAction->setIcon( KIcon("meeting-attending") ); + contactsDockAction->setToolTip( i18n("Enable or disable the contacts panel") ); + contactsDockAction->setText( i18nc("Toolbar button","Contacts") ); + contactsDockAction->setIconText( i18nc("Toolbar button","Contacts") ); + contactsDockAction->setShortcut( QKeySequence( "Ctrl+D" ) ); + + standardEmoticonsDockAction->setIcon( KIcon("face-smile") ); + standardEmoticonsDockAction->setToolTip( i18n("Enable or disable the standard emoticons panel") ); + standardEmoticonsDockAction->setText( i18nc("Toolbar button","Emoticons") ); + standardEmoticonsDockAction->setIconText( i18nc("Toolbar button","Emoticons") ); + standardEmoticonsDockAction->setShortcut( QKeySequence( "Ctrl+E" ) ); + + customEmoticonsDockAction->setIcon( KIcon("face-smile-gearhead-female") ); + customEmoticonsDockAction->setToolTip( i18n("Enable or disable the Custom Emoticons panel") ); + customEmoticonsDockAction->setText( i18nc("Toolbar button","My Emoticons") ); + customEmoticonsDockAction->setIconText( i18nc("Toolbar button","My Emoticons") ); + customEmoticonsDockAction->setShortcut( QKeySequence( "Ctrl+Y" ) ); + + // Add the dock toggling actions to the Panels menu + panelsMenuAction_->addAction( contactsDockAction ); + panelsMenuAction_->addAction( standardEmoticonsDockAction ); + panelsMenuAction_->addAction( customEmoticonsDockAction ); + + // Initially the chat has one tab only, so the Close All option is not useful + closeAllAction_->setEnabled( false ); + + // Add shorter texts for the toolbar + changeFontAction_ ->setIconText( i18n("&Font") ); + changeFontColorAction_->setIconText( i18n("Font &Color") ); + clearChatAction->setText( i18n("C&lear Chat Window") ); + clearChatAction->setIconText( i18n("C&lear Chat") ); + + // Connect slots to signals for "Chat" menu + connect( inviteButton_, SIGNAL( triggered(bool) ), + this, SLOT ( slotInviteContact() ) ); + connect( sendAction_, SIGNAL( triggered(bool) ), + this, SLOT ( startFileTransfer() ) ); + connect( webcamAction_, SIGNAL( triggered(bool) ), + this, SLOT ( startWebcamTransfer() ) ); + connect( nudgeAction_, SIGNAL( triggered(bool) ), + this, SLOT ( sendNudge() ) ); + connect( meetingAction_, SIGNAL( triggered(bool) ), + this, SLOT ( startMeeting() ) ); + connect( saveAction, SIGNAL( triggered(bool) ), + this, SLOT ( saveChat() ) ); + connect( closeAllAction_, SIGNAL( triggered() ), + this, SLOT ( closeAllTabs() ) ); + + // Connect slots to signals for "Edit" menu + connect( changeFontAction_, SIGNAL( triggered(bool) ), + this, SLOT ( editFont() ) ); + connect( changeFontColorAction_,SIGNAL( triggered(bool) ), + this, SLOT ( editFontColor() ) ); + connect( clearChatAction, SIGNAL( triggered() ), + this, SLOT ( viewClearChat() ) ); + + // Connect slots to signals for "Settings" menu + connect( emoticonAction_, SIGNAL( toggled(bool) ), + this, SLOT ( toggleEmoticons(bool) ) ); + connect( spellCheckAction_, SIGNAL( toggled(bool) ), + this, SLOT ( toggleSpellCheck(bool) ) ); + connect( sessionInfoAction_, SIGNAL( toggled(bool) ), + this, SLOT ( toggleSessionInfo(bool) ) ); + + + // Add actions to actionCollection for "Chat" menu + actionCollection_->addAction( "send", sendAction_ ); +#if ENABLE_WEBCAM + actionCollection_->addAction( "webcam", webcamAction_ ); +#endif + actionCollection_->addAction( "meeting", meetingAction_ ); + actionCollection_->addAction( "nudge", nudgeAction_ ); + actionCollection_->addAction( "save", saveAction ); + actionCollection_->addAction( "closeAll", closeAllAction_ ); + actionCollection_->addAction( "invite", inviteButton_ ); + + // Add actions to actionCollection for "Edit" menu + actionCollection_->addAction( "font", changeFontAction_ ); + actionCollection_->addAction( "fontColor", changeFontColorAction_ ); + + // Add actions to actionCollection for "View" menu + actionCollection_->addAction( "prevTab", prevTabAction_ ); + actionCollection_->addAction( "nextTab", nextTabAction_ ); + actionCollection_->addAction( "clearChat", clearChatAction ); + actionCollection_->addAction( "emoticons", emoticonAction_ ); + actionCollection_->addAction( "panelsMenu", panelsMenuAction_ ); + actionCollection_->addAction( "contactsDock", contactsDockAction ); + actionCollection_->addAction( "sessionInfo", sessionInfoAction_ ); + actionCollection_->addAction( "standardEmoticonsDock", standardEmoticonsDockAction ); + actionCollection_->addAction( "customEmoticonsDock", customEmoticonsDockAction ); + + // Add actions to actionCollection for "Settings" menu + actionCollection_->addAction( "spellCheck", spellCheckAction_ ); + + +#ifdef HAS_KPHONE // If KPhone is not enabled, don't support voice conversation + KAction *conversation = new KAction( "kphone", i18nc( "Menu/toolbar action for voice conversations (KPhone support)", + "Start or Stop a &Conversation"), this ); + + connect( send, SIGNAL( triggered(bool) ), + this, SLOT ( startConversation() ) ); + + actionCollection_->addAction( "conversation", conversation ); +#endif +} + + + +// Copy the currently selected text void ChatWindow::editCopy() { - getCurrentChat()->editCopy(); + // Get the cursor reference + QTextCursor cursor = messageEdit_->textCursor(); + + if( cursor.hasSelection() ) + { + messageEdit_->copy(); + } + else + + getCurrentChat()->editCopy(); } @@ -251,12 +590,21 @@ void ChatWindow::editCopy() // it from the document void ChatWindow::editCut() { - KTextEdit *typingField = getCurrentChat()->getMessageEditField(); - - if( typingField->hasFocus() ) + // If another editor has focus, don't actually cut anything + if( ! messageEdit_->hasFocus() ) { - typingField->cut(); + return; } + + messageEdit_->cut(); +} + + + +// Bring up a find dialog to search for text in the chat. +void ChatWindow::editFind() +{ + getCurrentChat()->slotFindChatText(); } @@ -264,33 +612,19 @@ void ChatWindow::editCut() // Bring up a dialog to change the message font color. void ChatWindow::editFont() { - QFont selection; - QString fontFamily; - int leftBracket; - - selection = currentAccount_->getFont(); + QFont selection( currentAccount_->getFont() ); int result = KFontDialog::getFont( selection, KFontChooser::NoDisplayFlags, this ); - if ( result == KFontDialog::Accepted ) - { - currentAccount_->setFont( selection ); - fontFamily = selection.family(); - // KDE3 seems to want to throw some stuff in square brackets at the - // end of font names. Strip that stuff off. - // I'm assuming no real proper font has "[" in the name. - leftBracket = fontFamily.indexOf( "[" ); - if ( leftBracket >= 0 ) - { - fontFamily = fontFamily.left( leftBracket ); - } - fontFamily = fontFamily.trimmed(); - selection.setFamily( fontFamily ); - // Set it to the stored account - currentAccount_->setFont( selection ); - // Commit changes to disk, now - currentAccount_->saveProperties(); + if( result != KFontDialog::Accepted ) + { + return; } + + currentAccount_->setFont( selection ); + + // Commit changes to disk, now + currentAccount_->saveProperties(); } @@ -298,15 +632,14 @@ void ChatWindow::editFont() // Bring up a dialog to change the message font color. void ChatWindow::editFontColor() { - QColor color = currentAccount_->getFontColor(); - QString fontColor; + QColor color( currentAccount_->getFontColor() ); // Show the color dialog int result = KColorDialog::getColor( color, this ); if ( result == KColorDialog::Accepted ) { // Get the string version of the selected color - fontColor = color.name(); + const QString& fontColor( color.name() ); // Set it to the stored account currentAccount_->setFontColor(fontColor); @@ -317,87 +650,254 @@ void ChatWindow::editFontColor() +// The color in the text box changed. +void ChatWindow::editorColorChanged(const QColor &color) + { +#ifdef KMESSTEST + KMESS_ASSERT( currentAccount_ != 0 ); +#endif + + // Whenever the QTextEdit's contents is entirely deleted, the font color spontaneously resets to black; + // if this happens, set the color back to the user's color. + // HACK: This possibly is a Qt <= 4.4 bug exposed. + if ( color.name() != currentAccount_->getFontColor() ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Color was reset to" << color.name() << ". Restoring it to the account setting."; +#endif + messageEdit_->setTextColor( QColor( currentAccount_->getFontColor() ) ); + } +} + + + // paste the clipboard into the document void ChatWindow::editPaste() { // Regardless of focus, always paste in message edit. - getCurrentChat()->getMessageEditField()->paste(); -} - - - -// enlarge the font size -void ChatWindow::editZoomIn() -{ - getCurrentChat()->changeZoomFactor( true ); -} - - - -// decrease the font size -void ChatWindow::editZoomOut() -{ - getCurrentChat()->changeZoomFactor( false ); -} - - - - -// The emoticon button was pressed. -void ChatWindow::showEmoticonPanel() -{ - // Find out what toolbox does the emoticon sidebar have - int emoticonSidebarId = sidebar_->indexOf( standardEmoticonSidebar_ ); - - // When the side bar is hidden, temporary show it. - if( ! sidebar_->isVisible() ) - { - isSidebarTemporary_ = true; - sidebar_->setCurrentIndex( emoticonSidebarId ); - sidebar_->show(); - } - else - { - // Sidebar is visible - - // Show the emoticon sidebar - if( sidebar_->currentIndex() != emoticonSidebarId ) - { - // Show emoticons - sidebar_->setCurrentIndex( emoticonSidebarId ); - } - else - { - // Emotion sidebar is displayed currently - // Hide the emoticon sidebar - if( isSidebarTemporary_ ) - { - // Hide again - sidebar_->hide(); - } - else - { - // Show Main tab (contacts) again - sidebar_->setCurrentIndex( sidebar_->indexOf( getCurrentChat()->getContactSidebar() ) ); - } - } - } + messageEdit_->paste(); } // Filter to catch window activation events -bool ChatWindow::eventFilter( QObject */*obj*/, QEvent *event ) +bool ChatWindow::eventFilter( QObject *obj, QEvent *event ) { + if( obj == this && event->type() == QEvent::WindowActivate ) + { + // Stop blinking immediately when the window is activated + if( blinkTimer_.isActive() ) + { + blinkTimer_.stop(); + blinkToUpper_ = true; + setWindowTitle(); + } + + // Give focus to the current message editor + if( messageEdit_->isVisible() ) + { + messageEdit_->setFocus(); + } + else if( inkEdit_->isVisible() ) + { + inkEdit_->inkFrame_->setFocus(); + } + + return false; + } + + // Only manage events for the editors from now on (the event filter code + // is complex enough as it is now...) + if( obj != messageEdit_ && obj != messageEdit_->viewport() + && obj != inkEdit_ + && obj != standardEmoticonsWidget_ + && obj != customEmoticonsWidget_ ) + { + return false; + } switch( event->type() ) { - case QEvent::WindowActivate: - // Stop blinking immediately when the window is activated - if( blinkTimer_.isActive() ) + // If a key was pressed, check if it's return and if so, send the drawing + case QEvent::KeyPress: + { + QKeyEvent *keyEvent = static_cast( event ); + bool ctrl = keyEvent->modifiers() & Qt::ControlModifier; + bool shift = keyEvent->modifiers() & Qt::ShiftModifier; + bool alt = keyEvent->modifiers() & Qt::AltModifier; + int key = keyEvent->key(); + + if( key == Qt::Key_Return || key == Qt::Key_Enter ) { - blinkTimer_.stop(); - setWindowTitle(); + if( shift || ctrl ) + { + // ctrl+enter or shift+enter, insert a new line instead. + messageEdit_->insertPlainText( "\n" ); + } + else + { + slotSendButtonClicked(); + } + + // Blocks further handling of this event. + keyEvent->ignore(); + return true; + } + // Detect scrolling commands. Shift scrolls faster + else if( key == Qt::Key_PageUp || key == Qt::Key_PageDown ) + { + getCurrentChat()->scrollTo( ( key == Qt::Key_PageDown ), shift ); + } + else if( alt ) + { + bool ok = false; + int chatIndex = keyEvent->text().toInt( &ok ); + + // Technically the index can't be more than 9, of course, but keep things safe & simple + if( ok && chatIndex > 0 && chatIndex <= chatTabs_->count() ) + { + chatTabs_->setCurrentIndex( chatIndex - 1 ); + keyEvent->ignore(); + return true; + } + } + else if( ctrl ) + { + switch( key ) + { + // Detect text copying from the message editor, or the Message View + case Qt::Key_C: + editCopy(); + break; + + // Detect 'save chat' command + case Qt::Key_S: + getCurrentChat()->showSaveChatDialog();; + break; + + // Detect fast-retype (ctrl+UpArrow) + case Qt::Key_Up: + if( quickRetypeList_.isEmpty() ) + { + break; + } + + if( indexSentences_ == quickRetypeList_.size() ) + { + // store the last sentence in writing + lastSentence_ = messageEdit_->toPlainText(); + } + + if( indexSentences_ > 0 ) + indexSentences_--; + + if( indexSentences_ >= 0 ) + { + messageEdit_->setPlainText( quickRetypeList_[ indexSentences_ ] ); + } + break; + + // Detect fast-retype (ctrl+DownArrow) + case Qt::Key_Down: + if( quickRetypeList_.isEmpty() ) + { + break; + } + + if( indexSentences_ == quickRetypeList_.size() - 1 + && ! lastSentence_.isEmpty() ) + { + messageEdit_->setPlainText( lastSentence_ ); + indexSentences_ = quickRetypeList_.size(); + } + + if( indexSentences_ < quickRetypeList_.size() - 1 ) + indexSentences_++; + + if( indexSentences_ < quickRetypeList_.size() ) + { + messageEdit_->setPlainText( quickRetypeList_[ indexSentences_ ] ); + } + break; + + default: + break; + } + } + + // Another key was pressed: switch to the message editor if needed + if( editorChooser_->currentWidget() != textPage_ ) + { + slotSwitchEditor(); + } + + return false; + } + + case QEvent::WindowActivate: + if( messageEdit_->isVisible() ) + { + messageEdit_->setFocus(); + } + else if( inkEdit_->isVisible() ) + { + inkEdit_->inkFrame_->setFocus(); + } + break; + + case QEvent::FocusOut: + case QEvent::Show: + { + QWidget *focusedWidget = QApplication::focusWidget(); + + // Allow this chat's search bar to take focus away from the message editor + if( focusedWidget && QString( focusedWidget->metaObject()->className() ) == "KHistoryComboBox" ) + { + break; + } + + messageEdit_->setFocus( Qt::OtherFocusReason ); + } + break; + + case QEvent::DragEnter: + { + QDragEnterEvent *dragEvent = static_cast( event ); + + if( ! dragEvent || ! dragEvent->mimeData()->hasUrls() ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Ignoring invalid drop"; +#endif + break; + } + + dragEvent->acceptProposedAction(); + } + break; + + case QEvent::Drop: + { + QDropEvent *dropEvent = static_cast( event ); + + // Process the drop only if it contains file URLs and comes from out of our application. + if( ! dropEvent || ! dropEvent->mimeData()->hasUrls() || dropEvent->source() != 0 ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Ignoring invalid drop"; +#endif + break; + } + +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Drag'n'dropped files:" << dropEvent->mimeData()->urls(); +#endif + + // Send the files to the contact + getCurrentChat()->startFileTransfer( dropEvent->mimeData()->urls() ); + + dropEvent->acceptProposedAction(); + return true; } break; @@ -422,32 +922,15 @@ bool ChatWindow::eventFilter( QObject */*obj*/, QEvent *event ) Chat *ChatWindow::getChat( int index ) { #ifdef KMESSTEST - KMESS_ASSERT( tabBar_->count() > 0 ); + KMESS_ASSERT( chatTabs_->count() > 0 ); #endif - if( index < 0 || index >= chats_.count() ) + if( index < 0 || index >= chatTabs_->count() ) { - return chats_.at( tabBar_->currentIndex() ); + return getCurrentChat(); } - return chats_.at( index ); -} - - - -// Return the chat object for a given switchboard connection, if found. -Chat * ChatWindow::getChatBySwitchboardConnection( const MsnSwitchboardConnection *connection ) const -{ - foreach( Chat *chat, chats_ ) - { - MsnSwitchboardConnection *chatConnection = chat->getSwitchboardConnection(); - if( chatConnection == connection ) - { - return chat; - } - } - - return 0; + return qobject_cast( chatTabs_->widget( index ) ); } @@ -455,182 +938,165 @@ Chat * ChatWindow::getChatBySwitchboardConnection( const MsnSwitchboardConnectio // Return a reference to the active chat Chat *ChatWindow::getCurrentChat() { -#ifdef KMESSTEST - KMESS_ASSERT( tabBar_->count() > 0 ); -#endif + return qobject_cast( chatTabs_->currentWidget() ); +} - // This really shouldn't happen, but instead of getting a qFatal(), - // let the code crash with a normal null pointer instead. - if( tabBar_->count() == 0 ) + + + +// Handle a text command (e.g. '/online') +bool ChatWindow::handleCommand( QString command ) +{ + if( command.isEmpty() ) { - return 0; + return true; } - return chats_.at( tabBar_->currentIndex() ); -} + // Parse arguments + QStringList arguments( command.split( " ", QString::SkipEmptyParts ) ); + if( arguments.isEmpty() ) + { + return true; + } + command = arguments.takeFirst(); + // Make it lower-case + command = command.toLower(); -// Show the user manual for KMess. -void ChatWindow::helpContents() -{ - KToolInvocation::invokeHelp("kmess/index"); -} + // Get us a kmess handle to call setStatus upon + KMessApplication *kmessApp = static_cast( kapp ); + KMess *kmess = kmessApp->getContactListWindow(); + bool isStatusCommand = ( command == "status" ); + // Check syntax errors + if( isStatusCommand && arguments.isEmpty() ) + { + KMessageBox::sorry( this, + i18n( "You used an incorrect syntax for the /status command. The correct syntax " + "is: /status online|away|idle|brb|busy|lunch|phone|invisible.
" + "Or you can use the /online, /phone etc. shortcuts." ), + i18nc( "Dialog box caption for wrong command syntax warning", "Incorrect /status syntax" ) + ); + return true; + } + QString toStatus; + const QStringList& participants( getCurrentChat()->getParticipants() ); -// Create the chat menu -void ChatWindow::initChatMenu() -{ - KAction *closeAction, *saveAction; + if( isStatusCommand ) + { + toStatus = arguments.takeFirst(); // we take the first, so we can get to the other arguments. + } - // Create the menu and the Invite Contact sub-menu - chatMenu_ = new KMenu( i18n("&Chat"), this ); + // Switch status + if( command == "online" || ( isStatusCommand && toStatus == "online" ) || + command == "back" || ( isStatusCommand && toStatus == "back" ) ) + { + kmess->changeStatus( STATUS_ONLINE ); + } + else if( command == "away" || ( isStatusCommand && toStatus == "away" ) ) + { + // Away message? + QString awayMessage; + if( ! arguments.isEmpty() ) + { + awayMessage = arguments.join(" "); + kmess->changeStatus( STATUS_AWAY_AUTOREPLY, awayMessage ); + } + else + { + kmess->changeStatus( STATUS_AWAY ); + } + } + else if( command == "idle" || ( isStatusCommand && toStatus == "idle" ) ) + { + kmess->changeStatus( STATUS_IDLE ); + } + else if( command == "brb" || ( isStatusCommand && toStatus == "brb" ) ) + { + kmess->changeStatus( STATUS_BE_RIGHT_BACK ); + } + else if( command == "busy" || ( isStatusCommand && toStatus == "busy" ) ) + { + kmess->changeStatus( STATUS_BUSY ); + } + else if( command == "lunch" || ( isStatusCommand && toStatus == "lunch" ) ) + { + kmess->changeStatus( STATUS_OUT_TO_LUNCH ); + } + else if( command == "phone" || ( isStatusCommand && toStatus == "phone" ) ) + { + kmess->changeStatus( STATUS_ON_THE_PHONE ); + } + else if( command == "invisible" || ( isStatusCommand && toStatus == "invisible" ) ) + { + kmess->changeStatus( STATUS_INVISIBLE ); + } + // Block and unblock user + else if( command == "block" ) + { + if( participants.count() != 1 ) + { + KMessageBox::sorry( this, + i18n( "You can't block anyone in a group chat." ), + i18nc( "Caption when trying to block someone when in a group chat", + "Can't Block Right Now!" ) + ); + return true; + } + getCurrentChat()->setContactBlocked( participants.first(), true ); + } + else if( command == "unblock" ) + { + if( participants.count() != 1 ) + { + KMessageBox::sorry( this, + i18n( "You can't block anyone in a group chat." ), + i18nc( "Caption when trying to block someone when in a group chat", + "Can't Block Right Now!" ) + ); + return true; + } + getCurrentChat()->setContactBlocked( participants.first(), false ); + } + // Send special messages + else if( command == "me" ) + { + const QString message( "* " + currentAccount_->getFriendlyName() + " " + arguments.join( " " ) ); + getCurrentChat()->sendChatMessage( message ); + ChatMessage chatmessage( ChatMessage::TYPE_OUTGOING, ChatMessage::CONTENT_MESSAGE, false, + message, currentAccount_->getHandle(), + currentAccount_->getFriendlyName( STRING_ORIGINAL ), + currentAccount_->getPicturePath(), + currentAccount_->getFont(), currentAccount_->getFontColor() ); + getCurrentChat()->showMessage( chatmessage ); + } + // Unknown command + else + { + // If an unknown command contains more than one '/', it's very likely to be a path. + // Don't show the error and return with 'false' to send the command/path. - // Create the actions - sendAction_ = new KAction( KIcon("folder-remote"), i18n("Send a &File"), this ); - meetingAction_ = new KAction( KIcon("gnomemeeting"), i18n("Start a &Meeting"), this ); - nudgeAction_ = new KAction( KIcon("preferences-desktop-notification-bell"), i18n("Send a &Nudge!"), this ); - saveAction = new KAction( KIcon("document-save"), i18n("Save chat"), this ); - addEmoticonAction_ = new KAction( KIcon("emoticons"), i18n("&Emoticons"), this ); - closeAction = KStandardAction::close( this, SLOT( queryClose() ), actionCollection_ ); - closeAllAction_ = new KAction( KIcon("dialog-close"), i18n("Close &All Tabs"), this ); + if( command.contains( '/' ) ) + { + return false; + } - // Initially the chat has one tab only, so the Close All option is not useful - closeAllAction_->setVisible( false ); + KMessageBox::sorry( this, + i18n( "Unknown command %1. If you did not want this " + "message to be a command, prepend your message with another" + " /.", command ), + i18nc( "Caption when an unknown command was requested", "Unknown Command" ) ); + return true; + } - // Add shorter texts for the toolbar - meetingAction_ ->setIconText( i18n("Meeting") ); - nudgeAction_ ->setIconText( i18n("Nudge") ); + // Clear the message edit field, because the command was executed succesfully. + messageEdit_->clear(); + messageEdit_->setFocus(); - // Add invite button for the toolbar - inviteButton_ = new KActionMenu( KIcon("list-add-user"), i18n("&Invite"), this ); - inviteButton_->setDelayed( false ); - - // Connect them - connect( sendAction_, SIGNAL( triggered(bool) ), - this, SLOT ( startFileTransfer() ) ); - connect( nudgeAction_, SIGNAL( triggered(bool) ), - this, SLOT ( sendNudge() ) ); - connect( meetingAction_, SIGNAL( triggered(bool) ), - this, SLOT ( startMeeting() ) ); - connect( saveAction, SIGNAL( triggered(bool) ), - this, SLOT ( saveChat() ) ); - connect( addEmoticonAction_, SIGNAL( triggered() ), - this, SLOT ( showEmoticonPanel() ) ); - connect( closeAllAction_, SIGNAL( triggered() ), - this, SLOT ( queryCloseAll() ) ); - -#ifdef HAS_KPHONE // If KPhone is not enabled, don't support voice conversation - KAction *conversation = new KAction( "kphone", i18n("Start or Stop a &Conversation"), this ); - connect( send, SIGNAL(triggered(bool)), this, SLOT( startConversation() ) ); -#endif - - // Plug the items into the Chat menu - // The Invite menu goes before this separator - firstChatMenuItem_ = chatMenu_->addSeparator(); - chatMenu_->addAction( sendAction_ ); - chatMenu_->addAction( meetingAction_ ); -#ifdef HAS_KPHONE // If KPhone is not enabled, don't support voice conversation - chatMenu_->addAction( conversation ); -#endif - chatMenu_->addAction( nudgeAction_ ); - chatMenu_->addSeparator(); - chatMenu_->addAction( saveAction ); - chatMenu_->addAction( closeAction ); - chatMenu_->addAction( closeAllAction_ ); - - // Also plug the icons into the toolbar - // removed 'close', not a frequently used action (and you'll have Alt+F4 and the window close button for that). - toolBar()->addAction( inviteButton_ ); - toolBar()->addAction( sendAction_ ); - toolBar()->addAction( nudgeAction_ ); - toolBar()->addAction( addEmoticonAction_ ); - - // Plug the menu into the menubar - menuBar()-> addMenu( chatMenu_ ); -} - - - -// Create the edit menu -void ChatWindow::initEditMenu() -{ - KAction *changeFont, *changeFontColor; - KAction *copy, *zoomIn, *zoomOut; - KMenu *editMenu; - - // Create the menu - editMenu = new KMenu( i18n("&Edit"), this ); - - // Create the "edit" menus - changeFont = new KAction( KIcon("preferences-desktop-font"), i18n("Change &Font"), this ); - changeFontColor = new KAction( KIcon("format-stroke-color"), i18n("Change Font &Color"), this ); - connect( changeFont, SIGNAL( triggered(bool) ), - this, SLOT( editFont() ) ); - connect( changeFontColor, SIGNAL( triggered(bool) ), - this, SLOT( editFontColor() ) ); - - // Add shorter texts for the toolbar - changeFont ->setIconText( i18n("&Font") ); - changeFontColor->setIconText( i18n("Font &Color") ); - - // More standard actions - cutAction_ = KStandardAction::cut ( this, SLOT( editCut() ), actionCollection_ ); - copy = KStandardAction::copy ( this, SLOT( editCopy() ), actionCollection_ ); - pasteAction_ = KStandardAction::paste ( this, SLOT( editPaste() ), actionCollection_ ); - zoomIn = KStandardAction::zoomIn ( this, SLOT( editZoomIn() ), actionCollection_ ); - zoomOut = KStandardAction::zoomOut( this, SLOT( editZoomOut() ), actionCollection_ ); - - // Plug the items into our new shiny Edit menu - editMenu->addAction( cutAction_ ); - editMenu->addAction( copy ); - editMenu->addAction( pasteAction_ ); - editMenu->addSeparator(); - editMenu->addAction( changeFont ); - editMenu->addAction( changeFontColor ); - editMenu->addSeparator(); - editMenu->addAction( zoomIn ); - editMenu->addAction( zoomOut ); - - // Plug the icons to the toolbar. - // Toolbar is only for fast access to frequently used actions. - // So cut/copy/paste are no longer in the toolbar by default.. It's not an office app you know. - KToolBar *mainToolBar = toolBar(); - mainToolBar->addSeparator(); - - // Plug the menu into the menubar - menuBar()->addMenu( editMenu ); -} - - - -// Create the help menu -void ChatWindow::initHelpMenu() -{ - KAction *aboutKDE, *aboutKMess, *helpContents; - KMenu *helpMenu; - - // Create the menu - helpMenu = new KMenu( i18n("&Help"), this ); - - // Create the help menu. - helpMenu_ = new KHelpMenu( this, KGlobal::mainComponent().aboutData() ); - - // Create the help menu items - aboutKMess = KStandardAction::aboutApp ( this, SLOT( aboutKMess() ), this ); - aboutKDE = KStandardAction::aboutKDE ( this, SLOT( aboutKDE() ), this ); - helpContents = KStandardAction::helpContents( this, SLOT( helpContents() ), actionCollection_ ); - - // Plug the items into the new Help menu - helpMenu->addAction( helpContents ); - helpMenu->addSeparator(); - helpMenu->addAction( aboutKMess ); - helpMenu->addAction( aboutKDE ); - - // Plug the menu into the menubar - menuBar()->addMenu( helpMenu ); + return true; } @@ -650,26 +1116,43 @@ bool ChatWindow::initialize() return false; } - // Create the emoticon sidebars - standardEmoticonSidebar_ = new EmoticonSidebar( sidebar_, false ); - customEmoticonSidebar_ = new EmoticonSidebar( sidebar_, true ); - - sidebar_->addItem( standardEmoticonSidebar_, i18n( "Emoticons" ) ); - sidebar_->addItem( customEmoticonSidebar_, i18n( "My emoticons" ) ); + // Autosave all GUI settings +#if KDE_IS_VERSION(4,0,70) + setAutoSaveSettings( KMessConfig::instance()->getAccountConfig( currentAccount_->getHandle(), "ChatWindow" ), + true /* save WindowSize */ ); +#else + setAutoSaveSettings( "ChatWindow", true /* save WindowSize */ ); +#endif // Read the window properties readProperties(); - checkSidebarPreferences(); - // HACK: Initially show the window as minimized. - // When tabBar_->addTab() is called (in the addChatTab() method) it will show the window before it's time, - // it will be empty and small, and it disappears a bit later and reappear later when everything is correctly set up. - // If the window is started minimized, it won't flash but will stay quiet in the tray. - // This won't affect its future appearance, since ChatMaster will raise it later. - // Sounds like a bug in Qt4.4. - showMinimized(); + // Enable the emoticon widgets + standardEmoticonsWidget_->initialize( false ); + customEmoticonsWidget_ ->initialize( true ); + connect( standardEmoticonsWidget_, SIGNAL( insertEmoticon(QString) ), + this, SLOT ( insertEmoticon(QString) ) ); + connect( customEmoticonsWidget_, SIGNAL( insertEmoticon(QString) ), + this, SLOT ( insertEmoticon(QString) ) ); + + // Create the emoticon widgets for the docks (they're not the same ones used for the chat tabs). + // Before we create the widgets, the docks have to be in place already, to be able to tell the + // widgets how to initially layout themselves. + EmoticonsWidget *standardEmoticonsDockWidget = new EmoticonsWidget( standardEmoticonsDock_ ); + EmoticonsWidget *customEmoticonsDockWidget = new EmoticonsWidget( customEmoticonsDock_ ); + standardEmoticonsDockWidget->initialize( false ); + customEmoticonsDockWidget ->initialize( true ); + standardEmoticonsDockWidget->setDockWidget( standardEmoticonsDock_, dockWidgetArea( standardEmoticonsDock_ ) ); + customEmoticonsDockWidget ->setDockWidget( customEmoticonsDock_, dockWidgetArea( customEmoticonsDock_ ) ); + standardEmoticonsDock_ ->setWidget( standardEmoticonsDockWidget ); + customEmoticonsDock_ ->setWidget( customEmoticonsDockWidget ); + connect( standardEmoticonsDockWidget, SIGNAL( insertEmoticon(const QString&) ), + this, SLOT ( insertEmoticon(const QString&) ) ); + connect( customEmoticonsDockWidget, SIGNAL( insertEmoticon(const QString&) ), + this, SLOT ( insertEmoticon(const QString&) ) ); initialized_ = true; + return true; } @@ -685,198 +1168,52 @@ bool ChatWindow::initializeCurrentAccount() currentAccount_ = CurrentAccount::instance(); if ( currentAccount_ == 0 ) { - kDebug() << "Couldn't get an instance of the current account."; + kWarning() << "Could not get an instance of the current account."; return false; } // Set up some widgets based on account settings - emoticonAction_->setChecked( currentAccount_->getUseEmoticons() ); + emoticonAction_ ->setChecked( currentAccount_->getUseEmoticons() ); + sessionInfoAction_->setChecked( currentAccount_->getShowSessionInfo() ); #ifdef KMESSTEST KMESS_ASSERT( currentAccount_ != 0 ); #endif + + // Connect needed signals + connect( currentAccount_, SIGNAL( changedFontSettings() ), + this, SLOT ( updateEditorFont() ) ); + return true; } -// Create the menus. -void ChatWindow::initMenus() +// Insert an emoticon into the message editor +void ChatWindow::insertEmoticon( const QString &shortcut ) { - // ActionCollection to collect the actions with a shortcut - actionCollection_ = new KActionCollection( this, KComponentData() ); + // Insert the text at the cursor + messageEdit_->insertPlainText( shortcut ); - // Initialize the menus with their separate functions - initChatMenu(); - initEditMenu(); - initSettingsMenu(); - initHelpMenu(); - - // Get a fast reference to the main toolbar object - KToolBar *mainToolbar = toolBar(); - - // Add the emoticon button - mainToolbar->addAction( addEmoticonAction_ ); - // Plug the sidebar button in after the emoticon button - mainToolbar->addAction( sidebarAction_ ); - - // Add collected actions - addActions( actionCollection_->actions() ); - - setAutoSaveSettings( "ChatWindow", true ); + // Switch to the message editor then + slotSwitchEditor(); } -// Create the settings menu -void ChatWindow::initSettingsMenu() -{ - KMenu *settingsMenu; - KToggleAction *spellCheckAction; - - // Create the menu - settingsMenu = new KMenu( i18n("&Settings"), this ); - - // Create the "settings" menus - spellCheckAction = new KToggleAction( KIcon("tools-check-spelling"), i18n("Use &Spell Checking"), this ); - emoticonAction_ = new KToggleAction( KIcon("services"), i18n("Show &Emoticons"), this ); - sidebarAction_ = new KAction( KIcon("view-sidetree"), i18n("Hide Side&bar"), this ); - showToolBar_ = new KToggleAction( KIcon("view-sidetree"), i18n("Hide &Toolbar"), actionCollection_ ); - showStatusBar_ = KStandardAction::showStatusbar( this, SLOT( showStatusBar() ), this ); - showMenuBar_ = KStandardAction::showMenubar( this, SLOT( showMenuBar() ), actionCollection_ ); - - // Assign to the sidebar action a keyboard shortcut and a tool tip like the standard actions - sidebarAction_->setShortcut( QKeySequence( "Ctrl+T" ) ); - sidebarAction_->setToolTip( i18n("Hide the contact sidebar") ); // tooltip and title updated by ChatWindow::toggleSidebar() - - // Connect the do... slots! - connect( emoticonAction_, SIGNAL( toggled(bool) ), - this, SLOT ( toggleEmoticons(bool) ) ); - connect( sidebarAction_, SIGNAL( activated() ), - this, SLOT ( toggleSidebar() ) ); - connect( showToolBar_, SIGNAL( toggled(bool) ), - this, SLOT ( showToolBar() ) ); - connect( spellCheckAction, SIGNAL( toggled(bool) ), - this, SLOT ( toggleSpellCheck(bool) ) ); - - // Plug the items into the new Settings menu - settingsMenu->addAction( spellCheckAction ); - settingsMenu->addSeparator(); - settingsMenu->addAction( emoticonAction_ ); - settingsMenu->addAction( showMenuBar_ ); - settingsMenu->addAction( showToolBar_ ); - settingsMenu->addAction( showStatusBar_ ); - settingsMenu->addAction( sidebarAction_ ); - - // Plug the menu into the menubar - menuBar()->addMenu( settingsMenu ); -} - - - -// Return whether the side bar is enabled -bool ChatWindow::isSidebarVisible() -{ - return sidebar_->isVisible(); -} - - - -// A chat tab is closing +// The window is closing, called by KMainWindow bool ChatWindow::queryClose() { #ifdef KMESSDEBUG_CHATWINDOW - kDebug() << "Closing current chat tab"; + kDebug() << "Closing all open chats"; #endif - int currentIndex = tabBar_->currentIndex(); - Chat *currentChat = getCurrentChat(); - if( currentChat != 0 ) - { - // Save the chat's UI settings before closing it, so the next selected tab will read them - currentChat->saveProperties(); - - currentChat->queryClose(); - - if( ! removeChatTab( currentIndex ) ) - { - kWarning() << "Unable to close the current chat!"; - } - - // If there still are open tabs, don't close - if( chats_.count() > 0 ) - { - // Select the leftmost tab - int newIndex = ( currentIndex == 0 ) ? currentIndex : currentIndex - 1; - tabBar_->setCurrentIndex( newIndex ); - slotSwitchTab( newIndex ); - return false; - } - } - - // Kill this window - hide(); - deleteLater(); - - // If the main window is not visible, make sure only this window closes - KMessApplication *kmessApp = static_cast( kapp ); - if( ! kmessApp->getContactListWindow()->isVisible() && ! kmessApp->quitSelected() ) - { -#ifdef KMESSDEBUG_KMESSINTERFACE - kDebug() << "Rejecting quit request, only close this window."; -#endif - - // Reject close / quit request. - return false; - } - else - { -#ifdef KMESSDEBUG_KMESSINTERFACE - kDebug() << "Accepting quit request."; -#endif - - // Normal procedure is ok - return true; - } + return closeAllTabs(); } -// The chat window is closing -bool ChatWindow::queryCloseAll() -{ - if( chats_.count() > 1 ) - { - int res = KMessageBox::questionYesNoCancel( this, - i18n( "There are multiple tabs open in this chat window. Do you want to close the " - "current tab only, or all tabs?

" - "Note:You can also close all tabs at once by pressing Shift+Esc." ), - i18nc( "Caption when closing a single chat window tab", "Closing a Chat Tab" ), - KGuiItem( i18n( "Close all tabs" ), "window-close" ), // Yes option - KGuiItem( i18n( "Close current tab" ), "tab-close" ), // No option - KStandardGuiItem::cancel(), - "closeOneChatTabInfo" ); - switch( res ) - { - case KMessageBox::Yes : break; - case KMessageBox::No : return queryClose(); - case KMessageBox::Cancel: - default : return false; - } - } - - // Just close all tabs one by one, until the last one closes the window too - while( chats_.count() > 0 ) - { - queryClose(); - } - - return true; -} - - - -// The application is exiting +// The application is exiting, called by KMainWindow bool ChatWindow::queryExit() { #ifdef KMESSDEBUG_CHATWINDOW @@ -884,20 +1221,20 @@ bool ChatWindow::queryExit() #endif // Allow performing last operations to all open chats and delete them - foreach( Chat *chat, chats_ ) + for( int i = 0; i < chatTabs_->count(); i++ ) { + Chat *chat = getChat( i ); chat->queryExit(); - delete chat; } // Clear the list of chat tabs - chats_.clear(); + chatTabs_->clear(); // Force a call to the destructor, to ensure correct cleanup by ChatMaster deleteLater(); // Always accept this one, otherwise the chat window won't close. - // The quit is precented in KMessApplication::slotLastWindowClosed() too. + // The quit is presented in KMessApplication::slotLastWindowClosed() too. #ifdef KMESSDEBUG_KMESSINTERFACE kDebug() << "Accepting exit request."; #endif @@ -910,74 +1247,40 @@ bool ChatWindow::queryExit() // Restore the window properties (called by KMainWindow) void ChatWindow::readProperties(const KConfigGroup &config ) { - KConfigGroup group; - - // Choose the config group if it was not given - if( &config == 0 ) - { - group = KMessConfig::instance()->getAccountConfig( currentAccount_->getHandle(), "ChatWindow" ); - } - else - { - group = config; - } + // The parameter is kept to mantain the same arguments as KMainWindow::readProperties(). + Q_UNUSED( config ); + const KConfigGroup& group( KMessConfig::instance()->getAccountConfig( currentAccount_->getHandle(), "ChatWindow" ) ); // Read the window position - QPoint pos = group.readEntry( "Position", QPoint() ); + const QPoint pos( group.readEntry( "Position", QPoint() ) ); if( ! pos.isNull() ) { move( pos ); } - // Set the default widget sizes. The sidebar has a default read size of 1 so it'll be + // Resize the window to decent dimensions if there's no saved state. + resize( 550, 450 ); + restoreState( group.readEntry( "ToolbarsAndDocksState", QByteArray() ) ); + restoreWindowSize( group ); + + // Read if the spelling check feature is enabled + toggleSpellCheck( group.readEntry( "UseSpellCheck", false ) ); + + // Set the default widget sizes. The message editor has a default read size of 1 so it'll be // as small as possible, without becoming invisible - int minSidebarWidth = sidebar_->minimumSize().width(); - sidebarSplitter_->setSizes( group.readEntry( "SidebarSplitterSizes", QList() << minSidebarWidth << 1 ) ); + int minChatViewHeight = chatTabs_->minimumSize().height(); + splitter_->setSizes( group.readEntry( "MessageSplitterSizes", QList() << minChatViewHeight << 1 ) ); + + // Load the level of zoom + zoomLevel_ = group.readEntry( "CurrentZoom", 100 ); } -// Delete an existing chat tab -bool ChatWindow::removeChatTab( int index ) +// Close a chat tab without user intervention +void ChatWindow::removeChatTab( Chat *chat ) { -#ifdef KMESSTEST - KMESS_ASSERT( chats_.count() > 0 ); -#endif - - // Find which chat has the given index - Chat *chat = getChat( index ); - - if( chat == 0 ) - { - kWarning() << "Asked to remove index" << index << ", but there are" << chats_.count() << "open tabs!"; - return false; - } -#ifdef KMESSDEBUG_CHATWINDOW - kDebug() << "Removing Chat:" << chat; - kDebug() << "All chats:" << chats_; - kDebug() << "Index of tab:" << index; - kDebug() << "Index in the list:" << chats_.indexOf( chat ); -#endif - - // Remove the tab - tabBar_->removeTab( chats_.indexOf( chat ) ); - - // Remove the chat from the list of open chats - chats_.removeAll( chat ); - - // If there's more than one tab, show the bar and the Close All option - bool moreThanOneTabs = ( chats_.count() > 1 ); - tabBar_->setVisible( moreThanOneTabs ); - closeAllAction_->setVisible( moreThanOneTabs ); - - // Remove the chat's view and contact sidebar from the window's frames - ContactSidebar *contactSideBar = chat->getContactSidebar(); - chatFrame_->layout()->removeWidget( chat ); - contactSidebarFrame_->layout()->removeWidget( contactSideBar ); - delete contactSideBar; - delete chat; - - return true; + chatTabs_->removeTab( chatTabs_->indexOf( chat ) ); } @@ -993,30 +1296,164 @@ void ChatWindow::saveChat() // Save the window properties (called by KMainWindow) void ChatWindow::saveProperties( KConfigGroup &config ) { - KConfigGroup group; + // The parameter is kept to mantain the same arguments as KMainWindow::saveProperties(). + Q_UNUSED( config ); + KConfigGroup group( KMessConfig::instance()->getAccountConfig( currentAccount_->getHandle(), "ChatWindow" ) ); - // Choose the config group if it was not given - if( &config == 0 ) + // Save the window position + group.writeEntry( "Position", pos() ); + + // Save the docks and toolbars state + group.writeEntry( "ToolbarsAndDocksState", saveState() ); + group.writeEntry( "UseSpellCheck", spellCheckAction_->isChecked() ); + + group.writeEntry( "MessageSplitterSizes", splitter_->sizes() ); + group.writeEntry( "CurrentZoom", zoomLevel_ ); +} + + + +// Send a ink via server +void ChatWindow::sendInk() +{ + // Get the image bytes and send them + const QByteArray& ink( inkEdit_->getImageBytes() ); + + getCurrentChat()->sendInkMessage( ink ); + + // Clear and reset the state of send button + inkEdit_->clearImage(); + sendButton_->setEnabled( false ); + + // Show the message in the browser window + const QString& text( "" ); + + ChatMessage message( ChatMessage::TYPE_OUTGOING, + ChatMessage::CONTENT_MESSAGE_INK, + false, + text, + currentAccount_->getHandle(), + currentAccount_->getFriendlyName( STRING_ORIGINAL ), + currentAccount_->getPicturePath()); + + getCurrentChat()->showMessage(message); +} + + +// Send a message via the server +void ChatWindow::sendMessage() +{ + // Don't send any typing messages while preparing to send the message in the text box... + doSendTypingMessages_ = false; + + // Get the message field's contents + QString text( messageEdit_->toPlainText() ); + + // Don't send empty messages + if( text.isEmpty() ) { - group = KMessConfig::instance()->getAccountConfig( currentAccount_->getHandle(), "ChatWindow" ); + return; + } + + // Max length is fixed to 10 chunks ( multi-packet ) + int maxSendableMessageLength = 14000; + + // Messages like "//hello" should be sent as "/hello" + // Messages like "/hello" are commands. + // Check if this is a command, and if so, emit handleCommand signal + if( text.left( 2 ) == "//" ) + { + text = text.mid( 1 ); + } + else if( text.left( 1 ) == "/" ) + { + const QString& command( text.mid( 1 ) ); + + // Handle command. If 'false' is returned, send it anyway. + if ( handleCommand( command ) ) + { + return; + } + } + + // If the text is longer than the sendable amount, put the remainder back in the text edit. + // Since the message will be sent as UTF8, it's the UTF8 length we have to consider. + const QByteArray& utf8Text( text.toUtf8() ); + if( utf8Text.length() > maxSendableMessageLength ) + { + // If so, then divide the text into the first part and a remainder. + const QByteArray& remainder( utf8Text.right( utf8Text.length() - maxSendableMessageLength ) ); + text = QString::fromUtf8( utf8Text.left( maxSendableMessageLength ) ); + + // Return the remainder to the message edit. + const QString& remainingText( QString::fromUtf8( remainder ) ); + messageEdit_->setText( remainingText ); + lastSentence_ = remainingText; } else { - group = config; + // Remove the message from the message field (allowing undo) + lastSentence_.clear(); + + QTextCursor cursor( messageEdit_->textCursor() ); + messageEdit_->setTextCursor( cursor ); + + cursor.beginEditBlock(); + cursor.select( QTextCursor::Document ); + cursor.removeSelectedText(); + cursor.endEditBlock(); } - // Save the window position - group.writeEntry( "Position", pos() ); + // Replace "\n" with "\r\n" (to follow the Windows linebreak style followed by the MSN servers) + // @TODO Move this server stuff to the network/protocol code + text = text.replace( QRegExp("\r?\n"), "\r\n" ); - // Save widgets sizes - group.writeEntry( "SidebarSplitterSizes", sidebarSplitter_->sizes() ); + // Send the message to the contact(s) + getCurrentChat()->sendChatMessage( text ); - // Only save the chats properties when there are some - if( chats_.count() > 0 ) - { - // Save the last active chat's settings - getCurrentChat()->saveProperties( group ) ; - } + // Reset the typing timer, so it restarts correctly + userTypingTimer_.stop(); + + // Now messages can again be sent + doSendTypingMessages_ = true; + + + // Show the message in the browser window + ChatMessage message( ChatMessage::TYPE_OUTGOING, + ChatMessage::CONTENT_MESSAGE, + false, + text, + currentAccount_->getHandle(), + currentAccount_->getFriendlyName( STRING_ORIGINAL ), + currentAccount_->getPicturePath(), + currentAccount_->getFont(), + currentAccount_->getFontColor() ); + + getCurrentChat()->showMessage( message ); + + // Add it to the list of sent messages, to allow fast retyping + quickRetypeList_.append( message.getBody() ); + lastSentence_ = QString(); + + // Reset the last sentence counter. + // showMessage() updates chatMessages_ + indexSentences_ = quickRetypeList_.size(); +} + + + +// The 'Send nudge' button has been clicked +void ChatWindow::sendNudge() +{ + getCurrentChat()->slotSendNudge(); +} + + + +// Change the active chat +void ChatWindow::setCurrentChat( Chat *chat ) +{ + chatTabs_->setCurrentIndex( chatTabs_->indexOf( chat ) ); } @@ -1025,17 +1462,35 @@ void ChatWindow::saveProperties( KConfigGroup &config ) void ChatWindow::setEnabled( bool isEnabled ) { // Set the state of the main UI elements - customEmoticonSidebar_ ->setEnabled( isEnabled ); - standardEmoticonSidebar_ ->setEnabled( isEnabled ); + customEmoticonsWidget_ ->setEnabled( isEnabled ); + standardEmoticonsWidget_->setEnabled( isEnabled ); + customEmoticonsDock_ ->setEnabled( isEnabled ); + standardEmoticonsDock_ ->setEnabled( isEnabled ); + + inkEdit_ ->setEnabled( isEnabled ); + messageEdit_ ->setEnabled( isEnabled ); + newLineButton_ ->setEnabled( isEnabled ); + sendButton_ ->setEnabled( isEnabled ); + inkButton_ ->setEnabled( isEnabled ); + standardEmoticonButton_ ->setEnabled( isEnabled ); + customEmoticonButton_ ->setEnabled( isEnabled ); + inviteButton_ ->setEnabled( isEnabled ); + textButton_ ->setEnabled( isEnabled ); + // Set the state of the extra contact actions - meetingAction_ ->setEnabled( isEnabled ); - nudgeAction_ ->setEnabled( isEnabled ); - sendAction_ ->setEnabled( isEnabled ); + emoticonAction_ ->setEnabled( isEnabled ); + meetingAction_ ->setEnabled( isEnabled ); + nudgeAction_ ->setEnabled( isEnabled ); + sendAction_ ->setEnabled( isEnabled ); + webcamAction_ ->setEnabled( isEnabled ); + changeFontAction_ ->setEnabled( isEnabled ); + changeFontColorAction_ ->setEnabled( isEnabled ); + spellCheckAction_ ->setEnabled( isEnabled ); // Set the state of cut and paste - cutAction_ ->setEnabled( isEnabled ); - pasteAction_ ->setEnabled( isEnabled ); + cutAction_ ->setEnabled( isEnabled ); + pasteAction_ ->setEnabled( isEnabled ); // The window is being enabled back, replace some stuff which changes // on every connection @@ -1049,25 +1504,106 @@ void ChatWindow::setEnabled( bool isEnabled ) -// "Show menu bar" was toggled. -void ChatWindow::showMenuBar() +// Enable or disable the parts of the window which allow user interaction +void ChatWindow::setUIState( UIState state ) { - if(!showMenuBar_->isChecked()) + switch( state) { - menuBar()->hide(); - } - else - { - menuBar()->show(); + case Disconnecting: + case Disconnected: + statusLabel_->setButtonEnabled( ChatStatusBar::Disconnected, true ); + setEnabled( false ); + break; + + case Connecting: + statusLabel_->setButtonEnabled( ChatStatusBar::Disconnected, false ); + setEnabled( false ); + break; + + case Connected: + setEnabled( true ); + break; + + default: + break; } } -// "Show status bar" was toggled. -void ChatWindow::showStatusBar() +// Change the caption of the chat window +void ChatWindow::setWindowTitle( const QString &caption ) { - statusBar()->setVisible( showStatusBar_->isChecked() ); + // Remember the window caption when it is fetched from the current chat + if( caption.isEmpty() ) + { + Chat *currentChat = getCurrentChat(); + if( currentChat != 0 ) + { + // Avoid newlines which would cause problems to the UI layout + caption_ = currentChat->getCaption().replace( "\n", " " ); + } + else + { + caption_ = QString(); + } + } + + // Always append the "Chat" prefix to the chat + if( caption.isEmpty() && caption_.isEmpty() ) + { + setCaption( i18nc( "Chat window caption, without contact name", "Chat" ) ); + } + else + { + setCaption( i18nc( "Chat window caption, with contact name", "%1 - Chat", ( caption.isEmpty() ? caption_ : caption ) ) ); + } +} + + + +// "Show menu bar" was toggled. +void ChatWindow::showMenuBar() +{ + // Just show the menubar if it was hidden + if( ! menuBar()->isVisible() ) + { + menuBar()->setVisible( true ); + return; + } + + // Ask the user if he/she really wants to hide the menubar, to avoid mistakes + // TODO: If the user disables the shortcut for the menu action, no shortcuts will be shown + int res = KMessageBox::questionYesNo( this, + i18nc( "Question dialog box message", + "Are you sure you want to hide the menu bar? " + "You will be able to show it again by using this " + "keyboard shortcut: %1", + showMenuBar_->shortcut().primary().toString( QKeySequence::NativeText ) ), + i18nc( "Dialog box caption: hiding the menu bar", "Hiding the Menu" ), + KStandardGuiItem::yes(), + KStandardGuiItem::no(), + "hideMenuBarQuestion" ); + + if( res == KMessageBox::Yes ) + { + menuBar()->setVisible( showMenuBar_->isChecked() ); + } + else + { + showMenuBar_->setChecked( true ); + } +} + + + +// Show a status message in the statusbar +void ChatWindow::showStatusMessage( ChatStatusBar::MessageType type, QString message ) +{ +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Showing status message" << message << "(" << type << ")"; +#endif + statusLabel_->setMessage( type, message ); } @@ -1082,7 +1618,16 @@ void ChatWindow::showStatusMessage( QString message, int duration ) kDebug() << "Showing status bar text" << message << "with duration" << duration; #endif - statusLabel_->setText( message ); + // HACK: Empty strings are not rendered, and any previously set text is not removed. + // So we change empty strings to contain a single space, which is enough to clean the label up. + if( message.isEmpty() ) + { + statusLabel_->setMessage( ChatStatusBar::DefaultType, " " ); + } + else + { + statusLabel_->setMessage( ChatStatusBar::ContactTyping, message ); + } // Each message will have an expiration time of its own or none at all statusTimer_.stop(); @@ -1101,10 +1646,41 @@ void ChatWindow::showStatusMessage( QString message, int duration ) -// "Show toolbar" was toggled. -void ChatWindow::showToolBar() +// Make the caption blink if the window still doesn't have focus +void ChatWindow::slotBlinkCaption() { - toolBar( "mainToolBar" )->setVisible( showToolBar_->isChecked() ); + // Make the caption alternate case + if ( blinkToUpper_ ) + { + const QString& caption( QTextDocumentFragment::fromHtml( caption_.toUpper() ).toPlainText() ); + setWindowTitle( QString( "* " + caption ) ); + } + else + { + setWindowTitle( QString( "* " + caption_.toLower() ) ); + } + + blinkToUpper_ = ! blinkToUpper_; +} + + + +// Called when an emoticon dock is toggled +void ChatWindow::slotEmoticonDocksToggled() +{ + bool showStandardButton = ( ! standardEmoticonsDock_->toggleViewAction()->isChecked() ); + bool showCustomButton = ( ! customEmoticonsDock_ ->toggleViewAction()->isChecked() ); + + // If an emoticon widget is shown and the button needs to be hidden, + // switch away from it + if( ( ! showStandardButton && editorChooser_->currentWidget() == stdEmoPage_ ) + || ( ! showCustomButton && editorChooser_->currentWidget() == cusEmoPage_ ) ) + { + slotSwitchEditor(); + } + + standardEmoticonButton_->setVisible( showStandardButton ); + customEmoticonButton_ ->setVisible( showCustomButton ); } @@ -1112,29 +1688,16 @@ void ChatWindow::showToolBar() // A message has been received void ChatWindow::slotGotChatMessage( const ChatMessage &message, Chat *chat ) { - // Update the sidebar - checkSidebarPreferences(); + Q_UNUSED( message ); - // If is the user the sender of the chat message, switch to the contacts sidebar - if( ! message.isIncoming() ) - { - // If the emoticon sidebar is still visible, show contact bar again. - if( sidebar_->currentIndex() == sidebar_->indexOf( standardEmoticonSidebar_ ) ) - { - sidebar_->setCurrentIndex( sidebar_->indexOf( getCurrentChat()->getContactSidebar() ) ); - } - - // When the sidebar was only temporary visible, hide it again - if( isSidebarTemporary_ && ! currentAccount_->getShowSidebar() ) - { - sidebar_->hide(); - } - } - - // Show the alert icon + // Display an highlighted tab title if( chat != getCurrentChat() ) { - tabBar_->setTabIcon( chats_.indexOf( chat ), KIcon( "mail-mark-important" ) ); + // Paint the text red + chatTabs_->setTabTextColor( chatTabs_->indexOf( chat ), QColor( "red" ) ); + + // Highlight the window title with the chat with new messages + caption_ = chat->getCaption(); } // If the window does not have focus, blink the caption as visual cue of an event @@ -1144,9 +1707,7 @@ void ChatWindow::slotGotChatMessage( const ChatMessage &message, Chat *chat ) } // Start blinking the caption - blinkToUpper_ = true; - slotBlinkCaption(); - blinkTimer_.start( 2000 ); + blinkTimer_.start( 1500 ); } @@ -1203,306 +1764,6 @@ void ChatWindow::slotGotNudge() -// Wheel mouse moved: change the tab. -void ChatWindow::slotWheelMouseMoved( int delta ) -{ - // If delta < 0 moves right trought tabs - if( delta < 0 ) - { - slotSwitchToRightTab(); - } - // If delta > 0 moves left trought tabs - else - { - slotSwitchToLeftTab(); - } -} - - - -// The 'Send nudge' button has been clicked -void ChatWindow::sendNudge() -{ - getCurrentChat()->slotSendNudge(); -} - - - -// Change the active chat -void ChatWindow::setCurrentChat( Chat *chat ) -{ - tabBar_->setCurrentIndex( chats_.indexOf( chat ) ); -} - - - -// Start a file transfer -void ChatWindow::startFileTransfer() -{ - getCurrentChat()->startFileTransfer(); -} - - - -// Switch the window to the clicked tab -void ChatWindow::slotChatInfoChanged() -{ - // Grep the chat has emitted the signal - Chat *chat = static_cast< Chat *>( sender() ); - - // Search it into the list - int index = chats_.indexOf( chat ); - if( index != -1 ) - { - // Change the tab caption - tabBar_->setTabText( index, chat->getCaption() ); - - // If chat is current chat then calls update caption method - if ( chat == getCurrentChat() ) - { - setWindowTitle(); - } - } -} - - - -// Switch the window to the clicked tab -void ChatWindow::slotSwitchTab( int tabIndex ) -{ - // Avoid connecting to non-existent sidebar tabs - if( ! initialized_ ) - { -#ifdef KMESSDEBUG_CHATWINDOW - kDebug() << "Not switching tab while not initialized."; -#endif - return; - } - - if( tabIndex < 0 || tabIndex >= chats_.count() ) - { - kWarning() << "Chat tab index" << tabIndex << "doesn't exist in the tabs list!"; - return; - } - - // Don't reactivate already selected chats - // Don't return if current tab and lastActiveChat are 0 beacuse if we close chat 0 - // and lastActiveChat is 0 the chat doesn't refresh! - if( lastActiveChatIndex_ == tabIndex && ( lastActiveChatIndex_ != 0 && tabIndex != 0 ) ) - { - return; - } - - Chat *chat = chats_.at( tabIndex ); - ContactSidebar *contactSidebar = chat->getContactSidebar(); - - // Remove the widgets of the various open chats from the chat and contact sidebar frame - Chat *oldChat = getChat( lastActiveChatIndex_ ); - if( oldChat ) - { - // Save the chat's UI settings - oldChat->saveProperties(); - - ContactSidebar *oldContactSidebar = oldChat->getContactSidebar(); - - // Disconnect the slots from the previously selected chat - disconnect( oldContactSidebar, 0, this, 0 ); - disconnect( standardEmoticonSidebar_, 0, oldChat, 0 ); - disconnect( customEmoticonSidebar_, 0, oldChat, 0 ); - - oldChat->getInviteMenu()->hide(); - oldContactSidebar->hide(); - oldChat->hide(); - } - - // Load the old chat's UI settings into this chat - chat->readProperties(); - - // Reset the icon - tabBar_->setTabIcon( tabIndex, KIcon() ); - - // Display the new chat - chat->show(); - contactSidebar->show(); - - // connect some signals so that the sidebars can send commands back - connect( standardEmoticonSidebar_, SIGNAL( insertEmoticon(QString) ), - chat, SLOT ( insertEmoticon(QString) ) ); - connect( customEmoticonSidebar_, SIGNAL( insertEmoticon(QString) ), - chat, SLOT ( insertEmoticon(QString) ) ); - - // Add the chat's invite menu in the toolbar - inviteButton_->setMenu( chat->getInviteMenu() ); - - // Replace the old chat's invite menu with the new one's - chatMenu_->removeAction( currentInviteMenu_ ); - currentInviteMenu_ = chatMenu_->insertMenu( firstChatMenuItem_, chat->getInviteMenu() ); - - // If the new chat is an offline one, disable the unavailable features - MsnSwitchboardConnection *connection = chat->getSwitchboardConnection(); - bool enableFeatures = ( connection && ! connection->isInactive() ); - sendAction_ ->setEnabled( enableFeatures ); - nudgeAction_ ->setEnabled( enableFeatures ); - meetingAction_ ->setEnabled( enableFeatures ); - currentInviteMenu_->setEnabled( enableFeatures ); - - // Save the new chat as last active one - lastActiveChatIndex_ = tabIndex; - - // Update the UI with this chat's details - setWindowTitle(); - slotGotTypingMessage( chat ); -} - - - -// Switch the window to the tab at the left of the current one -void ChatWindow::slotSwitchToLeftTab() -{ - // Find out at what tab are we and how many are there - int current = tabBar_->currentIndex(); - int count = tabBar_->count(); - - // Do nothing if there's only one tab - if( count <= 1 ) - { - return; - } - - // If the first tab was selected, then restart from the last tab - if( current == 0 ) - { - tabBar_->setCurrentIndex( count - 1 ); - return; - } - - tabBar_->setCurrentIndex( current - 1 ); -} - - - -// Switch the window to the tab at the right of the current one -void ChatWindow::slotSwitchToRightTab() -{ - // Find out at what tab are we and how many are there - int current = tabBar_->currentIndex(); - int count = tabBar_->count(); - - // Do nothing if there's only one tab - if( count <= 1 ) - { - return; - } - - // If the last tab was selected, then restart from the first tab - if( current >= ( count - 1 ) ) - { - tabBar_->setCurrentIndex( 0 ); - return; - } - - tabBar_->setCurrentIndex( current + 1 ); -} - - - -// Switch the window to the clicked tab and remove it -void ChatWindow::slotSwitchAndDeleteTab( int tabIndex ) -{ - tabBar_->setCurrentIndex( tabIndex ); - queryClose(); -} - - - -// The user sent a new message -void ChatWindow::slotUserSentMessage() -{ - // If the emoticon sidebar is still visible, show contact bar again. - if( sidebar_->currentIndex() == sidebar_->indexOf( standardEmoticonSidebar_ ) ) - { - sidebar_->setCurrentIndex( sidebar_->indexOf( getCurrentChat()->getContactSidebar() ) ); - } - - // When the sidebar was only temporary visible, hide it again - if( isSidebarTemporary_ && ! currentAccount_->getShowSidebar() ) - { - sidebar_->hide(); - } -} - - - -// Start GnomeMeeting with a contact. -void ChatWindow::startMeeting() -{ - getCurrentChat()->startMeeting(); -} - - - -// Start a voice conversation -void ChatWindow::startConversation() -{ - getCurrentChat()->startConversation(); -} - - - -// Called when the "use emoticons" action is called. -void ChatWindow::toggleEmoticons( bool useEmoticons ) -{ - // Set the new emoticon use value to the account - currentAccount_->setUseEmoticons( useEmoticons ); -} - - - -// Called when the "show sidebar" action is called. -void ChatWindow::toggleSidebar() -{ - if( sidebar_->isVisible() ) - { - sidebar_->hide(); - sidebarAction_->setText( i18n("Show Side&bar") ); - sidebarAction_->setToolTip( i18n("Show the contact sidebar") ); - } - else - { - sidebar_->show(); - sidebarAction_->setText( i18n("Hide Side&bar") ); - sidebarAction_->setToolTip( i18n("Hide the contact sidebar") ); - } - - // Toggle the current account's setting. - if ( currentAccount_ != 0 ) - { - currentAccount_->setShowSidebar( sidebar_->isVisible() ); - -#ifdef KMESSDEBUG_CHATWINDOW - kDebug() << "Set 'show sidebar' to " << currentAccount_->getShowSidebar() << "."; -#endif - } -} - - - -// Called when the "use spell checking" action is called. -void ChatWindow::toggleSpellCheck( bool useSpellCheck ) -{ - // Don't crash if no tabs are available - if( KMESS_NULL(getCurrentChat()) ) return; - -#ifdef KMESSDEBUG_CHATWINDOW - kDebug() << "Spell checking is now " << useSpellCheck; -#endif - - // Change the spell checking feature status - getCurrentChat()->getMessageEditField()->setCheckSpellingEnabled( useSpellCheck ); -} - - - // Update the contact typing messages in the status bar void ChatWindow::slotGotTypingMessage( Chat *chat ) { @@ -1521,22 +1782,29 @@ void ChatWindow::slotGotTypingMessage( Chat *chat ) } #endif - QPalette *palette = new QPalette(); - int tabIndex = chats_.indexOf( chat ); - QStringList typingContacts = chat->getTypingContacts(); + const QPalette palette; + int tabIndex = chatTabs_->indexOf( chat ); + const QStringList& typingContacts( chat->getTypingContacts() ); #ifdef KMESSDEBUG_CHATWINDOW_TYPING_MESSAGES kDebug() << "These contacts are typing:" << typingContacts; #endif // Update the color of this chat's tab - if( typingContacts.isEmpty() ) + // If the color is red, leave it + if( chatTabs_->tabTextColor( tabIndex ) != QColor( "red" ) ) { - tabBar_->setTabTextColor( tabIndex, palette->color( QPalette::WindowText ) ); - } - else - { - tabBar_->setTabTextColor( tabIndex, palette->color( QPalette::Highlight ) ); + QColor color; + if( typingContacts.isEmpty() ) + { + color = palette.color( QPalette::WindowText ); + } + else + { + color = palette.color( QPalette::Highlight ); + } + + chatTabs_->setTabTextColor( tabIndex, color ); } // If the typing message was not intended for the currently active tab, skip @@ -1552,7 +1820,10 @@ void ChatWindow::slotGotTypingMessage( Chat *chat ) // If no one is typing anymore, clean up the status bar if( typingContacts.isEmpty() ) { - showStatusMessage( QString() ); +#ifdef KMESSDEBUG_CHATWINDOW_TYPING_MESSAGES + kDebug() << "No contacts are typing anymore, cleaning up the status bar."; +#endif + showStatusMessage(); return; } @@ -1561,61 +1832,598 @@ void ChatWindow::slotGotTypingMessage( Chat *chat ) // Decide what string will be used depending on how many contacts are typing if( typingContacts.count() == 1 ) { - QString first = Qt::escape( typingContacts.first() ); - statusString = i18n( "%1 is typing.", first ); + const QString& first( typingContacts.first() ); + statusString = i18n( "%1 is typing...", first ); } else { int count = typingContacts.count() - 2; - QString first = Qt::escape( typingContacts[0] ); - QString second = Qt::escape( typingContacts[1] ); + const QString& first ( typingContacts[0] ); + const QString& second ( typingContacts[1] ); if( count == 0 ) { - statusString = i18n( "%1 and %2 are typing.", first, second ); + statusString = i18n( "%1 and %2 are typing...", first, second ); } else { - statusString = i18n( "%1, %2 and %3 others are typing.", first, second, count ); + statusString = i18n( "%1, %2 and %3 others are typing...", first, second, count ); } } - // Set the message to the status bar without a time limit: the chat itself will send another - // signal when the current message expires. - showStatusMessage( statusString, 0 ); + // Set the message to the status bar: the chat will send another signal when the current typing message expires + showStatusMessage(statusString, CHAT_TYPING_EXPIRATION_TIME ); } -// Change the caption of the chat window -void ChatWindow::setWindowTitle( const QString &caption ) +// Invite button was pressed +void ChatWindow::slotInviteContact() { - // Remember the window caption when it is fetched from the current chat - if( caption.isEmpty() ) + // Show invite dialog + QStringList usersToInvite; + InviteDialog inviteDialog( getCurrentChat()->getParticipants(), usersToInvite ); + + // If the user press OK and the users to invite list isn't empty then invite contacts + if( ! usersToInvite.isEmpty() ) { - Chat *currentChat = getCurrentChat(); - if( currentChat != 0 ) + getCurrentChat()->inviteContacts( usersToInvite ); + } +} + + + +// The message text changed, the user is typing or drawing +void ChatWindow::slotMessageChanged() +{ + // The window is closing, no chats are active + if( chatTabs_->count() == 0 ) + { + return; + } + + bool disable = true; + + // The message was changed + if( ! inkButton_->isChecked() ) + { + disable = ( messageEdit_->document()->isEmpty() ); + } + // The ink drawing was changed + else + { + disable = ( inkEdit_->isEmpty() ); + } + + // Something has been typed, enable the button so the user can send the message + sendButton_->setDisabled( disable ); + + + // There's some text, but the user doesn't want us to send typing notifications to the contacts + if( ! doSendTypingMessages_ ) + { + return; + } + + // If the typing timer is already going, do nothing + if( userTypingTimer_.isActive() ) + { + return; + } + + if( ! inkButton_->isChecked() ) + { + // If the last character of the message is a newline, sending the typing signal would + // cause the actual text message to be received twice, so check the last character + if( messageEdit_->toPlainText().right(1) == "\n" ) { - // Avoid newlines which would cause problems to the UI layout - caption_ = currentChat->getCaption().replace( "\n", " " ); + return; } - else + + // If a command is being typed, don't send a typing message + if( messageEdit_->toPlainText().left( 1 ) == "/" and messageEdit_->toPlainText().left( 2 ) != "//" ) { - caption_ = QString(); + return; } } - // Always append the "Chat" prefix to the chat - if( caption.isEmpty() && caption_.isEmpty() ) + // TODO Create a method to send an "user is drawing" message. WLM is able to do that. + getCurrentChat()->sendTypingMessage(); + + userTypingTimer_.start(); +} + + + +// The user clicked the new line button so insert a new line in the editor +void ChatWindow::slotNewLineButtonClicked() +{ + messageEdit_->insertPlainText( "\n" ); +} + + + +// The user pressed return in the message editor, so send the message +void ChatWindow::slotSendButtonClicked() +{ + if( inkButton_->isChecked() ) { - setCaption( i18nc( "Chat window caption, without contact name", "Chat" ) ); + sendInk(); + inkEdit_->inkFrame_->setFocus(); + } + else if( winksButton_->isChecked() ) + { + const QString& msnObject( winksWidget_->getMsnObjectWinkSelected() ); + if( ! msnObject.isEmpty() ) + { + getCurrentChat()->sendWink( msnObject ); + } } else { - setCaption( i18nc( "Chat window caption, with contact name", "%1 - Chat", ( caption.isEmpty() ? caption_ : caption ) ) ); + sendMessage(); + messageEdit_->setFocus(); } } +// Switch to the message editor, or another one +void ChatWindow::slotSwitchEditor() +{ + const QObject *caller = sender(); + bool disableSendButton = true; + bool disableNewLineButton = true; + +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Switching editors: caller:" << caller; +#endif + + // Called by the winks button, show the available winks + if( caller == winksButton_ && winksButton_->isChecked() ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Switching to winks list."; +#endif + winksWidget_->refresh(); + editorChooser_->setCurrentWidget( winksPage_ ); + winksButton_->setChecked( true ); + inkButton_->setChecked( false ); + standardEmoticonButton_->setChecked( false ); + customEmoticonButton_->setChecked( false ); + textButton_->setChecked( false ); + + disableSendButton = false; + } + // Called by the ink button, switch to the ink editor if it has been checked + else if( caller == inkButton_ && inkButton_->isChecked() ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Switching to ink editor."; +#endif + editorChooser_->setCurrentWidget( inkPage_ ); + winksButton_->setChecked( false ); + inkButton_->setChecked( true ); + standardEmoticonButton_->setChecked( false ); + customEmoticonButton_->setChecked( false ); + textButton_->setChecked( false ); + + disableSendButton = ( inkEdit_->isEmpty() ); + } + // Called by the standard emoticon button + else if( caller == standardEmoticonButton_ + && standardEmoticonButton_->isChecked() ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Switching to standard emoticons widget."; +#endif + editorChooser_->setCurrentWidget( stdEmoPage_ ); + winksButton_->setChecked( false ); + inkButton_->setChecked( false ); + standardEmoticonButton_->setChecked( true ); + customEmoticonButton_->setChecked( false ); + textButton_->setChecked( false ); + } + // Called by the custom emoticon button + else if( caller == customEmoticonButton_ + && customEmoticonButton_->isChecked() ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Switching to custom emoticons widget."; +#endif + editorChooser_->setCurrentWidget( cusEmoPage_ ); + winksButton_->setChecked( false ); + inkButton_->setChecked( false ); + standardEmoticonButton_->setChecked( false ); + customEmoticonButton_->setChecked( true ); + textButton_->setChecked( false ); + } + else // Otherwise, show the message editor + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Switching to the message editor."; +#endif + editorChooser_->setCurrentWidget( textPage_ ); + winksButton_->setChecked( false ); + inkButton_->setChecked( false ); + standardEmoticonButton_->setChecked( false ); + customEmoticonButton_->setChecked( false ); + textButton_->setChecked( true ); + + disableNewLineButton = false; + disableSendButton = ( messageEdit_->document()->isEmpty() ); + } + + // Update the send button status + sendButton_->setDisabled( disableSendButton ); + newLineButton_->setDisabled( disableNewLineButton ); + + // Also scroll down the chat, in all cases + getCurrentChat()->scrollToBottom(); +} + + + +// Switch the window to the tab at the left of the current one +void ChatWindow::slotSwitchToLeftTab() +{ + // Find out at what tab are we and how many are there + int current = chatTabs_->currentIndex(); + int count = chatTabs_->count(); + + // Do nothing if there's only one tab + if( count <= 1 ) + { + return; + } + + // If the first tab was selected, then restart from the last tab + if( current == 0 ) + { + chatTabs_->setCurrentIndex( count - 1 ); + return; + } + + chatTabs_->setCurrentIndex( current - 1 ); +} + + + +// Switch the window to the tab at the right of the current one +void ChatWindow::slotSwitchToRightTab() +{ + // Find out at what tab are we and how many are there + int current = chatTabs_->currentIndex(); + int count = chatTabs_->count(); + + // Do nothing if there's only one tab + if( count <= 1 ) + { + return; + } + + // If the last tab was selected, then restart from the first tab + if( current >= ( count - 1 ) ) + { + chatTabs_->setCurrentIndex( 0 ); + return; + } + + chatTabs_->setCurrentIndex( current + 1 ); +} + + + +// The active tab was changed +void ChatWindow::slotTabChanged( int currentIndex ) +{ + // Avoid switching to uninitialized widgets + if( ! initialized_ ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Not switching tab while not initialized."; +#endif + return; + } + + if( currentIndex < 0 || currentIndex >= chatTabs_->count() ) + { +#ifdef KMESSDEBUG_CHATWINDOW + if( currentIndex == -1 ) + { + kDebug() << "The window is closing."; + } + else + { + kDebug() << "Chat tab index" << currentIndex << "doesn't exist in the tabs list!"; + } +#endif + + messageEdit_->setDocument( new QTextDocument( messageEdit_ ) ); + updateEditorFont(); + inkEdit_->setImage( 0 ); + return; + } + + Chat *chat = getChat( currentIndex ); + + if( chat == 0 ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Chat tab" << currentIndex << "was destroyed"; +#endif + return; + } +#ifdef KMESSDEBUG_CHATWINDOW + else + { + kDebug() << "Activating chat tab" << currentIndex; + } +#endif + + + // Reset the color + const QPalette palette; + chatTabs_->setTabTextColor( currentIndex, palette.color( QPalette::WindowText ) ); + + // Display the new chat contents in the UI. Block the signals to avoid the editors + // from firing the "message changed" signal, which sends a typing message. + messageEdit_ ->blockSignals( true ); + inkEdit_ ->blockSignals( true ); + contactsDock_->setWidget( chat->getContactsWidget() ); + messageEdit_ ->setDocument( chat->getMessageEditContents() ); + inkEdit_ ->setImage( chat->getInkEditContents() ); + messageEdit_ ->blockSignals( false ); + inkEdit_ ->blockSignals( false ); + + // Set the font style/color + updateEditorFont(); + + // Update the window UI with this chat's details + slotSwitchEditor(); + setWindowTitle(); + slotGotTypingMessage( chat ); +} + + + +// Remove a chat +bool ChatWindow::slotTabRemoved( Chat *chat ) +{ + // When the function is called the pointer for chat is already checked by + // queryClose() or slotTabRemoved function, so grep the index of it and remove + // it from tab widget + int closedTabIndex = chatTabs_->indexOf( chat ); + +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Removing chat with index" << closedTabIndex; +#endif + + // Remove the tab of the closed chat + chatTabs_->removeTab( closedTabIndex ); + + // Request query close to chat ( so we can close correctly the SB and save the log ) + chat->queryClose(); + +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Removed tab index" << closedTabIndex; +#endif + + // Free the memory + delete chat; + + // If there are no more open chats, close the window too + checkAndCloseWindow(); + + return true; +} + + + +// Delete an existing chat tab by widget +bool ChatWindow::slotTabRemoved( QWidget *chatWidget ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( chatTabs_->count() > 0 ); +#endif + +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Forwarding removal command for a chat widget."; + kDebug() << "Currently open chats:" << chatTabs_->count(); +#endif + + // Cast the Widget to Chat pointer + Chat *chat = qobject_cast( chatWidget ); + + if( chat == 0 ) + { + kWarning() << "Unable to find chat for widget:" << chatWidget; + return false; + } + + // Relay the deletion to the main method + return slotTabRemoved( chat ); +} + + + +// Update a chat's tab title when the participants names change +void ChatWindow::slotUpdateChatInfo( Chat *chat ) +{ + // If called without a parameter, we've been called by a chat's signal + if( chat == 0 ) + { + // Find the chat which has emitted the signal + chat = qobject_cast( sender() ); + } + + // Search it into the list + int index = chatTabs_->indexOf( chat ); + if( index == -1 ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Cannot find source chat!"; +#endif + return; + } + + const QStringList& participantsList( chat->getParticipants() ); + + // getCaption() should return a properly html-escaped string + QString chatCaption( chat->getCaption() ); + + // Change the tab caption + chatTabs_->setTabText( index, chatCaption ); + chatTabs_->setTabIcon( index, chat->getParticipantsTabIcon() ); + + // Create a tool tip with details on the chat + QStringList participants; + foreach( const QString &handle, participantsList ) + { + const ContactBase *contact = currentAccount_->getContactByHandle( handle ); + if( contact == 0 ) + { + contact = currentAccount_->addInvitedContact( handle ); + } + + participants += QString( "%1 (%2)
%3" ) + .arg( contact->getFriendlyName( STRING_CLEANED ) ) + .arg( MsnStatus::getName( contact->getStatus() ) ) + .arg( handle ); + } + + QString toolTip( i18nc( "Tool tip for chat tabs", + "

Chat Info

" + "
" + "
Contacts:
  • %1
" + "
Chat started on:
%2
" + "
Connected with account:
%3
" + "
", + participants.join( "

" msgstr "" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 392 -#: rc.cpp:750 -#, fuzzy -msgid "and" -msgstr "Szomorú" +#. i18n: file: utils/likeback/likebackdialog.ui:81 +#. i18n: ectx: property (title), widget (QGroupBox, groupBox) +#: rc.cpp:893 +msgid "Your comment is about:" +msgstr "Megjegyzésed témája:" -#. i18n: tag string -#. i18n: file ./settings/miscellaneouspage.ui line 418 -#: rc.cpp:753 -#, fuzzy -msgid "for file transfers" -msgstr "Fájlátvitelek" +#. i18n: file: utils/likeback/likebackdialog.ui:93 +#. i18n: ectx: property (text), widget (QRadioButton, likeRadio_) +#: rc.cpp:896 +msgid "Something you like" +msgstr "Valami ami tetszik" -#: account.cpp:44 account.cpp:745 +#. i18n: file: utils/likeback/likebackdialog.ui:106 +#. i18n: ectx: property (text), widget (QRadioButton, dislikeRadio_) +#: rc.cpp:899 +msgid "Something you dislike" +msgstr "Valami ami nem tetszik" + +#. i18n: file: utils/likeback/likebackdialog.ui:119 +#. i18n: ectx: property (text), widget (QRadioButton, bugRadio_) +#: rc.cpp:902 +msgid "An improper behavior of the application" +msgstr "A program helytelen működése" + +#. i18n: file: utils/likeback/likebackdialog.ui:132 +#. i18n: ectx: property (text), widget (QRadioButton, featureRadio_) +#: rc.cpp:905 +msgid "A new feature you desire" +msgstr "Új kívánt képesség a programtól" + +#. i18n: file: utils/likeback/likebackdialog.ui:148 +#. i18n: ectx: property (text), widget (QCheckBox, specifyEmailCheckBox_) +#: rc.cpp:908 +msgid "Specify an email address to be contacted back" +msgstr "Adj meg egy e-mail címet, hogy felvehessük veled a kapcsolatot" + +#. i18n: file: utils/likeback/likebackdialog.ui:188 +#. i18n: ectx: property (text), widget (QCheckBox, showBarCheckbox_) +#: rc.cpp:911 +msgid "Show the feedback buttons bar on the windows" +msgstr "Visszajelzés gombok megjelenítése az ablakokban" + +#: account.cpp:45 account.cpp:736 msgid "I'm away from my computer" msgstr "Nem vagyok a gépnél" -#: account.cpp:60 +#: account.cpp:54 msgid "Your name" msgstr "Neved" -#: account.cpp:63 settings/accountpage.cpp:204 -#: settings/accountsettingsdialog.cpp:191 +#: account.cpp:57 settings/accountpage.cpp:222 +#: settings/accountsettingsdialog.cpp:204 msgid "you@hotmail.com" msgstr "you@hotmail.com" -#: chat/chat.cpp:124 +#: accountsmanager.cpp:388 msgid "" -"You can't start this invitation because there are multiple contacts in this " -"chat." +"Some insecure account passwords have been found.
Do you want to " +"import the passwords to the KDE Wallet named '%1', keep the insecure " +"passwords, or delete them permanently?

Note: it is not " +"recommended to use insecure passwords if the KDE Wallet is available, " +"because your passwords will be easily readable in the KMess configuration " +"files." +msgstr "" +"Találtunk nem biztonságosan tárolt jelszavakat.
Importáljuk őket " +"a %1 KDE Walletbe, tartsuk-e meg vagy töröljük őket?

Figyelem: " +"amennyiben van elérhető KDE Wallet szolgáltatás, nem érdemes a jelszavakat " +"azon kívül tárolni, mert azok így bárki által olvashatóak.
" + +#: accountsmanager.cpp:396 +msgctxt "Dialog box caption" +msgid "Secure Password Storage" +msgstr "Biztonságos jelszótárolás" + +#: accountsmanager.cpp:398 +msgctxt "Dialog button: Import passwords to a KDE wallet" +msgid "Import" +msgstr "Importálás" + +#: accountsmanager.cpp:401 +msgctxt "Dialog button: Delete insecure passwords" +msgid "Delete" +msgstr "Törlés" + +#: accountsmanager.cpp:404 +msgctxt "Dialog button: Keep insecure passwords" +msgid "Keep" +msgstr "Megtartás" + +#: chat/chat.cpp:119 +#, fuzzy +msgctxt "Error dialog box text" +msgid "" +"You can't send invitations when there are multiple contacts in a chat. " +"Please open a chat screen with the recipient, then re-send your invitation." msgstr "Nem tudod elindítani a meghívást, mert több partnerrel társalogsz." -#: chat/chat.cpp:158 -#, fuzzy +#: chat/chat.cpp:142 msgid "%1 has joined the chat." -msgstr "%1 csatlakozott a társalgáshoz." +msgstr "%1 csatlakozott a társalgáshoz." -#: chat/chat.cpp:211 +#: chat/chat.cpp:196 #, fuzzy -msgid "The conversation went idle, %1 has left the chat." -msgstr "%1 elhagyta a társalgást, inaktívvá vált." +msgctxt "Message shown in chat, %1 is the contact's friendly name" +msgid "The chat went idle, %1 has left the chat." +msgstr "%1 elhagyta a társalgást, inaktívvá vált." -#: chat/chat.cpp:215 +#: chat/chat.cpp:202 #, fuzzy +msgctxt "Message shown in chat, %1 is the contact's friendly name" msgid "%1 has left the chat." -msgstr "%1 elhagyta a társalgást." +msgstr "%1 elhagyta a társalgást." -#: chat/chat.cpp:364 -#, fuzzy +#: chat/chat.cpp:367 msgctxt "Name of a chat tab" msgid "%1 and %2" -msgstr "%1 és %2 - Társalgás" +msgstr "%1 és %2" -#: chat/chat.cpp:371 -#, fuzzy +#: chat/chat.cpp:374 msgctxt "Name of a chat tab" msgid "%1 et al." -msgstr "%1 és mások - Társalgás" +msgstr "%1 és mások" -#: chat/chat.cpp:630 -#, fuzzy +#: chat/chat.cpp:664 msgctxt "Automatic reply message" msgid "%1 (This message was sent automatically)" -msgstr " (Ez egy automatikusan küldött üzenet)" +msgstr "%1 (Ez egy automatikusan küldött üzenet)" -#: chat/chat.cpp:934 +#: chat/chat.cpp:830 #, fuzzy -msgid "You received a wink from %1." -msgstr "Animációt kaptál tőle: %1 " - -#: chat/chat.cpp:971 msgid "" -"The wink could not be displayed. Make sure you have 'cabextract' installed." +"KMess could not save the log for this chat:
The chat logs " +"directory, '%1', does not exist." msgstr "" -"Az animáció nem jeleníthető meg. Győződj meg róla, hogy a 'cabextract' " -"telepítve van." +"A KMess nem tudta elmenteni a társalgás.
A megadott „%1” könyvtár " +"nem létezik." -#: chat/chat.cpp:980 -msgid "The wink could not be displayed. The data could not be read." -msgstr "Az animáció nem jeleníthető meg. Az adat nem olvasható." - -#: chat/chat.cpp:1080 +#: chat/chat.cpp:941 #, fuzzy -msgid "You have received a wink from %1" -msgstr "Animációt kaptál tőle: %1 " +msgid "You have sent a wink" +msgstr "Animációt kaptál %1 partnertől" -#: chat/chat.cpp:1100 +#: chat/chat.cpp:966 +msgid "" +"The chat has been disabled because you are no longer connected to the MSN " +"server." +msgstr "" + +#: chat/chat.cpp:1116 +msgctxt "Warning message shown in chat" +msgid "There has been a connection problem." +msgstr "Kapcsolódási probléma lépett fel." + +#: chat/chat.cpp:1126 +msgctxt "Warning message shown in chat" +msgid "" +"There were too many different custom emoticons in your last message. " +"Only the first 7 will be sent." +msgstr "" + +#: chat/chat.cpp:1139 #, fuzzy -msgid "You received a nudge from %1!" -msgstr "%1 rezgő figyelmeztetést küldött." +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you a voice clip, but KMess does not support voice clips " +"yet, so you can't listen to it now." +msgstr "%1 hangklipet küldött, de a KMess ezt még nem támogatja." -#: chat/chat.cpp:1119 +#: chat/chat.cpp:1153 #, fuzzy -msgid "The message '%1' could not be sent." -msgstr "'%1' üzenet nem lett elküldve." +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an action message, but KMess does not support action " +"messages yet." +msgstr "" +"%1 akcióüzenetet küldött, de a KMess ezt még nem támogatja." -#: chat/chat.cpp:1183 +#: chat/chat.cpp:1168 +msgctxt "Warning message shown in chat, %1 is the contact's friendly name" +msgid "" +"%1 has sent you an MSN feature that KMess does not support yet." +msgstr "" +"%1 olyan MSN szolgáltatást használt, amit a KMess még nem támogat." + +#: chat/chat.cpp:1194 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but displaying winks has been disabled in " +"the account options. You can re-enable them in the account configuration." +msgstr "" +"Kaptál egy winket %1 partnertől, de a winkek megjelenítése ki van kapcsolva " +"a fiók beállításaiban." + +#: chat/chat.cpp:1220 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. Make sure " +"you have the 'cabextract' program installed. Check your distributions " +"package manager for more help." +msgstr "" +"A %1 partnertől kapott wink animáció nem jeleníthető meg. Győződj meg róla, " +"hogy a cabextract telepítve van." + +#: chat/chat.cpp:1230 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed, because " +"extracting the wink package with 'cabextract' failed." +msgstr "" +"A %1 partnertől kapott wink animáció nem jeleníthető meg, mert a " +"cabextracttal nem sikerült kicsomagolni." + +#: chat/chat.cpp:1241 +#, fuzzy +msgctxt "Message shown in the chat window, %1 is the contact's friendly name" +msgid "" +"You received a wink from %1, but it could not be displayed. The data " +"could not be read." +msgstr "" +"A %1 partnertől kapott wink animáció nem jeleníthető meg. Az adat nem " +"olvasható." + +#: chat/chat.cpp:1252 +#, fuzzy +msgid "%1 has sent you a wink!" +msgstr "%1 animációt küldött!" + +#: chat/chat.cpp:1284 +msgid "" +"%1 has gone offline. Any messages you send will be delivered the next " +"time he or she signs in." +msgstr "" + +#: chat/chat.cpp:1289 +#, fuzzy +msgid "%1 has gone offline." +msgstr "%1 csatlakozott a társalgáshoz." + +#: chat/chat.cpp:1299 +#, fuzzy +msgid "%1 has changed his or her status to \"%2\"" +msgstr "%1 csatlakozott a társalgáshoz." + +#: chat/chat.cpp:1330 +#, fuzzy +msgid "%1 has sent you a nudge!" +msgstr "%1 rezgő figyelmeztetést küldött!" + +#: chat/chat.cpp:1363 +msgctxt "" +"Phrase to be inserted in place of a contact name, when a message can't be " +"delivered to any of the recipients" +msgid "all contacts" +msgstr "minden" + +#: chat/chat.cpp:1376 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the nudge to %1." +msgstr "%1 rezgő figyelmeztetést küldött." + +#: chat/chat.cpp:1381 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the wink to %1.." +msgstr "Animációt kaptál %1 partnertől" + +#: chat/chat.cpp:1391 +#, fuzzy +msgctxt "Error message shown in chat, %1 is the contact's friendly name" +msgid "Failed to send the drawing to %1." +msgstr "%1 csatlakozott a társalgáshoz." + +#: chat/chat.cpp:1406 +#, fuzzy +msgctxt "" +"Error message shown in chat, %1 is the sent message, %2 is the contact's " +"friendly name" +msgid "Failed to send the message to %2:
%1" +msgstr "%1 kapcsolat nélküli üzenetet küldött:
„%2”" + +# REPORT -- onthe +#: chat/chat.cpp:1489 +#, fuzzy +msgid "" +"The file '%1' could not be found on your computer, and the download " +"failed." +msgstr "" +"A „%1” fájl nem található a számítógépen vagy nem lehet letölteni." + +#: chat/chat.cpp:1526 +#, fuzzy +msgctxt "Message shown in chat window, %1 is the contact's friendly name" msgid "You've sent a nudge to %1!" -msgstr "Rezgő figyelmeztetést küldtél neki: %1" +msgstr "Rezgő figyelmeztetést küldtél %1 partnernek" -#: chat/chat.cpp:1190 +#: chat/chat.cpp:1532 msgid "You've sent a nudge!" msgstr "Rezgő figyelmeztetést küldtél!" -#: chat/chatmaster.cpp:1219 +#: chat/chat.cpp:1593 +msgid "" +"%1 is currently offline. Any messages you send will be delivered the " +"next time he or she signs in." +msgstr "" + +#: chat/chatmaster.cpp:1368 msgid "%1 is sending a wink: %2" msgstr "%1 animációt küld: %2" -#: chat/chatmessagestyle.cpp:298 +#: chat/chatmessagestyle.cpp:372 msgid "%1 says:" msgstr "%1 üzenete:" -#: chat/chatmessageview.cpp:429 utils/richtextparser.cpp:675 +#: chat/chatmessageview.cpp:320 +#, fuzzy +msgctxt "" +"Header of a chat file saved in HTML: %1 is the contact, %2 the date and time" +msgid "Chat with %1
Started on: %2" +msgstr "Beszélgetés %1 és közötted
Kezdet: %2" + +#: chat/chatmessageview.cpp:364 +#, fuzzy +msgctxt "" +"Header of a single chat saved as plain text chat log: %1 is the chat date " +"and time" +msgid "Chat started on: %2" +msgstr "A beszélgetés %2 időpontban kezdődött" + +#: chat/chatmessageview.cpp:404 +#, fuzzy +msgctxt "Header of a chat file saved in plain text: %1 is the contact" +msgid "Saved KMess chats with %1" +msgstr "KMess által mentett társalgás %1 partnerrel" + +#: chat/chatmessageview.cpp:1062 utils/richtextparser.cpp:653 msgid "Add this emoticon: %1" msgstr "%1 emotikon hozzáadása" -#: chat/chatview.cpp:523 chat/chatwindow.cpp:508 -msgid "&Invite" -msgstr "&Meghívás" +#: chat/chatstatusbar.cpp:49 +msgctxt "@action:button" +msgid "Reconnect" +msgstr "Újrakapcsolódás" -#: chat/chatview.cpp:695 +#: chat/chatview.cpp:299 msgid "" -"Could not save chat log. Make sure you have permission to write in the " -"folder where logs are being saved." +"Could not save chat log in directory '%1'.\n" +"Make sure you have permission to write in the folder where logs are being " +"saved." msgstr "" -"A társalgási napló nem menthető. Győződj meg róla, hogy van írási " -"jogosultságod a naplók könyvtárára." +"A társalgási napló nem menthető a „%1” könyvtárba.\n" +"Győződj meg róla, hogy van-e írási jogosultságod a könyvtárra." -#: chat/chatview.cpp:1025 network/applications/filetransfer.cpp:199 +#: chat/chatview.cpp:438 +#, fuzzy +msgctxt "Chat log saving dialog, file type filter" +msgid "" +"*.html *.htm|Web Page (*.html)\n" +"*.txt|Plain Text Document (*.txt)\n" +"*.xml|XML Document (*.xml)" +msgstr "" +"*.html *.htm|Weblap (*.html)\n" +"*.txt|Egyszerű szöveg (*.txt)\n" +"*.xml|XML Dokumentum (*.xml)" + +#: chat/chatview.cpp:457 +#, fuzzy msgid "" "The file '%1' already exists.\n" -"do you want to overwrite it?" +"Do you want to overwrite it?" msgstr "" -"'%1' fájl már létezik.\n" +"„%1” fájl már létezik.\n" "Felülírod?" -#: chat/chatview.cpp:1026 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:458 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Overwrite File" msgstr "Fájl felülírása" -#: chat/chatview.cpp:1027 network/applications/filetransfer.cpp:200 -#: network/applications/filetransferp2p.cpp:349 +#: chat/chatview.cpp:459 network/applications/filetransfer.cpp:261 +#: network/applications/filetransferp2p.cpp:347 msgid "Over&write" msgstr "&Felülírás" -#: chat/chatview.cpp:1275 +#: chat/chatview.cpp:824 msgid "Add this &Emoticon..." -msgstr "&Emotikon hozzáadása" +msgstr "&Emotikon hozzáadása…" -#: chat/chatview.cpp:1282 +#: chat/chatview.cpp:827 +#, fuzzy +msgid "Ignore this &Emoticon" +msgstr "&Emotikon hozzáadása…" + +#: chat/chatview.cpp:833 msgid "Send &Email" msgstr "&E-mail küldése" -#: chat/chatview.cpp:1286 -msgid "Copy E&mail" -msgstr "E-&mail másolása" +#: chat/chatview.cpp:837 +msgid "Add &Contact" +msgstr "Partner &felvétele" -#: chat/chatview.cpp:1293 +#: chat/chatview.cpp:841 +#, fuzzy +msgid "Copy E&mail Address" +msgstr "&E-mail cím másolása" + +#: chat/chatview.cpp:847 msgid "Visit &Link" msgstr "Ugrás a &link címére" -#: chat/chatview.cpp:1297 +#: chat/chatview.cpp:851 msgid "Copy &Address" msgstr "&Cím másolása" -#: chat/chatview.cpp:1312 -msgid "&Copy text" +#: chat/chatview.cpp:867 +msgid "&Copy Text" msgstr "&Szöveg másolása" -#: chat/chatview.cpp:1313 +#: chat/chatview.cpp:868 msgid "Select &All" msgstr "&Mindent kijelöl" -#: chat/chatview.cpp:1314 -msgid "Find &Text" -msgstr "" +#: chat/chatview.cpp:869 +msgid "Find &Text..." +msgstr "Szöveg &keresése…" -#: chat/chatview.cpp:1315 -msgid "Save chat to &File" -msgstr "Társalgás mentése &fájlba" +#: chat/chatview.cpp:870 chat/chatwindow.cpp:494 +msgid "C&lear Chat" +msgstr "&Ablak törlése" -#: chat/chatwindow.cpp:489 -msgid "&Chat" -msgstr "&Társalgás" +#: chat/chatview.cpp:871 +msgid "Save Chat to &File..." +msgstr "Társalgás mentése &fájlba…" -#: chat/chatwindow.cpp:492 -msgid "Send a &File" -msgstr "&Fájl küldése" +#: chat/chatwindow.cpp:108 +msgid "Contacts" +msgstr "Partnerek" -#: chat/chatwindow.cpp:493 -msgid "Start a &Meeting" -msgstr "&Megbeszélés kezdése" - -#: chat/chatwindow.cpp:494 -msgid "Send a &Nudge!" -msgstr "Rezgő figyelmeztetés küldése" - -#: chat/chatwindow.cpp:495 -msgid "Save chat" -msgstr "Társalgás mentése" - -#: chat/chatwindow.cpp:496 -#, fuzzy -msgid "&Emoticons" -msgstr "Emotikonok" - -#: chat/chatwindow.cpp:498 -#, fuzzy -msgid "Close &All Tabs" -msgstr "Fül bezárása" - -#: chat/chatwindow.cpp:504 -#, fuzzy -msgid "Meeting" -msgstr "Beállítások" - -#: chat/chatwindow.cpp:505 -msgid "Nudge" -msgstr "" - -#: chat/chatwindow.cpp:526 -msgid "Start or Stop a &Conversation" -msgstr "&Megbeszélés indítása vagy befejezése" - -#: chat/chatwindow.cpp:568 -msgid "Change &Font" -msgstr "&Betűtípus módosítása" - -#: chat/chatwindow.cpp:569 -msgid "Change Font &Color" -msgstr "Betűtípus &színének módosítása" - -#: chat/chatwindow.cpp:576 -#, fuzzy -msgid "&Font" -msgstr "&Kapcsolat" - -#: chat/chatwindow.cpp:577 -#, fuzzy -msgid "Font &Color" -msgstr "Betűtípus &színének módosítása" - -#: chat/chatwindow.cpp:616 kmessinterface.cpp:266 -msgid "&Help" -msgstr "" - -#: chat/chatwindow.cpp:657 settings/accountsettingsdialog.cpp:86 -#: settings/accountsettingsdialog.cpp:87 +#: chat/chatwindow.cpp:114 settings/accountsettingsdialog.cpp:89 +#: settings/accountsettingsdialog.cpp:90 msgid "Emoticons" msgstr "Emotikonok" -#: chat/chatwindow.cpp:658 -msgid "My emoticons" +#: chat/chatwindow.cpp:121 +msgid "My Emoticons" msgstr "Saját emotikonok" -#: chat/chatwindow.cpp:738 +#: chat/chatwindow.cpp:328 #, fuzzy -msgid "&Settings" -msgstr "Beállítások" - -#: chat/chatwindow.cpp:741 -msgid "Use &Spell Checking" +msgid "" +"There are multiple tabs opened in this chat window. Do you want to " +"close the current tab only, or all tabs?

Note: You can close " +"all tabs at once by pressing Alt+F4." msgstr "" +"Több fül is van ebben a társalgási ablakban. Szeretnéd bezárni mindet " +"vagy csak az aktuálisat?

Megjegyzés: A füleket egyszerre " +"bezárhatod a Shift+Esc kombinációval" -#: chat/chatwindow.cpp:742 +#: chat/chatwindow.cpp:331 +msgctxt "Dialog box caption: closing a chatwindow with a single tab" +msgid "Closing a Chat Tab" +msgstr "Fül bezárása" + +#: chat/chatwindow.cpp:332 +#, fuzzy +msgid "Close All Tabs" +msgstr "&Minden fül bezárása" + +#: chat/chatwindow.cpp:333 +#, fuzzy +msgid "Close Current Tab" +msgstr "Aktuális fül bezárása" + +#: chat/chatwindow.cpp:409 +msgid "&Invite..." +msgstr "&Meghívás…" + +#: chat/chatwindow.cpp:410 +msgid "Send a &File..." +msgstr "&Fájl küldése…" + +#: chat/chatwindow.cpp:411 +msgid "Webcam Chat" +msgstr "Webkamerás társalgás" + +# FIXME -- biztos mindenki tudja, hogy ez a GnomeMeeting/Ekiga jellegű Meetingre vonatkozik? +#: chat/chatwindow.cpp:412 +msgid "Start a &Meeting" +msgstr "&Megbeszélés kezdése" + +#: chat/chatwindow.cpp:413 +msgid "Send a &Nudge!" +msgstr "Rezgő figyelmeztetés küldése" + +#: chat/chatwindow.cpp:414 +msgid "Save Chat..." +msgstr "Társalgás mentése…" + +#: chat/chatwindow.cpp:415 +msgid "Close &All Tabs" +msgstr "&Minden fül bezárása" + +#: chat/chatwindow.cpp:420 +msgid "Change &Font" +msgstr "&Betűtípus módosítása" + +#: chat/chatwindow.cpp:421 +msgid "Change Font &Color" +msgstr "Betűk &színének módosítása" + +#: chat/chatwindow.cpp:428 msgid "Show &Emoticons" msgstr "&Emotikonok megjelenítése" -#: chat/chatwindow.cpp:743 chat/chatwindow.cpp:1473 +#: chat/chatwindow.cpp:429 #, fuzzy -msgid "Hide Side&bar" -msgstr "Oldalsáv" +msgid "Show S&tatus Messages" +msgstr "&Idő megjelenítése" -#: chat/chatwindow.cpp:744 +#: chat/chatwindow.cpp:435 +msgid "&Panels" +msgstr "&Panelek" + +#: chat/chatwindow.cpp:438 +msgid "Use &Spell Checking" +msgstr "&Helyesírásellenőrzés engedélyezése" + +# FIXME -- biztos mindenki tudja, hogy ez a GnomeMeeting/Ekiga jellegű Meetingre vonatkozik? +#: chat/chatwindow.cpp:442 +msgid "Meeting" +msgstr "Megbeszélés" + +#: chat/chatwindow.cpp:443 +msgid "Nudge" +msgstr "Megbökés" + +#: chat/chatwindow.cpp:444 +msgid "Send a &File" +msgstr "&Fájl küldése" + +#: chat/chatwindow.cpp:447 chat/chatwindow.cpp:448 +msgid "P&revious Tab" +msgstr "" + +#: chat/chatwindow.cpp:449 chat/chatwindow.cpp:450 +msgid "Ne&xt Tab" +msgstr "" + +#: chat/chatwindow.cpp:465 #, fuzzy -msgid "Hide &Toolbar" -msgstr "Oldalsáv" +msgid "Enable or disable the contacts panel" +msgstr "Partnerpanel be- és kikapcsolása" -#: chat/chatwindow.cpp:750 chat/chatwindow.cpp:1474 +#: chat/chatwindow.cpp:466 chat/chatwindow.cpp:467 +msgctxt "Toolbar button" +msgid "Contacts" +msgstr "Partnerek" + +#: chat/chatwindow.cpp:471 #, fuzzy -msgid "Hide the contact sidebar" -msgstr "Partnerek oldalsáv megjelenítése/elrejtése" +msgid "Enable or disable the standard emoticons panel" +msgstr "Szabványos emotikonok paneljának be- és kikapcsolása" -#: chat/chatwindow.cpp:851 +#: chat/chatwindow.cpp:472 chat/chatwindow.cpp:473 +msgctxt "Toolbar button" +msgid "Emoticons" +msgstr "Emotikonok" + +#: chat/chatwindow.cpp:477 +#, fuzzy +msgid "Enable or disable the Custom Emoticons panel" +msgstr "Saját emotikonok paneljának be- és kikapcsolása" + +#: chat/chatwindow.cpp:478 chat/chatwindow.cpp:479 +msgctxt "Toolbar button" +msgid "My Emoticons" +msgstr "Saját emotikonok" + +#: chat/chatwindow.cpp:491 +msgid "&Font" +msgstr "&Betűtípus" + +#: chat/chatwindow.cpp:492 +msgid "Font &Color" +msgstr "Betűk &színe" + +#: chat/chatwindow.cpp:493 +msgid "C&lear Chat Window" +msgstr "Ablak törlése" + +#: chat/chatwindow.cpp:561 +msgctxt "Menu/toolbar action for voice conversations (KPhone support)" +msgid "Start or Stop a &Conversation" +msgstr "Hangos &megbeszélés indítása vagy befejezése" + +#: chat/chatwindow.cpp:977 msgid "" -"There are multiple tabs open in this chat window. Do you want to close " -"the current tab only, or all tabs?

Note:You can also close all " -"tabs at once by pressing Shift+Esc." +"You used an incorrect syntax for the /status command. The correct " +"syntax is: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
Or you can use the /online, /phone etc. shortcuts." msgstr "" +"Rosszul használtad a /status parancsot. A helyes szintaxis a " +"következő: /status online|away|idle|brb|busy|lunch|phone|invisible." +"
De használhatod a /online, /phone stb. rövid formákat is." +"" -#: chat/chatwindow.cpp:854 -msgctxt "Caption when closing a single chat window tab" -msgid "Closing a Chat Tab" +#: chat/chatwindow.cpp:980 +msgctxt "Dialog box caption for wrong command syntax warning" +msgid "Incorrect /status syntax" +msgstr "Hibás /status szintaxis" + +#: chat/chatwindow.cpp:1043 chat/chatwindow.cpp:1056 +#, fuzzy +msgid "You can't block anyone in a group chat." +msgstr "Nem blokkolhatsz senkit egy csoportos társalgásban." + +#: chat/chatwindow.cpp:1045 chat/chatwindow.cpp:1058 +#, fuzzy +msgctxt "Caption when trying to block someone when in a group chat" +msgid "Can't Block Right Now!" +msgstr "Nem lehet blokkolni" + +#: chat/chatwindow.cpp:1088 +msgid "" +"Unknown command %1. If you did not want this message to be a " +"command, prepend your message with another /." msgstr "" +"Ismeretlen parancs: %1. Ha nem akarod, hogy ezt az üzenetet " +"parancsként értelmezzük, tegyél az elejére még egy / jelet." -#: chat/chatwindow.cpp:855 -#, fuzzy -msgid "Close all tabs" -msgstr "Fül bezárása" +#: chat/chatwindow.cpp:1091 +msgctxt "Caption when an unknown command was requested" +msgid "Unknown Command" +msgstr "Ismeretlen parancs" -#: chat/chatwindow.cpp:856 -#, fuzzy -msgid "Close current tab" -msgstr "Fül bezárása" - -#: chat/chatwindow.cpp:1467 -#, fuzzy -msgid "Show Side&bar" -msgstr "Oldalsáv" - -#: chat/chatwindow.cpp:1468 -#, fuzzy -msgid "Show the contact sidebar" -msgstr "Partnerek oldalsáv megjelenítése/elrejtése" - -#: chat/chatwindow.cpp:1565 -msgid "%1 is typing." -msgstr "%1 ír." - -#: chat/chatwindow.cpp:1575 -msgid "%1 and %2 are typing." -msgstr "%1 és %2 üzenetet írnak." - -#: chat/chatwindow.cpp:1579 -msgid "%1, %2 and %3 others are typing." -msgstr "%1, %2 és %3 üzenetet írnak." - -#: chat/chatwindow.cpp:1611 -#, fuzzy +#: chat/chatwindow.cpp:1555 msgctxt "Chat window caption, without contact name" msgid "Chat" msgstr "Társalgás" -#: chat/chatwindow.cpp:1615 -#, fuzzy +#: chat/chatwindow.cpp:1559 msgctxt "Chat window caption, with contact name" msgid "%1 - Chat" msgstr "%1 - Társalgás" -#: chat/contactframe.cpp:284 kmessview.cpp:560 -msgid "&Send email" -msgstr "E-mail küldé&se" +#: chat/chatwindow.cpp:1579 kmessinterface.cpp:695 +msgctxt "Question dialog box message" +msgid "" +"Are you sure you want to hide the menu bar? You will be able to show " +"it again by using this keyboard shortcut: %1" +msgstr "" +"Biztosan el szeretnéd rejteni a menüt? A %1 kombinációval tudod " +"majd újra előhozni." -#: chat/contactframe.cpp:285 kmessview.cpp:561 +#: chat/chatwindow.cpp:1583 kmessinterface.cpp:699 +msgctxt "Dialog box caption: hiding the menu bar" +msgid "Hiding the Menu" +msgstr "Menü elrejtése" + +#: chat/chatwindow.cpp:1836 +msgid "%1 is typing..." +msgstr "%1 ír…" + +#: chat/chatwindow.cpp:1846 +msgid "%1 and %2 are typing..." +msgstr "%1 és %2 ír…" + +#: chat/chatwindow.cpp:1850 +msgid "%1, %2 and %3 others are typing..." +msgstr "%1, %2 és még %3 résztvevő ír…" + +#: chat/chatwindow.cpp:2296 +#, fuzzy +msgctxt "Tool tip for chat tabs" +msgid "" +"

  • " ), + chat->getStartTime().toString( Qt::DefaultLocaleLongDate ), + currentAccount_->getHandle() ) ); + + chatTabs_->setTabToolTip( index, toolTip ); + + // If chat is current chat then calls update caption method + if ( chat == getCurrentChat() ) + { +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Source chat is the current one, updating window title."; +#endif + setWindowTitle(); + } +} + + + +// Start a voice conversation +void ChatWindow::startConversation() +{ + getCurrentChat()->startConversation(); +} + + + +// Start a file transfer +void ChatWindow::startFileTransfer() +{ + getCurrentChat()->startFileTransfer(); +} + + + +// Start GnomeMeeting with a contact. +void ChatWindow::startMeeting() +{ + getCurrentChat()->startMeeting(); +} + + + +// Start a file transfer +void ChatWindow::startWebcamTransfer() +{ + getCurrentChat()->startWebcamTransfer(); +} + + + +// Called when the "use emoticons" action is called. +void ChatWindow::toggleEmoticons( bool useEmoticons ) +{ + // Set the new emoticon use value to the account + currentAccount_->setUseEmoticons( useEmoticons ); +} + + + +// Called when the "use emoticons" action is called. +void ChatWindow::toggleSessionInfo( bool showSessionMessages ) +{ + // Set the new emoticon use value to the account + currentAccount_->setShowSessionInfo( showSessionMessages ); +} + + + +// Called when the "use spell checking" action is called. +void ChatWindow::toggleSpellCheck( bool useSpellCheck ) +{ +#ifdef KMESSDEBUG_CHATWINDOW + kDebug() << "Spell checking is now" << useSpellCheck; +#endif + + // Sync the action with a manually set flag (ie in readProperties()) + if( spellCheckAction_->isChecked() != useSpellCheck ) + { + spellCheckAction_->setChecked( useSpellCheck ); + } + + // Change the spell checking feature status + messageEdit_->setCheckSpellingEnabled( useSpellCheck ); +} + + + +// Update the editor's font to match the account's font +void ChatWindow::updateEditorFont() +{ +#ifdef KMESSTEST + KMESS_ASSERT( currentAccount_ != 0 ); +#endif + + // Set the font settings the user has chosen + messageEdit_->setTextColor( QColor( currentAccount_->getFontColor() ) ); + messageEdit_->setFont( currentAccount_->getFont() ); + messageEdit_->setCurrentFont( currentAccount_->getFont() ); + messageEdit_->setFontPointSize( currentAccount_->getFont().pointSize() ); +} + + + +// Clean up the view of the current chat tab +void ChatWindow::viewClearChat() +{ + getCurrentChat()->slotClearChat(); +} + + + +// enlarge the font size +void ChatWindow::viewZoomIn() +{ + changeZoomFactor( true ); +} + + + +// decrease the font size +void ChatWindow::viewZoomOut() +{ + changeZoomFactor( false ); +} + + + #include "chatwindow.moc" diff --git a/src/chat/chatwindow.h b/src/chat/chatwindow.h index 6d56771..1b43a3c 100644 --- a/src/chat/chatwindow.h +++ b/src/chat/chatwindow.h @@ -19,14 +19,15 @@ #define CHATWINDOW_H #include "ui_chatwindow.h" +#include "chatstatusbar.h" #include #include #include #include -#include #include +#include // forward declarations @@ -34,7 +35,7 @@ class Chat; class ChatMessage; class ChatView; class CurrentAccount; -class EmoticonSidebar; +class EmoticonsWidget; class MsnSwitchboardConnection; class QLabel; @@ -55,139 +56,164 @@ class KToolBarPopupAction; * @author Mike K. Bennett * @ingroup Chat */ -class ChatWindow : public KMainWindow, private Ui::ChatWindow +class ChatWindow : public KXmlGuiWindow, private Ui::ChatWindow { Q_OBJECT friend class KMessTest; public: + enum UIState + { + Disconnected, + Connecting, + Connected, + Disconnecting + }; + + public: // Public methods // The constructor - ChatWindow(QWidget *parent=0); + ChatWindow( QWidget *parent=0 ); // The destructor virtual ~ChatWindow(); // Add a new chat tab - Chat *addChatTab( Chat *newChat ); + Chat *addChatTab( Chat *newChat, bool foreground ); // Return a reference to a chat Chat *getChat( int index = -1 ); // Return a reference to the active chat Chat *getCurrentChat(); - // Change the active chat - void setCurrentChat( Chat *chat ); // Initialize the object bool initialize(); - // Return whether the side bar is enabled - bool isSidebarVisible(); - // Return the chat object for a given switchboard connection, if found. - Chat *getChatBySwitchboardConnection( const MsnSwitchboardConnection *connection ) const; + // The chat window is closing, called by KMainWindow + bool queryClose(); + // The application is exiting, called by KMainWindow + bool queryExit(); + // Close a chat tab without user intervention + void removeChatTab( Chat *chat ); + // Change the active chat + void setCurrentChat( Chat *chat ); // Enable or disable the parts of the window which allow user interaction - void setEnabled( bool isEnabled ); + void setUIState( UIState state ); + // Show a status message. + void showStatusMessage( ChatStatusBar::MessageType type, QString message ); + // Check if the window must be closed + bool checkAndCloseWindow(); private: // Private methods - // Toggle the sidebar based on account preferences - void checkSidebarPreferences(); + // Set the zoom factor of the text + void changeZoomFactor( bool increase ); // Filter to catch window activation and keyboard shortcut events bool eventFilter( QObject *obj, QEvent *event ); - // Initialize the connect menu. - void initChatMenu(); - // Initialize the settings menu. - void initEditMenu(); - // Initialize the help menu. - void initHelpMenu(); // Set up the preferences which depend on the current account bool initializeCurrentAccount(); // Create the menus. - void initMenus(); - // Initialize the settings menu. - void initSettingsMenu(); + void createMenus(); // Restore the window properties (called by KMainWindow) void readProperties( const KConfigGroup &config = *((const KConfigGroup *)0) ); - // Delete an existing chat tab - bool removeChatTab( int index ); - // The application is exiting - bool queryExit(); // Save the window properties (called by KMainWindow) void saveProperties( KConfigGroup &config = *((KConfigGroup *)0) ); + // Enable or disable the parts of the window which allow user interaction + void setEnabled( bool isEnabled ); public slots: - // Show a status message temporary in the status dialog - void showStatusMessage( QString message = QString(), int duration = 5000 ); + // Show a status message temporarily in the status dialog + void showStatusMessage( QString message = QString(), int duration = 5 ); private slots: // Private slots - // Show the "about KDE" message. - void aboutKDE(); - // Show the "about KMess" message. - void aboutKMess(); - // put the marked text/object into the clipboard + // All tabs must be closed + bool closeAllTabs(); + // A tab must be closed + bool closeTab(); + // Close any open widget or close the tab + void closeWidgetOrTab(); + // Copy the marked text/object into the clipboard void editCopy(); - // put the marked text/object into the clipboard and remove it from the document + // Move the marked text/object from the document into the clipboard void editCut(); + // Bring up a find dialog to search for text in the chat. + void editFind(); // Bring up a dialog to change the message font color. void editFont(); // Bring up a dialog to change the message font color. void editFontColor(); + // The color in the text box changed. + void editorColorChanged( const QColor &color ); // paste the clipboard into the document void editPaste(); - // enlarge the text size - void editZoomIn(); - // decrease the text size - void editZoomOut(); - // Show the user manual for KMess. - void helpContents(); - // A chat tab is closing - bool queryClose(); - // The chat window is closing - bool queryCloseAll(); + // Handle a text command (e.g. '/online') + bool handleCommand( QString command ); + // Insert an emoticon in chat + void insertEmoticon( const QString &shortcut ); // Save the chat according to the user's request void saveChat(); + // Send a ink via server + void sendInk(); + // Send a message via the server + void sendMessage(); + // The 'Send nudge' button has been clicked + void sendNudge(); // Change the caption of the chat window void setWindowTitle( const QString &caption = QString() ); - // The emoticon button was pressed. - void showEmoticonPanel(); - // "Show status bar" was toggled. - void showStatusBar(); - // "Show toolbar" was toggled. - void showToolBar(); // "Show menu bar" was toggled. void showMenuBar(); // Make the caption blink if the window still doesn't have focus void slotBlinkCaption(); + // Called when an emoticon dock is toggled + void slotEmoticonDocksToggled(); // A message has been received void slotGotChatMessage( const ChatMessage &message, Chat *chat ); // A nudge has been received: shake the window. void slotGotNudge(); // Update the status label text void slotGotTypingMessage( Chat *chat = 0 ); - // Wheel mouse moved: change the tab. - void slotWheelMouseMoved( int delta ); - // The 'Send nudge' button has been clicked - void sendNudge(); + // Invite button was pressed + void slotInviteContact(); + // The message text changed, the user is typing + void slotMessageChanged(); + // The user clicked the new line button so insert a new line in the editor + void slotNewLineButtonClicked(); // Change the info for tab - void slotChatInfoChanged(); - // Switch the window to the clicked tab - void slotSwitchTab( int tabIndex ); - // Switch the window to the clicked tab and remove it - void slotSwitchAndDeleteTab( int tabIndex ); + void slotUpdateChatInfo( Chat *chat = 0 ); // Switch the window to the tab at the left of the current one void slotSwitchToLeftTab(); // Switch the window to the tab at the right of the current one void slotSwitchToRightTab(); - // The user sent a new message - void slotUserSentMessage(); + // The user pressed return in the message editor, so send the message + void slotSendButtonClicked(); + // Switch to the message editor, or another one + void slotSwitchEditor(); + // The active tab was changed + void slotTabChanged( int currentIndex ); + // Remove a chat + bool slotTabRemoved( Chat *chat ); + // Delete an existing chat tab by widget + bool slotTabRemoved( QWidget *chatWidget ); + // Update the editor's font to match the account's font + void updateEditorFont(); // Start a voice conversation void startConversation(); // Start a file transfer void startFileTransfer(); // Start GnomeMeeting with a contact. void startMeeting(); + // Start a webcam transfer + void startWebcamTransfer(); // Called when the "use emoticons" action is called. void toggleEmoticons( bool useEmoticons ); - // Called when the "show sidebar" action is called. - void toggleSidebar(); + // Called when the "show session messages" action is called. + void toggleSessionInfo( bool showSessionMessages ); // Called when the "use spell checking" action is called. void toggleSpellCheck( bool useSpellCheck ); + // Clean up the view of the current chat tab + void viewClearChat(); + // enlarge the text size + void viewZoomIn(); + // decrease the text size + void viewZoomOut(); private: // private attributes + // ActionCollection + KActionCollection *actionCollection_; // The add emoticon action KAction *addEmoticonAction_; // A timer used to make the caption blink on new messages. @@ -196,65 +222,77 @@ class ChatWindow : public KMainWindow, private Ui::ChatWindow bool blinkToUpper_; // The stored window caption QString caption_; - // The Chat menu - KMenu *chatMenu_; - // The list of active chat tabs - QList chats_; + // Action to change own text font + KAction *changeFontAction_; + // Action to change own text color + KAction *changeFontColorAction_; // Action to close the window along with all of its tabs KAction *closeAllAction_; + // Contacts list Dock Widget + QDockWidget *contactsDock_; // A pointer to the instance of the current account CurrentAccount *currentAccount_; - // The currently shown Invite menu - QAction *currentInviteMenu_; - // The custom emoticons sidebar - EmoticonSidebar *customEmoticonSidebar_; + // Custom emoticons Dock Widget + QDockWidget *customEmoticonsDock_; // Action to cut text to the clipboard KAction *cutAction_; - // The emoticon sidebar toggling action + // Whether or not typing messages should be sent (true except the very moment a text message is sent) + bool doSendTypingMessages_; + // The emoticon display toggling action KAction *emoticonAction_; // The first item in the Chat Menu (used to add the Invite menu before it) QAction *firstChatMenuItem_; - // The help menu launcher - KHelpMenu *helpMenu_; + // Index for fast-retype + int indexSentences_; // Whether or not the object was initialized bool initialized_; // The contact invite action - KActionMenu *inviteButton_; - // Whether the sidebar should only be temporary visible - bool isSidebarTemporary_; - // The index of the chat tab which was activated last - int lastActiveChatIndex_; + KAction *inviteButton_; + // Last sentence in writing + QString lastSentence_; // The last time the window was shaked QTime lastShake_; // Action to open a meeting KAction *meetingAction_; + // Action to switch to the next tab + KAction *nextTabAction_; // Action to send a nudge KAction *nudgeAction_; + // Action menu containing the panels shortcuts + KActionMenu *panelsMenuAction_; // Action to paste the clipboard contents KAction *pasteAction_; - // Toggle actions for showing and hiding the statusbar - KToggleAction *showStatusBar_; - // Toggle actions for showing and hiding the toolbar - KToggleAction *showToolBar_; - // Toggle actions for showing and hiding the menu bar - KToggleAction *showMenuBar_; - // The sidebar toggle - KAction *sidebarAction_; + // Action to switch to the previous tab + KAction *prevTabAction_; + // List of previously sent messages, to allow sending them again quickly + QStringList quickRetypeList_; // Action to start a file transfer KAction *sendAction_; - // The standard emoticons sidebar - EmoticonSidebar *standardEmoticonSidebar_; + // Toggle actions for showing and hiding the menu bar + KToggleAction *showMenuBar_; + // Toggle action to show/hide the join and part messages + KToggleAction *sessionInfoAction_; + // Action to toggle spell checking in the message editor + KToggleAction *spellCheckAction_; + // Standard emoticons Dock Widget + QDockWidget *standardEmoticonsDock_; // The status label - QLabel *statusLabel_; + ChatStatusBar *statusLabel_; // A timer to time the duration that a status message is shown QTimer statusTimer_; - // The bar of chat tabs - KTabBar *tabBar_; - // ActionCollection - KActionCollection *actionCollection_; + // A timer to time whether a "user is typing" message should be sent. + QTimer userTypingTimer_; + // Action to start a webcam transfer + KAction *webcamAction_; + // Stores the current level of zoom + int zoomLevel_; signals: // Public signals // Signal that the window is about to close. - void closing(QObject *object); + void closing( QObject *object ); + // Reconnect + void reconnect(); + // Signal that the user is typing + void userIsTyping(); }; #endif diff --git a/src/chat/chatwindow.ui b/src/chat/chatwindow.ui index 8a21dba..66759be 100644 --- a/src/chat/chatwindow.ui +++ b/src/chat/chatwindow.ui @@ -1,137 +1,388 @@ - + + ChatWindow - - + + 0 0 - 392 - 270 + 463 + 391 - - - 2 + + + 0 - + 0 - - - - 0 - 0 - + + + Qt::Vertical - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - - 0 - - - 0 - - - - - - - - Qt::Horizontal - - + 4 - + false - - - - 100 - 0 - - - - - 250 - 250 - - - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - - 0 - - - 0 - - - - - - + + + 0 - 0 + 100 - + - 130 - 0 + 150 + 100 - - 0 + + QTabWidget::pane { border: 0px solid transparent; padding: 0; } - - 0 + + Qt::ElideRight - - - - 0 - 0 - 120 - 218 - + + false + + + true + + + true + + + + + + 0 - - Contacts - - - - 0 - - - 0 - - - + + 0 + + + + + true + + + 4 + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Qt::WheelFocus + + + QFrame::StyledPanel + + + Qt::ScrollBarAlwaysOff + + + false + + + + + + + + + 0 + + + 0 + + + + + true + + + + + + + + + 0 + + + 0 + + + + + false + + + + + + + + + 0 + + + 0 + + + + + + + + + + 0 + + + 0 + + + + + + + + + + + + 2 + + + + + Qt::NoFocus + + + Standard text mode + + + Click this button to switch to standard text mode. + + + + + + true + + + true + + + + + + + Qt::NoFocus + + + Ink message + + + Click this button to switch to ink mode, so you can write or paint an ink message. + + + + + + true + + + + + + + Qt::Vertical + + + + + + + Qt::NoFocus + + + Standard emoticons + + + Click this button to show all default MSN emoticons, so you can easily insert them in your messages. + + + + + + true + + + + + + + Qt::NoFocus + + + Custom emoticons + + + If you have added any custom emoticons, click this button to view them, so you can easily insert them in your messages. + + + + + + true + + + + + + + Qt::NoFocus + + + Winks + + + Click this button to view the available winks. + + + + + + true + + + + + + + Qt::Horizontal + + + + 18 + 17 + + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Ne&w Line + + + Alt+W + + + + + + + false + + + + 0 + 0 + + + + Qt::NoFocus + + + S&end + + + Alt+E + + + + + + - + qPixmapFromMimeSource + + + KTabWidget + QTabWidget +
    ktabwidget.h
    + 1 +
    + + KTextEdit + QTextEdit +
    ktextedit.h
    +
    + + InkEdit + QWidget +
    chat/inkedit.h
    + 1 +
    + + EmoticonsWidget + QWidget +
    chat/emoticonswidget.h
    + 1 +
    + + WinksWidget + QWidget +
    chat/winkswidget.h
    + 1 +
    +
    + + chatTabs_ + messageEdit_ + + + slotSendButtonClicked() + slotNewLineButtonClicked() + slotMessageChanged() + slotColorChanged() + slotSwitchEditor() +
    diff --git a/src/chat/chatwindowui.rc b/src/chat/chatwindowui.rc new file mode 100644 index 0000000..9d5f3bb --- /dev/null +++ b/src/chat/chatwindowui.rc @@ -0,0 +1,45 @@ + + + + + &Chat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Toolbar + + + + + + + + diff --git a/src/chat/contactaction.cpp b/src/chat/contactaction.cpp deleted file mode 100644 index cefc6f4..0000000 --- a/src/chat/contactaction.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/*************************************************************************** - contactaction.cpp - description - ------------------- - begin : Wed Jan 22 2003 - copyright : (C) 2003 by Mike K. Bennett - email : mkb137b@hotmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "contactaction.h" - -#include "../contact/contact.h" -#include "../currentaccount.h" -#include "../kmessdebug.h" - -#include - - - -// The constructor -ContactAction::ContactAction(const Contact *contact, KMenu *menu, QWidget *parent ) - : KAction(parent), - contact_(contact), - inChat_(false), - menu_(menu), - added_(false) -{ -#ifdef KMESSTEST - KMESS_ASSERT( menu_ != 0 ); - KMESS_ASSERT( contact_ != 0 ); -#endif - - // Connect the action to its own activated signal - connect( this, SIGNAL( triggered(Qt::MouseButtons,Qt::KeyboardModifiers) ), - this, SLOT ( slotActivated() ) ); - - // Connect the contact - connect( contact_, SIGNAL( changedFriendlyName() ), - this, SLOT ( updateText() ) ); - connect( contact_, SIGNAL( changedStatus() ), - this, SLOT ( updateVisibility() ) ); - connect( contact_, SIGNAL( changedList(Contact*) ), - this, SLOT ( updateVisibility() ) ); - - // Set default text and visibility - updateText(); - updateVisibility(); -} - - - -// The destructor -ContactAction::~ContactAction() -{ -} - - - -// Return the contact's handle -const QString ContactAction::getHandle() const -{ - return contact_->getHandle(); -} - - - -// Set whether or not the contact is in the chat -void ContactAction::setInChat( bool inChat ) -{ - inChat_ = inChat; - updateVisibility(); -} - - - -//Inherit from KAction... -void ContactAction::slotActivated() -{ - emit activated( contact_->getHandle() ); -} - - - -// Update the text based on the contact's name -void ContactAction::updateText() -{ - setText( contact_->getFriendlyName() ); -} - - - -// Update the visibility of the action based on the contact's status, group, and list -void ContactAction::updateVisibility() -{ - bool shouldBeAdded = ( ! inChat_ && contact_->isOnline() && contact_->isFriend() ); - - // Add the contact to the menu if it should be added and it's not - if ( shouldBeAdded && ! added_ ) - { - menu_->addAction( this ); - added_ = true; - } - else if ( ! shouldBeAdded && added_ ) - { // Pull the contact out of the menu if it's added but shouldn't be - menu_->removeAction( this ); - added_ = false; - } -} - -#include "contactaction.moc" diff --git a/src/chat/contactaction.h b/src/chat/contactaction.h deleted file mode 100644 index aadb210..0000000 --- a/src/chat/contactaction.h +++ /dev/null @@ -1,76 +0,0 @@ -/*************************************************************************** - contactaction.h - description - ------------------- - begin : Wed Jan 22 2003 - copyright : (C) 2003 by Mike K. Bennett - email : mkb137b@hotmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef CONTACTACTION_H -#define CONTACTACTION_H - -#include - - -// Forward declarations -class Contact; -class KMenu; - - - -/** - * @brief Menu actions to invite contacts. - * - * @author Mike K. Bennett - * @ingroup Chat - */ -class ContactAction : public KAction -{ - Q_OBJECT - - public: - // The constructor - ContactAction( const Contact *contact, KMenu *menu, QWidget *parent=0 ); - // The destructor - ~ContactAction(); - // Return the contact's handle - const QString getHandle() const; - // Set whether or not the contact is in the chat - void setInChat( bool inChat ); - - private: // Private methods - - private slots: // Private slots - //Inherit from KAction... - void slotActivated(); - // Update the text based on the contact's name - void updateText(); - // Update the visibility of the action based on the contact's status, group, and list - void updateVisibility(); - - private: // Private attributes - // The contact - const Contact *contact_; - // Whether or not the contact is in the chat - bool inChat_; - // The menu into which the action is inserted - KMenu *menu_; - // Whether or not the contact has been added into the menu - bool added_; - - signals: // Public signals - // Signal the contact's friendly name when the action is selected - void activated(QString handle); - -}; - -#endif diff --git a/src/chat/contactframe.cpp b/src/chat/contactframe.cpp index 6ff7fe2..a6ed6b9 100644 --- a/src/chat/contactframe.cpp +++ b/src/chat/contactframe.cpp @@ -18,18 +18,18 @@ #include "contactframe.h" #include "../contact/contact.h" -#include "../contact/contactlist.h" #include "../contact/msnstatus.h" #include "../dialogs/contactpropertiesdialog.h" +#include "../model/contactlist.h" #include "../utils/kmessshared.h" #include "../utils/richtextparser.h" #include "../currentaccount.h" +#include "../emoticonmanager.h" #include "../kmessdebug.h" #include #include #include -#include #include #include @@ -45,47 +45,43 @@ // The constructor -ContactFrame::ContactFrame(QWidget *parent ) +ContactFrame::ContactFrame( QWidget *parent ) : QWidget(parent) , Ui::ContactFrame() , activated_(false) , contact_(0) + , contactPixmapLabelEnabled_(true) , contactPropertiesDialog_(0) , detailedContact_(0) , handle_(QString::null) , currentMode_(ModeNormal) + , infoLabelEnabled_(true) + , locked_(false) { - KStandardDirs *dirs = KGlobal::dirs(); - QPixmap pixmap; - QString path; - // Setup the UI as first thing setupUi( this ); + layout()->setAlignment( Qt::AlignTop | Qt::AlignLeft ); // Just for show - path = dirs->findResource( "data", "kmess/pics/unknown.png" ); - pixmap.load( path ); + const QPixmap& pixmap( KGlobal::dirs()->findResource( "data", "kmess/pics/unknown.png" ) ); contactPixmapLabel_->setPixmap( pixmap ); - contactPixmapLabel_->setMinimumSize( pixmap.width(), pixmap.height() ); - nowListeningPixmapLabel_->setPixmap( KIconLoader::global()->loadIcon("knotify", KIconLoader::NoGroup, KIconLoader::SizeSmall ) ); - nowListeningPixmapLabel_->hide(); - - contactPixmapLabel_ ->installEventFilter( this ); - statusLabel_ ->installEventFilter( this ); - personalMessageLabel_ ->installEventFilter( this ); installEventFilter( this ); + contactPixmapLabel_->installEventFilter( this ); + friendlyNameLabel_ ->installEventFilter( this ); + infoLabel_ ->installEventFilter( this ); // Set up and connect the typing timer typingTimer_.setSingleShot( true ); - connect( &typingTimer_, SIGNAL( timeout() ), - this, SLOT ( stopTyping() ) ); + connect( &typingTimer_, SIGNAL( timeout() ), + this, SLOT ( stopTyping() ) ); } ContactFrame::~ContactFrame() { + qDeleteAll( copyLinkActionsList_ ); } @@ -93,59 +89,63 @@ ContactFrame::~ContactFrame() // Activate the frame by giving it a contact void ContactFrame::activate( ContactBase *contact ) { + if ( contact_ && contact_ != contact ) + { + disconnect( contact_, 0, this, 0 ); + } + if( contact == 0 ) { #ifdef KMESSDEBUG_CONTACTFRAME kDebug() << "Deactivating frame for contact:" << handle_; #endif - disconnect( contact_, 0 ); - disconnect( detailedContact_, 0 ); - contact_ = 0; detailedContact_ = 0; activated_ = false; + locked_ = true; - return; + qDeleteAll( copyLinkActionsList_ ); + copyLinkActionsList_.clear(); } - - if ( contact_ != 0 ) + else { - kWarning() << "Already got a contact (" << contact_->getHandle() << "), refusing new one (" << contact->getHandle() << ")."; - return; + contact_ = contact; + handle_ = contact_->getHandle(); + detailedContact_ = CurrentAccount::instance()->getContactList()->getContactByHandle( handle_ ); + + if( detailedContact_ == 0 ) + { + activated_ = false; + locked_ = true; + } + else + { + // Connect the contact, to update the frame on presence info changes + connect( detailedContact_, SIGNAL( changedFriendlyName() ), + this, SLOT ( updateStatusWidgets() ) ); + connect( detailedContact_, SIGNAL( changedStatus() ), + this, SLOT ( updateStatusWidgets() ) ); + connect( detailedContact_, SIGNAL( changedPicture() ), + this, SLOT ( updatePicture() ) ); + connect( detailedContact_, SIGNAL( changedPersonalMessage(Contact*) ), + this, SLOT ( updateStatusWidgets() ) ); + connect( detailedContact_, SIGNAL( destroyed(QObject*) ), + this, SLOT ( contactDestroyed(QObject*) ) ); + + activated_ = true; + locked_ = false; + } } - contact_ = contact; - handle_ = contact_->getHandle(); - detailedContact_ = CurrentAccount::instance()->getContactList()->getContactByHandle( handle_ ); - - // Connect up the contact to update the frame on name, status, and picture changes - connect( contact_, SIGNAL( changedFriendlyName() ), - this, SLOT ( updateStatusWidgets() ) ); - connect( contact_, SIGNAL( changedStatus() ), - this, SLOT ( updateStatusWidgets() ) ); - connect( contact_, SIGNAL( changedPicture() ), - this, SLOT ( updatePicture() ) ); - connect( contact_, SIGNAL( destroyed(QObject*) ), - this, SLOT ( contactDestroyed(QObject*) ) ); - - if( detailedContact_ != 0 ) - { - connect( detailedContact_, SIGNAL( changedPersonalMessage(Contact*) ), - this, SLOT ( updateStatusWidgets() ) ); - connect( detailedContact_, SIGNAL( changedList(Contact*) ), - this, SLOT ( updateStatusWidgets() ) ); - } - - activated_ = true; - show(); - // Activate the right-click context menu initContactPopup(); // And prepare the widgets updatePicture(); updateStatusWidgets(); + + show(); } @@ -158,7 +158,7 @@ void ContactFrame::allowContact() return; } - emit setContactAllowed( handle_ ); + emit contactAllowed( handle_ ); updateStatusWidgets(); } @@ -176,7 +176,7 @@ void ContactFrame::contactDestroyed( QObject *object ) // - crash. #ifdef KMESSDEBUG_CONTACTFRAME - if( contact_ != object ) + if( contact_ && contact_ != object ) { kWarning() << "Received unexpected contact reference to" << object->metaObject()->className(); } @@ -184,6 +184,8 @@ void ContactFrame::contactDestroyed( QObject *object ) { kDebug() << "Resetting contact reference."; } +#else + Q_UNUSED( object ); #endif activated_ = false; @@ -204,7 +206,7 @@ void ContactFrame::copyText() if( action == popupCopyFriendlyName_ ) { - kapp->clipboard()->setText( contact_->getFriendlyName() ); + kapp->clipboard()->setText( contact_->getFriendlyName( STRING_CLEANED ) ); } else if( action == popupCopyHandle_ ) { @@ -212,7 +214,7 @@ void ContactFrame::copyText() } else if( action == popupCopyPersonalMessage_ && detailedContact_ != 0 ) { - kapp->clipboard()->setText( detailedContact_->getPersonalMessage() ); + kapp->clipboard()->setText( detailedContact_->getPersonalMessage( STRING_CLEANED ) ); } else if( detailedContact_ != 0 ) { @@ -233,6 +235,10 @@ void ContactFrame::editNotes() { contactPropertiesDialog_ = new ContactPropertiesDialog( this ); } + else + { + contactPropertiesDialog_->clearLists(); + } contactPropertiesDialog_->launch( detailedContact_, true ); } @@ -243,21 +249,35 @@ void ContactFrame::editNotes() // The personal status message received an event. bool ContactFrame::eventFilter( QObject *obj, QEvent *event ) { - if( event->type() != QEvent::MouseButtonRelease ) + int eventType = event->type(); + + // Check if the obj is contactPixmapLabel + if( obj == contactPixmapLabel_ && detailedContact_ + && ( eventType == QEvent::Enter || eventType == QEvent::Leave ) ) + { + QImage image( detailedContact_->getContactPicturePath() ); + + // Apply glow effect to image + if( eventType == QEvent::Enter ) + { + KIconEffect::toGamma( image, 0.8f ); + contactPixmapLabel_->setPixmap( QPixmap::fromImage( image ) ); + } + else if( eventType == QEvent::Leave ) + { + contactPixmapLabel_->setPixmap( QPixmap::fromImage( image ) ); + } + } + + if( eventType != QEvent::MouseButtonRelease ) { return false; // don't stop processing. } QMouseEvent *mouseEvent = static_cast( event ); - if( mouseEvent->button() == Qt::RightButton ) - { - showContactPopup( mouseEvent->globalPos() ); - } - else if( obj == contactPixmapLabel_ ) - { - showProfile(); - } + // Show the menu regardlessly of where the mouse button has been pressed + showContactPopup( mouseEvent->globalPos() ); return false; // don't stop processing. } @@ -281,7 +301,8 @@ bool ContactFrame::initContactPopup() } // Initialize context popup actions - popupEmailContact_ = new KAction( KIcon("mail-message-new"), i18n("&Send email"), this ); + popupStartPrivateChat_ = new KAction( KIcon("user-group-new"), i18n("&Start Private Chat"), this); + popupEmailContact_ = new KAction( KIcon("mail-message-new"), i18n("&Send Email"), this ); popupMsnProfile_ = new KAction( KIcon("preferences-desktop-user"), i18n("&View Profile"), this ); popupEditNotes_ = new KAction( KIcon("user-properties"), i18n("Ed&it Notes"), this ); @@ -298,6 +319,8 @@ bool ContactFrame::initContactPopup() // Connect the actions + connect( popupStartPrivateChat_, SIGNAL(triggered( bool )), this, SLOT( slotStartPrivateChat() ) ); + connect( popupEmailContact_, SIGNAL(triggered(bool)), this, SLOT( sendEmail() ) ); connect( popupMsnProfile_, SIGNAL(triggered(bool)), this, SLOT( showProfile() ) ); connect( popupEditNotes_, SIGNAL(triggered(bool)), this, SLOT( editNotes() ) ); @@ -315,45 +338,19 @@ bool ContactFrame::initContactPopup() // Initialize sub popups - popupCopyMenu_ = new KActionMenu( i18n("&Copy..."), this ); + popupCopyMenu_ = new KActionMenu( i18n("&Copy"), this ); popupCopyMenu_ ->addAction( popupCopyFriendlyName_ ); popupCopyMenu_ ->addAction( popupCopyPersonalMessage_ ); popupCopyMenu_ ->addAction( popupCopyHandle_ ); popupCopyMenu_->addSeparator(); - // If detailed contact information is available, search for links - if( detailedContact_ != 0 ) - { - // Append friendly name and personal message so cycle only one time to search links - QString nameAndPm = detailedContact_->getFriendlyName() + " " + detailedContact_->getPersonalMessage(); - - //Initialize index, link RegExp and found boolean for insert separator only at first found link - int pos = 0; - QRegExp linkRegExp( "(http://|https://|ftp://|sftp://|www\\..)\\S+" ); - - while( ( pos = linkRegExp.indexIn( nameAndPm, pos ) ) != -1 ) - { - // Grep the found link and update the position for the next cycle - QString foundLink = linkRegExp.cap( 0 ); - pos += linkRegExp.matchedLength(); - - // Put the found link into KAction, replace & with && to avoid shortcut problem and use tooltip - // for future grep of link ( to avoid shortcut problem too ) - popupCopyLink_ = new KAction( foundLink.replace( "&", "&&" ), this ); - popupCopyLink_->setToolTip( foundLink ); - connect( popupCopyLink_, SIGNAL( triggered( bool ) ), this, SLOT( copyText() ) ); - - // Add action to copy menu - popupCopyMenu_->addAction( popupCopyLink_ ); - } - } - // Initialize the popup popup contactActionPopup_ = new KMenu( handle_, this ); // Attach the actions to the menu // Order is as consistent as possible with the menu in KMessView contactActionPopup_->addTitle( contact_->getHandle() ); + contactActionPopup_->addAction( popupStartPrivateChat_ ); contactActionPopup_->addAction( popupEmailContact_ ); contactActionPopup_->addAction( popupMsnProfile_ ); contactActionPopup_->addAction( popupCopyMenu_ ); @@ -405,47 +402,45 @@ void ContactFrame::sendEmail() // Change the display mode of the frame when the contact leaves the chat or there are many active contacts void ContactFrame::setDisplayMode( DisplayMode mode ) { - bool isEnabled = ( mode & ModeDisabled ) ? false : true; - - // Reset the widgets only if enabling or disabling have been requested - if( ( mode & ModeEnabled ) || ( mode & ModeDisabled ) ) + if( currentMode_ == mode ) { - // Enable or disable the frame contents - contactPixmapLabel_ ->setEnabled( isEnabled ); + return; } + // Save the new current mode to avoid useless updates + currentMode_ = mode; + #ifdef KMESSDEBUG_CONTACTFRAME - kDebug() << "Frame" << this << "- Enabled:" << isEnabled << "- Mode:" << mode; + kDebug() << "Frame mode:" << mode; #endif // Change the displayed widgets - if( ( mode & ModeNormal ) || ( mode & ModeSingle ) ) + switch( mode ) { - contactPixmapLabel_ ->setVisible( ( detailedContact_ != 0 ) ); // Hide the picture for invited contacts - statusPixmapLabel_ ->setVisible( true ); - statusLabel_ ->setVisible( true ); - personalMessageLabel_ ->setVisible( true ); - nowListeningPixmapLabel_ ->setVisible( true ); - } - else if( mode & ModeSmall ) - { - contactPixmapLabel_ ->setVisible( false ); - statusPixmapLabel_ ->setVisible( true ); - statusLabel_ ->setVisible( true ); - personalMessageLabel_ ->setVisible( true ); - nowListeningPixmapLabel_ ->setVisible( true ); - } - else if( mode & ModeTiny ) - { - contactPixmapLabel_ ->setVisible( false ); - statusPixmapLabel_ ->setVisible( true ); - statusLabel_ ->setVisible( true ); - personalMessageLabel_ ->setVisible( false ); - nowListeningPixmapLabel_ ->setVisible( false ); - } + case ModeSingle: + popupStartPrivateChat_->setVisible( false ); + contactPixmapLabelEnabled_ = true; + infoLabelEnabled_ = true; + break; - // Set the current mode internally, so contact property updates don't change the way we display the content - currentMode_ = mode; + case ModeNormal: + popupStartPrivateChat_->setVisible( true ); + contactPixmapLabelEnabled_ = true; + infoLabelEnabled_ = true; + break; + + case ModeSmall: + popupStartPrivateChat_->setVisible( true ); + contactPixmapLabelEnabled_ = false; + infoLabelEnabled_ = true; + break; + + case ModeTiny: + popupStartPrivateChat_->setVisible( true ); + contactPixmapLabelEnabled_ = false; + infoLabelEnabled_ = false; + break; + } // Update the status widgets updateStatusWidgets(); @@ -453,14 +448,22 @@ void ContactFrame::setDisplayMode( DisplayMode mode ) +// Enable or disable the frame +void ContactFrame::setEnabled( bool isEnabled ) +{ + contactPixmapLabel_->setEnabled( isEnabled ); +} + + + // Update and show the contact popup menu void ContactFrame::showContactPopup( const QPoint &point ) { bool isAdded = false; - bool isAddable = false; + bool isAddable = ! locked_; bool isAllowed = true; bool isBlocked = false; - bool isBlockable = false; + bool isBlockable = ! locked_; bool hasPersonalMessage = false; if( detailedContact_ != 0 ) @@ -483,6 +486,48 @@ void ContactFrame::showContactPopup( const QPoint &point ) popupBlockContact_ ->setVisible( isBlockable && ! isBlocked ); popupUnblockContact_ ->setVisible( isBlockable && isBlocked ); + // If detailed contact information is available, search for links + if( detailedContact_ != 0 ) + { + qDeleteAll( copyLinkActionsList_ ); + copyLinkActionsList_.clear(); + + // Append friendly name and personal message so cycle only one time to search links + const QString& nameAndPm( detailedContact_->getFriendlyName() + " " + detailedContact_->getPersonalMessage() ); + QStringList links; + + //Initialize index, link RegExp and found boolean for insert separator only at first found link + int pos = 0; + QRegExp linkRegExp( "(http://|https://|ftp://|sftp://|www\\..)\\S+" ); + QString foundLink; + + while( ( pos = linkRegExp.indexIn( nameAndPm, pos ) ) != -1 ) + { + // Grep the found link and update the position for the next cycle + foundLink =linkRegExp.cap( 0 ); + pos += linkRegExp.matchedLength(); + + // Skip duplicated links + if( links.contains( foundLink ) ) + { + continue; + } + links.append( foundLink ); + + // Put the found link into KAction, replace & with && to avoid shortcut problem and use tooltip + // for future grep of link ( to avoid shortcut problem too ) + popupCopyLink_ = new KAction( foundLink.replace( "&", "&&" ), this ); + popupCopyLink_->setToolTip( foundLink ); + connect( popupCopyLink_, SIGNAL( triggered( bool ) ), this, SLOT( copyText() ) ); + + // Append current KAction to the copy link list + copyLinkActionsList_.append( popupCopyLink_ ); + + // Add action to copy menu + popupCopyMenu_->addAction( popupCopyLink_ ); + } + } + contactActionPopup_->popup( point ); } @@ -497,7 +542,7 @@ void ContactFrame::showProfile() } // Create a URL to the msn profile page, localized with our system's locale. - KUrl url = KUrl( "http://members.msn.com/default.msnw?mem=" + handle_ + "&mkt=" + KGlobal::locale()->country() ); + KUrl url = KUrl( "http://members.msn.com/default.msnw?mem=" + handle_ + "&mkt=" + KGlobal::locale()->language() ); // Launch the browser for the given URL KMessShared::openBrowser( url ); @@ -505,6 +550,14 @@ void ContactFrame::showProfile() +// Request to start private chat +void ContactFrame::slotStartPrivateChat() +{ + emit startPrivateChat( handle_ ); +} + + + // Receive notice that the contact is typing void ContactFrame::startTyping() { @@ -530,10 +583,15 @@ void ContactFrame::toggleContactAdded() { if( detailedContact_ == 0 ) { - return; - } + emit contactAdded( handle_, true ); - emit setContactAdded( handle_, ! detailedContact_->isFriend() ); + // Disallow adding unknown contacts more than once + locked_ = true; + } + else + { + emit contactAdded( handle_, ! detailedContact_->isFriend() ); + } updateStatusWidgets(); } @@ -545,10 +603,15 @@ void ContactFrame::toggleContactBlocked() { if( detailedContact_ == 0 ) { - return; - } + emit contactBlocked( handle_, true ); - emit setContactBlocked( handle_, ! detailedContact_->isBlocked() ); + // Disallow adding unknown contacts more than once + locked_ = true; + } + else + { + emit contactBlocked( handle_, ! detailedContact_->isBlocked() ); + } updateStatusWidgets(); } @@ -564,9 +627,9 @@ void ContactFrame::updatePicture() } // See if the contact picture is not updated. Avoids GUI flashing on older boxes - QString contactPicturePath = contact_->getContactPicturePath(); - QFileInfo contactPictureInfo( contactPicturePath ); - QDateTime contactPictureDate = contactPictureInfo.lastModified(); + const QString& contactPicturePath( contact_->getContactPicturePath() ); + const QFileInfo& contactPictureInfo( contactPicturePath ); + const QDateTime& contactPictureDate( contactPictureInfo.lastModified() ); if( contactPicturePath == contactPicturePath_ && contactPictureDate == contactPictureDate_ ) @@ -578,11 +641,11 @@ void ContactFrame::updatePicture() } #ifdef KMESSDEBUG_CONTACTFRAME - kDebug() << "New contact picture:" << contact_->getContactPicturePath(); + kDebug() << "New contact picture:" << contactPicturePath; #endif - QImage contactImage; - bool loaded = contactImage.load( contactPicturePath ); + QImage contactImage( contactPicturePath ); + bool loaded = ! contactImage.isNull(); if( loaded ) { // Loaded @@ -591,7 +654,7 @@ void ContactFrame::updatePicture() } else { - // Not laoded (PNG error?). load default if custom image could not be loaded + // Not loaded (PNG error?). load default if custom image could not be loaded loaded = contactImage.load( contact_->getContactDefaultPicturePath() ); if( ! loaded ) @@ -615,16 +678,14 @@ void ContactFrame::updatePicture() // Update the status widgets void ContactFrame::updateStatusWidgets() { - QString label, statusIdentifier; - Status status; - Flags flags = FlagNone; - if( contact_ == 0 ) { return; } - status = contact_->getStatus(); + QString label, statusIdentifier; + const Status status( contact_->getStatus() ); + Flags flags = FlagNone; if( detailedContact_ != 0 && detailedContact_->isBlocked()) { @@ -637,67 +698,54 @@ void ContactFrame::updateStatusWidgets() statusIdentifier = MsnStatus::getName( status ); } - bool showFormatting = CurrentAccount::instance()->getUseChatFormatting(); + friendlyNameLabel_->setText( contact_->getFriendlyName( STRING_CHAT_SETTING_ESCAPED ) ); + friendlyNameLabel_->setToolTip( contact_->getFriendlyName() ); + statusPixmapLabel_->setToolTip( i18nc( "Tooltip for a contact's status icon, " + "arg %1 is the MSN Status, like 'Online'", + "The contact is %1", + statusIdentifier ) ); + statusPixmapLabel_->setPixmap( MsnStatus::getIcon( status, flags ) ); - if( showFormatting ) + // Update the informative label + if( detailedContact_ && infoLabelEnabled_ ) { - statusLabel_->setText( contact_->getFriendlyName( STRING_FORMATTED ) ); - } - else - { - statusLabel_->setText( Qt::escape( contact_->getFriendlyName( STRING_CLEANED ) ) ); - } - - statusLabel_ ->setToolTip( contact_->getFriendlyName() ); - statusPixmapLabel_ ->setToolTip( i18n( "The contact is %1", statusIdentifier ) ); - statusPixmapLabel_ ->setPixmap( MsnStatus::getIcon( status, flags ) ); - - // Update the detailed info widgets, if available, and if we're not in Tiny display mode, which means that no - // personal message/song is displayed at all - if( detailedContact_ == 0 || currentMode_ == ModeTiny ) - { -#ifdef KMESSDEBUG_CONTACTFRAME - kDebug() << "Not updating widgets. Mode:" << currentMode_ << " Detailed info:" << detailedContact_; -#endif - - personalMessageLabel_ ->hide(); - nowListeningPixmapLabel_->hide(); - return; - } - - // Update the label with currently playing media - label = detailedContact_->getCurrentMediaString(); - - // If the contact has no media playing, show the personal message - if( label.isEmpty() ) - { - nowListeningPixmapLabel_->hide(); - if( showFormatting ) + const QString& mediaString( detailedContact_->getCurrentMediaString() ); + const QString& messageString( detailedContact_->getPersonalMessage( STRING_CHAT_SETTING_ESCAPED ) ); + if( ! mediaString.isEmpty() ) { - label = detailedContact_->getPersonalMessage( STRING_FORMATTED ); + // Determine the icon for the various media types, if none no icon will be shown + QString mediaEmoticon; + const QString& mediaType( detailedContact_->getCurrentMediaType() ); + if( mediaType == "Music" ) + { + mediaEmoticon = EmoticonManager::instance()->getReplacement( "(8)", true ); + } + else if( mediaType == "Gaming" ) + { + mediaEmoticon = EmoticonManager::instance()->getReplacement( "(xx)", true ); + } + + infoLabel_->setVisible( true ); + infoLabel_->setText( mediaEmoticon + Qt::escape( mediaString ) ); + infoLabel_->setToolTip( mediaString ); + } + else if( ! messageString.isEmpty() ) + { + infoLabel_->setVisible( true ); + infoLabel_->setText( messageString ); + infoLabel_->setToolTip( detailedContact_->getPersonalMessage( STRING_CHAT_SETTING ) ); } else { - label = Qt::escape( detailedContact_->getPersonalMessage( STRING_CLEANED ) ); + infoLabel_->setVisible( false ); } } else { - nowListeningPixmapLabel_->show(); + infoLabel_->setVisible( false ); } - // If neither the media nor the message are available, hide the label - if( ! label.isEmpty() ) - { - - personalMessageLabel_->show(); - personalMessageLabel_->setText( label ); - personalMessageLabel_->setToolTip( label ); - } - else - { - personalMessageLabel_->hide(); - } + contactPixmapLabel_->setVisible( contactPixmapLabelEnabled_ ); } diff --git a/src/chat/contactframe.h b/src/chat/contactframe.h index 4951ccc..265dc7e 100644 --- a/src/chat/contactframe.h +++ b/src/chat/contactframe.h @@ -50,22 +50,19 @@ class ContactFrame : public QWidget, private Ui::ContactFrame // Contact frame display modes enum DisplayMode { - ModeSingle = 1 // Single contact chat: all the widgets but the separator are displayed - , ModeNormal = 2 // Common group chat: all the widgets are displayed - , ModeSmall = 4 // Big group chat: Smaller pictures, less details for easier viewing - , ModeTiny = 8 // Mega group chat: A lot less details to optimize the available space - - , ModeDisabled = 64 // Disable our widgets if the contact leaves the chat - , ModeEnabled = 128 // Enable the contact frame's widgets + ModeSingle // Single contact chat: all the widgets but the separator are displayed + , ModeNormal // Common group chat: all the widgets are displayed + , ModeSmall // Big group chat: Smaller pictures, less details for easier viewing + , ModeTiny // Mega group chat: A lot less details to optimize the available space }; public: // The constructor - ContactFrame(QWidget *parent=0); + ContactFrame(QWidget *parent=0); // The destructor - ~ContactFrame(); + ~ContactFrame(); // Activate the frame by giving it a contact void activate(ContactBase *contact); // Return the handle of this frame's contact @@ -78,6 +75,8 @@ class ContactFrame : public QWidget, private Ui::ContactFrame void messageReceived(); // Change the display mode of the frame when the contact leaves the chat or there are many active contacts void setDisplayMode( DisplayMode mode ); + // Enable or disable the frame + void setEnabled( bool isEnabled ); // Receive notice that the contact is typing void startTyping(); @@ -100,6 +99,8 @@ class ContactFrame : public QWidget, private Ui::ContactFrame void showContactPopup( const QPoint &point ); // Show the contact's profile void showProfile(); + // Request to start private chat + void slotStartPrivateChat(); // Disable the typing label when the timer has timed out void stopTyping(); // Change the contact's added/removed status @@ -124,16 +125,24 @@ class ContactFrame : public QWidget, private Ui::ContactFrame QDateTime contactPictureDate_; // The contact picture file QString contactPicturePath_; + // Whether or not the display picture can be shown + bool contactPixmapLabelEnabled_; // Contact properties dialog ContactPropertiesDialog *contactPropertiesDialog_; // The contact's image visible while the contact is typing QPixmap contactTypingPicture_; + // List of actions with links to copy to the clipboard + QList copyLinkActionsList_; // The detailed contact information, if available Contact *detailedContact_; // The contact's handle, saved for performance and for safety QString handle_; // Current display mode DisplayMode currentMode_; + // Whether or not the PM or music can be shown + bool infoLabelEnabled_; + // Whether or not is it possible to add or block the contact + bool locked_; // Contact popup KAction to add the contact to the contact list KAction *popupAddContact_; // Contact popup KAction to allow the contact to see the user's status @@ -158,6 +167,8 @@ class ContactFrame : public QWidget, private Ui::ContactFrame KAction *popupMsnProfile_; // Contact popup KAction to remove a contact from the contact list KAction *popupRemoveContact_; + // Contact popup KAction to start a private chat with the contact while the user is in a multi-chat + KAction *popupStartPrivateChat_; // Contact popup KAction to unblock the contact KAction *popupUnblockContact_; // A timer to time the duration that the typing label is shown @@ -165,11 +176,13 @@ class ContactFrame : public QWidget, private Ui::ContactFrame signals: // The user wants to add or remove a contact. - void setContactAdded( QString handle, bool isAdded ); + void contactAdded( QString handle, bool isAdded ); // The user wants to allow a contact to see hi/hers online status. - void setContactAllowed( QString handle ); + void contactAllowed( QString handle ); // The user wants to block or unblock a contact. - void setContactBlocked( QString handle, bool isBlocked ); + void contactBlocked( QString handle, bool isBlocked ); + // The user wants to start private chat + void startPrivateChat( const QString &handle ); }; #endif diff --git a/src/chat/contactframe.ui b/src/chat/contactframe.ui index 0a5fc35..06f7d30 100644 --- a/src/chat/contactframe.ui +++ b/src/chat/contactframe.ui @@ -5,24 +5,24 @@ 0 0 - 114 - 132 + 86 + 119 - - - 0 - 0 - - - - - 110 - 0 - - - + + 1 + + + 4 + + + 0 + + + 12 + + 0 @@ -30,9 +30,6 @@ 0 - - QLayout::SetMaximumSize - @@ -65,9 +62,12 @@ - - - + + + + 0 + 0 + Qt::RichText @@ -77,121 +77,75 @@ - - - 0 + + + + 0 + 0 + - - - - - 0 - 0 - - - - - 20 - 20 - - - - - 20 - 20 - - - - false - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - - - - - Qt::RichText - - - - + + + 9 + true + + + + Qt::RichText + + - - - 0 + + + true - - QLayout::SetMaximumSize + + + 0 + 0 + - - - - - 0 - 0 - - - - - 48 - 48 - - - - - 96 - 96 - - - - PointingHandCursor - - - Qt::ClickFocus - - - Click here to display this contact's profile. - - - QFrame::StyledPanel - - - QFrame::Sunken - - - true - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 48 - 1 - - - - - + + + 64 + 64 + + + + + 64 + 64 + + + + PointingHandCursor + + + Qt::ClickFocus + + + Click here to display the menu for this contact + + + QFrame::StyledPanel + + + QFrame::Sunken + + + Qt::PlainText + + + true + + + Qt::NoTextInteraction + + - + Qt::Vertical @@ -200,8 +154,8 @@ - 20 - 20 + 12 + 12 diff --git a/src/chat/contactsidebar.cpp b/src/chat/contactsidebar.cpp deleted file mode 100644 index f3a8fa1..0000000 --- a/src/chat/contactsidebar.cpp +++ /dev/null @@ -1,280 +0,0 @@ -/*************************************************************************** - contactsidebar.cpp - description - ------------------- - begin : Thu Jan 16 2003 - copyright : (C) 2003 by Mike K. Bennett - email : mkb137b@hotmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "contactsidebar.h" - -#include "../contact/contactbase.h" -#include "../currentaccount.h" -#include "../kmessdebug.h" - - - -// The constructor -ContactSidebar::ContactSidebar( QWidget *parent ) - : QWidget( parent ) -{ - // Stretch widget - setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ); - - // Create a layout within the scrollview so that added widgets are laid out nicely - viewBox_ = new QVBoxLayout( this ); - - // Allow drag&drop - setAcceptDrops( true ); - - // Add some more space at the bottom - viewBox_->addStretch(); -} - - - -// The destructor -ContactSidebar::~ContactSidebar() -{ - // Remove all contact frames - qDeleteAll( contactFrames_ ); - contactFrames_.clear(); -} - - - -// A contact joined the chat -void ContactSidebar::contactJoined( QString handle, QString ) -{ -kDebug()<< handle; - ContactBase *contact; - ContactFrame *contactFrame; - ContactFrame::DisplayMode frameMode; - - // See if the contact already has a frame - contactFrame = getContactFrameByHandle( handle ); - if( contactFrame != 0 ) - { - // Reactivate the contact's frame - contactFrame->setDisplayMode( ContactFrame::ModeEnabled ); - return; - } - - // Get the first available contact frame - contactFrame = getFirstInactiveContactFrame(); - if( KMESS_NULL(contactFrame) ) return; - - // Get the given contact - contact = CurrentAccount::instance()->getContactByHandle( handle ); - - if( KMESS_NULL(contact) ) return; - - // Activate the frame - contactFrame->activate( contact ); - - // Find the most suitable frame display mode - frameMode = getBestFrameMode(); - - // Set it to all the frames, including the new one - foreach( ContactFrame *frame, contactFrames_ ) - { - frame->setDisplayMode( frameMode ); - } -} - - - -// A contact left the chat -void ContactSidebar::contactLeft( QString handle, bool /*isChatIdle*/ ) -{ -kDebug()<< handle; - ContactFrame::DisplayMode frameMode; - ContactFrame *contactFrame = getContactFrameByHandle( handle ); - - if ( contactFrame == 0 ) - { - return; - } - - // Find the most suitable frame mode - frameMode = getBestFrameMode(); - - // Set it to all the frames - foreach( ContactFrame *frame, contactFrames_ ) - { - frame->setDisplayMode( frameMode ); - } - - // Delete the frames whenever there is more than one; when only one is left, grey it out instead. - if( contactFrames_.count() > 1 ) - { - contactFrames_.removeAll( contactFrame ); - delete contactFrame; - return; - } - - // Deactivate the contact frame - contactFrame->setDisplayMode( ContactFrame::ModeDisabled ); -} - - - -// A contact is typing -void ContactSidebar::contactTyping(QString handle, QString) -{ - ContactFrame *contactFrame = getContactFrameByHandle( handle ); - if ( contactFrame != 0 ) - { - contactFrame->startTyping(); - } -} - - - -// Get the most suitable frame size, depending on how many contacts are currently in chat with us -ContactFrame::DisplayMode ContactSidebar::getBestFrameMode() -{ - // Find out how many are chatting at the moment - int count = contactFrames_.count(); - - - if( count > 5 ) - { - // More than 5 contacts in chat with us: it's a big group chat and we need to be able to display as many frames as possible - return ContactFrame::ModeTiny; - } - else if( count > 2 ) - { - // A normal group chat: reduce the size of the frames to be able to see all of our contacts at once - return ContactFrame::ModeSmall; - } - else if( count == 2 ) - { - // A small group chat: Show all details, there's still a lot of space - return ContactFrame::ModeNormal; - } - - // A simple 1-on-1 chat: we can show as much detail as possible - return ContactFrame::ModeSingle; -} - - - -// Find the contact frame with the given handle -ContactFrame* ContactSidebar::getContactFrameByHandle(const QString& handle) -{ - foreach( ContactFrame *contactFrame, contactFrames_ ) - { - if( contactFrame->getHandle() == handle ) - { - return contactFrame; - } - } - - return 0; -} - - - -// Return the first inactive contact frame -ContactFrame* ContactSidebar::getFirstInactiveContactFrame() -{ - ContactFrame *contactFrame; - - // If there's an inactive frame, use it - foreach( contactFrame, contactFrames_ ) - { - if( ! contactFrame->isActivated() ) - { - return contactFrame; - } - } - - // Well we don't have any, so make another. - contactFrame = new ContactFrame( this ); - - connect( contactFrame, SIGNAL( setContactAllowed( QString ) ), - this, SIGNAL( setContactAllowed( QString ) ) ); - connect( contactFrame, SIGNAL( setContactAdded( QString, bool ) ), - this, SIGNAL( setContactAdded( QString, bool ) ) ); - connect( contactFrame, SIGNAL( setContactBlocked( QString, bool ) ), - this, SIGNAL( setContactBlocked( QString, bool ) ) ); - - // Resize it, and add it to the viewBox so it appears in the sidebar - contactFrame->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Preferred ); - viewBox_->insertWidget( children().count() - 2, contactFrame ); - - // put it in the list of frames so we can find it again. - contactFrames_.append( contactFrame ); - - return contactFrame; -} - - - -// Initialize the object -bool ContactSidebar::initialize() -{ - // The important frame-creating code has to go in the constructor, so there's less to initialize, here. - - return true; -} - - - -// A message was received from one of the contacts... notify its frame -void ContactSidebar::messageReceived(const QString& handle) -{ - ContactFrame *frame; - frame = getContactFrameByHandle( handle ); - if ( frame != 0 ) - { - frame->messageReceived(); - } -} - - - -// Enable/disable the frames -void ContactSidebar::setEnabled( bool isEnabled ) -{ - ContactBase *contact; - CurrentAccount *account = CurrentAccount::instance(); - - if( isEnabled ) - { - // Loop through all frames - foreach( ContactFrame *frame, contactFrames_ ) - { - contact = account->getContactByHandle( frame->getHandle() ); - - // Only reactivate frames for contacts which exist in the account - if( contact ) - { - // Reactivate the frame - frame->activate( contact ); - } - } - } - else - { - // Loop through all frames - foreach( ContactFrame *frame, contactFrames_ ) - { - // Remove the activation status - frame->activate( 0 ); - } - } -} - - -#include "contactsidebar.moc" diff --git a/src/chat/contactswidget.cpp b/src/chat/contactswidget.cpp new file mode 100644 index 0000000..27bb849 --- /dev/null +++ b/src/chat/contactswidget.cpp @@ -0,0 +1,510 @@ +/*************************************************************************** + contactswidget.cpp - description + ------------------- + begin : Thu Jan 16 2003 + copyright : (C) 2003 by Mike K. Bennett + email : mkb137b@hotmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "contactswidget.h" + +#include "../contact/contact.h" +#include "../accountsmanager.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" + +#include + +#include + + + +// The constructor +ContactsWidget::ContactsWidget( QWidget *parent ) +: QWidget( parent ) +, Ui::ContactsWidget() +, wasVisible_( false ) +{ + setupUi( this ); + + // Create the layout which will organize the contact frames + layout_ = new QBoxLayout( QBoxLayout::TopToBottom, container_ ); + layout_->setSpacing( 2 ); + layout_->setContentsMargins( 0, 0, 0, 0 ); + layout_->setSizeConstraint( QLayout::SetMinAndMaxSize ); + layout_->setAlignment( Qt::AlignTop | Qt::AlignLeft ); + + // The scroll area background should mimetize with the rest of the app + area_->setBackgroundRole( QPalette::Window ); + + // Initialize the user picture frame + userPixmapLabel_->installEventFilter( this ); + CurrentAccount *account = CurrentAccount::instance(); + connect( account, SIGNAL( changedMsnObject() ), + this, SLOT ( slotUpdateDisplayPicture() ) ); + slotUpdateDisplayPicture(); +} + + + +// The destructor +ContactsWidget::~ContactsWidget() +{ + // Remove all contact frames + qDeleteAll( contactFrames_ ); + contactFrames_.clear(); + +#ifdef KMESSDEBUG_CONTACTSWIDGET + kDebug() << "DESTROYED."; +#endif +} + + + +// A contact was added to the contact list +void ContactsWidget::contactAdded( Contact *contact ) +{ + // Update any invited contact frame + foreach( ContactFrame *frame, contactFrames_ ) + { + if( frame->getHandle() == contact->getHandle() ) + { + frame->activate( contact ); + break; + } + } +} + + + +// A contact joined the chat +void ContactsWidget::contactJoined( ContactBase* contact ) +{ + // See if the contact already has a frame + const QString& handle( contact->getHandle() ); + ContactFrame *contactFrame = getContactFrameByHandle( handle ); + + if( contactFrame != 0 ) + { + // Reactivate the contact's frame + contactFrame->setEnabled( true ); + return; + } + +#ifdef KMESSDEBUG_CONTACTSWIDGET + kDebug() << handle; +#endif + + ContactFrame::DisplayMode frameMode; + + // Get the first available contact frame + contactFrame = getFirstInactiveContactFrame(); + if( KMESS_NULL(contactFrame) ) return; + + // Activate the frame + contactFrame->activate( contact ); + + // Find the most suitable frame display mode + frameMode = getBestFrameMode(); + + // Set it to all the frames, including the new one + foreach( ContactFrame *frame, contactFrames_ ) + { + frame->setDisplayMode( frameMode ); + } +} + + + +// A contact left the chat +void ContactsWidget::contactLeft( ContactBase *contact, bool /*isChatIdle*/ ) +{ + const QString& handle( contact->getHandle() ); + ContactFrame *contactFrame = getContactFrameByHandle( handle ); + + if ( contactFrame == 0 ) + { + return; + } + +#ifdef KMESSDEBUG_CONTACTSWIDGET + kDebug() << handle; +#endif + + ContactFrame::DisplayMode frameMode; + + // Delete the frames whenever there is more than one; when only one is left, grey it out instead. + if( contactFrames_.count() > 1 ) + { + contactFrames_.removeAll( contactFrame ); + delete contactFrame; + + // Find the most suitable frame mode + frameMode = getBestFrameMode(); + + // Set it to all the frames + foreach( ContactFrame *frame, contactFrames_ ) + { + frame->setDisplayMode( frameMode ); + } + } + else + { + // Deactivate the contact frame + contactFrame->setEnabled( false ); + } +} + + + +// A contact was removed from the contact list +void ContactsWidget::contactRemoved( Contact *contact ) +{ + // Update any invited contact frame + foreach( ContactFrame *frame, contactFrames_ ) + { + if( frame->getHandle() == contact->getHandle() ) + { + frame->activate( 0 ); + break; + } + } +} + + + +// A contact is typing +void ContactsWidget::contactTyping( ContactBase *contact ) +{ + ContactFrame *contactFrame = getContactFrameByHandle( contact->getHandle() ); + if ( contactFrame != 0 ) + { + contactFrame->startTyping(); + } +} + + + +// The user picture frame received an event +bool ContactsWidget::eventFilter( QObject *obj, QEvent *event ) +{ + QEvent::Type eventType = event->type(); + + if( obj != userPixmapLabel_ ) + { +#ifdef KMESSDEBUG_CONTACTSWIDGET + kWarning() << "Received event '" << eventType << "' from object '" << obj->objectName() << "'."; +#endif + return false; + } + + CurrentAccount *currentAccount = CurrentAccount::instance(); + + // Avoid wasting time :) + if( ! userPictureFrame_->isVisible() ) + { + return false; + } + + switch( eventType ) + { + // Make the picture to glow when hovered + case QEvent::Enter: + { + QImage glowingImage( currentAccount->getPicturePath() ); + KIconEffect::toGamma( glowingImage, 0.8f ); + userPixmapLabel_->setPixmap( QPixmap::fromImage( glowingImage ) ); + } + break; + + // Restore the picture when the mouse is not hovering over it anymore + case QEvent::Leave: + { + userPixmapLabel_->setPixmap( QPixmap( currentAccount->getPicturePath() ) ); + } + break; + + // When the picture is clicked, show the account settings + case QEvent::MouseButtonRelease: + { + AccountsManager::instance()->showAccountSettings( currentAccount ); + return true; + } + break; + + default: + break; + } + + return false; +} + + + +// Get the most suitable frame size, depending on how many contacts are currently in chat with us +inline ContactFrame::DisplayMode ContactsWidget::getBestFrameMode() +{ + // Find out how many are chatting at the moment + int count = contactFrames_.count(); + + + if( count > 5 ) + { + // More than 5 contacts in chat with us: it's a big group chat and we need to be able to display as many frames as possible + return ContactFrame::ModeTiny; + } + else if( count > 2 ) + { + // A normal group chat: reduce the size of the frames to be able to see all of our contacts at once + return ContactFrame::ModeSmall; + } + else if( count == 2 ) + { + // A small group chat: Show all details, there's still a lot of space + return ContactFrame::ModeNormal; + } + + // A simple 1-on-1 chat: we can show as much detail as possible + return ContactFrame::ModeSingle; +} + + + +// Find the contact frame with the given handle +ContactFrame* ContactsWidget::getContactFrameByHandle(const QString& handle) +{ + foreach( ContactFrame *contactFrame, contactFrames_ ) + { + if( contactFrame->getHandle() == handle ) + { + return contactFrame; + } + } + + return 0; +} + + + +// Return the first inactive contact frame +ContactFrame* ContactsWidget::getFirstInactiveContactFrame() +{ + ContactFrame *contactFrame; + + // If there's an inactive frame, use it + foreach( contactFrame, contactFrames_ ) + { + if( ! contactFrame->isActivated() ) + { + return contactFrame; + } + } + + // Well we don't have any, so make another. + contactFrame = new ContactFrame( container_ ); + + connect( contactFrame, SIGNAL( startPrivateChat( const QString& ) ), + this, SIGNAL( startPrivateChat( const QString& ) ) ); + connect( contactFrame, SIGNAL( contactAllowed( QString ) ), + this, SIGNAL( contactAllowed( QString ) ) ); + connect( contactFrame, SIGNAL( contactAdded( QString, bool ) ), + this, SIGNAL( contactAdded( QString, bool ) ) ); + connect( contactFrame, SIGNAL( contactBlocked( QString, bool ) ), + this, SIGNAL( contactBlocked( QString, bool ) ) ); + + // Add it to the viewBox so it appears in the widget + layout_->insertWidget( children().count() - 2, contactFrame ); + + // put it in the list of frames so we can find it again. + contactFrames_.append( contactFrame ); + + return contactFrame; +} + + + +// A message was received from one of the contacts... notify its frame +void ContactsWidget::messageReceived(const QString& handle) +{ + ContactFrame *frame; + frame = getContactFrameByHandle( handle ); + if ( frame != 0 ) + { + frame->messageReceived(); + } +} + + + +// Enable/disable the frames +void ContactsWidget::setEnabled( bool isEnabled ) +{ + ContactBase *contact; + CurrentAccount *account = CurrentAccount::instance(); + + if( isEnabled ) + { + // Loop through all frames + foreach( ContactFrame *frame, contactFrames_ ) + { + contact = account->getContactByHandle( frame->getHandle() ); + + // Only reactivate frames for contacts which exist in the account + if( contact ) + { + // Reactivate the frame + frame->activate( contact ); + } + } + } + else + { + // Loop through all frames + foreach( ContactFrame *frame, contactFrames_ ) + { + // Remove the activation status + frame->activate( 0 ); + } + } +} + + + +// Connect the widget to a dock +void ContactsWidget::setDockWidget( QDockWidget *dockWidget, Qt::DockWidgetArea initialArea ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( dockWidget ); +#endif + + // We need to change layout when the dock moves + connect( dockWidget, SIGNAL( dockLocationChanged(Qt::DockWidgetArea) ), + this, SLOT ( slotLocationChanged(Qt::DockWidgetArea) ) ); + connect( dockWidget, SIGNAL( topLevelChanged(bool) ), + this, SLOT ( slotTopLevelChanged(bool) ) ); + + slotLocationChanged( initialArea ); +} + + + +// The location of the parent dock widget has changed +void ContactsWidget::slotLocationChanged( Qt::DockWidgetArea area ) +{ +#ifdef KMESSDEBUG_CONTACTSWIDGET + kDebug() << "Changing location to" << area; +#endif + + switch( area ) + { + case Qt::TopDockWidgetArea: + case Qt::BottomDockWidgetArea: + + // Loop through all frames to switch the layout mode for frames + foreach( ContactFrame *frame, contactFrames_ ) + { + frame->setDisplayMode( ContactFrame::ModeSmall ); + } + + layout_->setDirection( QBoxLayout::LeftToRight ); + area_->setHorizontalScrollBarPolicy( Qt::ScrollBarAsNeeded ); + area_->setVerticalScrollBarPolicy ( Qt::ScrollBarAlwaysOff ); + userPictureFrame_->setVisible( false ); + break; + + case Qt::LeftDockWidgetArea: + case Qt::RightDockWidgetArea: + default: + + // Loop through all frames to switch the layout mode for frames + ContactFrame::DisplayMode mode = getBestFrameMode(); + foreach( ContactFrame *frame, contactFrames_ ) + { + frame->setDisplayMode( mode ); + } + + layout_->setDirection( QBoxLayout::TopToBottom ); + area_->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + area_->setVerticalScrollBarPolicy ( Qt::ScrollBarAsNeeded ); + + // Determine if the user picture needs to be shown + slotUpdateDisplayPicture(); + break; + } + + // Ensure that the view shows the top left corner + area_->ensureVisible( 0, 0 ); +} + + + +// The parent dock widget floating status has changed +void ContactsWidget::slotTopLevelChanged( bool isTopLevel ) +{ + // Moving has started + if( isTopLevel ) + { + wasVisible_ = isVisible(); + setVisible( false ); + } + // The widget has been dropped somewhere + else + { + setVisible( wasVisible_ ); + } + + adjustSize(); +} + + + +// Update the user's display picture +void ContactsWidget::slotUpdateDisplayPicture() +{ + CurrentAccount *currentAccount = CurrentAccount::instance(); + + bool isVisible = currentAccount->getShowChatUserPicture(); + + userPictureFrame_->setVisible( isVisible ); + + // Don't update it if it's not even visible + if( ! isVisible ) + { +#ifdef KMESSDEBUG_CONTACTSWIDGET + kDebug() << "Not updating hidden user picture widget"; +#endif + return; + } + + // The picture is unchanged, do nothing + const QString &pictureFileName( currentAccount->getPicturePath() ); + if( userPixmapLabel_->property( "PictureFileName" ) == pictureFileName ) + { +#ifdef KMESSDEBUG_CONTACTSWIDGET + kDebug() << "User picture unchanged, not updating widget"; +#endif + return; + } + +#ifdef KMESSDEBUG_CONTACTSWIDGET + kDebug() << "Updating user picture widget"; +#endif + + // Change the picture + const QPixmap& image( pictureFileName ); + userPixmapLabel_->setPixmap( image ); + userPixmapLabel_->setProperty( "PictureFileName", pictureFileName ); +} + + + +#include "contactswidget.moc" diff --git a/src/chat/contactsidebar.h b/src/chat/contactswidget.h similarity index 51% rename from src/chat/contactsidebar.h rename to src/chat/contactswidget.h index e5b6c68..a96db39 100644 --- a/src/chat/contactsidebar.h +++ b/src/chat/contactswidget.h @@ -1,5 +1,5 @@ /*************************************************************************** - contactsidebar.h - description + contactswidget.h - description ------------------- begin : Thu Jan 16 2003 copyright : (C) 2003 by Mike K. Bennett @@ -15,60 +15,81 @@ * * ***************************************************************************/ -#ifndef CONTACTSIDEBAR_H -#define CONTACTSIDEBAR_H +#ifndef CONTACTSWIDGET_H +#define CONTACTSWIDGET_H #include "contactframe.h" +#include "ui_contactswidget.h" + #include +#include // Forward declarations class ContactBase; class ContactList; -class QVBoxLayout; + +class QBoxLayout; +class QDockWidget; /** - * The sidebar in a chat that contains the little contact information frames. + * The widget in a chat that contains the little contact information frames. * * @author Mike K. Bennett * @ingroup Chat */ -class ContactSidebar : public QWidget +class ContactsWidget : public QWidget, private Ui::ContactsWidget { Q_OBJECT public: // The constructor - ContactSidebar( QWidget *parent=0 ); + ContactsWidget( QWidget *parent = 0 ); // The destructor - virtual ~ContactSidebar(); - // Initialize the object - bool initialize(); + virtual ~ContactsWidget(); // A message was received from one of the contacts... notify its frame void messageReceived(const QString& handle); // Enable/disable the frames void setEnabled( bool isEnabled ); + // Connect the widget to a dock + void setDockWidget( QDockWidget *dockWidget, Qt::DockWidgetArea initialArea ); public slots: // Public slots + // A contact was added to the contact list + void contactAdded( Contact *contact ); // A contact joined the chat - void contactJoined(QString handle, QString friendlyName); + void contactJoined( ContactBase* contact ); // A contact left the chat - void contactLeft( QString handle, bool isChatIdle ); + void contactLeft ( ContactBase*, bool isChatIdle ); + // A contact was removed from the contact list + void contactRemoved( Contact *contact ); // A contact is typing - void contactTyping(QString handle, QString friendlyName); + void contactTyping( ContactBase* contact ); + + private slots: + // The location of the parent dock widget has changed + void slotLocationChanged( Qt::DockWidgetArea area ); + // The parent dock widget floating status has changed + void slotTopLevelChanged( bool isTopLevel ); + // Update the user's display picture + void slotUpdateDisplayPicture(); signals: // The user wants to add or remove a contact. - void setContactAdded( QString handle, bool isAdded ); + void contactAdded( QString handle, bool isAdded ); // The user wants to allow a contact to see hi/hers online status. - void setContactAllowed( QString handle ); + void contactAllowed( QString handle ); // Toggle blocked status for a contact - void setContactBlocked( QString handle, bool isBlocked ); + void contactBlocked( QString handle, bool isBlocked ); + // The user wants to start private chat + void startPrivateChat( const QString &handle ); private: // Private methods +// The user picture frame received an event + bool eventFilter( QObject *obj, QEvent *event ); // Get the most suitable frame size, depending on how many contacts are currently in chat with us ContactFrame::DisplayMode getBestFrameMode(); // Find the contact frame with the given handle @@ -77,10 +98,12 @@ class ContactSidebar : public QWidget ContactFrame* getFirstInactiveContactFrame(); private: // Private attributes - // The list of pointers to the frames in the sidebar + // The list of frames contained in the widget QList contactFrames_; - // the box to put contact frames into - QVBoxLayout *viewBox_; + // the layout to put contact frames into + QBoxLayout *layout_; + // Whether or not the widget was visible before being moved + bool wasVisible_; }; #endif diff --git a/src/chat/contactswidget.ui b/src/chat/contactswidget.ui new file mode 100644 index 0000000..6e422cb --- /dev/null +++ b/src/chat/contactswidget.ui @@ -0,0 +1,142 @@ + + + ContactsWidget + + + + 0 + 0 + 229 + 315 + + + + + + + + 100 + 50 + + + + Qt::NoFocus + + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOff + + + false + + + + + 0 + 0 + 94 + 120 + + + + + + + + + + + + Qt::Horizontal + + + + + + + + + Qt::Horizontal + + + + 8 + 8 + + + + + + + + true + + + + 0 + 0 + + + + + 96 + 96 + + + + + 96 + 96 + + + + PointingHandCursor + + + Qt::NoFocus + + + Click here to open your account settings + + + QFrame::StyledPanel + + + QFrame::Sunken + + + Qt::PlainText + + + true + + + Qt::NoTextInteraction + + + + + + + Qt::Horizontal + + + + 8 + 8 + + + + + + + + + + + + + + diff --git a/src/chat/emoticonsidebar.cpp b/src/chat/emoticonsidebar.cpp deleted file mode 100644 index 21ace4e..0000000 --- a/src/chat/emoticonsidebar.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/*************************************************************************** - emoticonsidebar.cpp - description - ------------------- - begin : Mon 12 09 2005 - copyright : (C) 2005 by Diederik van der Boor - email : "vdboor" --at-- "codingdomain.com" - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "emoticonsidebar.h" - -#include "../emoticonmanager.h" -#include "../emoticontheme.h" -#include "../kmessdebug.h" -#include "../dialogs/addemoticondialog.h" -#include "../accountsmanager.h" -#include "../currentaccount.h" - -#include -#include -#include - -#include -#include - - -// The constructor -EmoticonSidebar::EmoticonSidebar( QWidget *parent, bool useCustomTheme ) - : QWidget(parent) - , emoticonDialog_(0) - , isCustom_(useCustomTheme) - , list_(0) -{ - // Get and connect to the emoticon manager. We'll need to update the sidebar when the emoticon - // theme changes - manager_ = EmoticonManager::instance(); - connect( manager_, SIGNAL( updated() ), - this, SLOT ( slotThemeUpdated() ) ); - - // Create and set the properties for list widget - list_ = new EmoticonListWidget( this ); - - // Connect to click of each button - connect( list_ , SIGNAL( leftClicked ( const QListWidgetItem* ) ), - this, SLOT ( slotItemClicked( const QListWidgetItem* ) ) ); - - // Enable the right-click context menu - connect( list_, SIGNAL( rightClicked (const QListWidgetItem*,const QPoint& ) ), - this, SLOT ( showContextMenu(const QListWidgetItem*,const QPoint& ) ) ); - - // Create and set the properties for the warning message - noEmoticonsWarning_ = new QLabel( this ); - noEmoticonsWarning_->setScaledContents( true ); - noEmoticonsWarning_->setWordWrap( true ); - noEmoticonsWarning_->setText( i18nc( "Informative label on the chat's Sidebar", - "

    You haven't added any custom emoticons yet.

    " - "

    To add new emoticons, click here!

    " ) ); - // Enable the link click action - connect( noEmoticonsWarning_, SIGNAL( linkActivated(const QString&) ), - this, SLOT ( slotNoEmoticonsLinkClicked(const QString&) ) ); - - // Create the layout - layout_ = new QVBoxLayout( this ); - layout_->addWidget( noEmoticonsWarning_ ); - layout_->addWidget( list_ ); - - // Force adding the theme's emoticons - slotThemeUpdated(); -} - - - -// Constructor for emoticon list widget class -EmoticonListWidget::EmoticonListWidget( QWidget *parent ) - : QListWidget(parent) -{ - // Set the list properties - setViewMode( QListView::IconMode ); - setResizeMode( QListView::Adjust ); - setIconSize( QSize( 16,16 ) ); - setMovement( QListView::Static ); - setSelectionMode( QAbstractItemView::SingleSelection ); - setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); - setFrameShape(QFrame::NoFrame ); - setStyleSheet( "QListWidget { background-color: transparent; }" ); -} - - - -// Reimplement the mouse press event to grep left and right click -void EmoticonListWidget::mousePressEvent( QMouseEvent *e ) -{ - QListWidget::mousePressEvent( e ); - QListWidgetItem *item = itemAt( e->pos() ); - if( item == 0 ) - { - return; - } - if( e->button() == Qt::LeftButton ) - { - emit leftClicked( item ); - } - else if( e->button() == Qt::RightButton ) - { - emit rightClicked( item, e->pos() ); - } -} - - - -// The destructor -EmoticonSidebar::~EmoticonSidebar() -{ - delete emoticonDialog_; - delete list_; - delete layout_; -} - - - -// One item was clicked -void EmoticonSidebar::slotItemClicked( const QListWidgetItem * item ) -{ - // Deselect current item so it has the click effect - list_->setCurrentItem( 0 ); - - emit insertEmoticon( item->data( Qt::UserRole ).toString() ); -} - - - -// The "Click to open the custom emoticons settings" link has been clicked -void EmoticonSidebar::slotNoEmoticonsLinkClicked( const QString &url ) -{ - Q_UNUSED( url ); - - AccountsManager::instance()->showAccountSettings( CurrentAccount::instance(), window(), AccountSettingsDialog::PageEmoticonsTabCustom ); -} - - - -// The theme has changed, we need to reload it -void EmoticonSidebar::slotThemeUpdated() -{ -#ifdef KMESSDEBUG_EMOTICONSIDEBAR - kDebug() << "Removing old theme from the sidebar."; -#endif - - // Clear list - list_->clear(); - -#ifdef KMESSDEBUG_EMOTICONSIDEBAR - kDebug() << "Updating sidebar with current emoticons."; -#endif - - // Add all theme emoticons to the list - EmoticonTheme *theme = manager_->getTheme( isCustom_ ); - const QList &emoticons = theme->getEmoticons(); - - list_ ->setVisible( ! emoticons.isEmpty() ); - noEmoticonsWarning_->setVisible( emoticons.isEmpty() && isCustom_ ); - - foreach( Emoticon *emoticon, emoticons ) - { - if( ! emoticon->isValid() ) - { - continue; - } - - QListWidgetItem *item = new QListWidgetItem( QIcon( emoticon->getPicturePath() ), "", list_ ); - - // Set the shortcut into data of current item widget - item->setData( ShortcutRole, emoticon->getShortcut() ); - item->setData( PictureRole, emoticon->getPicturePath() ); - - // Add the emoticon tooltip - QString tooltip( emoticon->getTooltip() ); - Emoticon::htmlEscape( tooltip ); - item->setToolTip( QString( emoticon->getHtml(false) + " " + tooltip ) ); - } - -#ifdef KMESSDEBUG_EMOTICONSIDEBAR - kDebug() << "Updated total" << emoticons.count() << "emoticons"; -#endif -} - - - - -// Right mouse button was clicked -void EmoticonSidebar::showContextMenu( const QListWidgetItem *item, const QPoint &point ) -{ - // Deselect current item so it has the click effect - list_->setCurrentItem( 0 ); - - // The popup menu is only for custom emoticon - if( isCustom_ == false ) - { - return; - } - - // Create the popup menu for custom emoticon - KMenu menu; - KAction addAction( KIcon( "insert-image" ), i18n( "Add to Chat" ), this ); - KAction insertAction( KIcon( "list-add" ), i18n( "Insert new" ), this ); - KAction editAction( KIcon( "draw-freehand" ), i18n( "Edit" ), this ); - KAction removeAction( KIcon( "list-remove" ), i18n( "Remove" ), this ); - - menu.addAction( &addAction ); - menu.addAction( &insertAction ); - menu.addAction( &editAction ); - menu.addAction( &removeAction ); - - // Exec the menu popup and grep the action selected - QAction *clickedAction = menu.exec( mapToGlobal( point ) ); - - if( clickedAction == 0 ) - { - // No action clicked - return; - } - - // Check which action was clicked - if( clickedAction == &addAction ) - { - slotItemClicked( item ); - return; - } - else if( clickedAction == &removeAction ) - { - manager_->getTheme( isCustom_ )->removeEmoticon( item->data( ShortcutRole ).toString() ); - return; - } - - if( emoticonDialog_ == 0 ) - { - emoticonDialog_ = new AddEmoticonDialog( manager_->getTheme( true ), this ); - } - - if( clickedAction == &insertAction ) - { - emoticonDialog_->preSelect( "", "" ); - } - else if( clickedAction == &editAction ) - { - emoticonDialog_->editEmoticon( item->data( PictureRole ).toString(), item->data( ShortcutRole ).toString() ); - } - - emoticonDialog_->show(); -} - - -#include "emoticonsidebar.moc" diff --git a/src/chat/emoticonswidget.cpp b/src/chat/emoticonswidget.cpp new file mode 100644 index 0000000..5950875 --- /dev/null +++ b/src/chat/emoticonswidget.cpp @@ -0,0 +1,498 @@ +/*************************************************************************** + emoticonswidget.cpp - description + ------------------- + begin : Mon 12 09 2005 + copyright : (C) 2005 by Diederik van der Boor + email : "vdboor" --at-- "codingdomain.com" + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "emoticonswidget.h" + +#include "../emoticonmanager.h" +#include "../emoticontheme.h" +#include "../kmessdebug.h" +#include "../utils/kmessshared.h" +#include "../dialogs/addemoticondialog.h" +#include "../accountsmanager.h" +#include "../currentaccount.h" + +#include +#include +#include +#include +#include +#include + + + +// The constructor +EmoticonsWidget::EmoticonsWidget( QWidget *parent ) + : QWidget(parent) + , emoticonDialog_(0) + , initialized_(false) + , noEmoticonsWarning_(0) +{ + // Get and connect to the emoticon manager. We'll need to update ourselves when the emoticon + // theme changes + manager_ = EmoticonManager::instance(); + connect( manager_, SIGNAL( updated() ), + this, SLOT ( slotThemeUpdated() ) ); + + // Create and set the properties for list widget + list_ = new EmoticonListWidget( this ); + + // React to mouse button clicks + connect( list_ , SIGNAL( leftClicked(const QListWidgetItem*) ), + this, SLOT ( slotItemClicked(const QListWidgetItem*) ) ); + // Enable the right-click context menu + connect( list_, SIGNAL( rightClicked(const QListWidgetItem*,const QPoint&) ), + this, SLOT ( showContextMenu(const QListWidgetItem*,const QPoint&) ) ); + connect( list_, SIGNAL( requestPreview(const QListWidgetItem*) ), + this, SLOT( slotRequestPreview(const QListWidgetItem*) ) ); + + // Set the label for preview + previewLabel_ = new QLabel( this ); + previewLabel_->setFrameShape( QFrame::StyledPanel ); + previewLabel_->setFrameShadow( QFrame::Sunken ); + previewLabel_->setFixedSize( 48, 48 ); + previewLabel_->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); + + // Set the movie preview + previewMovie_ = new QMovie( this ); + previewMovie_->stop(); + previewLabel_->setMovie( previewMovie_ ); + + // Create an initial layout for the widget + layout_ = new QBoxLayout( QBoxLayout::LeftToRight, this ); + layout_->addWidget( list_ ); + layout_->addWidget( previewLabel_ ); + setMinimumSize( minimumSizeHint() ); + + // Install event filter + installEventFilter( this ); +} + + + +// Constructor for emoticon list widget class +EmoticonListWidget::EmoticonListWidget( QWidget *parent ) + : QListWidget(parent) + , previousItem_(0) +{ + // Set the list properties + setViewMode( QListView::IconMode ); + setResizeMode( QListView::Adjust ); + setIconSize( QSize( 16,16 ) ); + setMovement( QListView::Static ); + setSelectionMode( QAbstractItemView::SingleSelection ); + setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + setFrameShape(QFrame::NoFrame ); + setStyleSheet( "QListWidget { background-color: transparent; }" ); + + // Install event filter + viewport()->installEventFilter( this ); +} + + + +// Preview requested +void EmoticonsWidget::slotRequestPreview( const QListWidgetItem *item ) +{ + if( ! initialized_ ) + { + kWarning() << "Uninitialized usage of EmoticonsWidget!"; + return; + } + + // Stop the movie and set the new emoticon + previewMovie_->stop(); + + // If the new item is not null set the emoticon to preview + if( item != 0 ) + { + previewLabel_->setMovie( previewMovie_ ); + previewMovie_->setFileName( item->data( PictureRole ).toString() ); + } + else + { + // if the item is null, set empty pixmap + previewLabel_->setPixmap( QPixmap() ); + return; + } + + // Check if the file format is valid + if( ! previewMovie_->isValid() ) + { + return; + } + + previewMovie_->start(); + + // Scale the emoticon if it is larger than its container + if( previewMovie_->currentPixmap().size().width() > previewLabel_->size().width() + || previewMovie_->currentPixmap().size().height() > previewLabel_->size().height() ) + { + previewLabel_->setScaledContents( true ); + } + else + { + previewLabel_->setScaledContents( false ); + } +} + + + +// Reimplement the mouse press event to grep left and right click +void EmoticonListWidget::mousePressEvent( QMouseEvent *e ) +{ + // Buttons press event + QListWidgetItem *item = itemAt( e->pos() ); + + if( item == 0 ) + { + return; + } + + if( e->button() == Qt::LeftButton ) + { + emit leftClicked( item ); + } + else if( e->button() == Qt::RightButton ) + { + emit rightClicked( item, e->pos() ); + } +} + + + +// Reimplement the event filter +bool EmoticonListWidget::eventFilter( QObject */*obj*/, QEvent *e ) +{ + if( e->type() == QEvent::HoverMove ) + { + // The cursor mouse is moving over the widget + QListWidgetItem *item = itemAt( static_cast(e)->pos() ); + + // Check if the mouse is over the same emoticon or the selection is changed + if( item == previousItem_ ) + { + return false; + } + + previousItem_ = item; + emit requestPreview( item ); + } + + return false; +} + + + +// The destructor +EmoticonsWidget::~EmoticonsWidget() +{ + delete emoticonDialog_; + delete noEmoticonsWarning_; +} + + + +// Reimplement the event filter +bool EmoticonsWidget::eventFilter( QObject *obj, QEvent *e ) +{ + Q_UNUSED( obj ); + + int type = e->type(); + + if( type == QEvent::Hide || type == QEvent::Leave ) + { + // Stop the preview while the emoticon widget is hide + previewLabel_->setPixmap( QPixmap() ); + previewMovie_->stop(); + } + + return false; +} + + + +// One item was clicked +void EmoticonsWidget::slotItemClicked( const QListWidgetItem * item ) +{ + if( ! initialized_ ) + { + kWarning() << "Uninitialized usage of EmoticonsWidget!"; + return; + } + + // Deselect current item so it has the click effect + list_->setCurrentItem( 0 ); + + emit insertEmoticon( item->data( Qt::UserRole ).toString() ); +} + + + +// The "Click to open the custom emoticons settings" link has been clicked +void EmoticonsWidget::slotNoEmoticonsLinkClicked() +{ + AccountsManager::instance()->showAccountSettings( CurrentAccount::instance(), window(), AccountSettingsDialog::PageEmoticonsTabCustom ); +} + + + +// The theme has changed, we need to reload it +void EmoticonsWidget::slotThemeUpdated() +{ + if( ! initialized_ ) + { + kWarning() << "Uninitialized usage of EmoticonsWidget!"; + return; + } + +#ifdef KMESSDEBUG_EMOTICONSWIDGET + kDebug() << "Removing old theme."; +#endif + + // Clear list + list_->clear(); + +#ifdef KMESSDEBUG_EMOTICONSWIDGET + kDebug() << "Updating with current emoticons."; +#endif + + // Add all theme emoticons to the list + EmoticonTheme *theme = manager_->getTheme( isCustom_ ); + const QList &emoticons = theme->getEmoticons(); + + // If the custom emoticon theme is empty, show the label + if( isCustom_ && emoticons.isEmpty() ) + { + if( noEmoticonsWarning_ == 0 ) + { + // Create and set the properties for the warning message + noEmoticonsWarning_ = new QLabel( this ); + noEmoticonsWarning_->setScaledContents( true ); + noEmoticonsWarning_->setWordWrap( true ); + noEmoticonsWarning_->setText( i18nc( "Informative label on the chat's emoticons bar", + "

    You haven't added any custom emoticons yet.

    " + "

    To add new emoticons, click here!

    " ) ); + + // Enable the link click action + connect( noEmoticonsWarning_, SIGNAL( linkActivated(const QString&) ), + this, SLOT ( slotNoEmoticonsLinkClicked() ) ); + + layout_->addWidget( noEmoticonsWarning_ ); + } + + // Show the label and hide the listwidget + noEmoticonsWarning_->show(); + list_->hide(); + + // Set the preview movie and label + previewMovie_->stop(); + previewLabel_->hide(); + +#ifdef KMESSDEBUG_EMOTICONSWIDGET + kDebug() << "Custom emoticon theme is empty"; +#endif + return; + } + + // If the label was created, hide it! + if( noEmoticonsWarning_ != 0 ) + { + previewLabel_->show(); + noEmoticonsWarning_->hide(); + } + + list_->show(); + + foreach( Emoticon *emoticon, emoticons ) + { + if( ! emoticon->isValid() ) + { + continue; + } + + QListWidgetItem *item = new QListWidgetItem( QIcon( emoticon->getPicturePath() ), "", list_ ); + + // Set the shortcut into data of current item widget + item->setData( ShortcutRole, emoticon->getShortcut() ); + item->setData( PictureRole, emoticon->getPicturePath() ); + + // Add the emoticon tooltip + QString tooltip; + + // Check if the current emoticon is custom to avoid problem with chars encode. + // The htmlEscape method put the #39; chars instead of ' in the standard emoticon description + if( isCustom_ ) + { + tooltip = KMessShared::htmlEscape( emoticon->getTooltip() ); + } + else + { + tooltip = emoticon->getTooltip(); + } + + item->setToolTip( tooltip ); + } + +#ifdef KMESSDEBUG_EMOTICONSWIDGET + kDebug() << "Updated total" << emoticons.count() << "emoticons"; +#endif +} + + + +// Initialize the widget +void EmoticonsWidget::initialize( bool useCustomTheme ) +{ + if( initialized_ ) + { + kWarning() << "EmoticonsWidget is already initialized!"; + return; + } + + initialized_ = true; + + // Set the theme and load it + isCustom_ = useCustomTheme; + slotThemeUpdated(); +} + + + +// Connect the widget to a dock +void EmoticonsWidget::setDockWidget( QDockWidget *dockWidget, Qt::DockWidgetArea initialArea ) +{ +#ifdef KMESSTEST + KMESS_ASSERT( dockWidget ); +#endif + + // We need to change layout when the dock moves + connect( dockWidget, SIGNAL( dockLocationChanged(Qt::DockWidgetArea) ), + this, SLOT ( slotLocationChanged(Qt::DockWidgetArea) ) ); + connect( dockWidget, SIGNAL( topLevelChanged(bool) ), + this, SLOT ( slotTopLevelChanged(bool) ) ); + + slotLocationChanged( initialArea ); +} + + + +// The location of the parent dock widget has changed +void EmoticonsWidget::slotLocationChanged( Qt::DockWidgetArea area ) +{ +#ifdef KMESSDEBUG_EMOTICONSWIDGET + kDebug() << "Changing location to" << area; +#endif + + switch( area ) + { + case Qt::TopDockWidgetArea: + case Qt::BottomDockWidgetArea: + layout_->setDirection( QBoxLayout::LeftToRight ); + break; + + case Qt::LeftDockWidgetArea: + case Qt::RightDockWidgetArea: + default: + layout_->setDirection( QBoxLayout::TopToBottom ); + break; + } + + // Update our size constraints + setMinimumSize( minimumSizeHint() ); +} + + + +// The parent dock widget floating status has changed +void EmoticonsWidget::slotTopLevelChanged( bool isTopLevel ) +{ + setVisible( ! isTopLevel ); + adjustSize(); +} + + + +// Right mouse button was clicked +void EmoticonsWidget::showContextMenu( const QListWidgetItem *item, const QPoint &point ) +{ + if( ! initialized_ ) + { + kWarning() << "Uninitialized usage of EmoticonsWidget!"; + return; + } + + // Deselect current item so it has the click effect + list_->setCurrentItem( 0 ); + + // The popup menu is only for custom emoticon + if( isCustom_ == false ) + { + return; + } + + // Create the popup menu for custom emoticon + QMenu menu; + QAction addAction( KIcon( "insert-image" ), i18n( "Add to Chat" ), this ); + QAction insertAction( KIcon( "list-add" ), i18n( "Add New" ), this ); + QAction editAction( KIcon( "draw-freehand" ), i18n( "Edit" ), this ); + QAction removeAction( KIcon( "list-remove" ), i18n( "Remove" ), this ); + + menu.addAction( &addAction ); + menu.addAction( &insertAction ); + menu.addAction( &editAction ); + menu.addAction( &removeAction ); + + // Exec the menu popup and grep the action selected + QAction *clickedAction = menu.exec( mapToGlobal( point ) ); + + if( clickedAction == 0 ) + { + // No action clicked + return; + } + + // Check which action was clicked + if( clickedAction == &addAction ) + { + slotItemClicked( item ); + return; + } + else if( clickedAction == &removeAction ) + { + manager_->getTheme( isCustom_ )->removeEmoticon( item->data( ShortcutRole ).toString() ); + return; + } + + if( emoticonDialog_ == 0 ) + { + emoticonDialog_ = new AddEmoticonDialog( manager_->getTheme( true ), this ); + } + + if( clickedAction == &insertAction ) + { + emoticonDialog_->preSelect( "", "" ); + } + else if( clickedAction == &editAction ) + { + emoticonDialog_->editEmoticon( item->data( PictureRole ).toString(), item->data( ShortcutRole ).toString() ); + } + + emoticonDialog_->show(); +} + + +#include "emoticonswidget.moc" diff --git a/src/chat/emoticonsidebar.h b/src/chat/emoticonswidget.h similarity index 58% rename from src/chat/emoticonsidebar.h rename to src/chat/emoticonswidget.h index 9db3afd..300dce7 100644 --- a/src/chat/emoticonsidebar.h +++ b/src/chat/emoticonswidget.h @@ -1,5 +1,5 @@ /*************************************************************************** - emoticonsidebar.h - description + emoticonswidget.h - description ------------------- begin : Mon 12 09 2005 copyright : (C) 2005 by Diederik van der Boor @@ -15,8 +15,8 @@ * * ***************************************************************************/ -#ifndef EMOTICONSIDEBAR_H -#define EMOTICONSIDEBAR_H +#ifndef EMOTICONSWIDGET_H +#define EMOTICONSWIDGET_H #include @@ -25,37 +25,53 @@ class AddEmoticonDialog; class Emoticon; class EmoticonListWidget; class EmoticonManager; + +class QBoxLayout; +class QDockWidget; class QLabel; class QMouseEvent; class QPoint; class QResizeEvent; -class QVBoxLayout; /** - * Implements an emoticon chooser as sidebar tab. + * The widget in a chat that contains the emoticons to send to your contacts. * * @author Diederik van der Boor, Valerio Pilo * @ingroup Chat */ -class EmoticonSidebar : public QWidget +class EmoticonsWidget : public QWidget { Q_OBJECT public: // The constructor - EmoticonSidebar( QWidget *parent, bool useCustomTheme ); + EmoticonsWidget( QWidget *parent ); // The destructor - virtual ~EmoticonSidebar(); + virtual ~EmoticonsWidget(); + // Initialize the widget + void initialize( bool useCustomTheme ); + // Connect the widget to a dock + void setDockWidget( QDockWidget *dockWidget, Qt::DockWidgetArea initialArea ); + + protected: + // Reimplement the event filter + bool eventFilter( QObject *obj, QEvent *e ); private slots: // One item was clicked void slotItemClicked( const QListWidgetItem *item ); + // The location of the parent dock widget has changed + void slotLocationChanged( Qt::DockWidgetArea area ); // The "Click to open the custom emoticons settings" link has been clicked - void slotNoEmoticonsLinkClicked( const QString &url ); + void slotNoEmoticonsLinkClicked(); + // Preview requested + void slotRequestPreview( const QListWidgetItem *item ); // The theme has changed, we need to reload it void slotThemeUpdated(); + // The parent dock widget floating status has changed + void slotTopLevelChanged( bool isTopLevel ); // Right mouse button was clicked void showContextMenu(const QListWidgetItem *item, const QPoint &point ); @@ -69,21 +85,27 @@ class EmoticonSidebar : public QWidget private: // private properties // Emoticon dialog for edit the custom emoticons AddEmoticonDialog *emoticonDialog_; - // Whether the sidebar contains a standard or custom theme + // Whether the widget has been initialized + bool initialized_; + // Whether we will keep a standard or custom theme bool isCustom_; - // Vertical Layout which will lay our list - QVBoxLayout *layout_; + // Horizontal Layout which will lay our list + QBoxLayout *layout_; // The list widget of emoticons EmoticonListWidget *list_; // A warning message to tell the user he/she's got no custom emoticons QLabel *noEmoticonsWarning_; + // Preview label + QLabel *previewLabel_; + // Preview movie to insert in preview label + QMovie *previewMovie_; // Reference to the emoticon manager, to update the emoticon buttons EmoticonManager *manager_; signals: // Signals // Request that the emoticon's html code should be inserted in the message. - void insertEmoticon(QString html); + void insertEmoticon( const QString &html ); }; @@ -95,15 +117,21 @@ class EmoticonListWidget : public QListWidget Q_OBJECT public: - EmoticonListWidget( QWidget *parent ); + EmoticonListWidget( QWidget *parent ); protected: // Reimplement the mouse press event to grep left and right click - void mousePressEvent( QMouseEvent *e ); + void mousePressEvent( QMouseEvent *e ); + // Reimplement the event filter + bool eventFilter( QObject *obj, QEvent *e ); + + private: + QListWidgetItem *previousItem_; signals: - void leftClicked ( const QListWidgetItem* ); - void rightClicked( const QListWidgetItem*, const QPoint& ); + void leftClicked ( const QListWidgetItem* ); + void rightClicked( const QListWidgetItem*, const QPoint& ); + void requestPreview( const QListWidgetItem* ); }; diff --git a/src/chat/inkedit.cpp b/src/chat/inkedit.cpp index 1f9e89d..9e94ae1 100644 --- a/src/chat/inkedit.cpp +++ b/src/chat/inkedit.cpp @@ -28,27 +28,31 @@ #include - InkEdit::InkEdit(QWidget *parent) - : QWidget(parent), - color_(Qt::black) - ,isEmpty_(true) - ,scribbling_(false) + +// Constructor +InkEdit::InkEdit( QWidget *parent ) +: QWidget( parent ) +, Ui::InkEdit() +, color_( Qt::black ) +, erasingImage_( false ) +, image_( 0 ) +, isEmpty_( true ) +, scribbling_( false ) { setupUi( this ); setAttribute( Qt::WA_StaticContents ); // Set the buttons colorButton_->setIcon( KIcon( "format-stroke-color" ) ); - clearButton_->setIcon( KIcon( "draw-eraser" ) ); + eraseButton_->setIcon( KIcon( "draw-eraser" ) ); + clearButton_->setIcon( KIcon( "edit-clear" ) ); - connect( colorButton_, SIGNAL( clicked() ), - this, SLOT( changeColor() ) ); - connect( clearButton_, SIGNAL( clicked() ), - this, SLOT( clearImage() ) ); - - // Reset the drawed area - rect_.setTopLeft( QPoint( -1, -1 ) ); - rect_.setBottomRight( QPoint( -1, -1 ) ); + connect( colorButton_, SIGNAL( clicked() ), + this, SLOT ( changeColor() ) ); + connect( eraseButton_, SIGNAL( clicked() ), + this, SLOT ( eraseBrush() ) ); + connect( clearButton_, SIGNAL( clicked() ), + this, SLOT ( clearImage() ) ); } @@ -56,15 +60,20 @@ // Clear the current image void InkEdit::clearImage() { - image_.fill( qRgb( 255, 255, 255 ) ); + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + image_->pixels.fill( qRgb( 255, 255, 255 ) ); update(); isEmpty_ = true; - // Reset the drawed area - rect_.setTopLeft( QPoint( -1, -1 ) ); - rect_.setBottomRight( QPoint( -1, -1 ) ); + // Reset the drawn area + image_->area = QRect(); - emit inkModified( true ); + emit inkChanged(); } @@ -85,34 +94,40 @@ void InkEdit::changeColor() // Crop the image to send only the drawed area void InkEdit::cropImage( QPoint position ) { + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + int sizePen = sizePen_->value(); // Adjust the initial size and position - if( rect_.topLeft().x() == - 1 || rect_.topLeft().y() == -1 ) + if( image_->area.topLeft().x() == - 1 || image_->area.topLeft().y() == -1 ) { - rect_.setTopLeft( QPoint( position.x(), position.y() ) ); - rect_.setBottomRight( QPoint( position.x() + sizePen , position.y() + sizePen ) ); + image_->area.setTopLeft( QPoint( position.x(), position.y() ) ); + image_->area.setBottomRight( QPoint( position.x() + sizePen , position.y() + sizePen ) ); return; } // Adjust the x position and width - if( position.x() < rect_.topLeft().x() ) + if( position.x() < image_->area.topLeft().x() ) { - rect_.setTopLeft( QPoint( position.x() - sizePen , rect_.topLeft().y() ) ); + image_->area.setTopLeft( QPoint( position.x() - sizePen , image_->area.topLeft().y() ) ); } - else if( position.x() > rect_.bottomRight().x() ) + else if( position.x() > image_->area.bottomRight().x() ) { - rect_.setBottomRight( QPoint( position.x() + sizePen, rect_.bottomRight().y() ) ); + image_->area.setBottomRight( QPoint( position.x() + sizePen, image_->area.bottomRight().y() ) ); } // Adjust the y position and height - if( position.y() < rect_.topLeft().y() ) + if( position.y() < image_->area.topLeft().y() ) { - rect_.setTopLeft( QPoint( rect_.topLeft().x(), position.y( ) - sizePen ) ); + image_->area.setTopLeft( QPoint( image_->area.topLeft().x(), position.y( ) - sizePen ) ); } - else if( position.y() > rect_.bottomRight().y() ) + else if( position.y() > image_->area.bottomRight().y() ) { - rect_.setBottomRight( QPoint( rect_.bottomRight().x() , position.y()+ sizePen ) ); + image_->area.setBottomRight( QPoint( image_->area.bottomRight().x() , position.y()+ sizePen ) ); } } @@ -121,8 +136,21 @@ void InkEdit::cropImage( QPoint position ) // Draw a line from start point to last point void InkEdit::drawLineTo( const QPoint &endPoint ) { - QPainter painter( &image_ ); - painter.setPen( QPen( color_, sizePen_->value(), Qt::SolidLine, Qt::RoundCap, + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + QPainter painter( &(image_->pixels) ); + + QColor color = color_; + if( erasingImage_ ) + { + color = QColor( "white" ); + } + + painter.setPen( QPen( color, sizePen_->value(), Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin ) ); painter.drawLine( lastPoint_, endPoint ); @@ -136,6 +164,23 @@ void InkEdit::drawLineTo( const QPoint &endPoint ) +// Erase brush was selected +void InkEdit::eraseBrush() +{ + erasingImage_ = ! erasingImage_; + + if( erasingImage_ ) + { + eraseButton_->setIcon( KIcon( "draw-freehand" ) ); + } + else + { + eraseButton_->setIcon( KIcon( "draw-eraser" ) ); + } +} + + + // Return if the image is empty bool InkEdit::isEmpty() { @@ -146,6 +191,12 @@ bool InkEdit::isEmpty() void InkEdit::mousePressEvent( QMouseEvent *event ) { + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + if( event->button() == Qt::LeftButton ) { lastPoint_ = event->pos(); @@ -158,6 +209,12 @@ void InkEdit::mousePressEvent( QMouseEvent *event ) void InkEdit::mouseMoveEvent(QMouseEvent *event) { + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + if( ( event->buttons() & Qt::LeftButton ) && scribbling_ ) { QPoint position = event->pos(); @@ -170,6 +227,12 @@ void InkEdit::mouseMoveEvent(QMouseEvent *event) void InkEdit::mouseReleaseEvent(QMouseEvent *event) { + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + if( event->button() == Qt::LeftButton && scribbling_ ) { QPoint position = event->pos(); @@ -178,7 +241,7 @@ void InkEdit::mouseReleaseEvent(QMouseEvent *event) isEmpty_ = false; scribbling_ = false; - emit inkModified(); + emit inkChanged(); } } @@ -186,25 +249,31 @@ void InkEdit::mouseReleaseEvent(QMouseEvent *event) void InkEdit::paintEvent(QPaintEvent */*event*/) { - QPainter painter( this) ; - painter.drawImage( QPoint(0, 0), image_ ); + if( image_ == 0 || image_->pixels.isNull() ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + QPainter painter( this ); + painter.drawImage( QPoint(0, 0), image_->pixels ); } void InkEdit::resizeEvent( QResizeEvent *event ) { - /*int newWidth = width(); - int newHeight = height(); - kDebug() << image_.size(); - kDebug() << newWidth; - resizeImage( &image_, QSize( newWidth, newHeight ) ); - update();*/ - if( width() > image_.width() || height() > image_.height() ) + if( image_ == 0 ) { - int newWidth = qMax( width() + 128, image_.width() ); - int newHeight = qMax( height() + 128, image_.height() ); - resizeImage( &image_, QSize( newWidth, newHeight ) ); + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + + if( width() > image_->pixels.width() || height() > image_->pixels.height() ) + { + int newWidth = qMax( width() + 128, image_->pixels.width() ); + int newHeight = qMax( height() + 128, image_->pixels.height() ); + resizeImage( &(image_->pixels), QSize( newWidth, newHeight ) ); update(); } @@ -213,13 +282,28 @@ void InkEdit::resizeEvent( QResizeEvent *event ) +// Return the image +InkImage *InkEdit::getImage() +{ + return image_; +} + + + // Return the bytes rapresents the image const QByteArray& InkEdit::getImageBytes() { + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + imageBytes_.clear(); + return imageBytes_; + } + QBuffer buffer( &imageBytes_ ); buffer.open( QIODevice::WriteOnly ); - image_.copy( rect_ ).save( &buffer, "PNG" ); - //image_.scaled( size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ).save( &buffer, "PNG" ); + image_->pixels.copy( image_->area ).save( &buffer, "PNG" ); + //image_->pixels.scaled( size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ).save( &buffer, "PNG" ); return imageBytes_; } @@ -227,9 +311,14 @@ const QByteArray& InkEdit::getImageBytes() void InkEdit::resizeImage( QImage *image, const QSize &newSize ) { + if( image_ == 0 ) + { + kWarning() << "Uninitialized usage of InkEdit!"; + return; + } + if( image->size() == newSize ) { - return; } @@ -248,4 +337,32 @@ void InkEdit::resizeImage( QImage *image, const QSize &newSize ) *image = newImage; } + + +// Change the image +void InkEdit::setImage( InkImage *newImage ) +{ + image_ = newImage; + update(); + + if( image_ ) + { + // Initialize the image if needed + if( ! image_->initialized ) + { + resizeImage( &(image_->pixels), size() ); + clearImage(); + image_->initialized = true; + } + + isEmpty_ = image_->area.isNull(); + } + else + { + isEmpty_ = true; + } +} + + + #include "inkedit.moc" diff --git a/src/chat/inkedit.h b/src/chat/inkedit.h index 83b6d69..e9b7b1f 100644 --- a/src/chat/inkedit.h +++ b/src/chat/inkedit.h @@ -21,17 +21,40 @@ #include "ui_inkedit.h" +// Structure to hold image data +struct InkImage +{ + // Structure initializer + InkImage() + { + initialized = false; + } + + // Is the image initialized? + bool initialized; + // Ink image pixels + QImage pixels; + // Rectangle containing the drawing + QRect area; +}; + + class InkEdit : public QWidget, public Ui::InkEdit { Q_OBJECT public: - InkEdit(QWidget *parent = 0); + // Constructor + InkEdit( QWidget *parent = 0 ); + // Return the image + InkImage *getImage(); // Return the bytes rapresents the image - const QByteArray &getImageBytes(); + const QByteArray &getImageBytes(); // Return if the image is empty bool isEmpty(); + // Change the image + void setImage( InkImage *newImage ); public slots: // Clear the current image @@ -56,26 +79,28 @@ class InkEdit : public QWidget, public Ui::InkEdit private slots: // Change color for current pen void changeColor(); + // Erase brush was selected + void eraseBrush(); private: // private attribute // Color of current pen QColor color_; - // Variable to store if the image is empty or not - bool isEmpty_; + // It's true if the erase brush was selected. + bool erasingImage_; + // Current image data + InkImage *image_; // The bytes of image QByteArray imageBytes_; - // The main image - QImage image_; + // Variable to store if the image is empty or not + bool isEmpty_; // Last point where the mouse pointer was released QPoint lastPoint_; - // Rect to store the position and size of current drawed area - QRect rect_; - // Return if we are in writing or no + // Returns if we are in writing or no bool scribbling_; signals: // Emitted when the ink was modified - void inkModified( bool erasered = false ); + void inkChanged(); }; #endif diff --git a/src/chat/inkedit.ui b/src/chat/inkedit.ui index 4a6c5b9..fa6c107 100644 --- a/src/chat/inkedit.ui +++ b/src/chat/inkedit.ui @@ -24,9 +24,6 @@ - - Qt::WheelFocus - QFrame::StyledPanel @@ -53,7 +50,7 @@
    - + Qt::Vertical @@ -66,11 +63,14 @@ - + Qt::NoFocus + + &Clear area + @@ -81,6 +81,9 @@ Qt::NoFocus + + &Pen Color + @@ -101,7 +104,7 @@ - Size pen + Pen Size 1 @@ -109,11 +112,24 @@ 10 + + 3 + Qt::Horizontal + + + + &Erase brush + + + + + + diff --git a/src/chat/winkswidget.cpp b/src/chat/winkswidget.cpp new file mode 100644 index 0000000..ffea962 --- /dev/null +++ b/src/chat/winkswidget.cpp @@ -0,0 +1,361 @@ +/*************************************************************************** + winkswidget.cpp - description + ------------------- + begin : Sat Mar 8 2009 + copyright : (C) 2009 by Antonio Nastasi + email : sifcenter (at) gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "winkswidget.h" + +#include "../contact/msnobject.h" +#include "../utils/kmessconfig.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +WinksWidget::WinksWidget( QWidget *parent ) +: QWidget(parent) +, noWinksWarning_(0) +{ + // Create and set the properties for list widget + list_ = new QListWidget( this ); + list_->setViewMode( QListView::IconMode ); + list_->setResizeMode( QListView::Adjust ); + list_->setIconSize( QSize( 32,32 ) ); + list_->setMovement( QListView::Static ); + list_->setSelectionMode( QAbstractItemView::SingleSelection ); + list_->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + list_->setFrameShape(QFrame::NoFrame ); + list_->setStyleSheet( "QListWidget { background-color: transparent; }" ); + + // Create an initial layout for the widget + layout_ = new QBoxLayout( QBoxLayout::LeftToRight, this ); + layout_->addWidget( list_ ); + winksDir_ = KMessConfig::instance()->getAccountsDirectory() + "/winks/"; + + setMinimumSize( minimumSizeHint() ); +} + + + +WinksWidget::~WinksWidget() +{ + clearList(); + + delete noWinksWarning_; +} + + + +void WinksWidget::clearList() +{ + if( list_->count() > 0 ) + { + while( list_->count() > 0 ) + { + delete list_->takeItem( 0 ); + } + } +} + + + +// Found better method to find out which winks is availables +// TODO may be we can create this cache one time and put one button to winks page to +// refresh this cache +void WinksWidget::refresh() +{ + clearList(); + const QDir directory( winksDir_, "*.cab" ); + QDir winkDirectory ( winksDir_, "*.png" ); + QFileInfo fileInfo; + KIcon icon; + QString iconPath; + const QStringList& cabFiles( directory.entryList( QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks ) ); + + if( cabFiles.isEmpty() ) + { + if( noWinksWarning_ == 0 ) + { + // Create and set the properties for the warning message + noWinksWarning_ = new QLabel( this ); + noWinksWarning_->setScaledContents( true ); + noWinksWarning_->setWordWrap( true ); + noWinksWarning_->setText( i18nc( "Informative label on the chat's winks bar", + "

    You don't have any winks yet.

    " + "

    To add new ones, have your contacts send you some!

    " ) ); + + // Enable the link click action + connect( noWinksWarning_, SIGNAL( linkActivated(const QString&) ), + this, SLOT ( slotNoEmoticonsLinkClicked() ) ); + + layout_->addWidget( noWinksWarning_ ); + } + + // Show the label and hide the list + noWinksWarning_->show(); + list_->hide(); + +#ifdef KMESSDEBUG_WINKSWIDGET + kDebug() << "There are no winks"; +#endif + return; + } + + // If the label was created, hide it! + if( noWinksWarning_ != 0 ) + { + list_->show(); + noWinksWarning_->hide(); + } + + foreach( const QString& file, cabFiles ) + { + // We need for file information to grep only it names ( without extension ) + fileInfo.setFile( winksDir_ + file ); + + if( QFile::exists( winksDir_ + file + ".stamp" ) ) + { + winkDirectory.setPath( winksDir_ + fileInfo.baseName() ); + // If the wink directory doens't exist we can't find the image of wink + // so icon is set to one default + // TODO we should try to extract the cab file to one directory so we be able to find the image + if( ! winkDirectory.exists() ) + { + iconPath = "view-media-artist"; + } + else + { + // Search for wink image + const QStringList& images( winkDirectory.entryList( QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks ) ); + if( images.isEmpty() ) + { + iconPath = "view-media-artist"; + } + else + { + iconPath = winkDirectory.path() + "/" + images.at(0); + } + } + + // Add the item + QListWidgetItem *item = new QListWidgetItem( KIcon( iconPath ), "", list_ ); + item->setData( Qt::UserRole, file ); + } + } +} + + + +//TODO clean this method +WinksWidget::CABEXTRACTOR WinksWidget::getHtmlFromWink( const QString &filename, QString &html ) +{ + const QFileInfo fileInfo( filename ); + const QString& winksDir( KMessConfig::instance()->getAccountsDirectory() + "/winks/" + fileInfo.baseName() ); + + QFile metaFile( winksDir + + "/content.xml" ); + + // See if the file was extracted already + if( ! metaFile.exists() ) + { + // Check if cabextract is installed + if( KStandardDirs::findExe( "cabextract" ).isEmpty() ) + { + return NOTINSTALLED; + } + + // Run cabextract to get the contents of the file + // -q: quiet, only print errors, -d: output dir, -l: force lowercase + // (avoiding incompatibilities because win32 is case-insensitive) + KProcess cabextract; + cabextract.closeReadChannel( QProcess::StandardOutput ); + cabextract.setOutputChannelMode( KProcess::SeparateChannels ); + cabextract.setReadChannel( QProcess::StandardError ); + cabextract << "cabextract" << "-q" << "-d" << winksDir << filename; + int exitCode = cabextract.execute( 5000 ); + // TODO: capture `cabextract` error messages, display nicely. + + if( exitCode != 0 ) + { + const QByteArray& errorOutput( cabextract.readAll() ); + kWarning().nospace() << "cabextract failed with the following output: " << errorOutput.trimmed(); + + return FAILED; + } + + if( ! metaFile.exists() ) + { + return UNKNOW; + } + } + + // Open the file + if( ! metaFile.open( QIODevice::ReadOnly ) ) + { + kWarning() << "file could not be opened: " << metaFile.fileName() << "!"; + return UNKNOW; + } + + // Parse the XML + QString xmlErrorMessage; + QDomDocument xml; + if( ! xml.setContent( &metaFile, true, &xmlErrorMessage ) ) + { + kWarning() << "parsing of wink XML failed: " << xmlErrorMessage << "!"; + return UNKNOW; + } + + // Get the package nodes + const QDomElement& packageNode( xml.namedItem("package").toElement() ); + if( packageNode.isNull() ) + { + kWarning() << "XML element /package not found!"; + return UNKNOW; + } + + if( packageNode.attribute( "type" ) != "wink" ) + { + kWarning() << "XML element /package/@type is not 'wink'!"; + return UNKNOW; + } + + if( packageNode.attribute( "contenttype" ) != "D" ) + { + kWarning() << "XML element /package/@contenttype is not 'D'!"; + } + + // Get the child nodes + const QDomNodeList& packageItems( packageNode.childNodes() ); + QString thumbnail; + QString animation; + QString animationType; + + for(int i = 0; i < packageItems.count(); i++) + { + const QDomElement& child( packageItems.item(i).toElement() ); + if( child.tagName() == "item" ) + { + const QString& type( child.attribute( "type" ) ); + if( type == "animation" ) + { + animation = child.attribute( "file" ); + animationType = child.attribute( "mimetype" ); + } + else if( type == "thumbnail-show" || type == "thumbnail" ) + { + thumbnail = child.attribute( "file" ); + // Type not stored. There are winks with mimetype="image/png" while they're sending a JPG. + } + else + { + kWarning() << "unknown wink element type: '" << type << "'!"; + } + } + } + + if( thumbnail.isEmpty() || animation.isEmpty() || animationType.isEmpty() ) + { + kWarning() << "XML elements are missing, could not play wink!"; + return UNKNOW; + } + + // Escape data for inclusion in HTML. + animation = Qt::escape(animation).replace("'", "'"); // quotes are not escaped by QStyleSheet::escape(). + animationType = animationType.remove( QRegExp("[^a-zA-Z0-9\\-/]") ); + + const QString& filePath( winksDir + "/" + animation ); + + // Height of 150 is a lot, but most winks are designed to be full-screen, so they can hardly be displayed smaller. + html = "
    " + "" + "" + "" + "" + "" + "" + "" + "" + "
    "; + + return SUCCESS; +} + + + +const QString WinksWidget::getMsnObjectWinkSelected() +{ + // Check if there is item selected + QListWidgetItem *item = list_->currentItem(); + if( item == 0 ) + { + return QString::null; + } + + // Grep the fileName of wink that the user selected and the handle to put in msn object + const QString& fileName( item->data( Qt::UserRole).toString() ); + const QString& handle( CurrentAccount::instance()->getHandle() ); + + // First, check if the file exists + QFile file( winksDir_ + fileName ); + if( ! file.open( QIODevice::ReadOnly ) ) + { + return QString::null; + } + + // Create the fileInfo object to grep only name of file without extension + const QFileInfo fileInfo( file ); + + // Second, read the content of wink ( it will be used for compute sha1c in msnobject ) + const QByteArray& data( file.readAll() ); + file.close(); + + // Try to read the certificate for the wink, without it the WLM doesn't show the wink received + //TODO we could send it to no WLM client if the file( certificate ) isn't present.... + // I don't know which clients check for it + file.setFileName( file.fileName() + ".stamp" ); + if( ! file.open( QIODevice::ReadOnly ) ) + { + return QString::null; + } + + // Third, read the certificate + const QByteArray& stamp( file.readAll() ); + file.close(); + if( stamp.isEmpty() ) + { + return QString::null; + } + + // TODO try to grep the real friendly name from file(?) + // Finally, make the msn object + MsnObject msnObject( handle , fileInfo.baseName(), QString( "wink from kmess" ), MsnObject::WINK, data, stamp ); + + return msnObject.objectString(); +} + +#include "winkswidget.moc" diff --git a/src/chat/winkswidget.h b/src/chat/winkswidget.h new file mode 100644 index 0000000..a5a76b8 --- /dev/null +++ b/src/chat/winkswidget.h @@ -0,0 +1,67 @@ +/*************************************************************************** + winkswidget.h - description + ------------------- + begin : Sat Mar 8 2009 + copyright : (C) 2009 by Antonio Nastasi + email : sifcenter (at) gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef WINKSWIDGET_H +#define WINKSWIDGET_H + +#include +#include + + +// Forward declaration +class QLabel; + + + +/** + * The widget in a chat that contains the winks to send to your contacts. + * + * @author Antonio Nastasi + * @ingroup Chat + */ +class WinksWidget : public QWidget +{ + Q_OBJECT + public: // public enum + enum CABEXTRACTOR + { + SUCCESS = 0, + FAILED, + NOTINSTALLED, + UNKNOW + }; + + public: + WinksWidget( QWidget *parent );; + ~WinksWidget(); + void refresh(); + static WinksWidget::CABEXTRACTOR getHtmlFromWink( const QString &filename, QString &html ); + const QString getMsnObjectWinkSelected(); + + private: // Private methods + void clearList(); + + private: // Private attributes + QBoxLayout *layout_; + QListWidget *list_; + // A warning message to tell the user he/she's got no winks + QLabel *noWinksWarning_; + QString winksDir_; +}; + +#endif diff --git a/src/chat/xsltransformation.cpp b/src/chat/xsltransformation.cpp index 5b20c53..5c1a35d 100644 --- a/src/chat/xsltransformation.cpp +++ b/src/chat/xsltransformation.cpp @@ -155,42 +155,20 @@ bool XslTransformation::hasStylesheet() const +// Set an XSL parameter +void XslTransformation::setParameter( const QString &key, const QVariant &value ) +{ + parametersMap_[ key ] = value.toString(); + updateParametersList(); +} + + + // Set the XSL parameters void XslTransformation::setParameters( const QMap xslParameters ) { - // Delete previous code. - for( int i = 0; i < xslParamCount_; i++ ) - { - delete xslParams_[i]; - } - delete[] xslParams_; - - // Params - if( xslParameters.isEmpty() ) - { - xslParams_ = 0; - } - else - { - int argCount = xslParameters.count() * 2 + 1; - xslParams_ = new const char*[ argCount ]; - - int i = 0; - for( QMap::const_iterator it = xslParameters.begin(); it != xslParameters.end(); ++it ) - { - // Duplicate the strings as they will be deleted outside this scope. - QByteArray key = it.key().toUtf8(); - QByteArray value = QString( "'" + it.value() + "'" ).toUtf8(); - xslParams_[ i++ ] = strdup( key.data() ); - xslParams_[ i++ ] = strdup( value.data() ); - } - xslParamCount_ = i; - xslParams_[ i++ ] = 0; - -#ifdef KMESSTEST - KMESS_ASSERT( i == argCount ); -#endif - } + parametersMap_ = xslParameters; + updateParametersList(); } @@ -300,6 +278,48 @@ void XslTransformation::setStylesheet(const QString &xslFileName) +// Refresh the actual XSL parameters list +void XslTransformation::updateParametersList() +{ + // Delete the previous parameter list + for( int i = 0; i < xslParamCount_; i++ ) + { + delete xslParams_[i]; + } + delete[] xslParams_; + + // Is the list empty? No parameters will be passed to the parser + if( parametersMap_.isEmpty() ) + { + xslParams_ = 0; + return; + } + + // Update the XSL parameters list with our list + int argCount = parametersMap_.count() * 2 + 1; + xslParams_ = new const char*[ argCount ]; + + int i = 0; + QMap::const_iterator it; + for( it = parametersMap_.begin(); it != parametersMap_.end(); ++it ) + { + // Duplicate the strings as they will be deleted outside this scope. + QByteArray key ( it.key().toUtf8() ); + QByteArray value ( QString( "'" + it.value() + "'" ).toUtf8() ); + xslParams_[ i++ ] = strdup( key .data() ); + xslParams_[ i++ ] = strdup( value.data() ); + } + + xslParamCount_ = i; + xslParams_[ i++ ] = 0; + +#ifdef KMESSTEST + KMESS_ASSERT( i == argCount ); +#endif +} + + + // Update the translation strings in the XSL document. void XslTransformation::updateXslTranslations( xmlNode *node, const xmlNs *xslNs, const xmlNs *kmessNs ) { @@ -340,11 +360,11 @@ void XslTransformation::updateXslTranslations( xmlNode *node, const xmlNs *xslNs // Get the content and convert to QString. xmlChar *rawContent = xmlNodeGetContent( curNode ); - QString content = QString::fromUtf8( (const char *) rawContent, xmlStrlen( rawContent ) ); + QString content( QString::fromUtf8( (const char *) rawContent, xmlStrlen( rawContent ) ) ); xmlFree( rawContent ); #ifdef KMESSDEBUG_XSLTRANSFORMATION - QString oldContent = content; + QString oldContent( content ); #endif // Trim and simplyfy spaces to avoid breaking translations too easily. diff --git a/src/chat/xsltransformation.h b/src/chat/xsltransformation.h index 6cb6335..908849d 100644 --- a/src/chat/xsltransformation.h +++ b/src/chat/xsltransformation.h @@ -23,6 +23,7 @@ #include #include +#include @@ -47,12 +48,16 @@ class XslTransformation QString convertXmlString(const QString &xml) const; // Check whether a stylesheet is loaded successfully bool hasStylesheet() const; + // Set an XSL parameter + void setParameter( const QString &key, const QVariant &value ); // Set the XSL parameters void setParameters( const QMap xslParameters ); // Set the XSL stylesheet. void setStylesheet(const QString &xslFileName); private: + // Refresh the actual XSL parameters list + void updateParametersList(); // Update the translation strings in the XSL document. void updateXslTranslations( xmlNode *node, const xmlNs *xslNs, const xmlNs *kmessNs ); @@ -62,6 +67,7 @@ class XslTransformation xmlDoc *xslDoc_; const char **xslParams_; int xslParamCount_; + QMap parametersMap_; }; #endif diff --git a/src/contact/contact.cpp b/src/contact/contact.cpp index d3c2ea0..72a042c 100644 --- a/src/contact/contact.cpp +++ b/src/contact/contact.cpp @@ -17,11 +17,10 @@ #include "contact.h" +#include "../contact/msnobject.h" +#include "../utils/kmessconfig.h" #include "../currentaccount.h" #include "../kmessdebug.h" -#include "../contact/msnobject.h" -#include "../network/specialgroups.h" -#include "../utils/kmessconfig.h" #include "contactextension.h" @@ -91,18 +90,18 @@ Contact::~Contact() // Add the groupID to the list of current groups void Contact::addGroupId(const QString &groupId) { + // Protect against invalid use, causes problems in KMessView. + if( groupId.isEmpty() ) + { + kWarning() << "Group-ID is empty (contact=" << handle_ << ")!"; + return; + } // Check whether contact is already added to the group. if( groupIds_.contains(groupId) ) { kWarning() << handle_ << " is already a member of group " << groupId << "."; return; } - // Protect against invalid use, causes problems in KMessView. - if( groupId.isEmpty() ) - { - kWarning() << "Group-ID is empty (contact=" << getHandle() << ")!"; - return; - } // Append to groups groupIds_.append(groupId); @@ -115,24 +114,12 @@ void Contact::addGroupId(const QString &groupId) } -// Check if this is a new contact -bool Contact::checkIfContactAddedUser() -{ -#ifdef KMESSDEBUG_CONTACT_GENERAL - kDebug() << "Contact " << handle_ << " - Check if new."; -#endif - - // Check if the contact is a new contact - return ( reverse_ && ! (friend_ || blocked_ || allowed_ ) ); -} - - // Return the path to the contact's picture QString Contact::getContactPicturePath() const { // Check before if there is some alternative contact's picture - QString picturePath = extension_->getContactAlternativePicturePath(); + QString picturePath( extension_->getContactAlternativePicturePath() ); if( ! picturePath.isEmpty() ) { @@ -146,11 +133,9 @@ QString Contact::getContactPicturePath() const { return picturePath; } - else - { - // else return the default contact picture path - return getContactDefaultPicturePath(); - } + + // else return the default contact picture path + return getContactDefaultPicturePath(); } @@ -181,14 +166,13 @@ ContactExtension *Contact::getExtension() const // Return the contact's friendly name QString Contact::getFriendlyName( FormattingMode mode ) const { + // Check if alternative friendly name is set if( extension_->getUseAlternativeName() ) { return extension_->getAlternativeName( mode ); } - else - { - return friendlyName_.getString( mode ); - } + // Else return the string contained in friendlyName + return friendlyName_.getString( mode ); } @@ -216,6 +200,14 @@ QStringList Contact::getGroupIds() const } + +// Return the contact's information +const QVariant Contact::getInformation( const QString &information ) const +{ + return informations_.value( information, QVariant() ); +} + + // Return the MSNObject const MsnObject* Contact::getMsnObject() const { @@ -232,14 +224,6 @@ const QString & Contact::getPersonalMessage( FormattingMode mode ) const -// Get the source group for an imminent move operation -const QString & Contact::getPrepareMove() const -{ - return movingFrom_; -} - - - // Return the contact's status Status Contact::getStatus() const { @@ -343,10 +327,6 @@ void Contact::loadMsnObject( QString msnObject ) // Load extension settings for a contact void Contact::readProperties( const KConfigGroup &config ) { -#ifdef KMESSDEBUG_CONTACTEXTENSION - kDebug() << "Loading state for contact" << handle_; -#endif - // Get the configuration group where this contact's data is stored KConfigGroup contactConfig = config.group( handle_ ); @@ -354,6 +334,7 @@ void Contact::readProperties( const KConfigGroup &config ) capabilities_ = contactConfig.readEntry( "capabilities", 0 ); clientAppName_ = contactConfig.readEntry( "clientAppName", "" ); personalMessage_.setString( contactConfig.readEntry( "lastPersonalMessage", "" ) ); + emoticonBlackList_ = contactConfig.readEntry( "emoticonBlackList", QStringList() ); // TODO: restore more state variables here, to implement contact list caching. @@ -364,19 +345,20 @@ void Contact::readProperties( const KConfigGroup &config ) // Remove the group from the list of group IDs -void Contact::removeGroupId(const QString &groupId) +void Contact::removeGroupId( const QString &groupId ) { - int removeCount = groupIds_.removeAll(groupId); + int removeCount = groupIds_.removeAll( groupId ); if(removeCount == 0) { kWarning() << handle_ << " was not registered to group " << groupId << "."; + return; } #ifdef KMESSDEBUG_CONTACT_GENERAL kDebug() << "groups of " << handle_ << " are '" << groupIds_.join(",") << "'"; #endif - emit changedGroup(this); + emit changedGroup( this ); } @@ -384,10 +366,6 @@ void Contact::removeGroupId(const QString &groupId) // Save extension settings for a contact void Contact::saveProperties( KConfigGroup &config ) { -#ifdef KMESSDEBUG_CONTACTEXTENSION - kDebug() << "Saving state for contact" << handle_; -#endif - // Get the configuration group where this contact's data is stored KConfigGroup contactConfig = config.group( handle_ ); @@ -395,6 +373,7 @@ void Contact::saveProperties( KConfigGroup &config ) contactConfig.writeEntry( "capabilities", getCapabilities() ); contactConfig.writeEntry( "clientAppName", getClientAppName() ); contactConfig.writeEntry( "lastPersonalMessage", getPersonalMessage( STRING_ORIGINAL ) ); + contactConfig.writeEntry( "emoticonBlackList", getEmoticonBlackList() ); // TODO: save more state variables here, to implement contact list caching. @@ -405,7 +384,7 @@ void Contact::saveProperties( KConfigGroup &config ) // Set whether or not the contact is allowed -void Contact::setAllowed(bool allowed) +void Contact::setAllowed( bool allowed ) { if( allowed_ != allowed ) { @@ -417,7 +396,7 @@ void Contact::setAllowed(bool allowed) // Set whether or not the contact is blocked -void Contact::setBlocked(bool blocked) +void Contact::setBlocked( bool blocked ) { if( blocked_ != blocked ) { @@ -429,7 +408,7 @@ void Contact::setBlocked(bool blocked) // Set whether or not the contact is on the friends list -void Contact::setFriend(bool isFriend) +void Contact::setFriend( bool isFriend ) { if( friend_ != isFriend ) { @@ -449,10 +428,11 @@ void Contact::setFriend(bool isFriend) // Change the contact's friendly name -void Contact::setFriendlyName(QString newName) +void Contact::setFriendlyName( QString newName ) { if( newName.isEmpty() ) { + kWarning() << "Not setting the friendly name of " << handle_ << " to an empty value (previously: " << friendlyName_.getCleaned() << ")"; return; } @@ -464,49 +444,25 @@ void Contact::setFriendlyName(QString newName) // Change the GUID of the contact, this is only known when the contact is added to the friends list. -void Contact::setGuid(const QString &guid) +void Contact::setGuid( const QString &guid ) { guid_ = guid; } -// Set whether or not the user is on a given list -void Contact::setList(const QString list, bool isMember) +// Set the extra information retrieved by soap response +void Contact::setInformations( const QHash &informations ) { -#ifdef KMESSTEST - KMESS_ASSERT( ( list == "FL" ) || ( list == "AL" ) || ( list == "BL" ) || ( list == "RL" ) ); -#endif -#ifdef KMESSDEBUG_CONTACT_GENERAL - kDebug() << "old =" << (allowed_ ? " AL" : "") - << (blocked_ ? " BL" : "") - << (friend_ ? " FL" : "") - << (reverse_ ? " RL" : "") << endl; -#endif + informations_ = informations; +} - if ( list == "FL" ) - { - setFriend( isMember ); - } - else if ( list == "AL" ) - { - setAllowed( isMember ); - } - else if ( list == "BL" ) - { - setBlocked( isMember ); - } - else if ( list == "RL" ) - { - setReverse( isMember ); - } -#ifdef KMESSDEBUG_CONTACT_GENERAL - kDebug() << "new =" << (allowed_ ? " AL" : "") - << (blocked_ ? " BL" : "") - << (friend_ ? " FL" : "") - << (reverse_ ? " RL" : "") << endl; -#endif + +// Set wether or not the contact is on pending list +void Contact::setPending( bool isPending ) +{ + pending_ = isPending; } @@ -514,6 +470,7 @@ void Contact::setList(const QString list, bool isMember) // Set the personal message of the contact void Contact::setPersonalStatus( const QString &message, const QString &mediaType, const QString &mediaString ) { + // If no information is changed if( personalMessage_.getOriginal() == message && currentMediaType_ == mediaType && currentMediaString_ == mediaString ) @@ -530,27 +487,8 @@ void Contact::setPersonalStatus( const QString &message, const QString &mediaTyp -// Prepare moving the contact to another group from the specified one -void Contact::setPrepareMove( QString from ) -{ - // It's the MSN Notification Server the one who actually performs the - // move, not us. This method only allows to understand if a received - // "add contact" command is subsequent to a move or not. - if( ! from.isEmpty() ) - { - movingFrom_ = from; - } - else - { - movingFrom_ = QString::null; - } - -} - - - // Set whether or not the contact is on the reverse list -void Contact::setReverse(bool reverse) +void Contact::setReverse( bool reverse ) { if( reverse_ != reverse ) { @@ -562,10 +500,15 @@ void Contact::setReverse(bool reverse) // Set the contact's status -void Contact::setStatus(const Status status, bool showBaloon) +void Contact::setStatus( const Status newStatus, bool showBaloon ) { + if( status_ == newStatus ) + { + return; + } + lastStatus_ = status_; - status_ = status; + status_ = newStatus; #ifdef KMESSDEBUG_CONTACT_GENERAL kDebug() << "Contact " << handle_ << " went from " << MsnStatus::getCode( lastStatus_ ) diff --git a/src/contact/contact.h b/src/contact/contact.h index a7fbcd1..900cdfe 100644 --- a/src/contact/contact.h +++ b/src/contact/contact.h @@ -83,8 +83,6 @@ class Contact : public ContactBase virtual ~Contact(); // Add the groupID to the list of current groups void addGroupId(const QString &groupId); - // Check if this is a new contact - bool checkIfContactAddedUser(); // Return the path to the contact's picture QString getContactPicturePath() const; // Return the current media type @@ -99,6 +97,8 @@ class Contact : public ContactBase QStringList getGroupIds() const; // Return the contact's globally unique identifier const QString & getGuid() const; + // Return the contact's information + const QVariant getInformation( const QString &information ) const; // Return the contact's previous status Status getLastStatus() const; // Return the contact's personal message @@ -109,8 +109,6 @@ class Contact : public ContactBase QString getTrueFriendlyName( FormattingMode mode = STRING_CLEANED ) const; // Return an MSN Object const MsnObject* getMsnObject() const; - // Get the source group for an imminent move operation - const QString & getPrepareMove() const; // Whether or not the contact is allowed bool isAllowed() const; // Whether or not the contact is blocked @@ -139,16 +137,16 @@ class Contact : public ContactBase void setFriendlyName(QString newName); // Change the GUID of the contact, this is only known when the contact is added to the friends list. void setGuid(const QString &guid); - // Set whether or not the user is on a given list - void setList(const QString list, bool isMember); + // Set the extra information retrieved by soap response + void setInformations( const QHash &informations ); + // Set wether or not the contact is on pending list + void setPending( bool isPending ); // Set the contacts Personal message void setPersonalStatus(const QString &message, const QString &mediaType = QString::null, const QString &mediaString = QString::null); - // Prepare moving the contact to another group from the specified one - void setPrepareMove( QString from = QString::null ); // Set whether or not the contact is on the reverse list void setReverse(bool reverse); // Set the contact's status - void setStatus(const Status status, bool showBaloon = true); + void setStatus( const Status newStatus, bool showBaloon = true ); private: // Private attributes // Whether or not the contact is "allowed" @@ -167,6 +165,8 @@ class Contact : public ContactBase QStringList groupIds_; // The contact's globally unique identifier QString guid_; + // Extra informations + QHash informations_; // The previous contact's status of the contact Status lastStatus_; // Name of the original group when the contact is being moved diff --git a/src/contact/contactbase.cpp b/src/contact/contactbase.cpp index 24014fd..6147714 100644 --- a/src/contact/contactbase.cpp +++ b/src/contact/contactbase.cpp @@ -19,7 +19,7 @@ #include "../contact/msnobject.h" // only used for detectClientAppName()! #include "../network/applications/applicationlist.h" -#include "../emoticon.h" +#include "../utils/kmessshared.h" #include "../kmessdebug.h" #include @@ -33,10 +33,18 @@ // The constructor ContactBase::ContactBase(QString handle, QString friendlyName, uint capabilities) : capabilities_(capabilities) - , friendlyName_(friendlyName) , handle_(handle) , applicationList_(0) { + // Use the handle in the rare cases where a friendly name is not available + if( friendlyName.isEmpty() ) + { + friendlyName_ = handle; + } + else + { + friendlyName_ = friendlyName; + } } @@ -58,14 +66,14 @@ void ContactBase::addEmoticonDefinition(const QString &emoticonCode, const QStri #endif // Escape the code so the HTML parser won't be fooled. - QString shortcut = emoticonCode; - Emoticon::htmlEscape( shortcut ); + QString shortcut( emoticonCode ); + KMessShared::htmlEscape( shortcut ); // Add emoticon to pending list, until Msn object is received. pendingEmoticons_.insert( msnObjectDataHash, shortcut ); // Escape the code to insert it safely into a regular expression - QString escapedCode = QRegExp::escape( shortcut ); + QString escapedCode( QRegExp::escape( shortcut ) ); // Update regexp pattern if( pendingRegExp_.isEmpty() ) @@ -95,7 +103,7 @@ void ContactBase::addEmoticonFile(const QString &msnObjectDataHash, const QStrin } // Get the emoticon code from pending list, remove it - QString emoticonCode = pendingEmoticons_[msnObjectDataHash]; // no QString& because record gets removed. + QString emoticonCode( pendingEmoticons_[msnObjectDataHash] ); // no QString& because record gets removed. pendingEmoticons_.remove(msnObjectDataHash); #ifdef KMESSDEBUG_CONTACTBASE @@ -115,12 +123,12 @@ void ContactBase::addEmoticonFile(const QString &msnObjectDataHash, const QStrin return; } -#ifdef KMESSDEBUG_CONTACT_GENERAL +#ifdef KMESSDEBUG_CONTACTBASE kDebug() << "Setting image for '" << emoticonCode << " to " << filename; #endif // Escape the code to insert it safely into a regular expression - QString escapedCode = QRegExp::escape( emoticonCode ); + QString escapedCode( QRegExp::escape( emoticonCode ) ); // Update regexp pattern if( emoticonRegExp_.isEmpty() ) @@ -160,12 +168,15 @@ void ContactBase::addEmoticonFile(const QString &msnObjectDataHash, const QStrin } // Add replacement. - QString replacement = "" + emoticonCode
-                      + ""; + QString altCode ( emoticonCode ); + altCode = KMessShared::htmlUnescape( altCode ).replace("'", "'"); + QString replacement( "" + altCode
+                     + "" ); + customEmoticons_.insert(emoticonCode, replacement); } @@ -212,23 +223,32 @@ ApplicationList * ContactBase::createApplicationList() // Set the application name based on the capabilities void ContactBase::detectClientAppName( uint capabilities, const MsnObject *msnObject ) { + // Note there are two ways to detect the client name. + // - in the notification connection, we can read the 'capabilities' and filename from the 'msnobject' (which some thirdparty clients tag with their name). + // - in the switchboard connection, a x-clientcaps message is sent by most thirdparty clients with exact version information. + // Use capabilities to give an indication what client we're dealing with. uint clientVersion = capabilities & 0xF0000000; // Find msn version float msnVersion = 0; + QString suffix; switch( clientVersion ) { case 0: break; - case MSN_CAP_MSN60: msnVersion = 6.0f; break; - case MSN_CAP_MSN61: msnVersion = 6.1f; break; - case MSN_CAP_MSN62: msnVersion = 6.2f; break; - case MSN_CAP_MSN70: msnVersion = 7.0f; break; // default caps 0x4000C024: ink-gif, multi-packet, direct-im, winks - case MSN_CAP_MSN75: msnVersion = 7.5f; break; - case MSN_CAP_MSN80: msnVersion = 8.0f; break; - case MSN_CAP_MSN81: msnVersion = 8.1f; break; // default caps 0x765DC02C: ink-gif, (ink-isf), multi-packet, direct-im, winks, shared-search, voice-clips, secure-channel, sip, folder-sharing - case MSN_CAP_MSN85: msnVersion = 8.5f; break; // default caps 0x865DC02C: ink-gif, ink-isf, multi-packet, direct-im, winks, shared-search, voice-clips, secure-channel, sip, folder-sharing - default: msnVersion = 999; + case MSN_CAP_MSN60: msnVersion = 6.0f; break; + case MSN_CAP_MSN61: msnVersion = 6.1f; break; + case MSN_CAP_MSN62: msnVersion = 6.2f; break; + case MSN_CAP_MSN70: msnVersion = 7.0f; break; // default caps 0x4000C024: ink-gif, multi-packet, direct-im, winks + case MSN_CAP_MSN75: msnVersion = 7.5f; break; + case MSN_CAP_MSN80: msnVersion = 8.0f; break; + case MSN_CAP_MSN81: msnVersion = 8.1f; break; // default caps 0x765DC02C: ink-gif, (ink-isf), multi-packet, direct-im, winks, shared-search, voice-clips, secure-channel, sip, folder-sharing, turn, uun + case MSN_CAP_MSN85: msnVersion = 8.5f; break; // default caps 0x865DC02C: ink-gif, ink-isf, multi-packet, direct-im, winks, shared-search, voice-clips, secure-channel, sip, folder-sharing + case MSN_CAP_MSN90beta: msnVersion = 9.0f; suffix = " beta"; break; // default caps 0x963CC03C: + case MSN_CAP_MSN2009: msnVersion = 2009.0f; break; + default: + kWarning() << "Unable to parse the WLM version of for the contact" << handle_ << ", msncversion=" << ( clientVersion >> 28 ) << " capabilities=" << capabilities; + msnVersion = 9999999; } @@ -254,7 +274,11 @@ void ContactBase::detectClientAppName( uint capabilities, const MsnObject *msnOb } else if( pictureLocation == "kopete.tmp" ) { - pictureClientName = "Kopete"; + pictureClientName = "Kopete"; // no longer works since KDE 4.2, Kopete uses libmsn now. + } + else if( pictureLocation == "amsn.tmp" ) + { + pictureClientName = "aMSN"; } else if( pictureLocation == "EncartaIcon.png" ) { @@ -291,6 +315,10 @@ void ContactBase::detectClientAppName( uint capabilities, const MsnObject *msnOb { clientAppName_ = i18n("Messenger Bot"); } + else if( capabilities & MSN_CAP_MCE_CLIENT ) + { + clientAppName_ = i18n("Windows Media Center"); + } else { if( msnVersion == 0 ) @@ -303,52 +331,77 @@ void ContactBase::detectClientAppName( uint capabilities, const MsnObject *msnOb // pre wlm client clientAppName_ = i18n("MSN Messenger %1 compatible", QString::number( msnVersion ) ); } - else if( msnVersion < 999 ) + else { - // wlm client - if( ( capabilities & 0x065DC024 ) == 0x065DC024 ) // is 0x765DC02C without ink-isf. + // WLM client. + // See if it has all capabilities of WLM 8.1 / 2009, or it's a third party client which is just faking... + // ink-isf is optional, requires Windows Journal to be installed. + const uint wlm80Mask = MSN_CAP_INK_GIF | MSN_CAP_MULTI_PACKET | MSN_CAP_DIRECT_IM | MSN_CAP_WINKS | MSN_CAP_SHARED_SEARCH | MSN_CAP_VOICE_CLIPS | MSN_CAP_SCHANNEL | MSN_CAP_SIP_INVITE | MSN_CAP_FOLDER_SHARING; // FIXME: turn / uun seen in 81, also in 8.0? + const uint wlm2009Mask = MSN_CAP_INK_GIF | MSN_CAP_MULTI_PACKET | MSN_CAP_DIRECT_IM | MSN_CAP_WINKS | MSN_CAP_VOICE_CLIPS | MSN_CAP_SCHANNEL | MSN_CAP_SIP_INVITE | MSN_CAP_UNKN_2009 | MSN_CAP_P2P_TURN | MSN_CAP_P2P_UUN; + bool isRealWlm = ( ( msnVersion < 9.0 && ( capabilities & wlm80Mask ) == wlm80Mask ) + || ( capabilities & wlm2009Mask ) == wlm2009Mask ); + + if( isRealWlm ) { - // Supports all default caps of 8.1, remove the "compatible" string. This truely is WLM. - clientAppName_ = i18n("Windows Live Messenger %1", QString::number( msnVersion ) ); + if( msnVersion < 9999999 ) + { + // Supports all default caps of 8.1 or 2009, remove the "compatible" string. This truely is WLM. + clientAppName_ = i18n("Windows Live Messenger %1", QString::number( msnVersion ) + suffix ); + } + else + { + // Beyond our current finger print database, can't show version number yet. + clientAppName_ = i18n("Windows Live Messenger"); + } } else { - clientAppName_ = i18n("Windows Live Messenger %1 compatible", QString::number( msnVersion ) ); + if( msnVersion < 9999999 ) + { + clientAppName_ = i18n("Windows Live Messenger %1 compatible", QString::number( msnVersion ) ); + } + else + { + // Kopete seams to use 0xc0000000 as capabilities.. 2 versions beyond WLM2009 + // It's caps are 0xc0148028; ink-isf, multi-packet, winks, voice-clips, sip + clientAppName_ = i18n("Windows Live Messenger compatible", QString::number( msnVersion ) ); + } } } - else - { - // newer version of wlm - clientAppName_ = i18n("Windows Live Messenger"); - } } #ifdef KMESSDEBUG_CONTACTBASE if( isOnline() ) { QStringList caps; - if( capabilities & MSN_CAP_WIN_MOBILE ) caps << "mobile-client"; - if( capabilities & MSN_CAP_MSO_CLIENT ) caps << "office-client"; - if( capabilities & MSN_CAP_WEB_CLIENT ) caps << "web-client"; - if( capabilities & MSN_CAP_BOT ) caps << "bot-client"; + if( capabilities & MSN_CAP_WIN_MOBILE ) caps << "mobile-client"; // 0x1 + if( capabilities & MSN_CAP_MSN8_USER ) caps << "msn8-user?"; // 0x2 + if( capabilities & MSN_CAP_MSO_CLIENT ) caps << "office-client"; // 0x800 + if( capabilities & MSN_CAP_WEB_CLIENT ) caps << "web-client"; // 0x200 + if( capabilities & MSN_CAP_BOT ) caps << "bot-client"; // 0x20000 + if( capabilities & MSN_CAP_MCE_CLIENT ) caps << "mce-client"; // 0x2000 - if( capabilities & MSN_CAP_INK_GIF ) caps << "ink-gif"; - if( capabilities & MSN_CAP_INK_ISF ) caps << "ink-isf"; - if( capabilities & MSN_CAP_MULTI_PACKET ) caps << "multi-packet"; - if( capabilities & MSN_CAP_DIRECT_IM ) caps << "direct-im"; - if( capabilities & MSN_CAP_WINKS ) caps << "winks"; - if( capabilities & MSN_CAP_SEARCH ) caps << "shared-search"; - if( capabilities & MSN_CAP_VOICE_IM ) caps << "voice-clips"; - if( capabilities & MSN_CAP_SECURE_IM ) caps << "secure-channel"; - if( capabilities & MSN_CAP_SIP_INVITE ) caps << "sip"; - if( capabilities & MSN_CAP_FOLDER_SHARING ) caps << "folder-sharing"; + if( capabilities & MSN_CAP_INK_GIF ) caps << "ink-gif"; // 0x4 + if( capabilities & MSN_CAP_INK_ISF ) caps << "ink-isf"; // 0x8 + if( capabilities & MSN_CAP_MULTI_PACKET ) caps << "multi-packet"; // 0x20 + if( capabilities & MSN_CAP_DIRECT_IM ) caps << "direct-im"; // 0x4000 + if( capabilities & MSN_CAP_WINKS ) caps << "winks"; // 0x8000 + if( capabilities & MSN_CAP_SHARED_SEARCH ) caps << "shared-search"; // 0x10000 + if( capabilities & MSN_CAP_VOICE_CLIPS ) caps << "voice-clips"; // 0x40000 + if( capabilities & MSN_CAP_SCHANNEL ) caps << "secure-channel"; // 0x80000 + if( capabilities & MSN_CAP_SIP_INVITE ) caps << "sip"; // 0x100000 + if( capabilities & MSN_CAP_UNKN_2009 ) caps << "unknown-2009"; // 0x200000 + if( capabilities & MSN_CAP_FOLDER_SHARING ) caps << "folder-sharing"; // 0x400000 + if( capabilities & MSN_CAP_P2P_TURN ) caps << "p2p-turn"; // 0x2000000 + if( capabilities & MSN_CAP_P2P_UUN ) caps << "p2p-uun"; // 0x4000000 - if( capabilities & MSN_CAP_VIDEO_CHAT ) caps << "has-webcam"; - if( capabilities & MSN_CAP_MSN_MOBILE ) caps << "has-mobile"; - if( capabilities & MSN_CAP_MSN_DIRECT ) caps << "has-direct"; - if( capabilities & MSN_CAP_LIVE_SPACE ) caps << "has-space"; + if( capabilities & MSN_CAP_VIDEO_CHAT ) caps << "has-webcam"; // 0x10 + if( capabilities & MSN_CAP_MSN_MOBILE ) caps << "has-mobile"; // 0x40 + if( capabilities & MSN_CAP_MSN_DIRECT ) caps << "has-direct"; // 0x80 + if( capabilities & MSN_CAP_LIVE_SPACE ) caps << "has-space"; // 0x1000 + if( capabilities & MSN_CAP_ONECARE ) caps << "has-onecare"; // 0x1000000 - kDebug() << "contact" << getHandle() << "uses client:" << clientAppName_ << "msn version:" << msnVersion << "capabilities:" << capabilities << "(" << caps << ")"; + kDebug() << "contact" << getHandle() << "uses client:" << clientAppName_ << "msn version:" << msnVersion << "capabilities:" << capabilities << caps; } #endif } @@ -379,7 +432,7 @@ const QString & ContactBase::getClientAppName() const -// Return the third party client nane field +// Return the third party client name field const QString & ContactBase::getClientName() const { return clientName_; @@ -396,6 +449,14 @@ QString ContactBase::getContactDefaultPicturePath() const +// Return the list of custom emoticons to ignore. +const QStringList &ContactBase::getEmoticonBlackList() const +{ + return emoticonBlackList_; +} + + + // Return the custom emoticon code for an msn object QString ContactBase::getEmoticonCode(const QString &msnObjectDataHash) const { @@ -413,7 +474,7 @@ const QRegExp & ContactBase::getEmoticonPattern() const // Return the custom emoticon replacements. -const QMap& ContactBase::getEmoticonReplacements() const +const QHash& ContactBase::getEmoticonReplacements() const { return customEmoticons_; } @@ -496,6 +557,30 @@ bool ContactBase::isOnline() const +// Add or remove a custom emoticon from the black list +bool ContactBase::manageEmoticonBlackList( bool add, const QString &emoticonCode ) +{ + // Add the emoticon + if( add ) + { + // Don't duplicate emoticons in the list + if( emoticonBlackList_.contains( emoticonCode ) ) + { + return false; + } + + emoticonBlackList_.append( emoticonCode ); + return true; + } + // Remove the emoticon + else + { + return ( emoticonBlackList_.removeAll( emoticonCode ) > 0 ); + } +} + + + // Unregister the contact as participant, contact has left the chat. void ContactBase::removeSwitchboardConnection( const MsnSwitchboardConnection *connection, bool userInitiated ) { @@ -547,18 +632,23 @@ void ContactBase::removeSwitchboardConnection( const MsnSwitchboardConnection *c void ContactBase::setCapabilities( uint capabilities ) { // See if the client software could have changed. - // Enable flags which could be toggled by the client. - bool clientChanged = ( capabilities_ | MSN_CAP_VIDEO_CHAT | MSN_CAP_MSN_MOBILE | MSN_CAP_MSN_DIRECT | MSN_CAP_LIVE_SPACE ) != - ( capabilities | MSN_CAP_VIDEO_CHAT | MSN_CAP_MSN_MOBILE | MSN_CAP_MSN_DIRECT | MSN_CAP_LIVE_SPACE ); - - capabilities_ = capabilities; + // Ignore flags which can be toggled by the client. + const int toggleFlags = ( MSN_CAP_VIDEO_CHAT | MSN_CAP_MSN_MOBILE | MSN_CAP_MSN_DIRECT | MSN_CAP_LIVE_SPACE | MSN_CAP_ONECARE ); + bool clientChanged = ( capabilities_ | toggleFlags ) != ( capabilities | toggleFlags ); // Reset the client name information if the capabilities changed. if( clientChanged ) { +#ifdef KMESSDEBUG_CONTACTBASE + kDebug() << "capabilities of" << handle_ << "changed from" << capabilities_ << "to" << capabilities << ", resetting detected app name."; +#endif + clientAppName_.clear(); clientName_.clear(); } + + // Set caps + capabilities_ = capabilities; } diff --git a/src/contact/contactbase.h b/src/contact/contactbase.h index 78e0cb6..bbb2e80 100644 --- a/src/contact/contactbase.h +++ b/src/contact/contactbase.h @@ -19,11 +19,9 @@ #define CONTACTBASE_H #include "../utils/richtextparser.h" -#include "contact/msnstatus.h" +#include "msnstatus.h" -#include -#include -#include +#include class MsnSwitchboardConnection; @@ -60,9 +58,10 @@ class ContactBase : public QObject */ enum MsnClientCapabilities { - MSN_CAP_WIN_MOBILE = 0x01, ///< 0x01, the client is a Windows Mobile device, display an phone icon overlay in buddy list. - MSN_CAP_INK_GIF = 0x04, ///< 0x04, the client supports handwritten messages in GIF format. - MSN_CAP_INK_ISF = 0x08, ///< 0x08, the client supports handwritten messages in ISF format. + MSN_CAP_WIN_MOBILE = 0x1, ///< 0x1, the client is a Windows Mobile device, display an phone icon overlay in buddy list. + MSN_CAP_MSN8_USER = 0x2, ///< 0x2, MSN 8 user?? + MSN_CAP_INK_GIF = 0x4, ///< 0x4, the client supports handwritten messages in GIF format. + MSN_CAP_INK_ISF = 0x8, ///< 0x8, the client supports handwritten messages in ISF format. MSN_CAP_VIDEO_CHAT = 0x10, ///< 0x10, the client supports video chats; the webcam is connected and shared. MSN_CAP_MULTI_PACKET = 0x20, ///< 0x20, the client supports multi-packet MIME messages. MSN_CAP_MSN_MOBILE = 0x40, ///< 0x40, the contact has a MSN Mobile device you can page them on (MSN6 displays a yellow icon if they're offline. This is equivalent to the BPR MOB Y setting). @@ -70,14 +69,19 @@ class ContactBase : public QObject MSN_CAP_WEB_CLIENT = 0x200, ///< 0x200, the client is http://webmessenger.msn.com/. MSN_CAP_MSO_CLIENT = 0x800, ///< 0x800, the client is Office Live client, or internal Microsoft client. MSN_CAP_LIVE_SPACE = 0x1000, ///< 0x1000, the user has an Windows Live space. + MSN_CAP_MCE_CLIENT = 0x2000, ///< 0x2000, the client is a Windows Media Center client. MSN_CAP_DIRECT_IM = 0x4000, ///< 0x4000, the client supports direct-im (chats without a switchboard connection) MSN_CAP_WINKS = 0x8000, ///< 0x8000, the client supports Winks. - MSN_CAP_SEARCH = 0x10000, ///< 0x10000, the client supports MSN shared search. + MSN_CAP_SHARED_SEARCH = 0x10000, ///< 0x10000, the client supports MSN shared search. MSN_CAP_BOT = 0x20000, ///< 0x20000, this is set by the server if the account has been provisioned by MSN as being a Bot account (and thus have its limitations removed). - MSN_CAP_VOICE_IM = 0x40000, ///< 0x40000, the client supports Voice Clips. - MSN_CAP_SECURE_IM = 0x80000, ///< 0x80000, the client supports secure channel to send secure messages. + MSN_CAP_VOICE_CLIPS = 0x40000, ///< 0x40000, the client supports Voice Clips. + MSN_CAP_SCHANNEL = 0x80000, ///< 0x80000, the client supports SChannel to send secure messages. MSN_CAP_SIP_INVITE = 0x100000, ///< 0x100000, the client supports unknown SIP-based communications. - MSN_CAP_FOLDER_SHARING = 0x400000, ///< 0x400000, the client supports folder sharing. + MSN_CAP_UNKN_2009 = 0x200000, ///< 0x200000, seen since WLM 2009, meaning unknown. + MSN_CAP_FOLDER_SHARING = 0x400000, ///< 0x400000, the client supports folder sharing (sdrive) + MSN_CAP_ONECARE = 0x1000000, ///< 0x1000000, the client supports OneCare. + MSN_CAP_P2P_TURN = 0x2000000, ///< 0x2000000, the client supports TURN as P2P transport layer. + MSN_CAP_P2P_UUN = 0x4000000, ///< 0x4000000, the client supports bootstrapping P2P via UUN. MSN_CAP_MSN60 = 0x10000000, ///< 0x10000000, the client supports the P2P protocol features of MSNC1 (introduced with MSN 6.0). MSN_CAP_MSN61 = 0x20000000, ///< 0x20000000, the client supports the P2P protocol features of MSNC2 (introduced with MSN 6.1). MSN_CAP_MSN62 = 0x30000000, ///< 0x30000000, the client supports the P2P protocol features of MSNC3 (introduced with MSN 6.2). @@ -85,7 +89,9 @@ class ContactBase : public QObject MSN_CAP_MSN75 = 0x50000000, ///< 0x50000000, the client supports the P2P protocol features of MSNC5 (introduced with MSN 7.5). MSN_CAP_MSN80 = 0x60000000, ///< 0x60000000, the client supports the P2P protocol features of MSNC6 (introduced with WLM 8.0). MSN_CAP_MSN81 = 0x70000000, ///< 0x70000000, the client supports the P2P protocol features of MSNC7 (introduced with WLM 8.1). - MSN_CAP_MSN85 = 0x80000000 ///< 0x80000000, the client supports the P2P protocol features of MSNC8 (introduced with WLM 8.5). + MSN_CAP_MSN85 = 0x80000000, ///< 0x80000000, the client supports the P2P protocol features of MSNC8 (introduced with WLM 8.5). + MSN_CAP_MSN90beta = 0x90000000, ///< 0x90000000, the client supports the P2P protocol features of MSNC9 (introduced with WLM 9.0 beta). + MSN_CAP_MSN2009 = 0xa0000000 ///< 0x90000000, the client supports the P2P protocol features of MSNC10 (introduced with WLM 2009). }; @@ -114,12 +120,14 @@ class ContactBase : public QObject QString getContactDefaultPicturePath() const; // Return the path to the contact's picture virtual QString getContactPicturePath() const = 0; + // Return the list of custom emoticons to ignore. + const QStringList &getEmoticonBlackList() const; // Return the custom emoticon code for an msn object QString getEmoticonCode(const QString &msnObjectDataHash) const; // Return the custom emoticon search pattern. const QRegExp & getEmoticonPattern() const; // Return the custom emoticon replacements. - const QMap & getEmoticonReplacements() const; + const QHash & getEmoticonReplacements() const; // Return the contact's friendly name virtual QString getFriendlyName( FormattingMode mode = STRING_CLEANED ) const; // Return the contact's handle @@ -140,6 +148,8 @@ class ContactBase : public QObject bool isOffline() const; // Return true if the contact is online bool isOnline() const; + // Add or remove a custom emoticon from the black list + bool manageEmoticonBlackList( bool add, const QString &emoticonCode ); // Unregister the contact as participant, contact has left the chat. void removeSwitchboardConnection( const MsnSwitchboardConnection *connection, bool userInitiated = false ); // Set the capabilities flag of the contact's msn client. @@ -166,7 +176,9 @@ class ContactBase : public QObject // The third party client name field QString clientName_; // The custom emoticons for the contact. - QMap customEmoticons_; + QHash customEmoticons_; + // The list of custom emoticons to ignore for this contact + QStringList emoticonBlackList_; // The emoticon regexp QRegExp emoticonRegExp_; // The contact's friendly name @@ -174,7 +186,7 @@ class ContactBase : public QObject // The contact's handle QString handle_; // The pending custom emoticons for the contact. - QMap pendingEmoticons_; + QHash pendingEmoticons_; // The regexp for pending custom emoticons QRegExp pendingRegExp_; // The contact's online status @@ -192,7 +204,7 @@ class ContactBase : public QObject void changedFriendlyName(); // Signal that the contact's picture path has changed void changedPicture(); - // Signal that the contact's status changed + // signal that the contact's status changed void changedStatus(); // Signal that the contact left all chats void leftAllChats( ContactBase *contact ); diff --git a/src/contact/contactextension.cpp b/src/contact/contactextension.cpp index 58fccec..a2e64e9 100644 --- a/src/contact/contactextension.cpp +++ b/src/contact/contactextension.cpp @@ -19,7 +19,6 @@ #include "../currentaccount.h" #include "../kmessdebug.h" -#include "contactlist.h" #include @@ -55,11 +54,10 @@ ContactExtension::~ContactExtension() // Clear the cache of picture files void ContactExtension::clearCache() { - QString fileName; - QFile file; + QFile file; // Grep all pictures and remove these - foreach( fileName, pictureFileList_ ) + foreach( const QString &fileName, pictureFileList_ ) { // Remove the picture file file.setFileName( fileName ); @@ -101,14 +99,12 @@ const QString& ContactExtension::getContactAlternativePicturePath() const // Read the original contact picture path const QString ContactExtension::getContactPicturePath() const { - if(QFile::exists(pictureFile_)) + if( QFile::exists( pictureFile_ ) ) { return pictureFile_; } - else - { - return QString::null; - } + + return QString::null; } @@ -116,14 +112,12 @@ const QString ContactExtension::getContactPicturePath() const // Read the custom contact sound path const QString ContactExtension::getContactSoundPath() const { - if(QFile::exists(soundFile_)) + if( QFile::exists( soundFile_ ) ) { return soundFile_; } - else - { - return QString::null; - } + + return QString::null; } @@ -168,7 +162,7 @@ bool ContactExtension::getUseAlternativeName() const // Read the list of pictures which the contact has used -QStringList ContactExtension::getPictureList() const +const QStringList& ContactExtension::getPictureList() const { return pictureFileList_; } @@ -179,19 +173,19 @@ QStringList ContactExtension::getPictureList() const void ContactExtension::readProperties( const KConfigGroup &config ) { // Get the configuration group where this contact's data is stored - KConfigGroup extensionGroup = config.group( "Extension" ); + const KConfigGroup& extensionGroup( config.group( "Extension" ) ); // When changing any of those default values, also change the saving condition // in saveProperties() ! - alternativeName_ = extensionGroup.readEntry("alternativeName", "" ); - alternativePictureFile_= extensionGroup.readEntry("alternativePictureFile", "" ); - lastSeen_ = extensionGroup.readEntry("lastSeen", QDateTime() ); - lastMessageDate_ = extensionGroup.readEntry("lastMessageDate", QDateTime() ); - notifyOnline_ = extensionGroup.readEntry("notifyOnline", true ); - notes_ = extensionGroup.readEntry("notes", "" ); - pictureFile_ = extensionGroup.readEntry("pictureFile", "" ); - pictureFileList_ = extensionGroup.readEntry("pictureFileList", QStringList() ); - soundFile_ = extensionGroup.readEntry("soundFile", "" ); + alternativeName_ = extensionGroup.readEntry("alternativeName", "" ); + alternativePictureFile_ = extensionGroup.readEntry("alternativePictureFile", "" ); + lastSeen_ = QDateTime::fromTime_t( extensionGroup.readEntry("lastSeen", 0 ) ); + lastMessageDate_ = QDateTime::fromTime_t( extensionGroup.readEntry("lastMessageDate", 0 ) ); + notifyOnline_ = extensionGroup.readEntry("notifyOnline", true ); + notes_ = extensionGroup.readEntry("notes", "" ); + pictureFile_ = extensionGroup.readEntry("pictureFile", "" ); + pictureFileList_ = extensionGroup.readEntry("pictureFileList", QStringList() ); + soundFile_ = extensionGroup.readEntry("soundFile", "" ); // We use the accessor function here because it handles the update, if required setUseAlternativeName ( extensionGroup.readEntry("useAlternativeName", false ) ); @@ -203,7 +197,7 @@ void ContactExtension::readProperties( const KConfigGroup &config ) void ContactExtension::saveProperties( KConfigGroup &config ) { // Get the configuration group where this contact's data is stored - KConfigGroup extensionGroup = config.group( "Extension" ); + KConfigGroup extensionGroup( config.group( "Extension" ) ); // If no info have been changed, don't waste space writing it, and if it's present already, remove the group. if( ! useAlternativeName_ @@ -242,11 +236,11 @@ void ContactExtension::saveProperties( KConfigGroup &config ) setLastSeen(); } - extensionGroup.writeEntry( "lastSeen", lastSeen_ ); - extensionGroup.writeEntry( "lastMessageDate", lastMessageDate_ ); - extensionGroup.writeEntry( "pictureFile", pictureFile_ ); - extensionGroup.writeEntry( "pictureFileList", pictureFileList_ ); - extensionGroup.writeEntry( "soundFile", soundFile_ ); + extensionGroup.writeEntry( "lastSeen", lastSeen_.toTime_t() ); + extensionGroup.writeEntry( "lastMessageDate", lastMessageDate_.toTime_t() ); + extensionGroup.writeEntry( "pictureFile", pictureFile_ ); + extensionGroup.writeEntry( "pictureFileList", pictureFileList_ ); + extensionGroup.writeEntry( "soundFile", soundFile_ ); } diff --git a/src/contact/contactextension.h b/src/contact/contactextension.h index 851064d..f4aae4c 100644 --- a/src/contact/contactextension.h +++ b/src/contact/contactextension.h @@ -74,7 +74,7 @@ class ContactExtension : public QObject // Read whether to use the alias or not bool getUseAlternativeName() const; // Read the list of pictures which the contact has used - QStringList getPictureList() const; + const QStringList& getPictureList() const; // Load extension settings for a contact void readProperties( const KConfigGroup &config ); // Save extension settings for a contact diff --git a/src/contact/contactlistmodelitem.cpp b/src/contact/contactlistmodelitem.cpp deleted file mode 100644 index 5838eaf..0000000 --- a/src/contact/contactlistmodelitem.cpp +++ /dev/null @@ -1,596 +0,0 @@ -/*************************************************************************** - contactlistmodelitem.cpp - description - ------------------- - begin : Sat Feb 16 2008 - copyright : (C) 2008 by Valerio Pilo - email : valerio@kmess.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "contactlistmodelitem.h" - -#include "../network/specialgroups.h" -#include "contact.h" -#include "contactextension.h" -#include "group.h" -#include "kmessdebug.h" - - - -/** - * Root constructor - * - * Creates a root node - */ -ContactListModelItem::ContactListModelItem() - : parentNode_(0) - , object_(0) - , itemType_(ItemRoot) -{ -} - - - -/** - * Contact constructor - * - * Creates a Contact node - */ -ContactListModelItem::ContactListModelItem( Contact *contact, ContactListModelItem *parent ) - : parentNode_(parent) - , object_(contact) - , itemType_(ItemContact) -{ - // Add this node as a child of the parent - parent->appendChild( this ); -} - - - -/** - * Group constructor - * - * Creates a Group node - */ -ContactListModelItem::ContactListModelItem( Group *group, ContactListModelItem *parent ) - : parentNode_(parent) - , object_(group) - , itemType_(ItemGroup) -{ - // Add this node as a child of the parent - parent->appendChild( this ); -} - - - -/** - * Destructor - * - * Since all the items contained by the model are directly managed by ContactList, their deletion - * is performed by the Contact List itself. - */ -ContactListModelItem::~ContactListModelItem() -{ - qDeleteAll( childItems_ ); - childItems_.clear(); - - // Delete this node from the parent's children - if( parentNode_ ) - { - parentNode_->removeChild( this ); - } -} - - - -/** - * Add a new child node - * - * Insert the given item as a child of this node, but only if it doesn't already exist - * - * @param item Item to add as child item - */ -void ContactListModelItem::appendChild( ContactListModelItem *item ) -{ - // Don't add groups as children of other groups which are not the root one - if( itemType_ != ItemRoot && item->getType() == ItemGroup ) - { - kWarning() << "Cannot insert a group as child of another group!"; - return; - } - - // Don't add items which are already present - if( ! childItems_.contains( item ) ) - { - childItems_.append( item ); - } -} - - - -/** - * Return the row-th child of this item - * - * @param row Requested row - * @return Node at the requested position - */ -ContactListModelItem *ContactListModelItem::child( int row ) -{ - if( row < 0 || row >= childItems_.count() ) - { - return 0; - } - - return childItems_.at( row ); -} - - - -/** - * Return all Contact children of this node which are identified by an handle - * - * This method is made so that Contacts added in different Groups are all found (for example, - * a Contact may be in the Online group and in an user-defined group too). - * If called from the root node, also search for children contacts in all groups. - * - * @param handle Handle of the contact to find - * @return List of items for the requested handle - */ -ModelItemList ContactListModelItem::childContacts( QString handle ) -{ - ModelItemList list; - foreach( ContactListModelItem *item, childItems_ ) - { - if( item->getType() == ItemContact - && static_cast( item->object() )->getHandle() == handle ) - { - list << item; - } - else if( itemType_ == ItemRoot && item->getType() == ItemGroup ) - { - ModelItemList subItems = item->childContacts( handle ); - if( ! subItems.isEmpty() ) - { - list << subItems; - } - } - } - - return list; -} - - - -/** - * Return a child Group identified by its ID - * - * @param id Id of the requested group - * @return Node of the group - */ -ContactListModelItem *ContactListModelItem::childGroup( QString id ) -{ - foreach( ContactListModelItem *item, childItems_ ) - { - if( item->getType() == ItemGroup - && static_cast( item->object() )->getId() == id ) - { - return item; - } - } - - return 0; -} - - - -/** - * Return the number of children of this item - * - * @return int - */ -int ContactListModelItem::childCount() const -{ - return childItems_.count(); -} - - - -/** - * Return the number of data columns - * - * The first column (index 0) contains the displayed data. - * The second column contains sort indexing information. - * The third column contains a string to be used for quick comparison based by the displayed text. - * - * @return int - */ -int ContactListModelItem::columnCount() const -{ - return 3; -} - - - -/** - * Return a collection of data from this item - * - * Data on the first column is actual item object's contents; data on the second - * column is a numeric index, used to sort the list contents; data on the third - * one is a string used to quickly compare two contacts for sorting. - * - * @param column Specify the kind of item data to obtain - * @return QVariant containing int, QMap or QString for the three columns respectively. - */ -QVariant ContactListModelItem::data( int column ) const -{ - // Output the sorting information - if( column == 1 ) - { - int sortIndex; - - if( itemType_ == ItemContact ) - { - Contact *contact = static_cast( object_ ); - - // Contacts are sorted by their status - switch( contact->getStatus() ) - { - case STATUS_ONLINE: sortIndex = 1; break; - case STATUS_BE_RIGHT_BACK: sortIndex = 2; break; - case STATUS_AWAY: sortIndex = 3; break; - case STATUS_IDLE: sortIndex = 3; break; - case STATUS_OUT_TO_LUNCH: sortIndex = 4; break; - case STATUS_ON_THE_PHONE: sortIndex = 5; break; - case STATUS_BUSY: sortIndex = 6; break; - - case STATUS_INVISIBLE: - case STATUS_OFFLINE: - default: sortIndex = 8; break; - } - - // Add to the index the first character of the friendly name, so that - // when two contacts have the same status, there's a (rough but fast) - // sorting method - QString sortChar( contact->getFriendlyName().mid( 0, 1 ) ); - if( ! sortChar.isEmpty() ) - { - sortIndex += sortChar.at( 0 ).toUpper().toAscii(); - } - } - else if( itemType_ == ItemGroup ) - { - Group *group = static_cast( object_ ); - QString groupId = group->getId(); - - // These numbers are set so that the groups always come after the contacts in the root group - - // Non-special groups must be the first - if( ! group->isSpecialGroup() ) - { - sortIndex = 1000 + group->getSortPosition(); - } - // The Online group must come right after them - else if( groupId == SpecialGroups::ONLINE ) - { - sortIndex = 32763; - } - // The Offline group must follow Online - else if( groupId == SpecialGroups::OFFLINE ) - { - sortIndex = 32764; - } - // Then the remaining special groups, Allowed - else if( groupId == SpecialGroups::ALLOWED ) - { - sortIndex = 32765; - } - // And Removed - else - { - sortIndex = 32766; - } - } - - return sortIndex; - } - - // Return a string for full contact list search - if( column == 2 ) - { - if( itemType_ == ItemContact ) - { - Contact *contact = static_cast( object_ ); - - // Enable searching by email, friendly name and personal message - QString searchBy( contact->getHandle() + " " + - contact->getFriendlyName() + " " + - contact->getPersonalMessage() ); - - // Enable searching by email, true friendly name, and alias - if( contact->getExtension() && contact->getExtension()->getUseAlternativeName() ) - { - return searchBy + " " + contact->getTrueFriendlyName(); - } - - return searchBy; - } - else if( itemType_ == ItemGroup ) - { - Group *group = static_cast( object_ ); - - return group->getName(); - } - } - - // Column 1 and 2 are done, and we have 3 columns only - if( column != 0 ) - { - kWarning() << "Invalid column number" << column << "given!"; - return QVariant(); - } - - ModelDataList itemData; - - // Fill the returned data map with a selection of useful contact information - if( itemType_ == ItemContact ) - { - Contact *contact = static_cast( object_ ); - - itemData[ "type" ] = ItemContact; - itemData[ "handle" ] = contact->getHandle(); - itemData[ "friendly" ] = contact->getFriendlyName( STRING_CLEANED ); - itemData[ "friendlyFormatted" ] = contact->getFriendlyName( STRING_FORMATTED ); - itemData[ "trueFriendly" ] = contact->getTrueFriendlyName( STRING_CLEANED ); - itemData[ "trueFriendlyFormatted" ] = contact->getTrueFriendlyName( STRING_FORMATTED ); - itemData[ "personalMessage" ] = contact->getPersonalMessage( STRING_CLEANED ); - itemData[ "personalMessageFormatted" ] = contact->getPersonalMessage( STRING_FORMATTED ); - itemData[ "displayPicture" ] = contact->getContactPicturePath(); - itemData[ "groups" ] = contact->getGroupIds(); - itemData[ "mediaType" ] = contact->getCurrentMediaType(); - itemData[ "mediaString" ] = contact->getCurrentMediaString(); - itemData[ "status" ] = (int) contact->getStatus(); - itemData[ "isBlocked" ] = contact->isBlocked(); - itemData[ "isReverse" ] = contact->isReverse(); - itemData[ "clientName" ] = contact->getClientAppName(); - itemData[ "lastSeen" ] = contact->getExtension()->getLastSeen(); - itemData[ "lastMessage" ] = contact->getExtension()->getLastMessageDate(); - - if( parentNode_->object() ) - { - Group *group = static_cast( parentNode_->object() ); - itemData[ "group" ] = group->getId(); - itemData[ "isInSpecialGroup" ] = group->isSpecialGroup(); - } - else - { - itemData[ "group" ] = QString(); - itemData[ "isInSpecialGroup" ] = false; - } - } - else if( itemType_ == ItemGroup ) - { - // Get the item's group to retrieve its data - Group *group = static_cast( object_ ); - - // Find out how many of the group's contacts are online - uint numOnlineContacts = 0; - foreach( ContactListModelItem *item, childItems_ ) - { - if( item->getType() != ItemContact ) - { - continue; - } - - Contact *contact = static_cast( item->object() ); - - if( contact && contact->isOnline() ) - { - numOnlineContacts++; - } - } - - itemData[ "type" ] = ItemGroup; - itemData[ "id" ] = group->getId(); - itemData[ "name" ] = group->getName(); - itemData[ "onlineContacts" ] = QString::number( numOnlineContacts ); - itemData[ "totalContacts" ] = QString::number( childCount() ); - itemData[ "isExpanded" ] = group->isExpanded(); - itemData[ "isSpecialGroup" ] = group->isSpecialGroup(); - } - else - { - itemData[ "type" ] = ItemRoot; - } - - return itemData; -} - - - -/** - * Return the type of the internal stored object - * - * @return ItemType - */ -ContactListModelItem::ItemType ContactListModelItem::getType() const -{ - return itemType_; -} - - - -/** - * Move a child item up or down the internal list - * - * @param movement Use a negative number to move it up one position, a positive one to - * move it down. Zero is positive. - * @param item The item to move - */ -void ContactListModelItem::moveChild( int movement, ContactListModelItem *item ) -{ - if( ! item || childItems_.indexOf( item ) < 0 ) - { - return; - } - - int row = childItems_.indexOf( item ); - movement = (movement >= 0) ? (row + 1) : (row - 1); - - // Verify if the destination row is within the list's dimensions - if( movement > childItems_.count() || movement < 0 ) - { - return; - } - - childItems_.move( row, movement ); -} - - - -/** - * Return the stored object - * - * The object should be casted accordingly to the result of a getType() call. - * - * @return void* - */ -void *ContactListModelItem::object() const -{ - return object_; -} - - - -/** - * Get the parent node of this item - * - * @return Parent node - */ -ContactListModelItem *ContactListModelItem::parent() const -{ - return parentNode_; -} - - - -/** - * Remove a child item - * - * The child's object itself is not deleted, but is removed from the parent node only. - * You have to manually call delete on it after removal. - * - * @param child The item to delete - */ -void ContactListModelItem::removeChild( ContactListModelItem *child ) -{ - if( ! childItems_.contains( child ) ) - return; - - childItems_.removeAll( child ); -} - - - -/** - * Get this item's position within the parent node - * - * @return int - */ -int ContactListModelItem::row() const -{ - if( parentNode_ && ! parentNode_->childItems_.isEmpty() ) - { - return parentNode_->childItems_.indexOf( const_cast( this ) ); - } - - return 0; -} - - - -/** - * Set another node to be the parent of this item - * - * This method can be used to move items between nodes - * - * @param newParent The node where this item will be moved to - */ -void ContactListModelItem::setParent( ContactListModelItem *newParent ) -{ - if( ! parentNode_ || ! newParent ) - { - return; - } - - parentNode_->removeChild( this ); - newParent->appendChild( this ); - - parentNode_ = newParent; -} - - - -/** - * Custom operator to display nodes and items in the debug output - * - * @param out Output debugging stream - * @param item Item to print - * @return QDebug The debug stream itself - */ -QDebug operator<<( QDebug out, const ContactListModelItem *item ) -{ - QString type; - Contact *contact; - Group *group; - - switch( item->getType() ) - { - case ContactListModelItem::ItemRoot: - type = "Root Node"; - break; - - case ContactListModelItem::ItemGroup: - group = static_cast( item->object() ); - type = "Group Node, id " + group->getId(); - break; - - case ContactListModelItem::ItemContact: - contact = static_cast( item->object() ); - - type = "Contact Node, handle " + contact->getHandle(); - - if( item->parent()->getType() == ContactListModelItem::ItemRoot ) - { - type += " in root node"; - } - // Only the root node should have no parent, this is symptom of an error - else if( ! item->parent() ) - { - type += " without parent (!)"; - } - else - { - group = static_cast( item->parent()->object() ); - type += " in node " + group->getId(); - } - break; - - default: - type = "Unknown node type"; - break; - } - - out << type << "(at address" << QString::number( (qlonglong)item, 16 ) << ")"; - - return out; -} - - diff --git a/src/contact/group.cpp b/src/contact/group.cpp index f2e85c0..d8e26bc 100644 --- a/src/contact/group.cpp +++ b/src/contact/group.cpp @@ -17,15 +17,15 @@ #include "group.h" -#include "../network/specialgroups.h" +#include "../utils/kmessconfig.h" #include "../currentaccount.h" #include "../kmessdebug.h" -#include "../utils/kmessconfig.h" +#include "specialgroups.h" // The constructor -Group::Group(QString id, QString name) +Group::Group(const QString &id, const QString &name) : id_(id), isExpanded_(true), name_(name), @@ -95,12 +95,8 @@ bool Group::isSpecialGroup() const // Read in group properties void Group::readProperties( const KConfigGroup &config ) { -#ifdef KMESSDEBUG_GROUP - kDebug() << "Loading properties for group" << name_; -#endif - // Get the configuration group where this group's data is stored - KConfigGroup groupConfig = config.group( id_ ); + const KConfigGroup& groupConfig( config.group( id_ ) ); // Obtain the sort positiong of this group. Special groups have no sorting. if( ! isSpecialGroup() ) @@ -121,12 +117,8 @@ void Group::readProperties( const KConfigGroup &config ) // Save group properties void Group::saveProperties( KConfigGroup &config ) { -#ifdef KMESSDEBUG_GROUP - kDebug() << "Saving properties for group" << name_; -#endif - // Get the configuration group where this group's data is stored - KConfigGroup groupConfig = config.group( id_ ); + KConfigGroup groupConfig( config.group( id_ ) ); // Save the sort positiong of this group. Special groups have no sorting. if( ! isSpecialGroup() ) @@ -140,14 +132,14 @@ void Group::saveProperties( KConfigGroup &config ) // Change the group name -void Group::setName(const QString& newName) +void Group::setName( const QString &newName ) { #ifdef KMESSTEST KMESS_ASSERT( newName != "" ); KMESS_ASSERT( ( id_ != SpecialGroups::ONLINE ) && ( id_ != SpecialGroups::OFFLINE ) && ( id_ != SpecialGroups::ALLOWED ) && ( id_ != SpecialGroups::REMOVED ) ); #endif - if ( ( name_ != newName ) && ( newName != "" ) ) + if ( ( name_ != newName ) && ( ! newName.isEmpty() ) ) { name_ = newName; } @@ -156,13 +148,14 @@ void Group::setName(const QString& newName) // Change the sort position -void Group::setSortPosition(int sortPosition) +void Group::setSortPosition( int sortPosition ) { #ifdef KMESSDEBUG_GROUP kDebug() << "Group " << name_ << " new sort position = " << sortPosition; #endif - sortPosition_ = sortPosition; - emit changedPosition( this, sortPosition_ ); + + sortPosition_ = sortPosition; + emit changedPosition( this, sortPosition_ ); } diff --git a/src/contact/group.h b/src/contact/group.h index 0873c14..0b53a17 100644 --- a/src/contact/group.h +++ b/src/contact/group.h @@ -40,7 +40,7 @@ class Group : public QObject public: // Public methods // The constructor - Group(QString id, QString name); + Group( const QString &id, const QString &name ); // The destructor virtual ~Group(); // Return the group ID @@ -58,11 +58,11 @@ class Group : public QObject // Save group properties void saveProperties( KConfigGroup &config ); // Change the group name - void setName(const QString& newName); + void setName( const QString& newName ); // Change the sort position - void setSortPosition(int sortPosition); + void setSortPosition( int sortPosition ); // Change the expanded state - void setExpanded(bool expanded); + void setExpanded( bool expanded ); private: // Private attributes // The group id diff --git a/src/contact/invitedcontact.cpp b/src/contact/invitedcontact.cpp index 7a0d8b3..ebbeff0 100644 --- a/src/contact/invitedcontact.cpp +++ b/src/contact/invitedcontact.cpp @@ -22,7 +22,7 @@ // The constructor -InvitedContact::InvitedContact(QString handle, QString friendlyName, uint capabilities) +InvitedContact::InvitedContact( const QString &handle, const QString &friendlyName, uint capabilities) : ContactBase(handle, friendlyName, capabilities) { detectClientAppName( capabilities, 0 ); @@ -50,8 +50,8 @@ QString InvitedContact::getContactPicturePath() const // Return the contact's status Status InvitedContact::getStatus() const { - // Since no status updates are returned for a contact not on the list, return "Online". - return STATUS_ONLINE; + // Since no status updates are returned for a contact not on the list, return "Invisible". + return STATUS_INVISIBLE; } diff --git a/src/contact/invitedcontact.h b/src/contact/invitedcontact.h index 3b8835e..c3ae894 100644 --- a/src/contact/invitedcontact.h +++ b/src/contact/invitedcontact.h @@ -38,7 +38,7 @@ class InvitedContact : public ContactBase public: // The constructor - InvitedContact(QString handle, QString friendlyName, uint capabilities = 0); + InvitedContact( const QString &handle, const QString &friendlyName = QString(), uint capabilities = 0 ); // The destructor virtual ~InvitedContact(); // Return the path to the contact's picture diff --git a/src/contact/msnobject.cpp b/src/contact/msnobject.cpp index bb5fa39..c709662 100644 --- a/src/contact/msnobject.cpp +++ b/src/contact/msnobject.cpp @@ -33,6 +33,7 @@ MsnObject::MsnObject() } + MsnObject::MsnObject(const QString &object) : original_(object) { @@ -46,6 +47,7 @@ MsnObject::MsnObject(const QString &object) } + // Copy constructor MsnObject::MsnObject(const MsnObject &other) : creator_(other.creator_) @@ -61,13 +63,15 @@ MsnObject::MsnObject(const MsnObject &other) } -MsnObject::MsnObject(const QString &creator, const QString &location, - const QString &friendly, MsnObjectType type, - const QByteArray &fileData) + +MsnObject::MsnObject( const QString &creator, const QString &location, + const QString &friendly, MsnObjectType type, + const QByteArray &fileData, const QByteArray &stamp ) : creator_(creator) , friendly_(friendly) , location_(location) , type_(type) +, stamp_(stamp) { size_ = fileData.size(); @@ -78,8 +82,6 @@ MsnObject::MsnObject(const QString &creator, const QString &location, - - // The destructor MsnObject::~MsnObject() { @@ -104,6 +106,7 @@ QString MsnObject::getAttribute( const QString& name, const QString& object ) } + // Get the sha1c hash const QString MsnObject::getContentHash() const { @@ -111,6 +114,7 @@ const QString MsnObject::getContentHash() const } + // Get the object's creator const QString& MsnObject::getCreator() const { @@ -118,6 +122,7 @@ const QString& MsnObject::getCreator() const } + // Get the sha1d hash const QString MsnObject::getDataHash() const { @@ -132,6 +137,7 @@ const QString& MsnObject::getLocation() const } + const QString& MsnObject::getFriendly() const { // This is actually base-64 encoded. We must decode it before @@ -140,6 +146,7 @@ const QString& MsnObject::getFriendly() const } + // Get the object's size int MsnObject::getSize() const { @@ -167,7 +174,7 @@ void MsnObject::loadObject( const QString& object ) sha1c_ = getAttribute("SHA1C", object).toUtf8(); // Get the friendly name from the object - QString friendlyEncoded = getAttribute( "Friendly", object ); + const QString& friendlyEncoded( getAttribute( "Friendly", object ) ); // The string is empty, store an empty friendly if( friendlyEncoded.isEmpty() ) @@ -177,11 +184,12 @@ void MsnObject::loadObject( const QString& object ) } // Don't check for invalid characters in the encoded string, QByteArray does it - QByteArray friendlyUcs2 = QByteArray::fromBase64( friendlyEncoded.toUtf8() ); - friendly_ = QString::fromUtf16( reinterpret_cast( friendlyUcs2.data() ), friendlyUcs2.size() ); + const QByteArray friendlyUcs2( QByteArray::fromBase64( friendlyEncoded.toUtf8() ) ); + friendly_ = QString::fromUtf16( reinterpret_cast( friendlyUcs2.data() ), friendlyUcs2.size() ).toUtf8(); } + bool MsnObject::verifyObjectHash() const { // And yes, QByteArray overloads operator== @@ -189,6 +197,7 @@ bool MsnObject::verifyObjectHash() const } + bool MsnObject::verifyFile( const QString &fileName ) const { QFile file( fileName ); @@ -198,13 +207,14 @@ bool MsnObject::verifyFile( const QString &fileName ) const return false; } - QByteArray fileData = file.readAll(); + const QByteArray& fileData( file.readAll() ); file.close(); return generateDataHash( fileData ) == sha1d_; } + const QByteArray MsnObject::generateDataHash( const QByteArray &fileData ) const { // Thanks Qt 4.3... :-) @@ -212,21 +222,24 @@ const QByteArray MsnObject::generateDataHash( const QByteArray &fileData ) const } + const QByteArray MsnObject::generateObjectHash() const { // Generate input - QByteArray baseString = "Creator" + creator_.toUtf8() + - "Size" + QByteArray::number( size_ ) + - "Type" + QByteArray::number( type_ ) + - "Location" + location_.toUtf8() + - "Friendly" + friendly_.toUtf8() + - "SHA1D" + sha1d_; + // Note the stamp must be excluded from the compute of hash + const QByteArray baseString( "Creator" + creator_.toUtf8() + + "Size" + QByteArray::number( size_ ) + + "Type" + QByteArray::number( type_ ) + + "Location" + location_.toUtf8() + + "Friendly" + friendly_.toUtf8() + + "SHA1D" + sha1d_ ); // Hash as sha1, and encode with base64 return QCryptographicHash::hash( baseString, QCryptographicHash::Sha1 ).toBase64(); } + const QString MsnObject::objectString() const { if( ! original_.isEmpty() ) @@ -243,30 +256,28 @@ const QString MsnObject::objectString() const else { // Copy existing UTF16 string to an QByteArray - // TODO: Use QByteArray::toBase64() ? - const char *ucs2Data = reinterpret_cast( friendly_.utf16() ); // remains valid until string is modified. - int size = friendly_.length() * 2; - QByteArray friendlyUcs2 = QByteArray::fromRawData( ucs2Data, size ); // only wraps the pointer. - - // Add null-padding, makes a deep copy. - friendlyUcs2.resize( size + 4 ); - friendlyUcs2[size + 0] = '\0'; - friendlyUcs2[size + 1] = '\0'; - friendlyUcs2[size + 2] = '\0'; - friendlyUcs2[size + 3] = '\0'; - - // To base64 encoding. - friendlyBase64 = QByteArray::fromBase64( friendlyUcs2 ); + // remains valid until string is modified. + const char *ucs2Data = reinterpret_cast( friendly_.utf16() ); + friendlyBase64 = QByteArray( ucs2Data ).toBase64(); } // Create msn object string. - return ""; + QString msnObjectString( ""; } @@ -279,7 +290,7 @@ bool MsnObject::hasChanged( const QString &newObj ) const return true; } - QString objSha1d = getAttribute( "SHA1D", newObj ); + const QString& objSha1d( getAttribute( "SHA1D", newObj ) ); // The data hash is more important than the full object hash, if it's present, use it if( ! sha1d_.isEmpty() && ! objSha1d.isEmpty() ) diff --git a/src/contact/msnobject.h b/src/contact/msnobject.h index eb901e8..969e573 100644 --- a/src/contact/msnobject.h +++ b/src/contact/msnobject.h @@ -18,7 +18,6 @@ #ifndef MSNOBJECT_H #define MSNOBJECT_H -#include #include @@ -82,8 +81,8 @@ class MsnObject * used to calculate the data hash and file size. */ MsnObject(const QString &creator, const QString &location, - const QString &friendly, MsnObjectType type, - const QByteArray &fileData); + const QString &friendly, MsnObjectType type, + const QByteArray &fileData, const QByteArray &stamp = QByteArray() ); // The destructor ~MsnObject(); @@ -133,12 +132,11 @@ class MsnObject */ bool hasChanged(const QString &newObj) const; - - - private: // private methods /// Parse an attribute from the object string static QString getAttribute( const QString& attribute, const QString& object ); + + private: // private methods /// Generate the base64-encoded sha1 hash for the file data const QByteArray generateDataHash( const QByteArray &fileData ) const; /// Generate the base64-encoded sha1 hash for this object @@ -164,6 +162,8 @@ class MsnObject QByteArray sha1d_; // The base64-encoded SHA1 hash of the MsnObject string itself QByteArray sha1c_; + // The base-64 encoded certificate useful for winks + QByteArray stamp_; }; diff --git a/src/contact/msnstatus.cpp b/src/contact/msnstatus.cpp index 91f490a..1adce3d 100644 --- a/src/contact/msnstatus.cpp +++ b/src/contact/msnstatus.cpp @@ -19,9 +19,15 @@ #include "../kmessdebug.h" +#include #include #include #include +#include + + +// Initialize the status menu +KMenu* MsnStatus::statusMenu_( 0 ); @@ -36,8 +42,7 @@ */ QPixmap MsnStatus::getIcon( const Status status, const Flags flags ) { - // most status' are based on this icon - QString iconBase = "user-online"; + QString iconBase; // initially set the overlay icon to an empty string as we do not know // at this point if we want one. QString iconOverlay; @@ -45,21 +50,30 @@ QPixmap MsnStatus::getIcon( const Status status, const Flags flags ) // Set the base icon depending on the status switch( status ) { - case STATUS_ONLINE: /* Just use the online icon above*/ break; - case STATUS_AWAY: iconBase = "user-away"; break; - case STATUS_BE_RIGHT_BACK: iconBase = "user-away-extended"; break; - case STATUS_BUSY: iconBase = "user-busy"; break; - case STATUS_INVISIBLE: iconBase = "user-invisible"; break; - case STATUS_IDLE: iconBase = "user-away"; break; - case STATUS_OFFLINE: iconBase = "user-offline"; break; + case STATUS_ONLINE: iconBase = "user-online"; break; + case STATUS_BUSY: iconBase = "user-busy"; break; + case STATUS_AWAY: iconBase = "user-away"; break; + case STATUS_IDLE: iconBase = "user-away-extended"; break; + case STATUS_INVISIBLE: iconBase = "user-invisible"; break; + case STATUS_OFFLINE: iconBase = "user-offline"; break; + + case STATUS_BE_RIGHT_BACK: + iconBase = "user-away"; + iconOverlay = "contact_away_overlay"; + break; + + case STATUS_AWAY_AUTOREPLY: + iconBase = "user-away"; + iconOverlay = "contact_invisible_overlay"; + break; case STATUS_ON_THE_PHONE: - iconBase = "user-away"; + iconBase = "user-away-extended"; iconOverlay = "contact_phone_overlay"; break; case STATUS_OUT_TO_LUNCH: - iconBase = "user-away"; + iconBase = "user-away-extended"; iconOverlay = "contact_food_overlay"; break; @@ -86,7 +100,7 @@ QPixmap MsnStatus::getIcon( const Status status, const Flags flags ) if( ! iconOverlay.isEmpty() ) { // Add the overlay image to our icon - QPixmap overlayIcon = KIconLoader::global()->loadIcon( iconOverlay, KIconLoader::User ); + QPixmap overlayIcon = KIconLoader::global()->loadIcon( iconOverlay, KIconLoader::Small ); QImage iconImage = icon.toImage(); QImage overlayImage = overlayIcon.toImage(); @@ -110,15 +124,16 @@ QString MsnStatus::getCode( const Status status ) // Just return the code switch( status ) { - case STATUS_ONLINE: return QString( "NLN" ); - case STATUS_AWAY: return QString( "AWY" ); - case STATUS_BE_RIGHT_BACK: return QString( "BRB" ); - case STATUS_BUSY: return QString( "BSY" ); - case STATUS_INVISIBLE: return QString( "HDN" ); - case STATUS_IDLE: return QString( "IDL" ); - case STATUS_OFFLINE: return QString( "FLN" ); - case STATUS_ON_THE_PHONE: return QString( "PHN" ); - case STATUS_OUT_TO_LUNCH: return QString( "LUN" ); + case STATUS_ONLINE: return QString( "NLN" ); + case STATUS_AWAY: return QString( "AWY" ); + case STATUS_AWAY_AUTOREPLY: return QString( "AWY" ); + case STATUS_BE_RIGHT_BACK: return QString( "BRB" ); + case STATUS_BUSY: return QString( "BSY" ); + case STATUS_INVISIBLE: return QString( "HDN" ); + case STATUS_IDLE: return QString( "IDL" ); + case STATUS_OFFLINE: return QString( "FLN" ); + case STATUS_ON_THE_PHONE: return QString( "PHN" ); + case STATUS_OUT_TO_LUNCH: return QString( "LUN" ); default: kWarning() << "Invalid status" << status << "!"; return QString( "NLN" ); @@ -138,23 +153,76 @@ QString MsnStatus::getName( const Status status ) // Localize and return the status name switch( status ) { - case STATUS_ONLINE: return i18n( "Online" ); - case STATUS_AWAY: return i18n( "Away" ); - case STATUS_BE_RIGHT_BACK: return i18n( "Be Right Back" ); - case STATUS_BUSY: return i18n( "Busy" ); - case STATUS_INVISIBLE: return i18n( "Invisible" ); - case STATUS_IDLE: return i18n( "Idle" ); - case STATUS_OFFLINE: return i18n( "Offline" ); - case STATUS_ON_THE_PHONE: return i18n( "On the Phone" ); - case STATUS_OUT_TO_LUNCH: return i18n( "Out to Lunch" ); + case STATUS_ONLINE: return i18n( "Online" ); + case STATUS_BUSY: return i18n( "Busy" ); + case STATUS_AWAY: return i18n( "Away" ); + case STATUS_AWAY_AUTOREPLY: return i18n( "Away with Auto-Reply" ); + case STATUS_IDLE: return i18n( "Idle" ); + case STATUS_BE_RIGHT_BACK: return i18n( "Be Right Back" ); + case STATUS_ON_THE_PHONE: return i18n( "On the Phone" ); + case STATUS_OUT_TO_LUNCH: return i18n( "Out to Lunch" ); + case STATUS_INVISIBLE: return i18n( "Invisible" ); + case STATUS_OFFLINE: return i18n( "Offline" ); + default: kWarning() << "Invalid status" << status << "!"; - return i18n( "Online" ); + return i18n( "Online" ); } } +/** + * Create and return a menu with all the states + * + * It also has a Disconnect option (instead of Offline) + * Be sure to actually attach the returned menu to some toolbar or the like, + * or it won't be properly deleted. + * + * @return KMenu with a QAction for each available Status + */ +KMenu *MsnStatus::getStatusMenu() +{ + if( statusMenu_ != 0 ) + { + return statusMenu_; + } + + statusMenu_ = new KMenu(); + statusMenu_->addTitle( KIcon( "go-jump" ), i18n( "&My Status" ) ); + statusMenu_->setIcon( KIcon( "go-jump" ) ); + statusMenu_->setTitle( i18n( "&My Status" ) ); + Status status; + KAction *action; + + // This loop assumes that a) STATES_NUMBER is the last item of the Status enum, and + // b) STATUS_OFFLINE is the second last. Fun stuff happens if it is not the case. + for( int index = 0; index < STATES_NUMBER; ++index ) + { + // Setting the action's data allows us to later retrieve the + // Status from a triggered QAction + status = (Status) index; + action = new KAction( KIcon( getIcon( status ) ), getName( status ), statusMenu_ ); + action->setData( status ); + + // The disconnection action is a bit special :) + if( status == STATUS_OFFLINE ) + { + // Divide the normal states from the disconnection action + statusMenu_->addSeparator(); + + // Change its name: "Offline" is misleading. + action->setText( i18nc( "Menu action name", "Disconnect" ) ); + } + + statusMenu_->addAction( action ); + } + + return statusMenu_; +} + + + /** * Convert a three-letter code to a status * diff --git a/src/contact/msnstatus.h b/src/contact/msnstatus.h index f57da45..b9dafe0 100644 --- a/src/contact/msnstatus.h +++ b/src/contact/msnstatus.h @@ -21,6 +21,10 @@ #include +// Forward declarations +class KMenu; + + /** * Available MSN states @@ -28,15 +32,17 @@ */ enum Status { - STATUS_ONLINE = 0 - , STATUS_AWAY - , STATUS_BE_RIGHT_BACK - , STATUS_BUSY - , STATUS_INVISIBLE - , STATUS_IDLE - , STATUS_OFFLINE - , STATUS_ON_THE_PHONE - , STATUS_OUT_TO_LUNCH + STATUS_ONLINE = 0 /// User is online + , STATUS_BUSY /// User is busy + , STATUS_AWAY /// User is away from the keyboard + , STATUS_AWAY_AUTOREPLY /// User is away with an automated answer + , STATUS_IDLE /// User is idle + , STATUS_BE_RIGHT_BACK /// User is away for a bit + , STATUS_ON_THE_PHONE /// User is on the phone + , STATUS_OUT_TO_LUNCH /// User is eating + , STATUS_INVISIBLE /// User is not visible to others + , STATUS_OFFLINE /// User is not connected (keep this as the second last item of the enum) + , STATES_NUMBER /// Internal: do not use (keep this as the last item of the enum) }; @@ -79,10 +85,16 @@ class MsnStatus static QString getCode( const Status status ); // Returns the localized name for a status static QString getName( const Status status ); - // Returns the localized name for a status - static QString getStatus( const Status status ); + // Create and return a menu with all the states + static KMenu *getStatusMenu(); // Convert a three-letter code to a status static Status codeToStatus( const QString &status ); + + + private: // Private static properties + + // The status menu + static KMenu *statusMenu_; }; diff --git a/src/network/specialgroups.h b/src/contact/specialgroups.h similarity index 95% rename from src/network/specialgroups.h rename to src/contact/specialgroups.h index 51657c8..9ded76d 100644 --- a/src/network/specialgroups.h +++ b/src/contact/specialgroups.h @@ -18,14 +18,13 @@ #ifndef SPECIALGROUPS_H #define SPECIALGROUPS_H - #include /** - * Define the special groups here - * @ingroup NetworkCore + * Defines for the special groups + * @ingroup Contact */ namespace SpecialGroups { diff --git a/src/contactlistmodelfilter.cpp b/src/contactlistmodelfilter.cpp deleted file mode 100644 index 0c060d6..0000000 --- a/src/contactlistmodelfilter.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/*************************************************************************** - contactlistmodelfilter.cpp - description - ------------------- - begin : Thu Jul 10 2008 - copyright : (C) 2008 by Valerio Pilo - email : valerio@kmess.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "contactlistmodelfilter.h" - -#include "contact/contactlistmodelitem.h" -#include "network/specialgroups.h" -#include "currentaccount.h" -#include "kmessdebug.h" - - - -// The constructor -ContactListModelFilter::ContactListModelFilter( QObject *parent ) -: QSortFilterProxyModel( parent ) -, showAllowed_ ( true ) -, showEmpty_ ( false ) -, showGroupsMode_( Account::VIEW_MIXED ) -, showOffline_ ( true ) -, showRemoved_ ( true ) -{ - // Set filtering options - setDynamicSortFilter( true ); - setFilterKeyColumn( 2 ); - setFilterRole( Qt::DisplayRole ); - setFilterCaseSensitivity( Qt::CaseInsensitive ); - setSortRole( Qt::UserRole ); - setSortCaseSensitivity( Qt::CaseInsensitive ); - - // Update the account-dependant options and re-sort the list - updateOptions(); - - // Now that we have a ref to the current account, connect the signals we need - connect( currentAccount_, SIGNAL( changedDisplaySettings() ), - this, SLOT ( updateOptions() ) ); - connect( currentAccount_, SIGNAL( changedViewMode() ), - this, SLOT ( updateOptions() ) ); -} - - - -/** - * Dumps the contact list contents to the debug output - * - * This method is temporary and for debugging purposes exclusively. - * This method is recursive. Do not call with any arguments, they are for internal use only. - * - * @param start Item in the model where to start from - * @param depth Current search depth - */ -void ContactListModelFilter::dump( QModelIndex start, int depth ) const -{ -#ifdef KMESSDEBUG_CONTACTLISTMODEL - bool started = false; - - if( ! start.isValid() ) - { - start = QModelIndex(); - kDebug() << "Contact List Filter model stats"; - kDebug() << "--------------------------------------"; - kDebug() << "Columns:" << columnCount(); - kDebug() << "Rows:" << rowCount(); - kDebug(); - kDebug() << "Contact List Filter model dump"; - kDebug() << "--------------------------------------"; - kDebug() << "Root @" << start; - started = true; - } - - QString spacer = QString().fill( '-', 2 * depth ) + ">"; - - // Print the current node's contents, and manage children recursively - for( int i = 0; i < rowCount( start ); i++ ) - { - QModelIndex itemIndex( index( i, 0, start ) ); - ModelDataList itemData( itemIndex.data().toMap() ); - - switch( itemData["type"].toInt() ) - { - case ContactListModelItem::ItemContact: - kDebug() << spacer << (i+1) << ") Contact:" - << itemData["handle"].toString() - << "@" << itemIndex; - break; - - case ContactListModelItem::ItemGroup: - kDebug() << spacer << (i+1) << ") Group:" - << itemData["id"].toString() - << "@" << itemIndex; - dump( itemIndex, depth + 1 ); - break; - - default: - kDebug() << spacer << "Unknown type of item: " + itemData["type"].toInt() << "@" << itemIndex; - break; - } - } - - if( started ) - { - kDebug() << "--------------------------------------"; - } -#else - Q_UNUSED( start ); - Q_UNUSED( depth ); -#endif -} - - - -/** - * @brief Determine if a row is visible or not - * - * Uses the internal data from the given index to determine if, according to the current - * account options, a row should be hid or shown. - * - * @param sourceRow Where the item to check is located inside the sourceParent index - * @param sourceParent The index containing the item to check - */ -bool ContactListModelFilter::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const -{ - bool isVisible = true; - - // Retrieve the item data from the source model - QModelIndex index( sourceModel()->index( sourceRow, 0, sourceParent ) ); - QMap itemData( index.data().toMap() ); - - if( itemData.isEmpty() ) - { -#ifdef KMESSDEBUG_CONTACTLISTMODEL - kDebug() << "Item" << index << "does not contain any data!"; -#endif - return true; - } - - switch( itemData[ "type" ].toInt() ) - { - case ContactListModelItem::ItemContact: - - // Contacts in special groups are always visible. Their group may be not, though - if( ! itemData[ "isInSpecialGroup" ].toBool() ) - { - // Hide contacts without group when showing by online/offline - if( showGroupsMode_ == Account::VIEW_BYSTATUS ) - { - isVisible = false; - } - else if( showGroupsMode_ == Account::VIEW_BYGROUP ) - { - isVisible = ( showOffline_ || ( (Status) itemData[ "status" ].toInt() ) != STATUS_OFFLINE ); - } - else - { - isVisible = ( ( (Status) itemData[ "status" ].toInt() ) != STATUS_OFFLINE ); - } - } - - // Handle contact searches: the view sets the filter expression, and we use it here - if( ! filterRegExp().isEmpty() ) - { - isVisible = ( isVisible && QSortFilterProxyModel::filterAcceptsRow( sourceRow, sourceParent ) ); - } - -#ifdef KMESSDEBUG_CONTACTLISTMODEL - kDebug() << "Visibility check: contact" << itemData[ "handle" ].toString() << "is" - << ( isVisible ? "visible" : "hidden" ); -#endif - break; - - case ContactListModelItem::ItemGroup: - - if( itemData[ "id" ] == SpecialGroups::ALLOWED ) - { - isVisible = ( showAllowed_ ); - } - else if( itemData[ "id" ] == SpecialGroups::REMOVED ) - { - isVisible = ( showRemoved_ ); - } - else if( itemData[ "id" ] == SpecialGroups::ONLINE ) - { - isVisible = ( showGroupsMode_ == Account::VIEW_BYSTATUS ); - } - else if( itemData[ "id" ] == SpecialGroups::OFFLINE ) - { - isVisible = ( showOffline_ && - ( showGroupsMode_ == Account::VIEW_BYSTATUS || showGroupsMode_ == Account::VIEW_MIXED ) ); - - // Also enable the Offline group when the offline contacts within groups are not visible - if( ! isVisible && showGroupsMode_ == Account::VIEW_MIXED && ! filterRegExp().isEmpty() ) - { - isVisible = true; - } - } - else if( showGroupsMode_ == Account::VIEW_BYSTATUS ) - { - isVisible = false; - } - else if( ! showEmpty_ ) - { - if( showOffline_ && showGroupsMode_ != Account::VIEW_MIXED ) - { - isVisible = ( itemData[ "totalContacts" ].toInt() > 0 ); - } - else - { - isVisible = ( itemData[ "onlineContacts" ].toInt() > 0 ); - } - } - -#ifdef KMESSDEBUG_CONTACTLISTMODEL - kDebug() << "Visibility check: group" << itemData[ "name" ].toString() << "is" - << ( isVisible ? "visible" : "hidden" ); -#endif - break; - - default: - kWarning() << "Unknown item:" << itemData; - break; - - } - - return isVisible; -} - - - -/** - * @brief Set the original model which will be filtered - * - * Connects the source model to the method which sorts the list when something in the source model is changed, - * then works as a normal setSourceModel(). - * - * @param sourceModel The model to filter - */ -void ContactListModelFilter::setSourceModel( QAbstractItemModel *newSourceModel ) -{ - // Disconnect from the first model (if any), and connect to the new one - if( sourceModel() ) - { - disconnect( sourceModel(), 0, this, 0 ); - } - - connect( newSourceModel, SIGNAL( dataChanged(const QModelIndex&,const QModelIndex&) ), - this, SLOT ( updateOptions() ) ); - - QSortFilterProxyModel::setSourceModel( newSourceModel ); -} - - - -/** - * @brief Update the internal filter/sort options - * - * Updates the internal preferences to reflect the current account's - */ -void ContactListModelFilter::updateOptions() -{ -#ifdef KMESSDEBUG_CONTACTLISTMODEL - kDebug() << "Updating account options from" << sender() << "( this:" << this << ", source model:" << sourceModel() << ")"; -#endif - - // Read the settings - currentAccount_ = CurrentAccount::instance(); - showAllowed_ = currentAccount_->getShowAllowedContacts(); - showRemoved_ = currentAccount_->getShowRemovedContacts(); - showGroupsMode_ = currentAccount_->getContactListDisplayMode(); - showOffline_ = currentAccount_->getShowOfflineContacts(); - showEmpty_ = currentAccount_->getShowEmptyGroups(); - - // Invalidate the proxy model, to update sorting and visibility of the model's items - invalidate(); -} - - diff --git a/src/currentaccount.cpp b/src/currentaccount.cpp index eb3af87..877c3ab 100644 --- a/src/currentaccount.cpp +++ b/src/currentaccount.cpp @@ -18,9 +18,9 @@ #include "currentaccount.h" #include "contact/contactbase.h" -#include "contact/contactlist.h" #include "contact/contact.h" #include "contact/invitedcontact.h" +#include "model/contactlist.h" #include "utils/kmessconfig.h" #include "utils/kmessshared.h" #include "emoticonmanager.h" @@ -28,10 +28,6 @@ #include "kmessapplication.h" #include "kmessdebug.h" -#include -#include -#include - #include #include @@ -45,7 +41,6 @@ CurrentAccount::CurrentAccount() : autoreply_(false), contactList_(0), externalPort_(0), - loginTime_(0), noEmails_(0), status_(STATUS_OFFLINE) { @@ -137,14 +132,6 @@ void CurrentAccount::destroy() -// Return the Passport authentication ticket -const QString& CurrentAccount::getAuthenticationTicket() const -{ - return authenticationTicket_; -} - - - // Return whether or not to autoreply to messages bool CurrentAccount::getAutoreply() const { @@ -153,14 +140,6 @@ bool CurrentAccount::getAutoreply() const -// Return the compose command. -const QString& CurrentAccount::getComposeCommand() const -{ - return composeCommand_; -} - - - // Return a contact by handle ContactBase * CurrentAccount::getContactByHandle(const QString &handle) const { @@ -240,13 +219,6 @@ uint CurrentAccount::getExternalPort() const -// Return the inbox command. -const QString& CurrentAccount::getInboxCommand() const -{ - return inboxCommand_; -} - - // Return the language code setted for current account const QString& CurrentAccount::getLanguageCode() const { @@ -294,40 +266,6 @@ int CurrentAccount::getNoEmails() const -// Return the passport token -const QString& CurrentAccount::getPassportToken() const -{ - return passportToken_; -} - - - -// Return the proof token -const QString& CurrentAccount::getProofToken() const -{ - return proofToken_; -} - - - -// Read property of int sessionLength. -int CurrentAccount::getSessionLength() const -{ - time_t currentTimeT, t; - int currentTime, elapsedTime; -// int sessionLength; - - currentTimeT = time(&t); - - currentTime = static_cast(currentTimeT); - - // Calculate the time the user's been connected by local reckoning - elapsedTime = currentTime - loginTime_; - return elapsedTime; -} - - - // Return the user's staus Status CurrentAccount::getStatus() const { @@ -336,6 +274,23 @@ Status CurrentAccount::getStatus() const +// Return the requested token +const QString CurrentAccount::getToken( const QString &domain ) const +{ + // Return the requested value or, if not exists, return empty string + return tokens_.value( domain, "" ); +} + + + +// Return the qhash that contain url informations +QHash& CurrentAccount::getUrlInformation() +{ + return urls_; +} + + + // Return whether the given contact exists in the contact list. bool CurrentAccount::hasContactInList(const QString &handle) const { @@ -360,24 +315,25 @@ CurrentAccount* CurrentAccount::instance() // Open mail with the given command, url, and folder void CurrentAccount::openMail( const QString &folder ) { - KMessShared::openEmailClient( folder, getEmailSupported() ); + KMessShared::openEmailClient( "", folder, getEmailSupported() ); } -// Open e-mail at the compose page with the given contact handle +// Open email at the compose page with the given contact handle void CurrentAccount::openMailAtCompose( QString contactHandle ) { - // For a compose message, the folder had to include the address of the contact - openMail( composeFolder_ + "?mailto=1&to=" + contactHandle ); + const QString composeFolder( urls_.value( "COMPOSE" ) ); + KMessShared::openEmailClient( contactHandle, composeFolder, getEmailSupported() ); } -// Open e-mail at the user's inbox +// Open email at the user's inbox void CurrentAccount::openMailAtInbox() { - openMail( inboxFolder_ ); + const QString inboxFolder( urls_.value( "INBOX" ) ); + KMessShared::openEmailClient( "", inboxFolder, getEmailSupported() ); } @@ -388,7 +344,7 @@ void CurrentAccount::setAccountInformation( QString authorization, QString prefe QString externalIp, uint externalPort, QString localIp) { - time_t currentTime, t; + Q_UNUSED( authorization ); #ifdef KMESSTEST bool goodSid; @@ -396,7 +352,6 @@ void CurrentAccount::setAccountInformation( QString authorization, QString prefe KMESS_ASSERT( goodSid ); #endif - authorization_ = authorization; preferredEmail_ = preferredEmail; sid_ = sid; languageCode_ = languageCode; @@ -406,18 +361,6 @@ void CurrentAccount::setAccountInformation( QString authorization, QString prefe // protected method call setEmailSupported(emailSupported); - - // Set the local login time by getting the current time - currentTime = time(&t); - loginTime_ = static_cast(currentTime); -} - - - -// Store the Passport authentication ticket -void CurrentAccount::setAuthenticationTicket( const QString &ticket ) -{ - authenticationTicket_ = ticket; } @@ -430,25 +373,6 @@ void CurrentAccount::setAutoreply(bool autoreply) -// Set compose properties -void CurrentAccount::setComposeInformation( QString command, QString folder, QString url ) -{ - composeCommand_ = command; - composeFolder_ = folder; - composeUrl_ = url; -} - - - -// Set inbox properties. -void CurrentAccount::setInboxInformation( QString command, QString folder, QString url ) -{ - inboxCommand_ = command; - inboxFolder_ = folder; - inboxUrl_ = url; -} - - // Store the contact list, maintained by the MsnNotificationConnection class. // Allows other classes to access the contact list from this central class. void CurrentAccount::setContactList(const ContactList *contactList) @@ -457,6 +381,7 @@ void CurrentAccount::setContactList(const ContactList *contactList) } + // Set initial email information void CurrentAccount::setInitialEmailInformation( int noEmailsInInbox, int noEmailsInOtherFolders ) { @@ -481,7 +406,7 @@ void CurrentAccount::setOfflineImKey( const QString &key ) -// Set the e-mail post url +// Set the email post url void CurrentAccount::setEmailUrl( QString postUrl ) { emailUrl_ = postUrl; @@ -505,21 +430,6 @@ void CurrentAccount::setNoEmails( int noEmails ) -// Set the passport token -void CurrentAccount::setPassportToken( const QString &token ) -{ - passportToken_ = token; -} - - - -// Set the proof token -void CurrentAccount::setProofToken( const QString &token ) -{ - proofToken_ = token; -} - - // Set the user's status void CurrentAccount::setStatus( Status status ) { @@ -567,6 +477,14 @@ void CurrentAccount::setStatus( Status status ) +// Set the tokens +void CurrentAccount::setTokens( const QHash tokens ) +{ + tokens_ = tokens; +} + + + // An invited contact left all chats. void CurrentAccount::slotInvitedContactLeftAllChats( ContactBase *contact ) { @@ -597,7 +515,7 @@ void CurrentAccount::startProcess( QString command ) // Split the arguments QStringList appArguments = command.split( " ", QString::SkipEmptyParts); - QString programName = appArguments.takeFirst(); + QString programName ( appArguments.takeFirst() ); // Start the process if( ! QProcess::startDetached( programName, appArguments ) ) diff --git a/src/currentaccount.h b/src/currentaccount.h index 548ffcc..4695978 100644 --- a/src/currentaccount.h +++ b/src/currentaccount.h @@ -54,19 +54,15 @@ class CurrentAccount : public Account public: // Add an unknown contact to the invited contact list - InvitedContact * addInvitedContact( const QString &handle, const QString &friendlyName, const uint capabilities ); + InvitedContact * addInvitedContact( const QString &handle, const QString &friendlyName = QString(), const uint capabilities = 0 ); // Receive notice that some emails were deleted void changeNoEmails( int change ); // Copy an account virtual void copyAccount( const Account *account ); // Delete the instance of the contact list static void destroy(); - // Return the Passport authentication ticket - const QString& getAuthenticationTicket() const; // Return whether or not to autoreply to messages bool getAutoreply() const; - // Return the compose command. - const QString& getComposeCommand() const; // Return a contact by handle ContactBase *getContactByHandle(const QString &handle) const; // Return a contact's name by handle @@ -81,8 +77,6 @@ class CurrentAccount : public Account const QString& getExternalIp() const; // Return the external port, as seen from the MSN server. uint getExternalPort() const; - // Return the inbox command. - const QString& getInboxCommand() const; // Return the language code setted for current account const QString& getLanguageCode() const; // Return the local IP. @@ -91,59 +85,49 @@ class CurrentAccount : public Account int getNoEmails() const; // Return the key for offline im messages const QString& getOfflineImKey() const; - // Return the passport token - const QString& getPassportToken() const; - // Return the proof token - const QString& getProofToken() const; // Return the user's staus Status getStatus() const; + // Return the requested token + const QString getToken( const QString &domain ) const; + // Return the qhash that contain url informations + QHash &getUrlInformation(); // Return whether the given contact exists in the contact list. bool hasContactInList(const QString &handle) const; // Return a singleton instance of the current account static CurrentAccount* instance(); - // Open e-mail with the given command, url, and folder + // Open email with the given command, url, and folder void openMail( const QString &folder ); - // Open e-mail at the compose page with the given contact handle + // Open email at the compose page with the given contact handle void openMailAtCompose(QString contactHandle); - // Open e-mail at the user's inbox + // Open email at the user's inbox void openMailAtInbox(); // Set some account information void setAccountInformation( QString authorization, QString preferredEmail, QString sid, QString languageCode, bool emailSupported, QString externalIp, uint externalPort, QString internalIp ); - // Store the Passport authentication ticket - void setAuthenticationTicket( const QString &ticket ); // Set whether or not to autoreply to a contact's chat message. void setAutoreply(bool autoreply); - // Set compose properties - void setComposeInformation( QString command, QString folder, QString url ); // Store the contact list, maintained by the MsnNotificationConnection class void setContactList(const ContactList *contactList); - // Set inbox properties. - void setInboxInformation( QString command, QString folder, QString url ); // Set initial email information void setInitialEmailInformation( int noEmailsInInbox, int noEmailsInOtherFolders ); - // Set the e-mail post url + // Set the email post url void setEmailUrl( QString postUrl ); // Set the number of emails void setNoEmails( int noEmails ); // Change the key for offline im messages void setOfflineImKey( const QString &key ); - // Set the passport token - void setPassportToken( const QString &token ); - // Set the proof token - void setProofToken( const QString &token ); // Set the user's status void setStatus( Status status ); + // Set the tokens + void setTokens( const QHash tokens ); private: // Private methods // The constructor CurrentAccount(); // The destructor virtual ~CurrentAccount(); - // Calculate the length of the session with the notification server. - int getSessionLength() const; private slots: // Private slots // An invited contact left all chats. @@ -156,18 +140,8 @@ class CurrentAccount : public Account void startProcess(QString command); private: // Private attributes - // The current passport authentication ticket - QString authenticationTicket_; - // The MS Passport authorization used to access hotmail. - QString authorization_; // Whether or not the program should autoreply to chat messages. bool autoreply_; - // The HTTPS command to use when connecting to hotmail's compose. - QString composeCommand_; - // The folder for email composition, i.e. cgi-bin/compose - QString composeFolder_; - // The URL to go to when opening the compose folder. - QString composeUrl_; // The contact list of the current account const ContactList *contactList_; // The user's preferred email URL (i.e. www.hotmail.com) @@ -176,12 +150,6 @@ class CurrentAccount : public Account QString externalIp_; // Our (external) Port seen from the MSN server. uint externalPort_; - // The HTTPS command to use when connecting to the inbox. - QString inboxCommand_; - // The inbox folder, i.e. /cgi-bin/HoTMaiL. - QString inboxFolder_; - //The URL of the inbox - QString inboxUrl_; // The instance of the singleton account static CurrentAccount *instance_; // The list of invited contacts, not part of the MSN ContactList of the user. @@ -192,20 +160,18 @@ class CurrentAccount : public Account QString languageCode_; // The local IP address QString localIp_; - // The time at which the user synchronized with the notification server. - unsigned int loginTime_; // The number of emails in the user's inbox. int noEmails_; - // Passport token - QString passportToken_; // The email address considered by the server to be the user's preferred address. I don't know when it differs from the handle. QString preferredEmail_; - // Proof token - QString proofToken_; // A value used to access the user's hotmail account. QString sid_; // The online status of the user. Status status_; + // All tokens for each domain + QHash tokens_; + // All url received by URL command sended by ns + QHash urls_; signals: // Public signals // Signal that the account went invisible diff --git a/src/dialogs/addcontactdialog.cpp b/src/dialogs/addcontactdialog.cpp index 25b37f2..e54e63e 100644 --- a/src/dialogs/addcontactdialog.cpp +++ b/src/dialogs/addcontactdialog.cpp @@ -17,8 +17,8 @@ #include "addcontactdialog.h" -#include "../contact/contactlist.h" #include "../contact/group.h" +#include "../model/contactlist.h" #include "../utils/kmessconfig.h" #include "../currentaccount.h" #include "../kmessdebug.h" @@ -30,15 +30,16 @@ * * The dialog is instantly shown as modal when the class is instantiated. * - * @param parent Parent widget - * @param handle Reference to the handle of the contact to add - * @param groupId Reference to the added contact's initial group + * @param parent Parent widget + * @param handle Reference to the handle of the contact to add + * @param groupIdList Reference to the added contact's initial groups */ -AddContactDialog::AddContactDialog( QString &handle, QString &groupId, QWidget *parent ) +AddContactDialog::AddContactDialog( QString &handle, QStringList &groupsId, QWidget *parent ) : KDialog( parent ) , Ui::AddContactDialog() { // Set up the interface and the dialog + setObjectName( "AddContact" ); QWidget *mainWidget = new QWidget( this ); setupUi( mainWidget ); setMainWidget( mainWidget ); @@ -52,30 +53,32 @@ AddContactDialog::AddContactDialog( QString &handle, QString &groupId, QWidget * // Connect the signals to check dialog's input connect( emailAddressEdit_, SIGNAL( textChanged(const QString&) ), this, SLOT ( interfaceChanged() ) ); - connect( groupComboBox_, SIGNAL( currentIndexChanged(const QString&) ), - this, SLOT ( interfaceChanged() ) ); // Lock the dialog height, it's ugly otherwise restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "AddContactDialog" ) ); - setFixedHeight( height() ); + + icon_->setPixmap( KIcon( "list-add-user" ).pixmap( 48, 48 ) ); // Fill up the groups list from the contactlist data - QListgroupList = CurrentAccount::instance()->getContactList()->getGroupList(); + QList< Group* > groupList = CurrentAccount::instance()->getContactList()->getGroupList(); + QListWidgetItem *item; + foreach( Group *group, groupList ) { if( ! group->isSpecialGroup() ) { - groupComboBox_->addItem( group->getName(), group->getId() ); + item = new QListWidgetItem( group->getName(), groupList_ ); + + // Set the groupId in the UserRole data + item ->setData( Qt::UserRole, group->getId() ); + item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); + item->setCheckState( Qt::Unchecked ); } } - // Add a first default item to add the contact outside of all groups - groupComboBox_->insertItem( 0, i18n("No group"), QString() ); - groupComboBox_->setCurrentIndex( 0 ); - - // Force an update of the widgets (to disable the Ok button) interfaceChanged(); + emailAddressEdit_->setFocus(); // Show the dialog modally int result = exec(); @@ -83,13 +86,13 @@ AddContactDialog::AddContactDialog( QString &handle, QString &groupId, QWidget * // Set the result strings if the user has pressed the Ok button if( result == QDialog::Accepted ) { - handle = emailAddressEdit_->text(); - groupId = groupComboBox_->itemData( groupComboBox_->currentIndex() ).toString(); + handle = emailAddressEdit_->text(); + groupsId = getSelectedGroups(); } else { - handle = QString(); - groupId = QString(); + handle = QString(); + groupsId = QStringList(); } // Schedule the dialog for deletion @@ -115,7 +118,7 @@ AddContactDialog::~AddContactDialog() */ void AddContactDialog::interfaceChanged() { - QString emailAddress = emailAddressEdit_->text(); + const QString& emailAddress( emailAddressEdit_->text() ); /** * If you try to add a contact handle which doesn't pass basic mail validation (addresses like "" or "none" @@ -141,4 +144,27 @@ void AddContactDialog::interfaceChanged() } + +// Iterate to check the selected groups +const QStringList AddContactDialog::getSelectedGroups() const +{ + QStringList selectedGroups; + QListWidgetItem *item; + + // Check for selected items + for( int i = 0; i < groupList_->count(); i++ ) + { + item = groupList_->item( i ); + if( item->checkState() == Qt::Checked ) + { + // Grep the groupId + selectedGroups.append( item->data( Qt::UserRole ).toString() ); + } + } + + return selectedGroups; +} + + + #include "addcontactdialog.moc" diff --git a/src/dialogs/addcontactdialog.h b/src/dialogs/addcontactdialog.h index a1c9d5c..e6d5b3f 100644 --- a/src/dialogs/addcontactdialog.h +++ b/src/dialogs/addcontactdialog.h @@ -40,13 +40,17 @@ class AddContactDialog : public KDialog, private Ui::AddContactDialog public: // Constructor - AddContactDialog( QString &handle, QString &groupId, QWidget *parent = 0 ); + AddContactDialog( QString &handle, QStringList &groupsId, QWidget *parent = 0 ); // Destructor - ~AddContactDialog(); + ~AddContactDialog(); + + private: // private methods + // Iterate to check the selected groups + const QStringList getSelectedGroups() const; protected slots: // Protected slots // Controls the OK button by checking the dialog's widgets - void interfaceChanged(); + void interfaceChanged(); }; #endif diff --git a/src/dialogs/addcontactdialog.ui b/src/dialogs/addcontactdialog.ui index 4757677..a725f50 100644 --- a/src/dialogs/addcontactdialog.ui +++ b/src/dialogs/addcontactdialog.ui @@ -1,69 +1,62 @@ AddContactDialog - - - 0 - 0 - 350 - 74 - - - - - 350 - 0 - - - - - Enter here the email address of the person you wish to add to your contact list + + + + 56 + 56 + + + + + 56 + 56 + + + + QFrame::StyledPanel + + + QFrame::Sunken - Email address + + + + + Initial groups + + + + + + + + - - - - - - Optionally, you can choose the group where to place the new contact - - - Initial group - - - - - + - + + + Enter here the email address of the person you wish to add to your contact list + + + Email address: + + - - - Qt::Horizontal - - - - 40 - 20 - - - + - emailAddressEdit_ - label - label_2 - diff --git a/src/dialogs/addemoticondialog.cpp b/src/dialogs/addemoticondialog.cpp index b0c0408..99ef80d 100644 --- a/src/dialogs/addemoticondialog.cpp +++ b/src/dialogs/addemoticondialog.cpp @@ -18,6 +18,7 @@ #include "addemoticondialog.h" #include "../utils/kmessconfig.h" +#include "../utils/kmessshared.h" #include "../emoticonmanager.h" #include "../kmessdebug.h" @@ -47,6 +48,7 @@ AddEmoticonDialog::AddEmoticonDialog( EmoticonTheme *theme, QWidget *parent ) , isEditing_(false) { // Set up the interface and the dialog + setObjectName( "AddEmoticon" ); QWidget *mainWidget = new QWidget( this ); setupUi( mainWidget ); setMainWidget( mainWidget ); @@ -122,7 +124,7 @@ void AddEmoticonDialog::choosePicture() // Edit the custom emoticon -void AddEmoticonDialog::editEmoticon( const QString pictureName, const QString shortcut ) +void AddEmoticonDialog::editEmoticon( const QString &pictureName, const QString &shortcut ) { setCaption( i18n("Edit Emoticon") ); isEditing_ = true; @@ -141,7 +143,11 @@ void AddEmoticonDialog::editEmoticon( const QString pictureName, const QString s void AddEmoticonDialog::interfaceChanged() { movie_->stop(); - movie_->setFileName( pictureEdit_->text() ); + + if( ! pictureEdit_->text().isEmpty() ) + { + movie_->setFileName( pictureEdit_->text() ); + } if( movie_->isValid() ) { @@ -177,7 +183,7 @@ void AddEmoticonDialog::interfaceChanged() * @param pictureName Full path to the file that will be added * @param shortcut Emoticon shortcut to preselect */ -void AddEmoticonDialog::preSelect( QString pictureName, QString shortcut ) +void AddEmoticonDialog::preSelect( const QString &pictureName, const QString &shortcut ) { // Select the image. Disable the field also to avoid messing up with the name. pictureEdit_->setText( pictureName ); @@ -187,11 +193,8 @@ void AddEmoticonDialog::preSelect( QString pictureName, QString shortcut ) // Select the shortcut, and save it so later we can tell everyone we've added this particular emoticon preselectedShortcut_ = shortcut; - // HTML-Decode the shortcut, to show it in its original form - Emoticon::htmlUnescape( shortcut ); - - // Select the shortcut - shortcutEdit_->setText( shortcut ); + // Select the shortcut, decoded from HTML to show it in its original form + shortcutEdit_->setText( KMessShared::htmlUnescape( shortcut ) ); } @@ -249,7 +252,7 @@ void AddEmoticonDialog::slotButtonClicked( int button ) #endif int result = KMessageBox::questionYesNo( this, - i18n( "The emoticon \"%1\" already exists, do you want to replace it?", shortcut ), + i18n( "The emoticon \"%1\" already exists. Do you want to replace it?", shortcut ), i18n("Add New Emoticon") ); if ( result == KMessageBox::Yes ) { diff --git a/src/dialogs/addemoticondialog.h b/src/dialogs/addemoticondialog.h index a342565..2526668 100644 --- a/src/dialogs/addemoticondialog.h +++ b/src/dialogs/addemoticondialog.h @@ -23,6 +23,7 @@ #include #include +#include class EmoticonTheme; @@ -43,13 +44,13 @@ class AddEmoticonDialog : public KDialog, private Ui::AddEmoticonDialog public: // Constructor - AddEmoticonDialog( EmoticonTheme *theme, QWidget *parent = 0 ); + explicit AddEmoticonDialog( EmoticonTheme *theme, QWidget *parent = 0 ); // Destructor virtual ~AddEmoticonDialog(); // Edit the custom emoticon - void editEmoticon( const QString pictureName, const QString shortcut ); + void editEmoticon( const QString &pictureName, const QString &shortcut ); // Preselects a file name and an emoticon shortcut in the dialog - void preSelect( QString pictureName, QString shortcut ); + void preSelect( const QString &pictureName, const QString &shortcut ); private slots: // Shows a File Selection dialog to choose an image for the new emoticon @@ -71,7 +72,7 @@ class AddEmoticonDialog : public KDialog, private Ui::AddEmoticonDialog signals: // Signal that we've added an emoticon with this code - void addedEmoticon( QString shortcut ); + void addedEmoticon( const QString &shortcut ); }; #endif diff --git a/src/dialogs/addemoticondialog.ui b/src/dialogs/addemoticondialog.ui index 4ee172e..6effd4a 100644 --- a/src/dialogs/addemoticondialog.ui +++ b/src/dialogs/addemoticondialog.ui @@ -93,7 +93,7 @@ - Enter a shortcut for this emoticon: + Enter a shortcut for the emoticon: false diff --git a/src/dialogs/awaymessagedialog.cpp b/src/dialogs/awaymessagedialog.cpp index ea161ae..a8a57db 100644 --- a/src/dialogs/awaymessagedialog.cpp +++ b/src/dialogs/awaymessagedialog.cpp @@ -27,13 +27,14 @@ AwayMessageDialog::AwayMessageDialog( QWidget *parent ) , Ui::AwayMessageDialog() { // Set up the interface and the dialog + setObjectName( "AwayMessage" ); QWidget *mainWidget = new QWidget( this ); setupUi( mainWidget ); setMainWidget( mainWidget ); setButtons( Ok | Cancel ); setDefaultButton( Ok ); - setCaption( i18n("Specify an Away message") ); + setCaption( i18n("Automatic Away Message") ); restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "AwayMessageDialog" ) ); adjustSize(); diff --git a/src/dialogs/awaymessagedialog.ui b/src/dialogs/awaymessagedialog.ui index cb6cc2f..b4ed6ad 100644 --- a/src/dialogs/awaymessagedialog.ui +++ b/src/dialogs/awaymessagedialog.ui @@ -19,7 +19,7 @@ Enter a message to be automatically sent to people who try to message you. - &Automatic away message + &Specify an automatic away message: messageEdit_ diff --git a/src/dialogs/chathistorydialog.cpp b/src/dialogs/chathistorydialog.cpp new file mode 100644 index 0000000..9fa7298 --- /dev/null +++ b/src/dialogs/chathistorydialog.cpp @@ -0,0 +1,536 @@ + /*************************************************************************** + chathistorydialog.cpp - chat logs browser + ------------------- + begin : Sun Feb 22 2009 + copyright : (C) 2009 by Dario Freddi + email : drf54321@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "chathistorydialog.h" + +#include "../chat/chatmessageview.h" +#include "../utils/kmessconfig.h" +#include "../currentaccount.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + + +// Constructor +ChatHistoryDialog::ChatHistoryDialog( QWidget *parent ) +: KDialog( parent ) +, model_( new QStandardItemModel( this ) ) +, proxyModel_( new QSortFilterProxyModel( this ) ) +{ + // Set up the dialog + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setMainWidget( mainWidget ); + setButtons( Close ); + setWindowTitle( i18nc( "Dialog window title", "Chat History" ) ); + + // Let the dialog destroy itself when it's done + setAttribute( Qt::WA_DeleteOnClose ); + + // Create the chat view to show the chat logs + chatView_ = new ChatMessageView( mainWidget ); + chatView_->updateChatStyle(); + rightSplitter_->addWidget( chatView_->widget() ); + + // Make the splitter assign more space to the view than to the controls, + // and set its minimum size + QSizePolicy sizePolicy( QSizePolicy::Preferred, QSizePolicy::Expanding ); + sizePolicy.setVerticalStretch( 100 ); + chatView_->widget()->setMinimumSize( 300, 200 ); + chatView_->widget()->setSizePolicy( sizePolicy ); + + loadContactsList(); + + // Initialize the model for the list of contacts + proxyModel_->setSourceModel( model_ ); + proxyModel_->setDynamicSortFilter( true ); + proxyModel_->setFilterCaseSensitivity( Qt::CaseInsensitive ); + + listView_->setModel( proxyModel_ ); + + QItemSelectionModel *selectionModel = listView_->selectionModel(); + + // Attach the signals + connect( searchEdit_, SIGNAL( textChanged(const QString&) ), + proxyModel_, SLOT ( setFilterRegExp(const QString&) ) ); + connect( selectionModel, SIGNAL( currentChanged(const QModelIndex&,const QModelIndex&) ), + this, SLOT ( cacheContactXml(const QModelIndex&) ) ); + connect( dateRadio_, SIGNAL( toggled(bool) ), + this, SLOT ( reloadLogs() ) ); + connect( fromBox_, SIGNAL( toggled(bool) ), + this, SLOT ( reloadLogs() ) ); + connect( fromDate_, SIGNAL( changed(const QDate&) ), + this, SLOT ( reloadLogs() ) ); + connect( toBox_, SIGNAL( toggled(bool) ), + this, SLOT ( reloadLogs() ) ); + connect( toDate_, SIGNAL( changed(const QDate&) ), + this, SLOT ( reloadLogs() ) ); + connect( conversationRadio_, SIGNAL( toggled(bool) ), + this, SLOT ( reloadLogs() ) ); + connect( conversationComboBox_, SIGNAL( currentIndexChanged(int) ), + this, SLOT ( reloadLogs() ) ); + + // Save the dialog and splitters sizes + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "AddEmoticonDialog" ); + restoreDialogSize( group ); + mainSplitter_ ->setSizes( group.readEntry( "mainSplitterSizes", QList() << 1 << 100 ) ); + rightSplitter_->setSizes( group.readEntry( "rightSplitterSizes", QList() << 1 << 100 ) ); + + // Normally the focus would be set on the Search box, thus making the + // preset explanation text to disappear. + listView_->setFocus(); +} + + + +// Destructor +ChatHistoryDialog::~ChatHistoryDialog() +{ + // Save the dialog and splitters size + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "AddEmoticonDialog" ); + saveDialogSize( group ); + group.writeEntry( "mainSplitterSizes", mainSplitter_ ->sizes() ); + group.writeEntry( "rightSplitterSizes", rightSplitter_->sizes() ); +} + + + +// Set the contact for whom the logs will be initially shown +void ChatHistoryDialog::setContact( const QString &handle ) +{ + if( handle.isEmpty() ) + { + return; + } + + QList items = model_->findItems( handle, Qt::MatchContains ); + + if( items.isEmpty() ) + { + kWarning() << "Unable to find contact" << handle; + return; + } + + listView_->setCurrentIndex( items.first()->index() ); +} + + + +// Caches the XML for the selected contact. Makes things a lot faster +void ChatHistoryDialog::cacheContactXml( const QModelIndex &index ) +{ + if( ! proxyModel_->mapToSource( index ).isValid() ) + { + return; + } + + // Initially the list view emits a currentChanged() signal, but the list + // doesn't bother to show the selected item + listView_->setCurrentIndex( index ); + + xml_.clear(); + + QDir logsDir( KMessConfig::instance()->getAccountDirectory( CurrentAccount::instance()->getHandle() ) + + "/chatlogs" ); + + logsDir.setFilter( QDir::Files ); + logsDir.setNameFilters( QStringList() << "*.xml" ); + + const QFileInfoList &list( logsDir.entryInfoList() ); + foreach( const QFileInfo &entry, list ) + { + QString handle( entry.fileName() ); + + if( ! handle.startsWith( model_->itemFromIndex( proxyModel_->mapToSource( index ) )->text() ) ) + { + continue; + } + + QFile file( entry.absoluteFilePath() ); + + if( ! file.open( QFile::ReadOnly | QFile::Text ) ) + { + // Very unlikely, but... + KMessageBox::error( this, i18nc( "Dialog box text", + "There has been an error while opening your logs. This " + "is commonly a permission problem, check if you have " + "read/write access to directory \"%1\". Otherwise, " + "your logs may be corrupted.", + logsDir.absolutePath() ), + i18nc( "Dialog box title", "Could not open chat history" ) ); + return; + } + + xml_ += file.readAll(); + + file.close(); + } + + // After caching, we want to load the conversation list and refresh the view + loadConversationList(); + reloadLogs(); +} + + + +// Load the list of conversation for the selected contact +void ChatHistoryDialog::loadConversationList() +{ + conversationComboBox_->clear(); + + QDomDocument doc; + doc.setContent( xml_ ); + + for( int i = 0; i < doc.childNodes().size(); ++i ) + { + if( doc.childNodes().at(i).nodeName() == "messageRoot" ) + { + QDomNode rootNode( doc.childNodes().at( i ) ); + for( int j = 0; j < rootNode.childNodes().size(); ++j ) + { + if( rootNode.childNodes().at(j).nodeName() == "conversation" ) + { + QDomNode conversation( rootNode.childNodes().at( j ) ); + + if ( conversation.attributes().item( 0 ).nodeName() == "timestamp" ) + { + // New system, good + QDateTime timestamp = QDateTime::fromTime_t( conversation.attributes().namedItem( "timestamp" ).nodeValue().toInt() ); + conversationComboBox_->addItem( KGlobal::locale()->formatDateTime( timestamp, KLocale::ShortDate ), + conversation.attributes().namedItem( "timestamp" ).nodeValue().toInt() ); + } + else + { + // Old logs, bad. + + migrateOldLogs(); + return; + } + } + } + } + } +} + + + +// Load the list of contacts for which logs are available +void ChatHistoryDialog::loadContactsList() +{ + // Find all XML chat log files in the logs directory + QDir logsDir( KMessConfig::instance()->getAccountDirectory( CurrentAccount::instance()->getHandle() ) + + "/chatlogs" ); + + logsDir.setFilter( QDir::Files ); + logsDir.setNameFilters( QStringList() << "*.xml" ); + + // Add them to the list + const QFileInfoList &list( logsDir.entryInfoList() ); + foreach( const QFileInfo &entry, list ) + { + QString handle( entry.fileName() ); + handle.remove( handle.length() - 4, 4 ); + + // Files ending with .1 should not be added + if( handle.at( handle.length() - 1 ).isNumber() ) + { + continue; + } + + model_->appendRow( new QStandardItem( handle ) ); + } +} + + + +// Reload the current chat log history +void ChatHistoryDialog::reloadLogs() +{ + QDomDocument doc; + doc.setContent( xml_ ); + + if( dateRadio_->isChecked() ) + { + for( int i = 0; i < doc.childNodes().size(); ++i ) + { + if( doc.childNodes().at(i).nodeName() == "messageRoot" ) + { + QDomNode rootNode = doc.childNodes().at(i); + for( int j = 0; j < rootNode.childNodes().size(); ++j ) + { + if( rootNode.childNodes().at(j).nodeName() == "conversation" ) + { + QDomNode conversation( rootNode.childNodes().at( j ) ); + + QDate date; + + if ( conversation.attributes().item( 0 ).nodeName() == "timestamp" ) + { + // New system, good + QDateTime timestamp = QDateTime::fromTime_t( conversation.attributes().item( 0 ).nodeValue().toInt() ); + date = timestamp.date(); + } + else + { + // Old logs, bad. Try migrating them + + migrateOldLogs(); + return; + } + + if ( !date.isValid() ) { + KMessageBox::error( this, i18n( "Could not retrieve a valid date from your logs! This is " + "probably due to the fact that this log was generated with an " + "old KMess version" ) ); + break; + } + + if( ( fromBox_->isChecked() && date < fromDate_->date() ) + || ( toBox_ ->isChecked() && date > toDate_ ->date() ) ) + { + rootNode.removeChild( conversation ); + } + } + } + } + } + } + + if( conversationRadio_->isChecked() ) + { + for( int i = 0; i < doc.childNodes().size(); ++i ) + { + if( doc.childNodes().at(i).nodeName() == "messageRoot" ) + { + QDomNode rootNode( doc.childNodes().at( i ) ); + + for( int j = 0; j < rootNode.childNodes().size(); ++j ) + { + if( rootNode.childNodes().at( j ).nodeName() == "conversation" ) + { + QDomNode conversation = rootNode.childNodes().at( j ); + + if ( conversation.attributes().item( 0 ).nodeName() == "timestamp" ) + { + // New system, good + uint timestamp = conversation.attributes().item( 0 ).nodeValue().toInt(); + if ( timestamp != conversationComboBox_->itemData( conversationComboBox_->currentIndex(), Qt::UserRole ).toUInt() ) + { + rootNode.removeChild( conversation ); + } + } + else + { + // Old logs, bad. + + migrateOldLogs(); + return; + } + } + } + } + } + } + + chatView_->setXml( doc.toString() ); +} + + + +// Migrates old logs to new timestamp format +void ChatHistoryDialog::migrateOldLogs() +{ + /* This is some sort of black magic: knowing what the local format + * is, we try to retreive the date and the time, and then to convert + * it to the timestamp + */ + + int result = KMessageBox::questionYesNo( this, i18n( "Your logs seems to be corrupted or belonging " + "to an old KMess version. KMess can try migrating " + "your logs. Do you want to do this now?" ) ); + + if ( result == KMessageBox::No ) + { + return; + } + + int total = 0, migrated = 0, failed = 0; + QStringList baseFormats = QStringList() << KGlobal::locale()->dateFormat() + << KGlobal::locale()->dateFormatShort(); + QStringList formats; + QStringList dateFormats = baseFormats; + + QString timeFormat = KGlobal::locale()->timeFormat(); + timeFormat.remove( ":%S:" ); + timeFormat.remove( ":%S" ); + timeFormat.remove( "%S:" ); + + foreach ( const QString &format, baseFormats ) + { + QString mFormat = format; + mFormat.replace( "%n", "%:m" ); + QString dFormat = format; + dFormat.replace( "%:m", "%m" ); + dateFormats << mFormat << dFormat; + formats << format + ' ' + timeFormat + << mFormat + ' ' + timeFormat + << dFormat + ' ' + timeFormat; + } + + kDebug() << "Date formats:" << formats << dateFormats; + + QDir logsDir( KMessConfig::instance()->getAccountDirectory( CurrentAccount::instance()->getHandle() ) + + "/chatlogs" ); + + logsDir.setFilter( QDir::Files ); + logsDir.setNameFilters( QStringList() << "*.xml" ); + + const QFileInfoList &list( logsDir.entryInfoList() ); + foreach( const QFileInfo &entry, list ) + { + kDebug() << "migrating" << entry.absoluteFilePath(); + QFile file( entry.absoluteFilePath() ); + + if( ! file.open( QFile::ReadOnly | QFile::Text ) ) + { + // Very unlikely, but... + KMessageBox::error( this, i18nc( "Dialog box text", + "There has been an error while opening your logs. This " + "is commonly a permission problem, check if you have " + "read/write access to directory \"%1\". Otherwise, " + "your logs may be corrupted.", + logsDir.absolutePath() ), + i18nc( "Dialog box title", "Could not open chat history" ) ); + return; + } + + QTextStream in(&file); + QString newContents; + while ( ! in.atEnd() ) + { + QString line = in.readLine(); + + if ( line.contains( "\"%1\"
    . Otherwise, " + "your logs may be corrupted.", + logsDir.absolutePath() ), + i18nc( "Dialog box title", "Could not open chat history" ) ); + return; + } + + QTextStream out(&file); + out << newContents << "\n"; + + file.close(); + } + + KMessageBox::information( this, i18n( "Migration terminated.\nTried to migrate %1 items\n" + "%2 items successfully migrated\n" + "%3 items could not have been migrated.", + total, migrated, failed), + i18n( "Alpha logs migration" ) ); + +} + + +#include "chathistorydialog.moc" diff --git a/src/dialogs/chathistorydialog.h b/src/dialogs/chathistorydialog.h new file mode 100644 index 0000000..da7ec98 --- /dev/null +++ b/src/dialogs/chathistorydialog.h @@ -0,0 +1,72 @@ + /*************************************************************************** + chathistorydialog.h - chat logs browser + ------------------- + begin : Sun Feb 22 2009 + copyright : (C) 2009 by Dario Freddi + email : drf54321@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef CHATHISTORYDIALOG_H +#define CHATHISTORYDIALOG_H + +#include + +#include "ui_chathistorydialog.h" + + +// Forward declarations +class ChatMessageView; +class QSortFilterProxyModel; +class QStandardItemModel; + + + +class ChatHistoryDialog : public KDialog, private Ui::historyDialog +{ + Q_OBJECT + + public: + // Constructor + ChatHistoryDialog( QWidget *parent = 0 ); + // Destructor + virtual ~ChatHistoryDialog(); + // Set the contact for whom the logs will be initially shown + void setContact( const QString &handle ); + + void migrateOldLogs(); + + private: + // Load the list of contacts for which logs are available + void loadContactsList(); + // Load the list of conversation for the selected contact + void loadConversationList(); + + private slots: + // Reload the current chat log history + void reloadLogs(); + // Caches the XML for the selected contact. Makes things a lot faster + void cacheContactXml(const QModelIndex &index); + + private: + // View used to show the chat logs + ChatMessageView *chatView_; + // Model for the list of contacts + QStandardItemModel *model_; + // Filter for the list of contacts + QSortFilterProxyModel *proxyModel_; + // Cache to store a contact's entire chat history + QByteArray xml_; +}; + + + +#endif /* CHATHISTORYDIALOG_H */ diff --git a/src/dialogs/chathistorydialog.ui b/src/dialogs/chathistorydialog.ui new file mode 100644 index 0000000..4d75da0 --- /dev/null +++ b/src/dialogs/chathistorydialog.ui @@ -0,0 +1,296 @@ + + + historyDialog + + + + 0 + 0 + 770 + 472 + + + + + + + + + + Qt::Horizontal + + + false + + + + + + + Search through contacts... + + + true + + + + + + + + 100 + 0 + + + + + + + + + + 100 + 0 + + + + Qt::Vertical + + + false + + + + Chat Log Filter + + + + + + QFormLayout::ExpandingFieldsGrow + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + &Do not filter + + + true + + + + + + + + + + + + + + Filter by &date + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + false + + + from + + + + + + + false + + + + + + + false + + + to + + + + + + + false + + + + + + + + + Filter by &chat + + + + + + + + + false + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + + 17 + 17 + + + + + + + + + + + + + + + + + + KComboBox + QComboBox +
    kcombobox.h
    +
    + + KDateWidget + QWidget +
    kdatewidget.h
    +
    + + KLineEdit + QLineEdit +
    klineedit.h
    +
    +
    + + searchEdit_ + listView_ + radioButton + dateRadio_ + fromBox_ + toBox_ + conversationRadio_ + conversationComboBox_ + + + + + dateRadio_ + toggled(bool) + fromBox_ + setEnabled(bool) + + + 305 + 74 + + + 437 + 82 + + + + + dateRadio_ + toggled(bool) + toBox_ + setEnabled(bool) + + + 295 + 73 + + + 449 + 113 + + + + + fromBox_ + toggled(bool) + fromDate_ + setEnabled(bool) + + + 439 + 80 + + + 535 + 82 + + + + + toBox_ + toggled(bool) + toDate_ + setEnabled(bool) + + + 456 + 106 + + + 564 + 114 + + + + + conversationRadio_ + toggled(bool) + conversationComboBox_ + setEnabled(bool) + + + 377 + 145 + + + 463 + 142 + + + + +
    diff --git a/src/dialogs/contactaddeduserdialog.cpp b/src/dialogs/contactaddeduserdialog.cpp index b0345b9..b23ce63 100644 --- a/src/dialogs/contactaddeduserdialog.cpp +++ b/src/dialogs/contactaddeduserdialog.cpp @@ -16,45 +16,111 @@ ***************************************************************************/ #include "contactaddeduserdialog.h" +#include "../model/contactlist.h" +#include "../contact/group.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" +#include "../utils/kmessconfig.h" -ContactAddedUserDialog::ContactAddedUserDialog() +/** + * Constructor + * + * The dialog is instantly shown as modal when the class is instantiated. + * + * @param contactHandle Reference to the handle of the contact that has added you + * @param contactFriendlyName The friendly name of the contact + */ +ContactAddedUserDialog::ContactAddedUserDialog( const QString &contactHandle, const QString &contactFriendlyName ) : KDialog() , Ui::ContactAddedUserDialog() - , returnCode_( BLOCK ) + , contactHandle_( contactHandle ) { // Load the ui file in a main qwidget + setObjectName( "ContactAddedUser" ); QWidget *mainWidget = new QWidget( this ); setupUi( mainWidget ); + setMainWidget( mainWidget ); + // Let the dialog destroy itself when it's done + setAttribute( Qt::WA_DeleteOnClose ); + + //adjust or restore saved size + adjustSize(); + restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "ContactAddedUserDialog" ) ); + // Update the window properties - setCaption( i18n("You have been added by someone") ); + setCaption( i18n( "You have been added by someone" ) ); + + // Set up the label + messageLabel_->setText( i18n( "%1 (%2)\nhas added you to his or her contact list." + , contactFriendlyName + , contactHandle ) ); + + // Fill up the groups list from the contactlist data + QList groupList( CurrentAccount::instance()->getContactList()->getGroupList() ); + QListWidgetItem *item; + + foreach( const Group *group, groupList ) + { + if( ! group->isSpecialGroup() ) + { + item = new QListWidgetItem( group->getName(), groupList_ ); + + // Set the groupId in the item's data, to retrieve it later + item->setData( Qt::UserRole, group->getId() ); + item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); + item->setCheckState( Qt::Unchecked ); + } + } } - +/** +* @brief Destructor +* +*/ ContactAddedUserDialog::~ContactAddedUserDialog() { + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "ContactAddedUserDialog" ); + saveDialogSize( group ); } -// The user pressed the "ok" button +/** +* @brief Called when the user pressed the "ok" button +* +*/ void ContactAddedUserDialog::accept() { + QStringList groupIds; + if( addContactOption_->isChecked() ) { - returnCode_ = ADD; + // Find all checked items in the list + QListWidgetItem *item; + for( int i = 0; i < groupList_->count(); i++ ) + { + item = groupList_->item( i ); + if( item->checkState() == Qt::Checked ) + { + // Retrieve the group id from the item's data + groupIds.append( item->data( Qt::UserRole ).toString() ); + } + } + + emit userChoice( contactHandle_, groupIds, ADD ); } else if( allowContactOption_->isChecked() ) { - returnCode_ = ALLOW; + emit userChoice( contactHandle_, groupIds, ALLOW ); } - else if( blockContactOption_->isChecked() ) + else { - returnCode_ = BLOCK; + emit userChoice( contactHandle_, groupIds, BLOCK ); } // Call parent @@ -63,37 +129,18 @@ void ContactAddedUserDialog::accept() -// The user pressed the "cancel" button +/** +* @brief Called when the user pressed the "cancel" button +* +*/ void ContactAddedUserDialog::reject() { - // Abort means block too. - returnCode_ = BLOCK; + // No choice for the moment, the question will be asked the next time // Call parent KDialog::reject(); } - -// Show the dialog modally, then return the user's choice. -ContactAddedUserDialog::ReturnCode ContactAddedUserDialog::launch(QString contactHandle, QString contactName) -{ - // Set the default return value - returnCode_ = BLOCK; - - // Set up the label - messageLabel_->setText( i18n( "%1 (%2) \n has added you to his or her contact list. " - , contactName, contactHandle ) ); - - - // Show the dialog modally - exec(); - - // The return value should be set properly. Return it. - return returnCode_; -} - - - #include "contactaddeduserdialog.moc" diff --git a/src/dialogs/contactaddeduserdialog.h b/src/dialogs/contactaddeduserdialog.h index 3416154..6daa8e4 100644 --- a/src/dialogs/contactaddeduserdialog.h +++ b/src/dialogs/contactaddeduserdialog.h @@ -38,28 +38,30 @@ class ContactAddedUserDialog : public KDialog, private Ui::ContactAddedUserDialo // Return types for the dialog enum ReturnCode { - ADD = 0, - ALLOW = 1, - BLOCK = 2 + ADD = 0 + , ALLOW = 1 + , BLOCK = 2 }; + public: // The constructor - ContactAddedUserDialog(); + ContactAddedUserDialog( const QString &contactHandle, const QString &contactFriendlyName ); // The destructor - virtual ~ContactAddedUserDialog(); - - // Show the dialog modally, then return the user's choice. - ReturnCode launch(QString contactHandle, QString contactName); + virtual ~ContactAddedUserDialog(); public slots: // Protected slots // The user pressed the "ok" button - virtual void accept(); + virtual void accept(); // The user pressed the "cancel" button - virtual void reject(); + virtual void reject(); - private: // private attributes - // The return value - ReturnCode returnCode_; + private: // Private properties + // The handle of the contact who has added the user + QString contactHandle_; + + signals: + // Notify of the choice made by the user + void userChoice( const QString &handle, const QStringList &groupsId, const int code ); }; diff --git a/src/dialogs/contactaddeduserdialog.ui b/src/dialogs/contactaddeduserdialog.ui index 076767a..a61affc 100644 --- a/src/dialogs/contactaddeduserdialog.ui +++ b/src/dialogs/contactaddeduserdialog.ui @@ -1,77 +1,124 @@ - + + ContactAddedUserDialog - - + + 0 0 - 482 - 206 + 417 + 363 - + - - - + + + 0 0 - + - + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - + false - - + + Qt::Vertical - + QSizePolicy::Fixed - + - 464 - 13 + 17 + 17 - - - What would you like to do + + + What would you like to do? - + - - - &Add this person to my "Friends" list + + + &Add this person to these groups of my contact list: - + true - - - Do not add this person; only allow them to see my online state + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 17 + 17 + + + + + + + + + 150 + 150 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 17 + 17 + + + + + + + + &Do not add this person; only allow them to see my status - - - &Block this person from contacting me or seeing my online state + + + &Block this person from contacting me or seeing my status @@ -79,22 +126,42 @@ - - + + Qt::Vertical - + + QSizePolicy::MinimumExpanding + + - 464 - 50 + 17 + 17 - + qPixmapFromMimeSource - + + + addContactOption_ + toggled(bool) + groupList_ + setEnabled(bool) + + + 188 + 84 + + + 193 + 156 + + + + diff --git a/src/dialogs/contactentry.cpp b/src/dialogs/contactentry.cpp new file mode 100644 index 0000000..db41b79 --- /dev/null +++ b/src/dialogs/contactentry.cpp @@ -0,0 +1,137 @@ +/*************************************************************************** + contactentry.cpp - description + ------------------- + begin : Wed Oct 31 2008 + copyright : (C) 2008 by Antonio Nastasi + email : sifcenter@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "contactentry.h" + +#include "../contact/contact.h" +#include "../utils/richtextparser.h" +#include "../kmessdebug.h" + +#include + + + +// Constructor +ContactEntry::ContactEntry( const Contact *contact, QWidget *parent ) + : QWidget( parent ) + , Ui::ContactEntry() + , selected_(false) +{ + // Setup UI + setupUi( this ); + installEventFilter( this ); + + // Fill labels with the informations about contact + nameLabel_->setText( contact->getFriendlyName( STRING_LIST_SETTING_ESCAPED ) ); + handle_ = contact->getHandle(); + handleLabel_->setText( handle_ ); + picture_->setPixmap( contact->getContactPicturePath() ); +} + + + +// Another constructor +ContactEntry::ContactEntry( const QString &handle, QWidget *parent ) + : QWidget( parent ) + ,Ui::ContactEntry() + , selected_(false) +{ + // Setup UI + setupUi( this ); + installEventFilter( this ); + + // Fill labels with the informations about contact, the picture and the name is unknow + // because we haven't information about it + handle_ = handle; + nameLabel_->setText( handle ); + handleLabel_->setText( handle ); +} + + + +// Destructor +ContactEntry::~ContactEntry() +{ +} + + + +// Event Filter to catch mouse click +bool ContactEntry::eventFilter( QObject */*obj*/, QEvent *event ) +{ + if( event->type() == QEvent::MouseButtonRelease ) + { + emit clicked(); + } + + return false; +} + + + +// Return the friendly name of the contact +const QString ContactEntry::getFriendlyName() const +{ + return nameLabel_->text(); +} + + + +// Return the handle for the contact +const QString& ContactEntry::getHandle() const +{ + return handle_; +} + + + +bool ContactEntry::isSelected() const +{ + return selected_; +} + + + +// Set the color of background to simulate the selection +void ContactEntry::click( bool deselect ) +{ + QPalette palette; + QColor color; + + if( deselect ) + { + selected_ = false; + } + else + { + selected_ = ! selected_; + } + + if( selected_ ) + { + color = palette.color( QPalette::Highlight ); + } + else + { + color = palette.color( QPalette::Background ); + } + + palette.setColor( QPalette::Background, color ); + setPalette( palette ); +} + +#include "contactentry.moc" diff --git a/src/dialogs/contactentry.h b/src/dialogs/contactentry.h new file mode 100644 index 0000000..c1fdea9 --- /dev/null +++ b/src/dialogs/contactentry.h @@ -0,0 +1,65 @@ +/*************************************************************************** + contactentry.h - description + ------------------- + begin : Wed Oct 31 2008 + copyright : (C) 2008 by Antonio Nastasi + email : sifcenter@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef CONTACTENTRY_H +#define CONTACTENTRY_H + +#include "ui_contactentry.h" + +#include + +class Contact; + + + +class ContactEntry : public QWidget, private Ui::ContactEntry +{ + Q_OBJECT + + public: + // Constructor + explicit ContactEntry( const Contact *contact, QWidget *parent = 0 ); + // Another constructor + explicit ContactEntry( const QString &handle, QWidget *parent = 0 ); + // Destructor + ~ContactEntry(); + // Return the friendly name of the contact + const QString getFriendlyName() const; + // Return the handle of the contact + const QString& getHandle() const; + // Return if the widget is selected + bool isSelected() const; + // Select or deselect this entry + void click( bool deselect = false ); + + protected: + // Event Filter to catch mouse click + bool eventFilter( QObject *obj, QEvent *event ); + + private: + // Handle + QString handle_; + bool selected_; + + signals: + // Emitted when the widget is clicked + void clicked(); +}; + + +#endif diff --git a/src/dialogs/contactentry.ui b/src/dialogs/contactentry.ui new file mode 100644 index 0000000..670d1e1 --- /dev/null +++ b/src/dialogs/contactentry.ui @@ -0,0 +1,98 @@ + + ContactEntry + + + + 0 + 0 + 154 + 59 + + + + + + + + 0 + + + 0 + + + + + true + + + QFrame::NoFrame + + + QFrame::Raised + + + 3 + + + + + + + 48 + 48 + + + + + 48 + 48 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + picture_ + + + + + + Qt::Horizontal + + + + + + + + diff --git a/src/dialogs/contactpropertiesdialog.cpp b/src/dialogs/contactpropertiesdialog.cpp index bff94e5..e051955 100644 --- a/src/dialogs/contactpropertiesdialog.cpp +++ b/src/dialogs/contactpropertiesdialog.cpp @@ -17,18 +17,18 @@ #include "contactpropertiesdialog.h" -#include "../contact/contact.h" #include "../contact/contactextension.h" -#include "../contact/contactlist.h" #include "../contact/group.h" +#include "../model/contactlist.h" #include "../utils/kmessconfig.h" -#include "../utils/richtextparser.h" +#include "../utils/kmessshared.h" #include "../currentaccount.h" #include "../kmessdebug.h" #include #include +#include #include #include #include @@ -44,6 +44,7 @@ ContactPropertiesDialog::ContactPropertiesDialog( QWidget *parent ) , mediaSound_(0) { // Set up the interface and the dialog + setObjectName( "ContactProperties" ); QWidget *mainWidget = new QWidget( this ); setupUi( mainWidget ); setMainWidget( mainWidget ); @@ -51,7 +52,7 @@ ContactPropertiesDialog::ContactPropertiesDialog( QWidget *parent ) // Configure the dialog setWindowModality( Qt::WindowModal ); - KIconLoader *loader = KIconLoader::global(); + const KIconLoader *loader = KIconLoader::global(); // Set the dialog size setButtons( Ok | Cancel ); @@ -64,11 +65,19 @@ ContactPropertiesDialog::ContactPropertiesDialog( QWidget *parent ) // Set properties for clear cache button clearCacheButton_->setIcon( loader->loadIcon( "draw-eraser", KIconLoader::Small ) ); + useButton_ ->setIcon( loader->loadIcon( "user-properties", KIconLoader::Small ) ); - connect( clearCacheButton_, SIGNAL( clicked() ), this, SLOT( slotClearCache() ) ); - connect( restoreButton_, SIGNAL( clicked() ), this, SLOT( restoreContactPicture() ) ); - connect( soundButton_, SIGNAL( clicked() ), this, SLOT( chooseSound() ) ); - connect( playButton_, SIGNAL( clicked() ), this, SLOT( slotPlaySound() ) ); + connect( clearCacheButton_, SIGNAL( clicked() ), this, SLOT( slotClearCache() ) ); + connect( useButton_, SIGNAL( clicked() ), this, SLOT( slotUsePicture() ) ); + connect( restoreButton_, SIGNAL( clicked() ), this, SLOT( restoreContactPicture() ) ); + connect( soundButton_, SIGNAL( clicked() ), this, SLOT( chooseSound() ) ); + connect( playButton_, SIGNAL( clicked() ), this, SLOT( slotPlaySound() ) ); + connect( removeEmoticonButton_, SIGNAL( clicked() ), this, SLOT( slotRemoveEmoticon() ) ); + + connect( blackListView_, SIGNAL( itemSelectionChanged () ), + this, SLOT ( slotEmoticonSelectionChanged() ) ); + connect( pictureList_, SIGNAL( itemSelectionChanged () ), + this, SLOT ( slotPictureSelectionChanged() ) ); imageContact_->installEventFilter( this ); } @@ -99,9 +108,7 @@ void ContactPropertiesDialog::alternativeNameCheckBoxToggled(bool checked) // Apply all values in the widgets to the contact extension. void ContactPropertiesDialog::applyChanges() { - ContactExtension *extension; - - extension = contact_->getExtension(); + ContactExtension *extension = contact_->getExtension(); // if the user clears the name edit, be user-friendly and decide that what // they really wanted to do was turn off the alternative name override. @@ -121,9 +128,8 @@ void ContactPropertiesDialog::applyChanges() extension->setContactAlternativePicturePath( alternativePicturePath_ ); - const QStringList groupIdsList = contact_->getGroupIds(); + const QStringList groupIdsList( contact_->getGroupIds() ); QListWidgetItem *item; - QString currentId; groupList_->setGridSize( QSize( 2, (int) ceil( (float) groupList_->count() / 2.0 ) ) ); @@ -131,7 +137,7 @@ void ContactPropertiesDialog::applyChanges() for( int i = 0; i < groupList_->count(); i++ ) { item = groupList_->item( i ); - currentId = item->data( 6 ).toString(); + const QString& currentId( item->data( 6 ).toString() ); if( item->checkState() == Qt::Checked ) { @@ -155,6 +161,9 @@ void ContactPropertiesDialog::applyChanges() // else the user isn't already in the group } } + + // Save the changed settings + CurrentAccount::instance()->getContactList()->saveProperties( contact_ ); } @@ -164,9 +173,7 @@ void ContactPropertiesDialog::applyChanges() // of said widget with the result of the file selection dialog. void ContactPropertiesDialog::chooseFile(KLineEdit *edit, QString wildcard) { - QString file; - - file = edit->text(); + QString file( edit->text() ); file = KFileDialog::getOpenFileName( file, wildcard, this ); @@ -181,11 +188,11 @@ void ContactPropertiesDialog::chooseFile(KLineEdit *edit, QString wildcard) // Choose a picture file (KFile dialog) void ContactPropertiesDialog::choosePicture() { - KUrl file; - file = KFileDialog::getImageOpenUrl( alternativePicturePath_ , this ); + const KUrl& file( KFileDialog::getImageOpenUrl( alternativePicturePath_ , this ) ); + if ( ! file.isEmpty() ) { - QPixmap pixmap( file.toLocalFile() ); + const QPixmap& pixmap( file.toLocalFile() ); // If it's a valid image if( ! pixmap.isNull() ) @@ -202,10 +209,10 @@ void ContactPropertiesDialog::choosePicture() void ContactPropertiesDialog::chooseSound() { // Grep the standard sound directory - QStringList soundDirectoryList( KGlobal::dirs()->findDirs( "sound", "" ) ); + const QStringList& soundDirectoryList( KGlobal::dirs()->findDirs( "sound", "" ) ); if( ! soundDirectoryList.isEmpty () ) { - KUrl soundDirectory( soundDirectoryList.first() ); + const KUrl& soundDirectory( soundDirectoryList.first() ); soundEdit_->setUrl( soundDirectory ); } @@ -214,6 +221,34 @@ void ContactPropertiesDialog::chooseSound() +// Clear the qlistwidget if there are already object +void ContactPropertiesDialog::clearLists() +{ + // Clear the group list if there are already objects + int count = groupList_->count(); + int i; + + if( count > 0 ) + { + for( i = 0; i < count; i++ ) + { + delete groupList_->takeItem( i ); + } + } + + // Clear the group list if there are already objects + count = pictureList_->count(); + if( count > 0 ) + { + for( i = 0; i < count; ++i ) + { + delete pictureList_->takeItem( i ); + } + } +} + + + bool ContactPropertiesDialog::eventFilter(QObject *obj, QEvent *event ) { if( obj == imageContact_ ) @@ -262,14 +297,16 @@ bool ContactPropertiesDialog::launch( Contact *contact, bool openNotesTab ) #ifdef KMESSDEBUG_CONTACTPROPERTIES kDebug() << "Launch with contact " << contact->getHandle(); #endif - QString dialogCaption; // Copy the pointer to the contact class contact_ = contact; + // If the contact gets destroyed, close the window immediately + connect( contact_, SIGNAL( destroyed(QObject*) ), + this, SLOT ( reject() ) ); + // Set the dialog title - dialogCaption = i18n( "Contact Properties for %1", contact->getHandle() ); - setCaption( dialogCaption ); + setCaption( i18n( "Contact Properties for %1", contact->getHandle() ) ); // Setup the dialog setupWidgets(); @@ -296,11 +333,11 @@ bool ContactPropertiesDialog::launch( Contact *contact, bool openNotesTab ) // The online notification checkbox was toggled -void ContactPropertiesDialog::notifyOnlineCheckBoxToggled(bool checked) +void ContactPropertiesDialog::notifyOnlineCheckBoxToggled( bool checked ) { - soundEdit_->setEnabled( checked ); + soundEdit_ ->setEnabled( checked ); soundButton_->setEnabled( checked ); - playButton_->setEnabled( checked ); + playButton_ ->setEnabled( checked ); } @@ -309,14 +346,14 @@ void ContactPropertiesDialog::notifyOnlineCheckBoxToggled(bool checked) void ContactPropertiesDialog::restoreContactPicture() { // Restore the contact's picture - QString originalPicture = contact_->getExtension()->getContactPicturePath(); + QString originalPicture( contact_->getExtension()->getContactPicturePath() ); if( originalPicture.isEmpty() ) { originalPicture = contact_->getContactDefaultPicturePath(); } - QPixmap pixmap( originalPicture ); + const QPixmap& pixmap( originalPicture ); if( ! pixmap.isNull() ) { @@ -341,10 +378,10 @@ void ContactPropertiesDialog::setupWidgets() restoreButton_->hide(); trueNameLabel_->setFont( font ); - trueNameLabel_->setText( Qt::escape( contact_->getTrueFriendlyName() ) ); + trueNameLabel_->setText( contact_->getTrueFriendlyName( STRING_LIST_SETTING_ESCAPED ) ); // Set the informations about contact - QString pm = Qt::escape( contact_->getPersonalMessage() ); + const QString& pm( contact_->getPersonalMessage( STRING_LIST_SETTING_ESCAPED ) ); if( pm.isEmpty() ) { // Hide to avoid blank space @@ -356,11 +393,12 @@ void ContactPropertiesDialog::setupWidgets() } QString lastSeenString, lastMessageString; + if( contact_->isOnline() ) { lastSeenString = i18n( "Connected" ); } - else if( extension->getLastSeen().isNull() ) + else if( extension->getLastSeen().toTime_t() == 0 || extension->getLastSeen().isNull() ) { lastSeenString = i18n( "Not seen yet" ); } @@ -369,7 +407,7 @@ void ContactPropertiesDialog::setupWidgets() lastSeenString = extension->getLastSeen().toString(); } - if( extension->getLastMessageDate().isNull() ) + if( extension->getLastMessageDate().toTime_t() == 0 || extension->getLastMessageDate().isNull() ) { lastMessageString = i18n( "No messages yet" ); } @@ -378,11 +416,11 @@ void ContactPropertiesDialog::setupWidgets() lastMessageString = extension->getLastMessageDate().toString(); } - lastSeenLabel_ ->setText( i18n( "Last seen: %1", lastSeenString ) ); - lastMessageLabel_ ->setText( i18n( "Last message: %1", lastMessageString ) ); - emailLabel_ ->setText( i18n( "Email: %1", contact_->getHandle() ) ); - clientLabel_ ->setText( i18n( "Client: %1", contact_->getClientAppName() ) ); - nameEdit_ ->setText( extension->getAlternativeName() ); + lastSeenLabel_ ->setText( i18nc( "Contact props dialog info", "Last seen: %1", lastSeenString ) ); + lastMessageLabel_ ->setText( i18nc( "Contact props dialog info", "Last message: %1", lastMessageString ) ); + emailLabel_ ->setText( i18nc( "Contact props dialog info", "Email address: %1", contact_->getHandle() ) ); + clientLabel_ ->setText( i18nc( "Contact props dialog info", "Client: %1", contact_->getClientAppName() ) ); + nameEdit_ ->setText( extension->getAlternativeName( STRING_ORIGINAL ) ); notesEdit_ ->setPlainText( extension->getNotes() ); alternativeNameCheckBox_->setChecked( extension->getUseAlternativeName() ); @@ -391,9 +429,7 @@ void ContactPropertiesDialog::setupWidgets() notifyOnlineCheckBoxToggled( extension->getNotifyOnline() ); // Set the contact picture - QString picturePath = contact_->getContactPicturePath(); - - QPixmap pixmap( picturePath ); + QPixmap pixmap( contact_->getContactPicturePath() ); // If pixmap is null set the default contact picture if( pixmap.isNull() ) @@ -414,11 +450,11 @@ void ContactPropertiesDialog::setupWidgets() soundEdit_->setText( extension->getContactSoundPath() ); // Set the group list - QStringList groupIdsList = contact_->getGroupIds(); - QList groupContactList = CurrentAccount::instance()->getContactList()->getGroupList(); + const QStringList& groupIdsList( contact_->getGroupIds() ); + const QList& groupContactList( CurrentAccount::instance()->getContactList()->getGroupList() ); QListWidgetItem *item; - foreach( Group *group, groupContactList ) + foreach( const Group *group, groupContactList ) { if( ! group->isSpecialGroup() ) { @@ -437,11 +473,16 @@ void ContactPropertiesDialog::setupWidgets() } } - // Set the pictures list - QStringList pictureList( extension->getPictureList() ); - QListWidgetItem *pictureItem; + // If contact isn't in FL disable the group list + if( ! contact_->isFriend() ) + { + groupList_->setEnabled( false ); + } - foreach( QString pictureFile, pictureList ) + // Set the pictures list + const QStringList& pictureList( extension->getPictureList() ); + + foreach( const QString &pictureFile, pictureList ) { // Load into QPixmap and check if the pixmap is valid if( ! pixmap.load( pictureFile ) ) @@ -450,18 +491,30 @@ void ContactPropertiesDialog::setupWidgets() } // Set the new item and put it into pictures list - pictureItem = new QListWidgetItem(); - pictureItem->setIcon( QIcon( pixmap ) ); + item = new QListWidgetItem(); + item->setIcon( QIcon( pixmap ) ); + item->setData( Qt::UserRole, pictureFile ); QFile fileDat( pictureFile + ".dat" ); if ( fileDat.exists() && fileDat.open( QIODevice::ReadOnly | QIODevice::Text ) ) { QTextStream in( &fileDat ); - pictureItem->setText( in.readLine() ); + item->setText( in.readLine() ); fileDat.close(); } - pictureList_->addItem( pictureItem ); + pictureList_->addItem( item ); + } + + // Set up the emoticon blacklist + const QStringList& blackList( contact_->getEmoticonBlackList() ); + foreach( const QString &shortcut, blackList ) + { + item = new QListWidgetItem(); + item->setData( Qt::UserRole, shortcut ); + item->setText( KMessShared::htmlUnescape( shortcut ) ); + + blackListView_->addItem( item ); } } @@ -496,10 +549,28 @@ void ContactPropertiesDialog::slotClearCache() +// The user has selected or deselected something in the emoticon blacklist +void ContactPropertiesDialog::slotEmoticonSelectionChanged() +{ + // Only activate the Remove Emoticon button if an item is selected + removeEmoticonButton_->setEnabled( ! blackListView_->selectedItems().isEmpty() ); +} + + + +// The user has selected or deselected something in the pictures list +void ContactPropertiesDialog::slotPictureSelectionChanged() +{ + // Only activate the Use as personal image button if an item is selected + useButton_->setEnabled( ! pictureList_->selectedItems().isEmpty() ); +} + + + // The play sound button has been pressed void ContactPropertiesDialog::slotPlaySound() { - QString currentFile = soundEdit_->text(); + const QString& currentFile( soundEdit_->text() ); if( currentFile.isEmpty() ) { return; @@ -528,6 +599,33 @@ void ContactPropertiesDialog::slotPlaySound() +// Remove a blacklisted emoticon +void ContactPropertiesDialog::slotRemoveEmoticon() +{ + QListWidgetItem *item = blackListView_->currentItem(); + + if( item == 0 ) + { +#ifdef KMESSDEBUG_CONTACTPROPERTIES + kDebug() << "No emoticon selected!"; +#endif + return; + } + + bool removed = contact_->manageEmoticonBlackList( false, item->data( Qt::UserRole ).toString() ); + +#ifdef KMESSDEBUG_CONTACTPROPERTIES + kDebug() << "Blacklist operation succeeded?" << removed; +#endif + + if( removed ) + { + delete item; + } +} + + + // Called when media sound finished void ContactPropertiesDialog::slotSoundFinished() { @@ -536,4 +634,66 @@ void ContactPropertiesDialog::slotSoundFinished() } + +// Use the selected picture as personal image +void ContactPropertiesDialog::slotUsePicture() +{ + // Check if the selection is valid + const QListWidgetItem *item = pictureList_->currentItem(); + if( item == 0 ) + { + return; + } + + // Grep the filename of the picture + QFile file( item->data( Qt::UserRole ).toString() ); + if( ! file.exists() ) + { + // The file doesn't exist + return; + } + + // Ask confirmation to the user + int result = KMessageBox::questionYesNo( this, + i18nc( "Dialog box text", + "Are you sure you want to use the display " + "picture of this contact?" ), + i18n( "Copy Contact Picture" ), + KStandardGuiItem::yes(), + KStandardGuiItem::no(), + QString( "copyContactPicture" ) ); + if( result == KMessageBox::No ) + { + return; + } + + const QFileInfo fileInfo( file ); + CurrentAccount *account = CurrentAccount::instance(); + const QString& accountHandle( account->getHandle() ); + const QString& pictureDirPath( KMessConfig::instance()->getAccountDirectory( accountHandle ) + "/displaypics/" ); + + const QString& newFileName( pictureDirPath + fileInfo.fileName() ); + + // If the file already exists in the personal picture directory, use it + // Else copy it from contact directory + if( ! QFile::exists( newFileName ) ) + { + // Check if the directory already created ( Note: this check is necessary because + // if the user doesn't never set one personal image, the directory doesn't exist ) + QDir pictureDir( pictureDirPath ); + if( ! pictureDir.exists() ) + { + // Create the missing directory + pictureDir.mkpath( pictureDirPath ); + } + if( ! file.copy( newFileName ) ) + { + return; + } + } + + // Set the new picture + account->setPicturePath( newFileName ); +} + #include "contactpropertiesdialog.moc" diff --git a/src/dialogs/contactpropertiesdialog.h b/src/dialogs/contactpropertiesdialog.h index 190e39c..560c87b 100644 --- a/src/dialogs/contactpropertiesdialog.h +++ b/src/dialogs/contactpropertiesdialog.h @@ -41,6 +41,8 @@ class ContactPropertiesDialog : public KDialog, private Ui::ContactProperties public: ContactPropertiesDialog( QWidget *parent=0 ); virtual ~ContactPropertiesDialog(); + // Clear the qlistwidget if there are already object + void clearLists(); // Show the dialog and obtain the contact handle. bool launch( Contact *contact, bool openNotesTab = false ); @@ -68,10 +70,18 @@ class ContactPropertiesDialog : public KDialog, private Ui::ContactProperties void slotButtonClicked( int button ); // The "Clear cache" button has been pressed void slotClearCache(); + // The user has selected or deselected something in the emoticon blacklist + void slotEmoticonSelectionChanged(); + // The user has selected or deselected something in the pictures list + void slotPictureSelectionChanged(); // The play sound button has been pressed void slotPlaySound(); + // Remove a blacklisted emoticon + void slotRemoveEmoticon(); // Called when media sound finished void slotSoundFinished(); + // Use the selected picture as personal image + void slotUsePicture(); private: // Private attributes // Alternative picture path diff --git a/src/dialogs/contactpropertiesdialog.ui b/src/dialogs/contactpropertiesdialog.ui index 2eedb37..6e87d9d 100644 --- a/src/dialogs/contactpropertiesdialog.ui +++ b/src/dialogs/contactpropertiesdialog.ui @@ -5,12 +5,12 @@ 0 0 - 387 - 437 + 461 + 454 - Contact Properties for %1 + @@ -19,14 +19,6 @@ 0 - - - 0 - 0 - 371 - 397 - - &Information @@ -68,8 +60,11 @@ + + Click this button to restore the display picture of this contact + - Restore + &Restore @@ -117,7 +112,7 @@ - + @@ -180,7 +175,10 @@ - Groups: + &Groups: + + + groupList_ @@ -215,7 +213,7 @@ - Use alternative name for this person + Use an &alternative name for this person @@ -225,7 +223,7 @@ - Show a popup when the contact goes online/offline + Show a &popup when the contact goes online/offline @@ -234,7 +232,10 @@ - Sound: + &Sound: + + + soundEdit_ @@ -253,7 +254,7 @@ - ... + @@ -277,14 +278,6 @@ - - - 0 - 0 - 371 - 397 - - I&mages @@ -329,6 +322,19 @@ + + + + false + + + Click here to use the selected picture as your display picture + + + Use As Display Picture + + + @@ -341,16 +347,8 @@ - - - 0 - 0 - 371 - 397 - - - Notes + &Notes @@ -358,6 +356,103 @@ + + + &Emoticons + + + + + + You can choose to hide any emoticon received from this contact. Just right-click on a received emoticon and choose "Ignore this Emoticon". +With this page, you can restore the hidden emoticons. + + + Qt::AlignJustify|Qt::AlignVCenter + + + true + + + + + + + true + + + Qt::ScrollBarAlwaysOff + + + true + + + QAbstractItemView::SelectRows + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + + + QListView::Free + + + QListView::Fixed + + + QListView::ListMode + + + true + + + true + + + true + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 170 + 21 + + + + + + + + false + + + Click here to delete the selected emoticon + + + Remo&ve + + + Alt+V + + + + + + + diff --git a/src/dialogs/invitedialog.cpp b/src/dialogs/invitedialog.cpp new file mode 100644 index 0000000..9dc58e7 --- /dev/null +++ b/src/dialogs/invitedialog.cpp @@ -0,0 +1,265 @@ +/*************************************************************************** + invitedialog.cpp - description + ------------------- + begin : Wed Oct 31 2008 + copyright : (C) 2008 by Antonio Nastasi + email : sifcenter@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "invitedialog.h" + +#include "contactentry.h" +#include "../currentaccount.h" +#include "../contact/contact.h" +#include "../model/contactlist.h" +#include "../utils/kmessconfig.h" + +#include + + + +// Constructor +InviteDialog::InviteDialog( const QStringList &usersAlreadyInChat, QStringList &usersToInvite, QWidget *parent ) +: KDialog( parent ) +, Ui::InviteDialog() +{ + // Set up the interface and the dialog + setObjectName( "Invite" ); + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setMainWidget( mainWidget ); + setWindowModality( Qt::ApplicationModal ); + setCaption( i18nc("Caption of a dialog box", "Invite Contacts") ); + setButtons( Ok | Cancel ); + setDefaultButton( Ok ); + restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "InviteDialog" ) ); + + // Setup the layouts + contactsLayout_ = static_cast( contactsArea_->layout() ); + contactsLayout_->addStretch(); + invitedLayout_ = static_cast( invitedArea_->layout() ); + invitedLayout_->addStretch(); + + // Set buttons + addButton_ ->setIcon( KIcon( "go-next" ) ); + removeButton_->setIcon( KIcon( "go-previous" ) ); + connect( addButton_, SIGNAL( clicked() ), this, SLOT( addContact() ) ); + connect( removeButton_, SIGNAL( clicked() ), this, SLOT( removeContact() ) ); + + // Set the other contact button + otherButton_->setIcon( KIcon( "contact-new" ) ); + connect( otherButton_, SIGNAL( clicked() ), this, SLOT( addOtherContactEntry() ) ); + connect( otherEdit_, SIGNAL( returnPressed() ), this, SLOT( addOtherContactEntry() ) ); + + // Search widgets + searchIcon_->setPixmap( KIconLoader::global()->loadIcon( "edit-find-user", KIconLoader::Small ) ); + connect( searchEdit_, SIGNAL( textChanged(QString) ), this, SLOT( searchTextChanged() ) ); + + // Calls update interface + updateInterface( usersAlreadyInChat ); + + // Show the dialog modally + int result = exec(); + + // Set the result stringlist if the user has pressed the Ok button + if( result == QDialog::Accepted ) + { + usersToInvite = usersToInvite_; + } + else + { + usersToInvite = QStringList(); + } + + kDebug() << "Users to invite: " << usersToInvite; + + // Schedule the dialog for deletion + deleteLater(); +} + + + +// Destructor +InviteDialog::~InviteDialog() +{ + kDebug() << "DESTROYED"; + + // Save the dialog size and position + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "InviteDialog" ); + saveDialogSize( group ); + + // Delete all widgets + qDeleteAll( contactEntryList_ ); +} + + +// Add contact to invite list +void InviteDialog::addContact() +{ + ContactEntry *contactEntry; + foreach( contactEntry, contactEntryList_ ) + { + if( ! contactEntry->isSelected() ) + { + continue; + } + + // Remove entry from contact list and add to invited contact list + contactsLayout_->removeWidget( contactEntry ); + invitedLayout_->insertWidget( 0, contactEntry ); + usersToInvite_.append( contactEntry->getHandle() ); + + invitedContacts_.append( contactEntry ); + contactEntryList_.removeAll( contactEntry ); + contactEntry->click(); + } +} + + + +// The other contact insert button was pressed +void InviteDialog::addOtherContactEntry() +{ + // Grep the text and clean the QLineEdit + QString handle( otherEdit_->text() ); + otherEdit_->setText( "" ); + + // Check if the handle is empty or if the users to invite list contains already it + // or if account isn't valid email + if( handle.isEmpty() || usersToInvite_.contains( handle ) + || ! Account::isValidEmail( handle ) ) + { + return; + } + + ContactEntry *contactEntry; + + // Check if the handle is of one contact we have already in contact list + // We need to check only the contact list ( no invited list ) beacuse we check already + // for it in usersToInvite_ + foreach( contactEntry, contactEntryList_ ) + { + if( contactEntry->getHandle() == handle ) + { + // Remove entry from contact list and add to invited contact list + contactsLayout_->removeWidget( contactEntry ); + invitedLayout_->insertWidget( 0, contactEntry ); + usersToInvite_.append( contactEntry->getHandle() ); + invitedContacts_.append( contactEntry ); + contactEntryList_.removeAll( contactEntry ); + return; + } + } + + // Insert in the invited contact + contactEntry = new ContactEntry( handle ); + connect( contactEntry, SIGNAL( clicked() ), this, SLOT( contactClicked() ) ); + + invitedContacts_.append( contactEntry ); + invitedLayout_->insertWidget( 0, contactEntry ); +} + + + +// One contact entry was pressed +void InviteDialog::contactClicked() +{ + // Grep the pointer of widget clicked and select/deselect it + ContactEntry *contactEntry = static_cast( sender() ); + if( contactEntry != 0 ) + { + kDebug() << contactEntry->isSelected(); + contactEntry->click(); + } +} + + + +// Remove contact from invite list +void InviteDialog::removeContact() +{ + ContactEntry *contactEntry; + foreach( contactEntry, invitedContacts_) + { + if( ! contactEntry->isSelected() ) + { + continue; + } + + // Remove entry from invited contact list and add to contact list + invitedLayout_->removeWidget( contactEntry ); + contactsLayout_->insertWidget( 0, contactEntry ); + usersToInvite_.removeAll( contactEntry->getHandle() ); + contactEntryList_.append( contactEntry ); + invitedContacts_.removeAll( contactEntry ); + + // Deselect the entry + contactEntry->click(); + } +} + + + +// The search text was changed +void InviteDialog::searchTextChanged() +{ + QString text = searchEdit_->text().toLower(); + ContactEntry *contactEntry; + + foreach( contactEntry, contactEntryList_ ) + { + if( contactEntry->getHandle() .toLower().contains( text ) + || contactEntry->getFriendlyName().toLower().contains( text ) ) + { + contactEntry->show(); + continue; + } + + contactEntry->click( true ); + contactEntry->hide(); + } +} + + + +// Update the interface with the contact entries +void InviteDialog::updateInterface( const QStringList &usersAlreadyInChat, bool onlyOnline ) +{ + const Contact *contact; + ContactEntry *contactEntry; + CurrentAccount *currentAccount = CurrentAccount::instance(); + QHashIterator it( currentAccount->getContactList()->getContactList() ); + + // Interate to add each contact + while ( it.hasNext() ) + { + contact = it.next().value(); + + // If the current user is already in multi-chat, jump to next + if( usersAlreadyInChat.contains( contact->getHandle() ) ) + { + continue; + } + + // Check if the contact is online or if we want also the offline contacts + if( contact->isOnline() || ! onlyOnline ) + { + contactEntry = new ContactEntry( contact ); + contactEntryList_.append( contactEntry ); + contactsLayout_->insertWidget( 0, contactEntry ); + connect( contactEntry, SIGNAL( clicked() ), this, SLOT( contactClicked() ) ); + } + } +} + + +#include "invitedialog.moc" diff --git a/src/dialogs/invitedialog.h b/src/dialogs/invitedialog.h new file mode 100644 index 0000000..b657d2d --- /dev/null +++ b/src/dialogs/invitedialog.h @@ -0,0 +1,67 @@ +/*************************************************************************** + invitedialog.h - description + ------------------- + begin : Wed Oct 31 2008 + copyright : (C) 2008 by Antonio Nastasi + email : sifcenter@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef INVITEDIALOG_H +#define INVITEDIALOG_H + +#include "ui_invitedialog.h" + +class ContactEntry; + + + +class InviteDialog : public KDialog, private Ui::InviteDialog +{ + Q_OBJECT + + public: + // Constructor + InviteDialog( const QStringList &usersAlreadyInChat, QStringList &usersToInvite, QWidget *parent = 0 ); + // Destructor + ~InviteDialog(); + + private: // private method + // Update the interface with the contact entries + void updateInterface( const QStringList &usersAlreadyInChat, bool onlyOnline = true ); + + private: // private attributes + // Layout for contacts + QVBoxLayout *contactsLayout_; + // Layout for invited contacts + QVBoxLayout *invitedLayout_; + // All users selected for the invitation + QStringList usersToInvite_; + // All contact entries + QList contactEntryList_; + // All invited contact entries + QList invitedContacts_; + + private slots: + // Add contact to invite list + void addContact(); + // The other contact insert button was pressed + void addOtherContactEntry(); + // One contact entry was pressed + void contactClicked(); + // Removed contact from invite list + void removeContact(); + // The search text was changed + void searchTextChanged(); +}; + + +#endif diff --git a/src/dialogs/invitedialog.ui b/src/dialogs/invitedialog.ui new file mode 100644 index 0000000..691bcbe --- /dev/null +++ b/src/dialogs/invitedialog.ui @@ -0,0 +1,186 @@ + + InviteDialog + + + + 0 + 0 + 614 + 468 + + + + + + + + + + Available Contacts + + + false + + + + + + + + QFrame::NoFrame + + + + + + + + + + + + + + + true + + + + + 0 + 0 + 259 + 316 + + + + + 1 + + + 1 + + + + + + + + + Invite a contact not on your list: + + + otherEdit_ + + + + + + + + + Insert the email of a contact to invite + + + + + + + + + + + + + + + + + + + Invited Contacts + + + + + + true + + + + + 0 + 0 + 259 + 409 + + + + + 1 + + + 1 + + + + + + + + + + + + 0 + + + 0 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + ... + + + + + + + ... + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + diff --git a/src/dialogs/listexportdialog.cpp b/src/dialogs/listexportdialog.cpp new file mode 100644 index 0000000..ecc0e4d --- /dev/null +++ b/src/dialogs/listexportdialog.cpp @@ -0,0 +1,307 @@ +/*************************************************************************** + listexportdialog.cpp - description + ------------------- + begin : Tue Sep 09 2008 + copyright : (C) 2008 by Antonio Nastasi + email : sifcenter@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "listexportdialog.h" + +#include "../contact/contact.h" +#include "../model/contactlist.h" +#include "../utils/kmessshared.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" + +#include +#include + +#include + + +ListExportDialog::ListExportDialog( QWidget *parent ) + : QWidget( parent ) +{ + setObjectName( "ListExport" ); + setupUi( this ); + + // Connect the signal and set the icons for the buttons + connect( exportButton_, SIGNAL( clicked() ), this, SLOT( slotExport() ) ); + connect( closeButton_, SIGNAL( clicked() ), this, SLOT( hide() ) ); + connect( selectAllButton_, SIGNAL( clicked() ), this, SLOT( slotSelectAll() ) ); + connect( deselectAllButton_, SIGNAL( clicked() ), this, SLOT( slotDeselectAll() ) ); + + exportButton_->setIcon( KIcon( "document-export" ) ); + closeButton_ ->setIcon( KIcon( "dialog-close" ) ); + + setupWidgets(); +} + + + +ListExportDialog::~ListExportDialog() +{ + kDebug() << "DESTROYED"; +} + + + +// Returns the string formatted in csv +QString ListExportDialog::getCsvString( const QString &text ) +{ + QString csvFormatted( text ); + // Replace the " with "" + csvFormatted.replace( "\"", "\"\"" ); + + // If text contains "," char, use the " chars + if( csvFormatted.contains( "," ) ) + { + csvFormatted = "\"" + csvFormatted + "\""; + } + + return csvFormatted; +} + + + +// Setup the widgets +void ListExportDialog::setupWidgets() +{ + QListWidgetItem *currentItem; + CurrentAccount *currentAccount = CurrentAccount::instance(); + + setWindowTitle( i18n( "Export Contact List for %1", currentAccount->getHandle() ) ); + csvButton_->setChecked( true ); + + // Fill the exportable items list + QStringList exportableItems; + exportableItems << "Handle" << "Friendlyname" << "Current PM"; + foreach( const QString &item, exportableItems ) + { + currentItem = new QListWidgetItem( item, itemsListWidget_ ); + currentItem->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); + currentItem->setCheckState( Qt::Checked ); + } + + // Grep the current contact list + QHash contacts = currentAccount->getContactList()->getContactList(); + + // If the list is empty, disable the export button and notify this to user + if( contacts.size() == 0 ) + { + currentItem = new QListWidgetItem( i18n( "Nothing to export" ), contactListWidget_ ); + + selectAllButton_ ->setEnabled( false ); + deselectAllButton_->setEnabled( false ); + exportButton_ ->setEnabled( false ); + return; + } + + // Catch all contacts in the contact list of current account and put it in the list widget + QHashIterator i( contacts ); + Contact *contact; + + while( i.hasNext() ) + { + i.next(); + contact = i.value(); + + // Use the checkable style + currentItem = new QListWidgetItem( contact->getHandle(), contactListWidget_ ); + currentItem->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled ); + currentItem->setCheckState( Qt::Checked ); + } +} + + + +// The export button was pressed +void ListExportDialog::slotExport() +{ + // Use the file dialog to determinate the file name + QString fileName( QFileDialog::getSaveFileName( this ) ); + + // Check if the filename is empty + if( fileName.isEmpty() ) + { + return; + } + + // Check if the file has the extension and add one if there isn't. + QFileInfo fileInfo( fileName ); + if( fileInfo.suffix().isEmpty() ) + { + if( csvButton_->isChecked() ) + { + fileName += ".csv"; + } + else if( xmlButton_->isChecked() ) + { + fileName += ".xml"; + } + } + + // Check if the file already exists + QFile file( fileName ); + if( file.exists() ) + { + if( QMessageBox::question( this, i18n( "File exists" ), + i18n( "The file %1 already exists, do you want to overwrite?", fileName ), + QMessageBox::Yes | QMessageBox::No ) != QMessageBox::Yes ) + { + return; + } + } + + // Open the file for the writing + if( ! file.open( QIODevice::WriteOnly | QIODevice::Text ) ) + { + return; + } + + QTextStream out( &file ); + + // Get all items and save in select format + QListWidgetItem *currentContact; + Contact *contact; + bool isCsv = csvButton_->isChecked(); + QString text; + + if( ! isCsv ) + { + // XML format was selected + out << "\n"; + } + + for( int i = 0; i < contactListWidget_->count(); i++ ) + { + // Check which contacts the user wants to export + currentContact = contactListWidget_->item( i ); + if( currentContact->checkState() != Qt::Checked ) + { + continue; + } + + if( ! isCsv ) + { + // XML format was selected + out << "\t\n"; + } + + // Check which items the user wants to save + // Handle + if( itemsListWidget_->item( 0 )->checkState() == Qt::Checked ) + { + // CSV + if( isCsv ) + { + out << getCsvString( currentContact->text() ); + } + else + { + out << "\t\t" + currentContact->text() + "\n"; + } + } + + // Friendly name + if( itemsListWidget_->item( 1 )->checkState() == Qt::Checked ) + { + contact = CurrentAccount::instance()->getContactList()->getContactByHandle( currentContact->text() ); + if( contact != NULL ) + { + // CSV + if( isCsv ) + { + out << "," << getCsvString( contact->getFriendlyName() ); + } + else + { + text = contact->getFriendlyName( STRING_ORIGINAL ); + out << "\t\t" + KMessShared::htmlEscape( text ) + + "\n"; + } + } + } + + // Personal Message + if( itemsListWidget_->item( 2 )->checkState() == Qt::Checked ) + { + contact = CurrentAccount::instance()->getContactList()->getContactByHandle( currentContact->text() ); + if( contact != NULL ) + { + // CSV + if( isCsv ) + { + out << "," << getCsvString( contact->getPersonalMessage( STRING_ORIGINAL ) ); + } + else + { + text = contact->getPersonalMessage( STRING_ORIGINAL ); + out << "\t\t" + KMessShared::htmlEscape( text ) + + "\n"; + } + } + } + + if( isCsv ) + { + out << "\n"; + } + else + { + out << "\t\n"; + } + } + + if( ! isCsv ) + { + // XML format was selected + out << ""; + } + + QMessageBox::information( this, i18n( "Export Finished" ), i18n( "The export of the contact list is finished" ) ); + file.close(); + hide(); +} + + + +// Select or deselect the items of the contact list +void ListExportDialog::selectAll( bool select ) +{ + QListWidgetItem *currentContact; + for( int i = 0; i < contactListWidget_->count(); i++ ) + { + // Select or deselect item + currentContact = contactListWidget_->item( i ); + currentContact->setCheckState( select ? Qt::Checked : Qt::Unchecked ); + } +} + + + +// The deselect all button was pressed +void ListExportDialog::slotDeselectAll() +{ + selectAll( false ); +} + + + +// The select all button was pressed +void ListExportDialog::slotSelectAll() +{ + selectAll(); +} + +#include "listexportdialog.moc" diff --git a/src/dialogs/listexportdialog.h b/src/dialogs/listexportdialog.h new file mode 100644 index 0000000..4040637 --- /dev/null +++ b/src/dialogs/listexportdialog.h @@ -0,0 +1,54 @@ +/*************************************************************************** + listexportdialog.h - description + ------------------- + begin : Tue Sep 09 2008 + copyright : (C) 2008 by Antonio Nastasi + email : sifcenter@gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef LISTEXPORTDIALOG_H +#define LISTEXPORTDIALOG_H + +#include "ui_listexportdialog.h" + + +/** + * A dialog to export the contact list + * + * @author Antonio Nastasi + */ +class ListExportDialog : public QWidget, private Ui::ListExportDialog +{ + Q_OBJECT + + public: + ListExportDialog( QWidget *parent = 0 ); + ~ListExportDialog(); + + private: // private methods + // Returns the string formatted in csv + QString getCsvString( const QString &text ); + // Select or deselect the items of the contact list + void selectAll( bool select = true ); + // Setup the widgets + void setupWidgets(); + + private slots: + // The export button was pressed + void slotExport(); + // The deselect all button was pressed + void slotDeselectAll(); + // The select all button was pressed + void slotSelectAll(); +}; + +#endif diff --git a/src/dialogs/listexportdialog.ui b/src/dialogs/listexportdialog.ui new file mode 100644 index 0000000..7537607 --- /dev/null +++ b/src/dialogs/listexportdialog.ui @@ -0,0 +1,133 @@ + + ListExportDialog + + + + 0 + 0 + 553 + 464 + + + + + + + + + Items to export: + + + + + + + + + + true + + + Format + + + + + + CSV + + + + + + + XML + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Contacts: + + + + + + + + + + + + Select All + + + + + + + Deselect All + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Export... + + + + + + + Close + + + + + + + + + + diff --git a/src/dialogs/networkwindow.cpp b/src/dialogs/networkwindow.cpp index 00b0fd4..30d7941 100644 --- a/src/dialogs/networkwindow.cpp +++ b/src/dialogs/networkwindow.cpp @@ -17,8 +17,6 @@ #include "../kmessdebug.h" -#ifdef KMESS_NETWORK_WINDOW - #include "networkwindow.h" #include "../network/mimemessage.h" @@ -53,7 +51,8 @@ NetworkWindow::NetworkWindow( QWidget *parent ) , Ui::NetworkWindow() { // Set up the dialog and its buttons - setButtons( Close | User1 | User2 ); + setObjectName( "Network" ); + setButtons( Close | User1 | User2 | User3 ); setDefaultButton( Close ); setCaption( i18n("Network Window") ); restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "NetworkWindow" ) ); @@ -76,12 +75,15 @@ NetworkWindow::NetworkWindow( QWidget *parent ) connect( sendCommandButton_, SIGNAL( released() ), this, SLOT( slotSendCommand() ) ); // Name our custom buttons and setup their behavior - setButtonText( User1, i18n("S&ave tab") ); - setButtonText( User2, i18n("C&lear tab") ); + setButtonText( User1, i18n("S&ave Tab") ); + setButtonText( User2, i18n("C&lear Tab") ); + setButtonText( User3, i18n("C&lose All Tabs") ); setButtonIcon( User1, KIcon("document-save") ); setButtonIcon( User2, KIcon("edit-clear-list") ); + setButtonIcon( User3, KIcon("edit-clear") ); connect( this, SIGNAL( user1Clicked() ), this, SLOT( saveCurrentTab() ) ); connect( this, SIGNAL( user2Clicked() ), this, SLOT( clearCurrentTab() ) ); + connect( this, SIGNAL( user3Clicked() ), this, SLOT( closeAllTabs() ) ); // Set the default state of the ui widgets sendStandardCmdRadio_->setChecked( true ); @@ -117,7 +119,7 @@ NetworkWindow::~NetworkWindow() entry->logView->append( "

     

    " ); } - entry->logView->append( html ); + entry->logView->append( html.toUtf8() ); entry->lastMessage = now; // Update the widgets for the currently visible tab @@ -130,7 +132,7 @@ NetworkWindow::~NetworkWindow() void NetworkWindow::addLogMessage(QObject *connection, const QString &message) { ConnectionEntry *entry = getConnectionEntry(connection); - QString html = "

      " + message + "

    \n"; + QString html( "

      " + message + "

    \n" ); addMessage( entry, html ); } @@ -140,7 +142,7 @@ NetworkWindow::~NetworkWindow() void NetworkWindow::addIncomingMessage(QObject *connection, const QByteArray &message) { ConnectionEntry *entry = getConnectionEntry(connection); - QString html = "


    " + formatMessage(entry, true, message) + "

    \n"; + QString html( "


    " + formatMessage(entry, true, message) + "

    \n" ); addMessage(entry, html); } @@ -150,7 +152,7 @@ NetworkWindow::~NetworkWindow() void NetworkWindow::addOutgoingMessage(QObject *connection, const QByteArray &message) { ConnectionEntry *entry = getConnectionEntry(connection); - QString html = "


    " + formatMessage(entry, false, message) + "

    \n"; + QString html( "


    " + formatMessage(entry, false, message) + "

    \n" ); addMessage(entry, html); } @@ -173,7 +175,7 @@ NetworkWindow::~NetworkWindow() // Return a log description for a standard command. QString NetworkWindow::describeCommand(const QString &command) { - QString firstPart = command.left(3); // command[0] in normal code. + QString firstPart( command.left(3) ); // command[0] in normal code. int errorCode = firstPart.toInt(); if( errorCode != 0 ) @@ -357,7 +359,7 @@ NetworkWindow::~NetworkWindow() } // Return a description based on the content type - QString contentType = rx.cap(1); + QString contentType( rx.cap(1) ); // Notification server messages @@ -369,17 +371,17 @@ NetworkWindow::~NetworkWindow() else if( contentType == "text/x-msmsgsinitialemailnotification" ) { // The initial status of the mailbox - return formatDescription("Initial e-mail status message"); + return formatDescription("Initial email status message"); } else if( contentType == "text/x-msmsgsemailnotification" ) { - // A new e-mail was received - return formatDescription("New e-mail notification message"); + // A new email was received + return formatDescription("New email notification message"); } else if( contentType == "text/x-msmsgsactivemailnotification" ) { - // The number of unread e-mails has changed - return formatDescription("E-mail activity message"); + // The number of unread emails has changed + return formatDescription("Email activity message"); } else if( contentType == "application/x-msmsgssystemmessage" ) { @@ -389,7 +391,7 @@ NetworkWindow::~NetworkWindow() else if( contentType == "text/x-msmsgsinitialmdatanotification" ) { // Another contact sent an Offline-IM, which is received upon logging-in - return formatDescription("Offline-IM notification or Hotmail e-mail status"); + return formatDescription("Offline-IM notification or Hotmail email status"); } else if( contentType == "text/x-msmsgsoimnotification" ) { @@ -490,12 +492,13 @@ NetworkWindow::~NetworkWindow() switch( flags ) { case 0: + case 0x1000000: // since WLM 2009 // Check for abuse of the P2P system (datacast emulation) if( sessionId == 64 ) { if( dataOffset > 0 ) { - QString partName = ( dataOffset + dataSize ) >= totalSize ? "last part" : "next part"; + QString partName( ( dataOffset + dataSize ) >= totalSize ? "last part" : "next part" ); return formatDescription("Ink message over P2P, " + partName); } else @@ -504,6 +507,15 @@ NetworkWindow::~NetworkWindow() } } + // Another awkward data message (webcam setup) + if( sessionId != 0 + && flags == 0 + && dataSize >= 18 + && message[ headerStart + 48 ] == '\x80' ) + { + return formatDescription("Webcam setup message"); + } + // No flags means the contents is a string with SLP-like mime fields, used to negotiate the session. // datasize of 0 is not handed here, is an invalid packet. // KMess does parse it as ACK message for compatibility with broken clients. @@ -513,13 +525,13 @@ NetworkWindow::~NetworkWindow() } else if( dataOffset > 0 ) { - QString partName = ( dataOffset + dataSize ) >= totalSize ? "last part" : "next part"; + QString partName( ( dataOffset + dataSize ) >= totalSize ? "last part" : "next part" ); return formatDescription("P2P Session negotiation message, " + partName); } else if( sessionId == 0 && dataSize > 4 ) { int preambleStart = headerStart + 48; - QString slpMessage = QString::fromUtf8( message.data() + preambleStart, message.size() - preambleStart - 5 ); // last 5 is for the footer code. + QString slpMessage ( QString::fromUtf8( message.data() + preambleStart, message.size() - preambleStart - 5 ) ); // last 5 is for the footer code. bool isTransfer = slpMessage.contains("Content-Type: application/x-msnmsgr-trans"); if( slpMessage.startsWith("INVITE ") ) { @@ -603,6 +615,7 @@ NetworkWindow::~NetworkWindow() "ackSid " + QString::number(ackSessionId) + ", session should terminate"); case 0x20: + case 0x1000020: // since WLM 2009 return formatDescription("P2P MsnObject data," " bytes " + QString::number(dataOffset) + "-" + QString::number(dataOffset + dataSize) + " of " + QString::number(totalSize)); @@ -681,7 +694,8 @@ NetworkWindow::~NetworkWindow() entry->type = TYPE_SB; } else if( memcmp(message.data(), "GET ", 4) == 0 - || memcmp(message.data(), "POST ", 5) == 0) + || memcmp(message.data(), "POST ", 5) == 0 + || memcmp(message.data(), "type = TYPE_HTTP; } @@ -747,7 +761,7 @@ NetworkWindow::~NetworkWindow() // Assume it's a standard connection. default: // Convert the message to UTF-8 - QString utf8Message = QString::fromUtf8( message.data(), message.size() ); + QString utf8Message( QString::fromUtf8( message.data(), message.size() ) ); // Treat Mime messages with P2P content different. if( utf8Message.contains("Content-Type: application/x-msnmsgrp2p") ) @@ -757,7 +771,7 @@ NetworkWindow::~NetworkWindow() if( mimeEnd != -1 ) { // Extract the first utf-8 mime part, locate start of p2p header - QString p2pMimePart = utf8Message.left(mimeEnd + 4); + QString p2pMimePart( utf8Message.left(mimeEnd + 4) ); int headerStart = p2pMimePart.toUtf8().size(); // convert mimeEnd index, utf-8 may have double characters // Add the mime part and binary p2p part @@ -862,7 +876,7 @@ NetworkWindow::~NetworkWindow() } // Show header information - logMessage += formatRawData(incoming, message, headerStart, 48, 16); + logMessage += formatRawData(incoming, message, headerStart, 48, 4, 16); // Add header debug details logMessage += ""; @@ -887,29 +901,40 @@ NetworkWindow::~NetworkWindow() logMessage += ""; // The message a utf-8 (MSNSLP) payload if the session id is zero. + const char *dataPtr = ( message.data() + p2pDataStart ); bool hasSlpPayload = ( sessionId == 0 && dataSize > 0 ); - int dataEnd = ( p2pDataStart + dataSize ); - int realEnd = ( message.size() ); + int safeEnd = qMin( message.size(), (int) ( p2pDataStart + dataSize ) ); + int safeSize = qMin( (int) dataSize, ( message.size() - p2pDataStart ) ); if( hasSlpPayload ) { // See if the SLP body is terminated with a final null character (should be). - bool hasSlpNullEnd = ( message[ dataEnd - 1 ] == 0x00 ); + int slpLength = safeSize; + bool hasSlpNullEnd = ( message[ p2pDataStart + slpLength - 1 ] == 0x00 ); if( hasSlpNullEnd ) { - dataEnd--; + slpLength--; } // Display the SLP body - QString slpMessage = QString::fromUtf8( message.data() + p2pDataStart, qMin( dataSize, (quint32) qMin( dataEnd, realEnd ) - p2pDataStart ) ); - logMessage += "\n
    " + formatString(slpMessage); + QString slpMessage( QString::fromUtf8( dataPtr, slpLength ) ); + logMessage += "\n
    " + formatString( slpMessage ); // Add message footer if( hasSlpNullEnd ) { - // Display the \0 that QString::fromUtf8() silently dropped - logMessage += formatRawData( incoming, message, dataEnd, 1 ); + // Display the \0 that was dropped in the QString::fromUtf8() call. + logMessage += formatRawData( incoming, message, slpLength, 1 ); } } + else if( dataSize >= 18 && message[ p2pDataStart ] == '\x80' ) + { + // Webcam invitation + QString camMessage( QString::fromUtf16( reinterpret_cast( dataPtr + 10 ), ( safeSize - 10 - 1 ) / 2 ) ); + + logMessage += "\n
    " + formatRawData( incoming, message, p2pDataStart, 10, 1 ) // 1 per col. + + "\n
    " + formatString( camMessage ) + + "\n
    " + formatRawData( incoming, message, safeEnd - 2, 2 ); // final null (in utf16). + } else { // Don't display the data. @@ -918,10 +943,9 @@ NetworkWindow::~NetworkWindow() // Display the remaining bytes, if any. // This is the footer when the p2p message is sent over the SB. - int remainingBytes = ( message.size() - dataEnd ); - if( remainingBytes > 0 ) + if( safeEnd < message.size() ) { - logMessage += "
    " + formatRawData( incoming, message, dataEnd, remainingBytes ); + logMessage += "
    " + formatRawData( incoming, message, safeEnd, message.size() - safeEnd ); } return logMessage; @@ -930,7 +954,7 @@ NetworkWindow::~NetworkWindow() // Format a utf-8 string to be displayed - QString NetworkWindow::formatRawData(bool incoming, const QByteArray &message, const int start, const int length, const int bytesPerRow) + QString NetworkWindow::formatRawData(bool incoming, const QByteArray &message, const int start, const int length, const int bytesPerCol, const int bytesPerRow) { QString logMessage; logMessage += ""; } - else if( i % 4 == 0 ) + else if( i % bytesPerCol == 0 ) { logMessage += " "; } @@ -974,7 +998,7 @@ NetworkWindow::~NetworkWindow() QString NetworkWindow::formatString(const QString &message) { // Parse any HTML characters. - QString logMessage = Qt::escape( message ); + QString logMessage( Qt::escape( message ) ); // Format newline characters logMessage = logMessage.replace("\r\n", "\\r\\n
    "); @@ -1009,6 +1033,9 @@ NetworkWindow::~NetworkWindow() // Add new tab connectionTabs_->addTab( entry->logView, KIcon( "edit-select-all" ), connection->objectName() ); + + // Enable the Close All Tabs button + enableButton( User3, ( connectionViews_.count() > 1 ) ); } // Initialize new connections and reinitialize old ones as open @@ -1067,15 +1094,13 @@ NetworkWindow::~NetworkWindow() return; QString path; - QString name = connectionTabs_->tabText( connectionTabs_->currentIndex() ); + QString name( connectionTabs_->tabText( connectionTabs_->currentIndex() ) ); path = KFileDialog::getSaveFileName( KUrl(), "*.html" ); if( path.isEmpty() ) return; -#ifdef KMESSDEBUG_CHATWINDOW_GENERAL kDebug() << "NetworkWindow - saving network log for window '" << name << "' to '" << path << "'."; -#endif bool failed = false; @@ -1088,7 +1113,7 @@ NetworkWindow::~NetworkWindow() } // Output the HTML with the right text encoding - QString text = static_cast( connectionTabs_->currentWidget() )->toHtml(); + QString text( static_cast( connectionTabs_->currentWidget() )->toHtml() ); QTextStream textStream( &file ); textStream.setCodec( QTextCodec::codecForLocale() ); textStream << text; @@ -1114,6 +1139,31 @@ NetworkWindow::~NetworkWindow() + // The 'close all tabs' button was pressed. + void NetworkWindow::closeAllTabs() + { + // Activate the tab of the main connection + connectionTabs_->setCurrentIndex( 0 ); + + // Get the main connection widget + QWidget *mainConnectionWidget = connectionTabs_->widget( 0 ); + + // Loop through all tabs + foreach( ConnectionEntry *entry, connectionViews_.values() ) + { + // Don't close the main connection tab + if( entry->logView == mainConnectionWidget ) + { + continue; + } + + connectionTabs_->removeTab( connectionTabs_->indexOf( entry->logView ) ); + closeTab( entry->logView ); + } + } + + + // A 'close tab' button was pressed. void NetworkWindow::closeTab( QWidget *removedWidget ) { @@ -1138,6 +1188,9 @@ NetworkWindow::~NetworkWindow() // Delete the page of the removed item delete removedWidget; + + // Disable the Close All Tabs button when there are no tabs + enableButton( User3, ( connectionViews_.count() > 1 ) ); } @@ -1213,8 +1266,8 @@ NetworkWindow::~NetworkWindow() // Warn the developer about what he or she is doing. int result = KMessageBox::warningContinueCancel( this, i18n( "Sending commands to the server is a risky operation.
    " - "If you don't know how exactly send messages to the servers," - "you could be lucky and just get disconnected, or you may" + "If you don't know how to exactly do it, " + "you could be lucky and just get disconnected, or you may " "incur in more serious consequences.
    " "You have been warned!
    " "Do you want to continue sending this message?" ), @@ -1325,6 +1378,3 @@ NetworkWindow::~NetworkWindow() #include "networkwindow.moc" - -#endif // KMESS_NETWORK_WINDOW - diff --git a/src/dialogs/networkwindow.h b/src/dialogs/networkwindow.h index 2ff2a6f..7a39b45 100644 --- a/src/dialogs/networkwindow.h +++ b/src/dialogs/networkwindow.h @@ -18,8 +18,6 @@ #include "../kmessdebug.h" -#ifdef KMESS_NETWORK_WINDOW - #ifndef NETWORKWINDOW_H #define NETWORKWINDOW_H @@ -73,6 +71,8 @@ class NetworkWindow : public KDialog, private Ui::NetworkWindow void saveCurrentTab(); // The 'clear tab' button was pressed. void clearCurrentTab(); + // The 'close all tabs' button was pressed. + void closeAllTabs(); // The 'close tab' button was pressed. void closeTab( QWidget *removedWidget ); // A tab was selected. @@ -103,7 +103,7 @@ class NetworkWindow : public KDialog, private Ui::NetworkWindow QString formatP2PMessage(bool incoming, const QByteArray &message, const int headerStart); // Format a utf-8 string to be displayed QString formatRawData(bool incoming, const QByteArray &message, - const int start, const int length, const int bytesPerRow = 32); + const int start, const int length, const int bytesPerCol = 4, const int bytesPerRow = 32); // Format a utf-8 string to be displayed QString formatString(const QString &message); // Return the current time. @@ -140,8 +140,4 @@ class NetworkWindow : public KDialog, private Ui::NetworkWindow }; - - #endif - -#endif // #ifdef KMESS_NETWORK_WINDOW diff --git a/src/dialogs/transferentry.cpp b/src/dialogs/transferentry.cpp index 8e55df5..9e418b4 100644 --- a/src/dialogs/transferentry.cpp +++ b/src/dialogs/transferentry.cpp @@ -59,7 +59,7 @@ TransferEntry::TransferEntry( QWidget *parent, const QString filename, const ulo if( preview_.isNull() ) { // Get a default icon pixmap - QString iconTitle = KMimeType::iconNameForUrl( KUrl( filename_) ); + QString iconTitle( KMimeType::iconNameForUrl( KUrl( filename_) ) ); preview_ = loader->loadIcon( iconTitle, KIconLoader::NoGroup, iconLabel_->width() ); if( ! preview_.isNull() ) @@ -144,6 +144,14 @@ bool TransferEntry::isDone() const +// Returns true if the transfer is incoming +bool TransferEntry::isIncoming() const +{ + return incoming_; +} + + + // Return the file name QString TransferEntry::getFileName() const { @@ -316,8 +324,8 @@ void TransferEntry::updateProgress( ulong bytesTransferred ) bytesTransferred_ = bytesTransferred; int percent = (int) ( ( (double) bytesTransferred * 100.0 ) / (double) filesize_ ); - QString transferred = toReadableBytes( bytesTransferred ); - QString total = toReadableBytes( filesize_ ); + QString transferred( toReadableBytes( bytesTransferred ) ); + QString total ( toReadableBytes( filesize_ ) ); // Avoid useless repaints if( ! ( percent == previousPercentage_ ) ) diff --git a/src/dialogs/transferentry.h b/src/dialogs/transferentry.h index f964605..702a374 100644 --- a/src/dialogs/transferentry.h +++ b/src/dialogs/transferentry.h @@ -39,37 +39,39 @@ public: // Destructor virtual ~TransferEntry(); - // Returns true is the transfer is either cancelled or completed - bool isDone() const; + // Returns true if the transfer is either cancelled or completed + bool isDone() const; + // Returns true if the transfer is incoming + bool isIncoming() const; // Returns the file name - QString getFileName() const; + QString getFileName() const; // Set the transfer ID to identify ourselves to the Transfer Window - void setTransferID( int transferID ); + void setTransferID( int transferID ); // Format nicely the byte quantities - static QString toReadableBytes( ulong bytes ); + static QString toReadableBytes( ulong bytes ); public slots: // Mark the transfer as failed - void failTransfer( const QString &message = QString::null ); + void failTransfer( const QString &message = QString::null ); // Mark the transfer as complete - void finishTransfer(); + void finishTransfer(); // Set a status message - void setStatusMessage( const QString &message ); + void setStatusMessage( const QString &message ); // Update the progress bar - void updateProgress( ulong bytesTransferred ); + void updateProgress( ulong bytesTransferred ); private slots: // The cancel link was pressed - void cancelClicked(); + void cancelClicked(); // The open link was pressed - void openClicked(); + void openClicked(); // Update the transfer rate and ETA - void updateTransferRate(); + void updateTransferRate(); signals: // Emit a request to cancel the transfer - void cancelTransfer( int transferID ); + void cancelTransfer( int transferID ); private: // Indicate the transfer is done (cancelled or complete) diff --git a/src/dialogs/transferentry.ui b/src/dialogs/transferentry.ui index 8670afb..d2cde5a 100644 --- a/src/dialogs/transferentry.ui +++ b/src/dialogs/transferentry.ui @@ -5,8 +5,8 @@ 0 0 - 350 - 70 + 359 + 85 @@ -35,180 +35,210 @@ 0 - - - - - - 0 - 0 - - - - - 48 - 48 - - - - - 48 - 48 - - - - Qt::AlignCenter - - - false - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 20 - 0 - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - - - - - 200 - 0 - - - - KSqueezedTextLabel - - - - - - - - - 0 - - - false - - - - - - - - 0 - 0 - - - - KSqueezedTextLabel - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 235 - 0 - - - - - - - - - - - - - 0 - 0 - - - - Open - - - - - - - - - - - - - - 0 - 0 - - - - Cancel - - - - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 20 - 0 - - - - - + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 2 + + + 1 + + + + + + + + 0 + 0 + + + + + 48 + 48 + + + + + 48 + 48 + + + + Qt::AlignCenter + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 20 + 0 + + + + + + + + + + 2 + + + 2 + + + 2 + + + + + + + + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + + + + + + + + + 0 + + + false + + + + + + + + 0 + 0 + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 235 + 0 + + + + + + + + + + 2 + + + + + + 0 + 0 + + + + Open + + + + + + + + + + + + + + 0 + 0 + + + + Cancel + + + + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 20 + 0 + + + + + + + + diff --git a/src/dialogs/transferwindow.cpp b/src/dialogs/transferwindow.cpp index eb06586..3305adc 100644 --- a/src/dialogs/transferwindow.cpp +++ b/src/dialogs/transferwindow.cpp @@ -36,6 +36,7 @@ TransferWindow::TransferWindow( QWidget *parent ) , Ui::TransferWindow() { // Set up the interface and the dialog + setObjectName( "Transfer" ); QWidget *mainWidget = new QWidget( this ); setupUi( mainWidget ); setMainWidget( mainWidget ); @@ -44,15 +45,23 @@ TransferWindow::TransferWindow( QWidget *parent ) layout_ = static_cast( transfersArea_->layout() ); layout_->addStretch(); - // Set up the dialog and its buttons - setButtons( User1 | Close ); + // Set up the dialog + setButtons( None ); setDefaultButton( Close ); setCaption( i18n("File Transfers") ); restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "TransferWindow" ) ); - // Set up the Clean Up button behavior - setButtonText( User1, i18n("Cl&ean Up") ); - connect( this, SIGNAL( user1Clicked() ), this, SLOT( cleanUp() ) ); + // Set up the Clean Up and close button + closeButton_ ->setIcon( KIcon( "dialog-close" ) ); + cleanupButton_->setIcon( KIcon( "trash-empty" ) ); + connect( cleanupButton_, SIGNAL( clicked() ), this, SLOT( cleanUp() ) ); + connect( closeButton_, SIGNAL( clicked() ), this, SLOT( hide() ) ); + + // Set up the Download and Upload buttons + downloadButton_->setIcon( KIcon( "go-down" ) ); + uploadButton_ ->setIcon( KIcon( "go-up" ) ); + connect( downloadButton_, SIGNAL( toggled( bool ) ), this, SLOT( slotDownloadButtonToggled( bool ) ) ); + connect( uploadButton_, SIGNAL( toggled( bool ) ), this, SLOT( slotUploadButtonToggled( bool ) ) ); } @@ -229,4 +238,79 @@ void TransferWindow::cleanUp() +// The "Download" button was pressed +void TransferWindow::slotDownloadButtonToggled( bool checked ) +{ + if( checked ) + { + // Show the download entries + showEntries( true, true ); + } + else + { + if( uploadButton_->isChecked() ) + { + // Hide the download entries + showEntries( true, false ); + } + else + { + // Don't permit to user to deselect both buttons + downloadButton_->setChecked( true ); + } + } +} + + + +// The "Upload" button was pressed +void TransferWindow::slotUploadButtonToggled( bool checked ) +{ + if( checked ) + { + // Show the upload entries + showEntries( false, true ); + } + else + { + if( downloadButton_->isChecked() ) + { + // Hide the download entries + showEntries( false, false ); + } + else + { + // Don't permit to user to deselect both buttons + uploadButton_->setChecked( true ); + } + } +} + + + +// Show or hide selected entries +void TransferWindow::showEntries( bool incoming, bool show ) +{ + TransferEntry *entry; + QMapIterator it( entryList_ ); + + // Search the selected entries + while( it.hasNext() ) + { + it.next(); + entry = it.value(); + + // Check if the current entry is one of selected + if( entry->isIncoming() == incoming ) + { + // Show or hide the entry + entry->setVisible( show ); + } + } + + // Update to the UI + update(); +} + + #include "transferwindow.moc" diff --git a/src/dialogs/transferwindow.h b/src/dialogs/transferwindow.h index 741763f..2f205c5 100644 --- a/src/dialogs/transferwindow.h +++ b/src/dialogs/transferwindow.h @@ -69,21 +69,28 @@ class TransferWindow : public KDialog, private Ui::TransferWindow private slots: // The "Clean up" button was pressed. void cleanUp(); + // The "Download" button was pressed + void slotDownloadButtonToggled( bool checked ); + // The "Upload" button was pressed + void slotUploadButtonToggled( bool checked ); signals: // Emit a request to cancel a transfer void cancelTransfer( int transferID ); + private: // Private methods + // Show or hide selected entries + void showEntries( bool incoming, bool show ); + private: // Counter used to generate unique transfer IDs static int currentEntryID_; + // List of all entries + QMap entryList_; + // Layout QVBoxLayout *layout_; // Instance to the singleton static TransferWindow *onlyInstance_; - - private: - // List of all entries - QMap entryList_; }; #endif diff --git a/src/dialogs/transferwindow.ui b/src/dialogs/transferwindow.ui index 0fdf32f..75e441d 100644 --- a/src/dialogs/transferwindow.ui +++ b/src/dialogs/transferwindow.ui @@ -6,7 +6,7 @@ 0 0 418 - 168 + 269 @@ -16,6 +16,12 @@ + + 2 + + + 0 + @@ -41,14 +47,105 @@ 0 0 - 404 - 154 + 412 + 232 - + + + 1 + + + 1 + + + + + + 1 + + + + + + 100 + 0 + + + + + 100 + 28 + + + + &Download + + + true + + + true + + + + + + + + 100 + 0 + + + + + 100 + 28 + + + + &Upload + + + true + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + C&lean Up + + + + + + + &Close + + + + + diff --git a/src/dialogs/userpicturesdialog.cpp b/src/dialogs/userpicturesdialog.cpp index 75fa4ad..bf39f11 100644 --- a/src/dialogs/userpicturesdialog.cpp +++ b/src/dialogs/userpicturesdialog.cpp @@ -23,44 +23,117 @@ #include +#include + + +// Constructor UserPicturesDialog::UserPicturesDialog( QWidget *parent ) - : QWidget( parent ) + : KDialog( parent ) { - setupUi(this); - setWindowTitle( i18n( "Choose or remove your avatar" ) ); + // Setup the user interface + setObjectName( "UserPictures" ); + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setMainWidget( mainWidget ); - useButton_ ->setText( i18n( "Use" ) ); - deleteButton_ ->setText( i18n( "Remove" ) ); + setButtons( KDialog::User1 | KDialog::Ok | KDialog::Close ); + setDefaultButton( Ok ); + setButtonText( Ok, i18n( "&Use" ) ); + setButtonText( User1, i18n( "&Delete" ) ); + + setWindowTitle( i18n( "Choose or Remove Your Display Picture" ) ); + + // Connect signals connect( listPictures_, SIGNAL( itemSelectionChanged() ), this, SLOT( slotItemSelectionChanged() ) ); - - connect( useButton_, SIGNAL( clicked() ), this, SLOT( useButtonClicked() ) ); - connect( deleteButton_, SIGNAL( clicked() ), this, SLOT( deleteButtonClicked() ) ); } +// Destructor UserPicturesDialog::~UserPicturesDialog() { + clearList(); kDebug() << "DESTROYED"; } -// Delete button was clicked -void UserPicturesDialog::deleteButtonClicked() +// Clear and free memory of list widget +void UserPicturesDialog::clearList() +{ + // Check if it's necessary the cleaning + if( listPictures_->count() == 0 ) + { + return; + } + + // Remove the items + while( listPictures_->count() != 0 ) + { + delete listPictures_->takeItem( 0 ); + } +} + + + +// Current item was changed +void UserPicturesDialog::slotItemSelectionChanged() +{ + QListWidgetItem *currentItem = listPictures_->currentItem(); + bool selected = false; + + if( currentItem != 0 ) + { + // Set current item to avoid lost the blue rect on selection + listPictures_->setCurrentItem( currentItem ); + selected = true; + } + + enableButton( Ok, selected ); + enableButton( User1, selected ); +} + + + +// Use the selected picture. +void UserPicturesDialog::usePicture() { // Check if the current item is valid - QListWidgetItem *currentItem = listPictures_->currentItem(); + const QListWidgetItem *currentItem = listPictures_->currentItem(); if( currentItem == 0 ) { return; } + emit pictureUpdate( false, currentItem->data( 6 ).toString() ); +} + + + +// Delete the selected picture. +void UserPicturesDialog::deletePicture() +{ + // Check if the current item is valid + const QListWidgetItem *currentItem = listPictures_->currentItem(); + if( currentItem == 0 ) + { + return; + } + + // Request confirmation + int result = KMessageBox::questionYesNo( this, + i18n( "Are you sure you want to delete the picture?", + i18nc( "Dialog box title", "Delete Picture" ) ) ); + if( result != KMessageBox::Yes ) + { + return; + } + // Check if the file exists and remove it - QString filename = currentItem->data( 6 ).toString(); + QString filename( currentItem->data( 6 ).toString() ); if( QFile::exists( filename ) ) { QFile::remove( filename ); @@ -72,56 +145,19 @@ void UserPicturesDialog::deleteButtonClicked() -// Current item was changed -void UserPicturesDialog::slotItemSelectionChanged() -{ - QListWidgetItem *currentItem = listPictures_->currentItem(); - - if( currentItem == 0 ) - { - useButton_ ->setEnabled( false ); - deleteButton_->setEnabled( false ); - } - else - { - // Set current item to avoid lost the blue rect on selection - listPictures_->setCurrentItem( currentItem ); - useButton_ ->setEnabled( true ); - deleteButton_->setEnabled( true); - } -} - - - -// Use button was clicked -void UserPicturesDialog::useButtonClicked() -{ - // Check if the current item is valid - QListWidgetItem *currentItem = listPictures_->currentItem(); - if( currentItem == 0 ) - { - return; - } - - emit pictureUpdate( false, currentItem->data( 6 ).toString() ); - hide(); -} - - - // Update the widgets void UserPicturesDialog::updateWidgets( const QString &handle ) { int number = 0; - QString filePath; - QString dirPath = KMessConfig::instance()->getAccountDirectory( handle ); - QDir dir( dirPath + "/displaypics" ); + QString path( KMessConfig::instance()->getAccountDirectory( handle ) ); + const QDir dir( path + "/displaypics" ); + QListWidgetItem *item; - handle_ = handle; - listPictures_->clear(); + // Clear the list + clearList(); - foreach( QString file, dir.entryList( QDir::Files | QDir::NoDotAndDotDot ) ) + foreach( const QString &file, dir.entryList( QDir::Files | QDir::NoDotAndDotDot ) ) { // To avoid listing of temporary picture file if( file.contains( "temporary-picture" ) ) @@ -129,13 +165,40 @@ void UserPicturesDialog::updateWidgets( const QString &handle ) continue; } - filePath = dir.absolutePath() + "/" + file; - item = new QListWidgetItem( QIcon( filePath ), QString::number( ++number ), listPictures_ ); - item->setData( 6, filePath ); + path = dir.absolutePath() + "/" + file; + item = new QListWidgetItem( QIcon( path ), QString::number( ++number ), listPictures_ ); + item->setData( 6, path ); } - useButton_ ->setEnabled( false ); - deleteButton_->setEnabled( false ); + enableButton( Ok, false ); + enableButton( User1, false ); + + handle_ = handle; } + + +// A button has been pressed, act accordingly +void UserPicturesDialog::slotButtonClicked( int button ) +{ + switch( button ) + { + case KDialog::Ok: + usePicture(); + accept(); + break; + + case KDialog::User1: + deletePicture(); + return; + break; + + default: + KDialog::slotButtonClicked( button ); + break; + } +} + + + #include "userpicturesdialog.moc" diff --git a/src/dialogs/userpicturesdialog.h b/src/dialogs/userpicturesdialog.h index 9190815..be2c93c 100644 --- a/src/dialogs/userpicturesdialog.h +++ b/src/dialogs/userpicturesdialog.h @@ -20,7 +20,8 @@ #include "ui_userpicturesdialog.h" -#include +#include + /** @@ -28,27 +29,33 @@ * @author Antonio Nastasi * @ingroup Dialogs */ -class UserPicturesDialog : public QWidget, private Ui::UserPicturesDialog +class UserPicturesDialog : public KDialog, private Ui::UserPicturesDialog { Q_OBJECT public: - // Constructor + // Constructor UserPicturesDialog( QWidget *parent = 0 ); - // Destructor - ~UserPicturesDialog(); + // Destructor + ~UserPicturesDialog(); // Update the widgets void updateWidgets( const QString &handle ); - private slots: - // Delete button was clicked - void deleteButtonClicked(); - // Current item was changed - void slotItemSelectionChanged(); - // Use button was clicked - void useButtonClicked(); + private: // Private methods + // Clear and free memory of list widget + void clearList(); + // Use the selected picture. + void usePicture(); + // Delete the selected picture. + void deletePicture(); - private: // private attributes + private slots: // Private slots + // A button has been pressed, act accordingly. + void slotButtonClicked( int button ); + // Current item was changed. + void slotItemSelectionChanged(); + + private: // Private attributes QString handle_; signals: diff --git a/src/dialogs/userpicturesdialog.ui b/src/dialogs/userpicturesdialog.ui index 07fd323..20945c2 100644 --- a/src/dialogs/userpicturesdialog.ui +++ b/src/dialogs/userpicturesdialog.ui @@ -1,9 +1,6 @@ UserPicturesDialog - - Qt::ApplicationModal - 0 @@ -13,7 +10,7 @@ - Form + @@ -47,37 +44,6 @@ - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - - - - diff --git a/src/emoticon.cpp b/src/emoticon.cpp index fba0e2d..964a8bc 100644 --- a/src/emoticon.cpp +++ b/src/emoticon.cpp @@ -17,6 +17,7 @@ #include "emoticon.h" +#include "utils/kmessshared.h" #include "kmessdebug.h" #include "currentaccount.h" @@ -36,7 +37,7 @@ * Constructor for standard emoticons * * @param pictureName The picture file name - * @param tooltip The name of this emoticon, which will be displayed as tooltip in the Emoticon Sidebar + * @param tooltip The name of this emoticon: it will be displayed as tooltip in the Emoticons Widget */ Emoticon::Emoticon( const QString &pictureName, const QString &tooltip ) : pictureDirectory_(QString::null) @@ -59,7 +60,7 @@ Emoticon::Emoticon( const QString &pictureName, const QString &tooltip ) * Constructor for custom emoticons, with custom picture path * * @param pictureName The picture file name - * @param tooltip The name of this emoticon, which will be displayed as tooltip in the Emoticon Sidebar + * @param tooltip The name of this emoticon: it will be displayed as tooltip in the Emoticons Widget * @param pictureDirectory The folder where this emoticon's image is located */ Emoticon::Emoticon( const QString &pictureName, const QString &tooltip, const QString &pictureDirectory ) @@ -114,7 +115,7 @@ Emoticon::~Emoticon() * * @param shortcut Shortcut text */ -void Emoticon::addShortcut( QString shortcut ) +void Emoticon::addShortcut( const QString &shortcut ) { shortcuts_.append( shortcut ); } @@ -186,8 +187,9 @@ QString Emoticon::getHtml( bool small ) const emoticonClass = "standardEmoticon"; } - return "" + shortcuts_.first() + ""; } @@ -201,11 +203,11 @@ QString Emoticon::getPattern() const QString pattern; QStringList::const_iterator shortcut; - for( shortcut = shortcuts_.begin(); shortcut != shortcuts_.end(); shortcut++ ) + for( shortcut = shortcuts_.begin(); shortcut != shortcuts_.end(); ++shortcut ) { if( pattern.length() > 0 ) { - pattern += "|"; + pattern += '|'; } pattern += QRegExp::escape( *shortcut ); } @@ -245,42 +247,6 @@ QString Emoticon::getTooltip() const -/** - * Converts a string with HTML to one with escaped entities - * - * Only the main HTML control characters are escaped; the string is made suitable for - * insertion within an HTML tag attribute. - * Neither KDE nor Qt have escape/unescape methods this thorough, they only replace the <>&. Annoying. - */ -void Emoticon::htmlEscape( QString &string ) -{ - string.replace( "&", "&" ) - .replace( "<", "<" ) - .replace( ">", ">" ) - .replace( "'", "'" ) - .replace( '"', """ ); -} - - - -/** - * Converts a string with escaped entities to one with HTML - * - * Only the main HTML control characters are unescaped; the string is reverted back to its - * original state. - * Neither KDE nor Qt have HTML to text decoding methods. Annoying. - */ -void Emoticon::htmlUnescape( QString &string ) -{ - string.replace( """, "\"" ) - .replace( "'", "'" ) - .replace( ">", ">" ) - .replace( "<", "<" ) - .replace( "&", "&" ); -} - - - /** * Find if this emoticon really contains a valid picture */ @@ -311,7 +277,7 @@ void Emoticon::setPictureName( const QString &pictureName ) * * @param shortcut The new shortcut */ -void Emoticon::setShortcut( QString shortcut ) +void Emoticon::setShortcut( const QString &shortcut ) { shortcuts_.clear(); shortcuts_.append( shortcut ); @@ -324,7 +290,7 @@ void Emoticon::setShortcut( QString shortcut ) * * @param shortcuts The new list of shortcuts */ -void Emoticon::setShortcuts( QStringList shortcuts ) +void Emoticon::setShortcuts( const QStringList &shortcuts ) { shortcuts_.clear(); shortcuts_ = shortcuts; @@ -374,15 +340,15 @@ void Emoticon::update() // For each iteration: // - with a standard emoticon, will check both folders (current and default theme); // - with a custom emoticon, will skip the check in the default theme folder, since they simply can't be there. - foreach( QString pictureType, allowedTypes ) + foreach( const QString &pictureType, allowedTypes ) { if( isCustomEmoticon_ ) { - picturePath_ = emoticonPath + "/" + pictureName_ + "." + pictureType; + picturePath_ = emoticonPath + '/' + pictureName_ + '.' + pictureType; } else { - picturePath_ = dirs->findResource( "emoticons", emoticonPath + "/" + pictureName_ + "." + pictureType ); + picturePath_ = dirs->findResource( "emoticons", emoticonPath + '/' + pictureName_ + '.' + pictureType ); } if( ! picturePath_.isNull() && KStandardDirs::exists( picturePath_ ) ) @@ -395,9 +361,9 @@ void Emoticon::update() // If this emoticon does not exist in this theme, try again loading the default KMess emoticon if( ! found ) { - foreach( QString pictureType, allowedTypes ) + foreach( const QString &pictureType, allowedTypes ) { - // Search in Kmess' default theme folder + // Search in KMess' default theme folder picturePath_ = dirs->findResource( "emoticons", "KMess-new/" + originalPictureName_ + "." + pictureType ); if( ! picturePath_.isNull() && KStandardDirs::exists( picturePath_ ) ) diff --git a/src/emoticon.h b/src/emoticon.h index 1338885..7fe067a 100644 --- a/src/emoticon.h +++ b/src/emoticon.h @@ -24,10 +24,11 @@ /** * Emoticons default size * - * Original MSN emoticons have a size of 19x19 pixels, so we assume that as a minimum. + * Original MSN emoticons have a size of 19x19 pixels, but to embed emoticons within text we'll + * need to shrink them some more */ #ifndef EMOTICONS_DEFAULT_SIZE - #define EMOTICONS_DEFAULT_SIZE 19 + #define EMOTICONS_DEFAULT_SIZE 14 #endif /** @@ -83,7 +84,7 @@ class Emoticon : public QObject virtual ~Emoticon(); // Add a text shortcut which will translate to this emoticon - void addShortcut( QString shortcut ); + void addShortcut( const QString &shortcut ); // Get the picture file name const QString &getPictureName() const; // Get the full path of the picture file @@ -103,20 +104,14 @@ class Emoticon : public QObject // Change the name of the emoticon picture void setPictureName( const QString &pictureName ); // Delete all the shortcuts and replace them with a single one - void setShortcut( QString shortcut ); + void setShortcut( const QString &shortcut ); // Delete all the shortcuts and replace them with another list - void setShortcuts( QStringList shortcuts ); + void setShortcuts( const QStringList &shortcuts ); // Change the associated tooltip void setTooltip( const QString &pictureTooltip ); // Update the internal emoticon data void update(); - public: // Public static methods - // Converts a string with HTML to one with escaped entities - static void htmlEscape( QString &string ); - // Converts a string with escaped entities to one with HTML - static void htmlUnescape( QString &string ); - private: // Private attributes // The directory where the custom emoticon image is located. Unused for standard emoticons QString pictureDirectory_; @@ -140,7 +135,7 @@ class Emoticon : public QObject int width_; signals: - // Signal the EmoticonSidebar that we've changed something and it should update the button + // Signal the EmoticonsWidget that we've changed something and it should update the button void changed(); }; diff --git a/src/emoticonmanager.cpp b/src/emoticonmanager.cpp index ad89621..0b72120 100644 --- a/src/emoticonmanager.cpp +++ b/src/emoticonmanager.cpp @@ -163,16 +163,9 @@ void EmoticonManager::disconnected() /** * Return the picture file names of all emoticons */ -const QMap& EmoticonManager::getFileNames( bool getCustomTheme ) const +const QHash& EmoticonManager::getFileNames( bool getCustomTheme ) { - if( getCustomTheme ) - { - return customTheme_->getFileNames(); - } - else - { - return standardTheme_->getFileNames(); - } + return getTheme( getCustomTheme )->getFileNames(); } @@ -180,16 +173,9 @@ const QMap& EmoticonManager::getFileNames( bool getCustomTheme /** * Return the search pattern to find emoticons in an HTML document */ -const QRegExp& EmoticonManager::getHtmlPattern( bool getCustomTheme ) const +const QRegExp& EmoticonManager::getHtmlPattern( bool getCustomTheme ) { - if( getCustomTheme ) - { - return customTheme_->getHtmlPattern(); - } - else - { - return standardTheme_->getHtmlPattern(); - } + return getTheme( getCustomTheme )->getHtmlPattern(); } @@ -197,16 +183,19 @@ const QRegExp& EmoticonManager::getHtmlPattern( bool getCustomTheme ) const /** * Return the HTML replacement codes for all emoticons in a theme */ -const QMap& EmoticonManager::getHtmlReplacements( bool small, bool getCustomTheme ) const +const QHash& EmoticonManager::getHtmlReplacements( bool small, bool getCustomTheme ) { - if( getCustomTheme ) - { - return customTheme_->getHtmlReplacements( small ); - } - else - { - return standardTheme_->getHtmlReplacements( small ); - } + return getTheme( getCustomTheme )->getHtmlReplacements( small ); +} + + + +/** + * Return a QStringList of emoticons + */ +const QStringList& EmoticonManager::getList( bool getCustomTheme ) +{ + return getTheme( getCustomTheme )->getList(); } @@ -214,16 +203,9 @@ const QMap& EmoticonManager::getHtmlReplacements( bool small, b /** * Return the search pattern to find emoticons in a text */ -const QRegExp& EmoticonManager::getPattern( bool getCustomTheme ) const +const QRegExp& EmoticonManager::getPattern( bool getCustomTheme ) { - if( getCustomTheme ) - { - return customTheme_->getPattern(); - } - else - { - return standardTheme_->getPattern(); - } + return getTheme( getCustomTheme )->getPattern(); } @@ -231,16 +213,9 @@ const QRegExp& EmoticonManager::getPattern( bool getCustomTheme ) const /** * Return one replacement code for the given emoticon */ -QString EmoticonManager::getReplacement( const QString &code, bool small, bool getCustomTheme ) const +QString EmoticonManager::getReplacement( const QString &code, bool small, bool getCustomTheme ) { - if( getCustomTheme ) - { - return customTheme_->getReplacement( code, small ); - } - else - { - return standardTheme_->getReplacement( code, small ); - } + return getTheme( getCustomTheme )->getReplacement( code, small ); } @@ -248,16 +223,9 @@ QString EmoticonManager::getReplacement( const QString &code, bool small, bool g /** * Return the replacement codes for all emoticons in a theme */ -const QMap& EmoticonManager::getReplacements( bool small, bool getCustomTheme ) const +const QHash& EmoticonManager::getReplacements( bool small, bool getCustomTheme ) { - if( getCustomTheme ) - { - return customTheme_->getReplacements( small ); - } - else - { - return standardTheme_->getReplacements( small ); - } + return getTheme( getCustomTheme )->getReplacements( small ); } @@ -284,14 +252,7 @@ EmoticonTheme *EmoticonManager::getTheme( bool getCustomTheme ) */ const QString& EmoticonManager::getThemePath( bool getCustomTheme ) { - if( getCustomTheme ) - { - return customTheme_->getThemePath(); - } - else - { - return standardTheme_->getThemePath(); - } + return getTheme( getCustomTheme )->getThemePath(); } @@ -318,19 +279,10 @@ void EmoticonManager::parseEmoticons( QString &text, bool small, bool useCustomT { int pos = 0; - EmoticonTheme *usedTheme; - - if( useCustomTheme ) - { - usedTheme = customTheme_; - } - else - { - usedTheme = standardTheme_; - } + EmoticonTheme *usedTheme = getTheme( useCustomTheme ); const QRegExp &pattern = usedTheme->getPattern(); - const QMap &replacements = usedTheme->getReplacements( small ); + const QHash &replacements = usedTheme->getReplacements( small ); while( pos != -1 ) { @@ -339,10 +291,10 @@ void EmoticonManager::parseEmoticons( QString &text, bool small, bool useCustomT if( pos != -1 ) { // Found a emoticon - QString code = text.mid(pos, pattern.matchedLength()); + QString code( text.mid(pos, pattern.matchedLength()) ); if( replacements.contains(code) ) { - QString replacement = replacements[code]; + QString replacement( replacements[code] ); text = text.replace(pos, pattern.matchedLength(), replacement); pos += replacement.length(); } diff --git a/src/emoticonmanager.h b/src/emoticonmanager.h index b93a6a8..f9442a8 100644 --- a/src/emoticonmanager.h +++ b/src/emoticonmanager.h @@ -43,21 +43,23 @@ class EmoticonManager : public QObject public: // Public methods // Return the picture file names of all emoticons - const QMap& getFileNames( bool getCustomTheme = false ) const; + const QHash &getFileNames( bool getCustomTheme = false ); // Return the search pattern to find emoticons in an HTML document - const QRegExp& getHtmlPattern( bool getCustomTheme = false ) const; + const QRegExp &getHtmlPattern( bool getCustomTheme = false ); // Return the HTML replacement codes for all emoticons in a theme - const QMap &getHtmlReplacements( bool small = false, bool getCustomTheme = false ) const; + const QHash &getHtmlReplacements( bool small = false, bool getCustomTheme = false ); + // Return a QStringList of emoticons + const QStringList &getList( bool getCustomTheme ); // Return the search pattern to find emoticons in a text - const QRegExp& getPattern( bool getCustomTheme = false ) const; + const QRegExp &getPattern( bool getCustomTheme = false ); // Return one replacement code for the given emoticon - QString getReplacement( const QString &code, bool small = false, bool getCustomTheme = false ) const; + QString getReplacement( const QString &code, bool small = false, bool getCustomTheme = false ); // Return the replacement codes for all emoticons in a theme - const QMap &getReplacements( bool small = false, bool getCustomTheme = false ) const; + const QHash &getReplacements( bool small = false, bool getCustomTheme = false ); // Return a pointer to the emoticons theme - EmoticonTheme *getTheme( bool getCustomTheme = false ); + EmoticonTheme *getTheme( bool getCustomTheme = false ); // Return the path where the theme's emoticons are located - const QString &getThemePath( bool getCustomTheme = false ); + const QString &getThemePath( bool getCustomTheme = false ); // Replace the standard emoticons in the text with the urls to the emoticon pngs. void parseEmoticons( QString &text, bool small = false, bool useCustomTheme = false ); // Replace the custom emoticon theme with a new one diff --git a/src/emoticontheme.cpp b/src/emoticontheme.cpp index 2379352..10eede4 100644 --- a/src/emoticontheme.cpp +++ b/src/emoticontheme.cpp @@ -18,6 +18,7 @@ #include "emoticontheme.h" #include "utils/kmessconfig.h" +#include "utils/kmessshared.h" #include "kmessdebug.h" #include @@ -72,7 +73,7 @@ EmoticonTheme::EmoticonTheme( const EmoticonTheme &other ) emoticons_.append( emoticon ); } - // The caches cannot be easily copied (due to QMaps being implicitly shared), so regenerate them. + // The caches cannot be easily copied (due to QHashs being implicitly shared), so regenerate them. updateCache(); } @@ -191,7 +192,7 @@ bool EmoticonTheme::createTheme( QString themeDir ) QDomElement emoticonTag = xmlChild.toElement(); if( ! emoticonTag.isNull() && emoticonTag.tagName() == "emoticon" ) { - QString emoticonFile = emoticonTag.attribute( "file" ); + QString emoticonFile( emoticonTag.attribute( "file" ) ); // Loop through all tags QStringList shortcuts; @@ -260,7 +261,7 @@ const QList &EmoticonTheme::getEmoticons() const /** * Return the picture file names of all emoticons, mapped by their first shortcut code */ -const QMap& EmoticonTheme::getFileNames() const +const QHash& EmoticonTheme::getFileNames() const { return themeFileNames_; } @@ -280,7 +281,7 @@ const QRegExp& EmoticonTheme::getHtmlPattern() const /** * Return the HTML replacement codes for all emoticons */ -const QMap& EmoticonTheme::getHtmlReplacements( bool small ) const +const QHash& EmoticonTheme::getHtmlReplacements( bool small ) const { if( small ) { @@ -294,6 +295,16 @@ const QMap& EmoticonTheme::getHtmlReplacements( bool small ) co +/** + * Return a QStringList of emoticons + */ +const QStringList& EmoticonTheme::getList() const +{ + return emoticonList_; +} + + + /** * Return the search pattern to find emoticons in a text */ @@ -324,7 +335,7 @@ QString EmoticonTheme::getReplacement( const QString &code, bool small ) const /** * Return the replacement codes for all emoticons */ -const QMap& EmoticonTheme::getReplacements( bool small ) const +const QHash& EmoticonTheme::getReplacements( bool small ) const { if( small ) { @@ -429,7 +440,7 @@ bool EmoticonTheme::loadTheme( QString themeName, bool isCustomTheme ) { bool success = false; - QString oldThemePath = themePath_; + QString oldThemePath( themePath_ ); isCustomTheme_ = isCustomTheme; #ifdef KMESSDEBUG_EMOTICON_THEMES @@ -627,7 +638,7 @@ bool EmoticonTheme::saveTheme() } // We only need base names of the emoticons: the specs - QString file = QFileInfo( emoticon->getPicturePath() ).baseName(); + QString file( QFileInfo( emoticon->getPicturePath() ).baseName() ); // New emoticon: the file name is encoded as HTML to avoid XML parsing errors xmlOutput << "\t" << endl; @@ -637,8 +648,8 @@ bool EmoticonTheme::saveTheme() for( QStringList::ConstIterator it = codes.begin(); it != codes.end(); ++it ) { // Encode the shortcuts as HTML to avoid XML parsing errors - QString code = *it; - Emoticon::htmlEscape( code ); + QString code( *it ); + KMessShared::htmlEscape( code ); xmlOutput << "\t\t" << code << "" << endl; } @@ -703,6 +714,7 @@ void EmoticonTheme::updateCache() #endif // Remove all replacements, some emoticons may be no longer valid + emoticonList_.clear(); smallReplacements_.clear(); largeReplacements_.clear(); smallHtmlReplacements_.clear(); @@ -727,22 +739,23 @@ void EmoticonTheme::updateCache() } // Generate the HTML tag which represents the emoticon - QString htmlSmall = emoticon->getHtml( true ); - QString htmlLarge = emoticon->getHtml( false ); + QString htmlSmall( emoticon->getHtml( true ) ); + QString htmlLarge( emoticon->getHtml( false ) ); // Traverse all shortcuts of this emoticon const QStringList &codes = emoticon->getShortcuts(); foreach( const QString &code, codes ) { // Convert to HTML the main significant HTML control characters - QString htmlCode = code; - Emoticon::htmlEscape( htmlCode ); + QString htmlCode( code ); + KMessShared::htmlEscape( htmlCode ); // Add the current code to the replacement lists.. - smallReplacements_.insert(code, htmlSmall); - largeReplacements_.insert(code, htmlLarge); - smallHtmlReplacements_.insert(htmlCode, htmlSmall); - largeHtmlReplacements_.insert(htmlCode, htmlLarge); + emoticonList_ << code; + smallReplacements_.insert( code, htmlSmall ); + largeReplacements_.insert( code, htmlLarge ); + smallHtmlReplacements_.insert( htmlCode, htmlSmall ); + largeHtmlReplacements_.insert( htmlCode, htmlLarge ); // ..to the filenames list.. file.setFile( emoticon->getPicturePath() ); @@ -804,7 +817,7 @@ void EmoticonTheme::updateTitles() #endif QString name; - QMap emoticonTitles; + QHash emoticonTitles; emoticonTitles[ "smile" ] = i18n( "Smile" ); emoticonTitles[ "wink" ] = i18n( "Wink" ); @@ -835,7 +848,7 @@ void EmoticonTheme::updateTitles() emoticonTitles[ "boy" ] = i18n( "Boy" ); emoticonTitles[ "love" ] = i18n( "Red heart" ); emoticonTitles[ "rose" ] = i18n( "Red rose" ); - emoticonTitles[ "thumbs_up" ] = i18n( "Thumby up" ); + emoticonTitles[ "thumbs_up" ] = i18n( "Thumbs up" ); emoticonTitles[ "dog" ] = i18n( "Dog face" ); emoticonTitles[ "sun" ] = i18n( "Sun" ); emoticonTitles[ "devil" ] = i18n( "Devil" ); @@ -853,7 +866,7 @@ void EmoticonTheme::updateTitles() emoticonTitles[ "airplane" ] = i18n( "Airplane" ); emoticonTitles[ "turtle" ] = i18n( "Turtle" ); emoticonTitles[ "snail" ] = i18n( "Snail" ); - emoticonTitles[ "sheep" ] = i18n( "Black sheep" ); + emoticonTitles[ "sheep" ] = i18n( "Sheep" ); emoticonTitles[ "goat" ] = i18n( "Goat" ); emoticonTitles[ "bat" ] = i18n( "Vampire bat" ); emoticonTitles[ "pizza" ] = i18n( "Pizza" ); @@ -879,8 +892,8 @@ void EmoticonTheme::updateTitles() emoticonTitles[ "handcuffs" ] = i18n( "Handcuffs" ); emoticonTitles[ "money" ] = i18n( "Money" ); emoticonTitles[ "lightbulb" ] = i18n( "Light bulb" ); - emoticonTitles[ "cigarette" ] = i18n( "Cigarrette" ); - emoticonTitles[ "soccer" ] = i18n( "Soccer ball" ); + emoticonTitles[ "cigarette" ] = i18n( "Cigarette" ); + emoticonTitles[ "soccer" ] = i18n( "Football ball" ); emoticonTitles[ "present" ] = i18n( "Gift with a bow" ); emoticonTitles[ "gameconsole" ] = i18n( "X-Box" ); emoticonTitles[ "computer" ] = i18n( "Computer" ); @@ -940,7 +953,7 @@ bool EmoticonTheme::updateTheme( QString themeDir ) // Load the codes in a map for efficient lookup - QMap themeFiles; + QHash themeFiles; // Loop through all tags QDomNode xmlChild = xml.documentElement().firstChild(); @@ -951,7 +964,7 @@ bool EmoticonTheme::updateTheme( QString themeDir ) if( ! emoticonTag.isNull() && emoticonTag.tagName() == "emoticon" ) { // Loop through all tags - QString emoticonFile = emoticonTag.attribute( "file" ); + QString emoticonFile( emoticonTag.attribute( "file" ) ); QDomNode xmlChild2 = emoticonTag.firstChild(); while( ! xmlChild2.isNull() ) { diff --git a/src/emoticontheme.h b/src/emoticontheme.h index aa861e4..32aefa3 100644 --- a/src/emoticontheme.h +++ b/src/emoticontheme.h @@ -20,9 +20,7 @@ #include "emoticon.h" -#include -#include -#include +#include @@ -58,19 +56,21 @@ class EmoticonTheme : public QObject // Return the full list of emoticons const QList & getEmoticons() const; // Return the picture file names of all emoticons, mapped by their first shortcut code - const QMap &getFileNames() const; + const QHash &getFileNames() const; // Return the search pattern to find emoticons in an HTML text - const QRegExp &getHtmlPattern() const; + const QRegExp &getHtmlPattern() const; // Return the HTML replacement codes for all emoticons - const QMap &getHtmlReplacements( bool small = false ) const; + const QHash &getHtmlReplacements( bool small = false ) const; + // Return a QStringList of emoticons + const QStringList &getList() const; // Return the search pattern to find emoticons in a text - const QRegExp &getPattern() const; + const QRegExp &getPattern() const; // Return one replacement code for the given emoticon QString getReplacement( const QString &code, bool small = false ) const; // Return the replacement codes for all emoticons - const QMap &getReplacements( bool small = false ) const; + const QHash &getReplacements( bool small = false ) const; // Return where the picture files for this theme are located - const QString &getThemePath(); + const QString &getThemePath(); // Load a theme, by creating it anew or by refreshing the current one bool loadTheme( QString themeName, bool isCustomTheme ); // Delete a custom emoticon from the theme @@ -103,21 +103,23 @@ class EmoticonTheme : public QObject // Is this a custom theme? bool isCustomTheme_; // The HTML replace codes for emoticons - QMap largeHtmlReplacements_; + QHash largeHtmlReplacements_; // The replace codes for emoticons - QMap largeReplacements_; + QHash largeReplacements_; + // The list of emoticon codes + QStringList emoticonList_; // The search pattern for html emoticon codes QRegExp patternHtml_; // The search pattern for text emoticon codes QRegExp patternText_; // The HTML replace codes for emoticons - QMap smallHtmlReplacements_; + QHash smallHtmlReplacements_; // The replace codes for emoticons - QMap smallReplacements_; + QHash smallReplacements_; // The full path to the currently loaded theme QString themePath_; // A mapping from code to emoticon picture filename - QMap themeFileNames_; + QHash themeFileNames_; signals: // Signal that we've been changed and the UI needs to be refreshed diff --git a/src/initialview.cpp b/src/initialview.cpp index d68ac11..77f8205 100644 --- a/src/initialview.cpp +++ b/src/initialview.cpp @@ -17,32 +17,48 @@ #include "initialview.h" +#include "network/msnconnection.h" // Required for the offline socket #define #include "utils/kmessconfig.h" +#include "utils/kmessshared.h" #include "accountsmanager.h" #include "account.h" #include "kmessdebug.h" #include +#include #include +#include #include #include #include +/** + * Reconnection timeout + * + * This number is the time, expressed in seconds, after which a connection is attempted again + */ +#ifndef RECONNECTION_TIME + #define RECONNECTION_TIME 30 +#endif + // The constructor InitialView::InitialView( QWidget *parent ) : QWidget( parent ) , Ui::InitialView() - , isConnecting_( false ) + , isConnectingUI_( false ) + , networkStatus_( Solid::Networking::Connected ) + , reconnectionRemainingSeconds_( 30 ) + , triedConnecting_( false ) { // Set up the UI first setupUi( this ); // Set the username box with the last used email address config_ = KMessConfig::instance()->getGlobalConfig( "InitialView" ); - defaultHandle_ = config_.readEntry( "defaultHandle", "me@hotmail.com" ); + lastUsedHandle_ = config_.readEntry( "defaultHandle", "me@hotmail.com" ); // Enable auto completion handleCombobox_->setCompletionMode( KGlobalSettings::CompletionPopup ); @@ -52,11 +68,11 @@ InitialView::InitialView( QWidget *parent ) QDate currentDate = QDate::currentDate(); if( currentDate.month() == 12 && currentDate.day() > 15 ) { - imageName = "kmesslogo2"; + imageName = "kmessstrip2"; } else { - imageName = "kmesslogo"; + imageName = "kmessstrip1"; } // Load the chosen icon loader_ = KIconLoader::global(); @@ -82,25 +98,23 @@ InitialView::InitialView( QWidget *parent ) addAccount( account ); } - // Initially hide the options box - optionsBox_->hide(); - // Connect the remaining signals connect( handleCombobox_, SIGNAL( editTextChanged(const QString&) ), this, SLOT ( updateView() ) ); -#if KDE_IS_VERSION(4,0,70) - connect( handleCombobox_, SIGNAL( returnPressed() ), - connectButton_, SLOT ( animateClick() ) ); -#else - connect( handleCombobox_->lineEdit(), SIGNAL( returnPressed() ), - connectButton_, SLOT ( animateClick() ) ); -#endif connect( connectButton_, SIGNAL( clicked() ), this, SLOT ( slotConnectClicked() ) ); connect( rememberAccountCheckBox_, SIGNAL( stateChanged(int) ), this, SLOT ( rememberAccountStateChanged(int) ) ); - connect( optionsLabel_, SIGNAL( leftClickedUrl(QString) ), - this, SLOT ( toggleOptionsBox() ) ); + connect( forgottenPasswordLabel_, SIGNAL( leftClickedUrl(const QString&) ), + this, SLOT ( slotClickedUrl(const QString&) ) ); + connect( newAccountLabel_, SIGNAL( leftClickedUrl(const QString&) ), + this, SLOT ( slotClickedUrl(const QString&) ) ); + connect( statusLabel_, SIGNAL( linkActivated(const QString&) ), + this, SLOT ( slotClickedUrl(const QString&) ) ); + + // Enable tooltips for the two URL labels (they're disabled by default) + newAccountLabel_->setUseTips( true ); + forgottenPasswordLabel_->setUseTips( true ); // When an account is edited, reflect the changes in the accounts list connect( AccountsManager::instance(), SIGNAL( accountChanged(Account*,QString,QString) ), @@ -110,17 +124,24 @@ InitialView::InitialView( QWidget *parent ) connect( AccountsManager::instance(), SIGNAL( passwordsReady() ), this, SLOT ( updateView() ) ); - // The status is needed only later - statusLabel_->hide(); - - // Force an update of the view - setEnabled( true ); - updateView(); - // Use Solid to find out whether we're connected or not, and apply the status immediately connect( Solid::Networking::notifier(), SIGNAL( statusChanged(Solid::Networking::Status) ), this, SLOT ( slotConnectionStatusChanged(Solid::Networking::Status) ) ); - slotConnectionStatusChanged( Solid::Networking::status() ); + + // Set the initial status of the widgets + reset(); + + // Add an event filter to create a quick account chooser + pictureLabel_->installEventFilter( this ); + installEventFilter( this ); + + // Set up the timers + reconnectionTimer_.setInterval( 1000 ); // Fire every second + connect( &reconnectionTimer_, SIGNAL( timeout() ), + this, SLOT ( slotReconnectTimerEvent() ) ); + statusMessageTimer_.setSingleShot( true ); + connect( &statusMessageTimer_, SIGNAL( timeout() ), + this, SLOT ( statusMessage() ) ); } @@ -148,9 +169,9 @@ void InitialView::addAccount(Account *account) handleCombobox_->completionObject()->addItem( handle ); // Select the account in the combobox if it's the default account. - if( handle == defaultHandle_ ) + if( handle == lastUsedHandle_ ) { - handleCombobox_->setCurrentItem( defaultHandle_ ); + handleCombobox_->setCurrentItem( lastUsedHandle_ ); updateView(); } } @@ -194,6 +215,98 @@ void InitialView::changedAccount( QString oldName, QString newName ) +/** + * @brief Automatically reconnect with a specified account [slot]. + * + * This method starts reconnecting to an account + * + * @param handle The email address of the account to reconnect + */ +void InitialView::reconnect( QString handle ) +{ +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Reconnecting account" << handle; +#endif + + Account *account = accounts_[ handle ]; + if( account == 0 ) + { +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Account not found, aborting."; +#endif + + statusMessage( i18nc( "Status message on login screen", + "Cannot reconnect: account not found." ), + 10000 ); + return; + } + + // If the account has not a saved password, we can't reconnect + if( account->getPassword().isEmpty() || ! account->getSavePassword() ) + { +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Account has no password, aborting."; +#endif + + statusMessage( i18nc( "Status message on login screen", + "Cannot reconnect: this account has no saved password." ), + 10000 ); + return; + } + + // Save the account which we will connect to, later on + reconnectionHandle_ = handle; + triedConnecting_ = true; + + switch( networkStatus_ ) + { + // We're connected to the network, try connecting now + case Solid::Networking::Connected: +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Network status: Connected. Waiting a little bit for reconnection."; +#endif + reconnectionRemainingSeconds_ = 5; + break; + + + // The network connection is down, wait for it to come up again + case Solid::Networking::Unconnected: + case Solid::Networking::Connecting: +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Network status: Unconnected/connecting. Waiting for a connection."; +#endif + setEnabled( false ); + statusMessage( i18nc( "Status message on login screen", + "Waiting for an Internet connection to reconnect...
    Reconnect now!", + "kmess://reconnect/" ) ); + return; + + + // The connection is being brought down, wait for it + case Solid::Networking::Disconnecting: + kDebug() << "Network status: disconnecting. Waiting a moment for reconnection."; + reconnectionRemainingSeconds_ = 30; + return; + + + // The network connection status is not known, wait a while before reconnecting + case Solid::Networking::Unknown: + +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Network status: Unknown. Scheduling reconnection."; +#endif + reconnectionRemainingSeconds_ = 30; + break; + } + + // Start the reconnection delay timer + setEnabled( false ); + reconnectionTimer_.start(); + slotReconnectTimerEvent(); +} + + + /** * @brief Update the view when the network connection status changes * @@ -204,36 +317,108 @@ void InitialView::changedAccount( QString oldName, QString newName ) */ void InitialView::slotConnectionStatusChanged( Solid::Networking::Status newStatus ) { - // If Solid is unable to retrieve the status, assume we're connected - bool isConnected = ( newStatus == Solid::Networking::Connected || newStatus == Solid::Networking::Unknown ); +#if KMESS_DEBUG == 1 && KMESS_ENABLE_NULL_SOCKET == 1 + networkStatus_ = Solid::Networking::Connected; +#else + networkStatus_ = newStatus; +#endif - connectButton_->setEnabled( isConnected ); - - if( isConnected && ! isConnecting_ ) +#ifdef KMESSDEBUG_INITIALVIEW + QString status; + switch( networkStatus_ ) { - statusLabel_->setVisible( false ); - statusMessage( QString() ); + case Solid::Networking::Unknown: status = "Unknown"; break; + case Solid::Networking::Unconnected: status = "Unconnected"; break; + case Solid::Networking::Disconnecting: status = "Disconnecting"; break; + case Solid::Networking::Connecting: status = "Connecting"; break; + case Solid::Networking::Connected: status = "Connected"; break; + default: status = "Other (not known)"; break; + } + kDebug() << "The network connection status has changed to:" << status << "."; +#endif + + // If Solid is unable to retrieve the status, assume we're connected + if( networkStatus_ == Solid::Networking::Connected + || networkStatus_ == Solid::Networking::Unknown ) + { + if( ! triedConnecting_ ) + { +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "no connection attempt active, do nothing."; +#endif + } + else + { +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "A connection attempt was in progress, continueing..."; +#endif + + if( ! reconnectionHandle_.isEmpty() ) + { +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Reconnection asked, scheduling."; +#endif + reconnect( reconnectionHandle_ ); + } + else + { + statusMessage(); + setEnabled( true ); + } + } } else { - if( isConnecting_ ) + // Solid connection is not up. + // Reset the dialog, keep the "isConnecting" status + setEnabled( ! triedConnecting_ ); + if( triedConnecting_ ) { - // Force a disconnection - connectButton_->click(); + // Still show the same message. + statusMessage( i18nc( "Status message on login screen", + "Waiting for an Internet connection to reconnect...
    Reconnect now!", + "kmess://reconnect/" ) ); + } + else + { + statusMessage( i18nc( "Status message on login screen", "Internet connection not available." ) ); } - - statusLabel_->setVisible( true ); - statusMessage( i18n("Internet connection not available.") ); } } +// Update the reconnection timer data +void InitialView::slotReconnectTimerEvent() +{ + if( reconnectionRemainingSeconds_ == 0 ) + { + // Halt the timer + reconnectionTimer_.stop(); + + // Try reconnecting now + startConnecting( reconnectionHandle_ ); + return; + } + + statusMessage( i18ncp( "Status message on login screen", + "Waiting %1 second before reconnection...
    Reconnect now!", + "Waiting %1 seconds before reconnection...
    Reconnect now!", + reconnectionRemainingSeconds_, + "kmess://reconnect/" ), + 5000 ); + + // Reduce time for reconnect + --reconnectionRemainingSeconds_; +} + + + // The account was deleted void InitialView::deleteAccount(Account *account) { // Remove account from hashmap. - QString handle = account->getHandle(); + QString handle( account->getHandle() ); accounts_.remove(handle); // Remove account from completionbox (extended qlistbox) @@ -263,7 +448,7 @@ void InitialView::deleteAccount(Account *account) QString InitialView::getSelectedHandle() const { // Get handle, remove appended friendlyname if present - QString handle = handleCombobox_->currentText(); + QString handle( handleCombobox_->currentText() ); if( handle.contains(' ') ) { handle = handle.section(' ', 0, 0); @@ -280,7 +465,7 @@ void InitialView::updateView() if( account != 0 ) { // User typed the full account name without using autocompletion. - if( account->getPassword().isEmpty() || ! account->getSavePassword() ) + if( ! account->getSavePassword() ) { rememberPasswordCheckBox_->setChecked( false ); passwordEdit_->setText( QString() ); @@ -361,25 +546,44 @@ void InitialView::rememberAccountStateChanged( int state ) +// Reset the view to its initial state +void InitialView::reset() +{ + // Reset internal data + setEnabled( true ); + reconnectionHandle_ = QString(); + reconnectionTimer_.stop(); + triedConnecting_ = false; + + // Update the view again with regard to the current network status + updateView(); + statusMessage(); + slotConnectionStatusChanged( Solid::Networking::status() ); +} + + + // Enable or disable the widgets when we're waiting or connecting void InitialView::setEnabled( bool isEnabled ) { - loginBox_ ->setEnabled( isEnabled ); - optionsBox_ ->setEnabled( isEnabled ); - optionsLabel_ ->setVisible( isEnabled ); - initialStatusLabel_->setEnabled( isEnabled ); - initialStatus_ ->setEnabled( isEnabled ); - statusLabel_ ->setVisible( ! isEnabled ); + isConnectingUI_ = ( ! isEnabled ); + + initialStatusLabel_ ->setEnabled( isEnabled ); + initialStatus_ ->setEnabled( isEnabled ); + handleCombobox_ ->setEnabled( isEnabled ); + passwordEdit_ ->setEnabled( isEnabled ); + rememberAccountCheckBox_ ->setEnabled( isEnabled ); + rememberPasswordCheckBox_->setEnabled( isEnabled ); // Switch the button's look if( isEnabled ) { - connectButton_->setText( i18n( "Connect" ) ); + connectButton_->setText( i18nc( "Button label", "&Connect" ) ); connectButton_->setIcon( loader_->loadIcon( "network-connect", KIconLoader::Small, KIconLoader::SizeMedium ) ); } else { - connectButton_->setText( i18n( "Disconnect" ) ); + connectButton_->setText( i18nc( "Button label", "&Cancel" ) ); connectButton_->setIcon( loader_->loadIcon( "network-disconnect", KIconLoader::Small, KIconLoader::SizeMedium ) ); } } @@ -390,49 +594,82 @@ void InitialView::setEnabled( bool isEnabled ) void InitialView::slotConnectClicked() { #ifdef KMESSDEBUG_INITIALVIEW - kDebug() << "Connect button clicked," << (isConnecting_?"disconnecting":"connecting"); + kDebug() << "Connect button clicked," << ( isConnectingUI_ ? "disconnecting" : "connecting" ); #endif // The button was acting as Disconnect button when it was clicked - if( isConnecting_ ) + if( isConnectingUI_ ) { - isConnecting_ = false; + emit disconnectClicked(); // Enable back the widgets to allow connecting again - setEnabled( true ); - - emit disconnectClicked(); + reset(); return; } // The button was acting as Connect button when it was clicked - QString handle = getSelectedHandle(); + startConnecting( getSelectedHandle() ); +} + + + +/** Start connecting with a specified account. + * + * It can also simply update the UI, without actually requesting a connection. + * KMess' autologin functions connect by themselves, so this is required. + * + * @param handle Handle of the account to connect with + * @param emitConnectionSignal Whether to emit the connection request signal + * to the KMess class or not + */ +bool InitialView::startConnecting( const QString handle, bool emitConnectionSignal ) +{ + // Fill the UI fields with the selected handle's details, if any + // Selecting the account this way also makes a saved account's + // password to appear + handleCombobox_->setEditText( handle ); // Avoid connecting with empty fields if( handle.isEmpty() || passwordEdit_->text().isEmpty() ) { - return; + statusMessage( i18nc( "Status message on login screen", + "Please, fill both your email and password." ), + 10000 ); + + // Select the box with the error + if( handle.isEmpty() ) + { + handleCombobox_->setFocus(); + } + else + { + passwordEdit_->setFocus(); + } + return false; } // Also don't connect if the handle is invalid if( ! Account::isValidEmail( handle ) ) { + statusMessage( i18nc( "Status message on login screen", + "Please, enter a valid email address." ), + 10000 ); + handleCombobox_->setFocus(); - return; + return false; } - // Set the UI options for the selected handle - handleCombobox_->setEditText( handle ); - - isConnecting_ = true; +#ifdef KMESSDEBUG_INITIALVIEW + kDebug() << "Connecting with handle:" << handle; +#endif // Disable the widgets to start connecting setEnabled( false ); // Save the currently selected account for the next logins - defaultHandle_ = handle; + lastUsedHandle_ = handle; config_.writeEntry( "defaultHandle", handle ); // Find out what status has been chosen @@ -449,65 +686,165 @@ void InitialView::slotConnectClicked() default: initialStatus = STATUS_ONLINE; break; } + // Set the state. + // This toggles reconnection, and "continue connecting" stuff. + triedConnecting_ = true; + + // When we connect to an account from outside InitialView, the actual connection + // process may be handled externally, so emitting the signal below would cause + // problems, and even infinite loops. + if( ! emitConnectionSignal ) + { + return true; + } + // Inform parent with the account information emit connectWithAccount( handle, passwordEdit_->text(), rememberAccountCheckBox_->isChecked(), rememberPasswordCheckBox_->isChecked(), initialStatus ); -} - - -// Start connecting with a specified account -void InitialView::startedConnecting( const QString handle ) -{ - // Do nothing if an invalid or no account has been selected - if( handle.isEmpty() || ! accounts_.contains( handle ) ) - { -#ifdef KMESSDEBUG_INITIALVIEW - kDebug() << "Not updating view for invalid handle" << handle; -#endif - return; - } - -#ifdef KMESSDEBUG_INITIALVIEW - kDebug() << "Updating UI for" << handle; -#endif - - // Set the UI options for the selected handle - handleCombobox_->setEditText( handle ); - - isConnecting_ = true; - - // Disable the widgets to start connecting - setEnabled( false ); - - // Save the currently selected account for the next logins - defaultHandle_ = handle; - config_.writeEntry( "defaultHandle", handle ); + return true; } // Change the connection status text -void InitialView::statusMessage( QString text ) +void InitialView::statusMessage( const QString text, int timeout ) { statusLabel_->setText( text ); + + if( timeout > 0 ) + { + statusMessageTimer_.start( timeout ); + } + else + { + statusMessageTimer_.stop(); + } } -// Toggle displaying the Options box, which allows remembering accounts & passwords -void InitialView::toggleOptionsBox() +// Execute the browser for a clicked UI link +void InitialView::slotClickedUrl( const QString &url ) { - if( optionsBox_->isHidden() ) + // Handle special links + if( url.startsWith( "kmess://" ) ) { - optionsBox_->show(); - optionsLabel_->setText( i18nc( "Clickable label on login screen", "Less options..." ) ); + if( url == "kmess://reconnect/" ) + { + // The reconnection process is still active, stop it before trying to connect + reconnectionTimer_.stop(); + + startConnecting( reconnectionHandle_ ); + } + + return; } - else + + KMessShared::openBrowser( KUrl( url ) ); +} + + + +bool InitialView::eventFilter(QObject *obj, QEvent *event) +{ + // Handle keyboard events for all widgets + if( event->type() == QEvent::KeyPress ) { - optionsBox_->hide(); - optionsLabel_->setText( i18nc( "Clickable label on login screen", "More options..." ) ); + QKeyEvent *keyEvent = static_cast( event ); + int key = keyEvent->key(); + + // Enable pressing Enter from any widget to start connecting + if( ( key == Qt::Key_Return || key == Qt::Key_Enter ) + || ( key == Qt::Key_Escape && isConnectingUI_ ) ) // Enable pressing Esc to cancel a connection attempt + { + slotConnectClicked(); + return true; + } } + + // The following code is only for the picture label. If any code has to be added for + // another widget, this code may need to be changed.. + + if( obj != pictureLabel_ ) + { + return false; // don't stop processing. + } + + // Don't handle events when connecting + if( isConnectingUI_ ) + { + return false; + } + + Account *account = accounts_[ getSelectedHandle() ]; + KStandardDirs *dirs = KGlobal::dirs(); + QEvent::Type eventType = event->type(); + + if( eventType == QEvent::Enter ) // Glow effect when mouse enters display picture + { + QImage glowingImage; + + if( account != 0 ) + { + glowingImage = QImage( account->getPicturePath() ); + } + else + { + glowingImage = QImage( dirs->findResource( "data", "kmess/pics/kmesspic.png" ) ); + } + + KIconEffect::toGamma( glowingImage, 0.8f ); + pictureLabel_->setPixmap( QPixmap::fromImage( glowingImage ) ); + } + else if( eventType == QEvent::Leave ) // Restore default when mouse leaves display picture + { + QPixmap picture; + + if( account != 0 ) + { + picture = QPixmap( account->getPicturePath() ); + } + else + { + picture = QPixmap( dirs->findResource( "data", "kmess/pics/kmesspic.png" ) ); + } + + pictureLabel_->setPixmap( picture ); + } + else if( eventType == QEvent::Wheel && handleCombobox_->isEnabled() == true ) // Switch accounts using mousewheel + { + QWheelEvent *wheelEvent = static_cast( event ); + + int newIndex = handleCombobox_->currentIndex(); + + if( wheelEvent->delta() > 0 ) + { + newIndex--; + + if( newIndex < 0 ) + { + newIndex = handleCombobox_->count() - 1; + } + } + else + { + newIndex++; + + if( newIndex >= handleCombobox_->count() ) + { + newIndex = 0; + } + } + + handleCombobox_->setCurrentIndex( newIndex ); + } + else if( eventType == QEvent::MouseButtonRelease ) // Show settings when display picture is clicked + { + emit showSettings( account ); + } + + return false; // don't stop processing. } diff --git a/src/initialview.h b/src/initialview.h index 5e1dc36..b56cf24 100644 --- a/src/initialview.h +++ b/src/initialview.h @@ -22,6 +22,8 @@ #include "contact/msnstatus.h" #include +#include +#include #include @@ -56,46 +58,70 @@ class InitialView : public QWidget, private Ui::InitialView void changedAccount( QString oldName, QString newName ); // The account was deleted void deleteAccount(Account *account); + // Reset the view to its initial state + void reset(); // Start connecting with a specified account - void startedConnecting( const QString handle ); + bool startConnecting( const QString handle, bool emitConnectionSignal = true ); + + private: // Private methods + // The users picture received an event. + bool eventFilter( QObject *obj, QEvent *ev ); public slots: // Public slots // A profile was selected from the drop-down list, or written manually. void updateView(); + // Automatically reconnect with a specified account + void reconnect( QString handle ); // Change the connection status text - void statusMessage( QString text ); + void statusMessage( const QString text = QString(), int timeout = 0 ); private slots: // Get the currently selected handle QString getSelectedHandle() const; // The "remember account" checkbox change its state void rememberAccountStateChanged( int state ); + // Update the reconnection timer data + void slotReconnectTimerEvent(); // Enable or disable the widgets when we're connecting or waiting void setEnabled( bool isEnabled ); // The connect/disconnect button has been clicked void slotConnectClicked(); // Detect changes in the status of the internet connection void slotConnectionStatusChanged( Solid::Networking::Status newStatus ); - // Toggle displaying the Options box, which allows remembering accounts & passwords - void toggleOptionsBox(); + // Execute the browser for a clicked UI link + void slotClickedUrl( const QString &url ); private: // Private attributes // The list of accounts to choose from QHash accounts_; // The application's configuration file KConfigGroup config_; - // The default handle to display - QString defaultHandle_; // Whether the UI is set up for connection or waiting for the login data - bool isConnecting_; + bool isConnectingUI_; + // The default handle to display + QString lastUsedHandle_; // Loader for icons KIconLoader *loader_; + // The current status of the network connection + Solid::Networking::Status networkStatus_; + // Account to reconnect with + QString reconnectionHandle_; + // Number of seconds left before reconnection + quint16 reconnectionRemainingSeconds_; + // Timer to schedule reconnection + QTimer reconnectionTimer_; + // Timer to blank the status message + QTimer statusMessageTimer_; + // Whether KMess was trying to connect. + bool triedConnecting_; signals: // Public signals // Connect with the given account void connectWithAccount( QString handle, QString password, bool rememberAccount, bool rememberPassword, Status initialStatus ); // Disconnect button was clicked void disconnectClicked(); + // Show the settings of the current account. + void showSettings( Account* account ); }; #endif diff --git a/src/initialview.ui b/src/initialview.ui index 95f57f7..f6cb2a9 100644 --- a/src/initialview.ui +++ b/src/initialview.ui @@ -5,244 +5,299 @@ 0 0 - 546 - 637 + 293 + 509 - + + + 0 + + + 8 + - 5 + 0 + + + 8 - 5 + 0 - - - QFrame::Sunken - + Qt::Horizontal - - - - - + - 0 - 0 + 12 + 20 - - QFrame::NoFrame + + + + + + + 400 + 16777215 + - - QFrame::Plain - - - 2 - - + + + 0 + + + 0 + - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 100 - 104 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 2 - - - - - - 96 - 96 - - - - - 96 - 96 - - - - QFrame::StyledPanel - - - QFrame::Sunken - - - - - - true - - - Qt::AlignCenter - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - + + + + 0 + 0 + - - false - - - false - - - - - - Email address: + + + + + Qt::Horizontal - - false + + + 48 + 20 + + + + + + + + 100 + 104 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 2 + + + + + + 96 + 96 + + + + + 96 + 96 + + + + <html>Click here to display the options for the currently selected account, or scroll using the mouse wheel to switch between the saved accounts</html> + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + true + + + Qt::AlignCenter + + + + - - - - true + + + + Qt::Horizontal - + + + 40 + 20 + + + - - - - Password: + + + + Qt::Vertical - - false + + QSizePolicy::MinimumExpanding - - - - - - QLineEdit::Password + + + 13 + 13 + - + - TextLabel2 - TextLabel3 - handleCombobox_ - passwordEdit_ - + + + + 0 + 0 + + - Status at login + Email address: false + + handleCombobox_ + - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - More options... - - - - - - - - - Account options + + + + 0 + 0 + + + + Insert here the email address of your registered Passport or Live account + + + true + + + + + + + + 0 + 0 + + + + Password: + + + false + + + passwordEdit_ + + + + + + + Insert here your account's password + + + QLineEdit::Password + + + + + + + + 0 + 0 + + + + Status at login: + + + false + + + initialStatus_ + + + + + + + + 0 + 0 + + + + Choose a status to set when successfully connected. + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 13 + 13 + + + + + + + + If enabled, KMess will save your account + + + Remem&ber account + + + Alt+B + + + + + + + If you choose to remember an account within KMess, you can also save its password + + + R&emember password + + + Alt+B - - - - - Remem&ber this profile - - - Alt+B - - - - - - - Also r&emember the password - - - Alt+B - - - - @@ -255,8 +310,8 @@ - 16 - 16 + 13 + 13 @@ -284,9 +339,18 @@ Qt::TabFocus + + Click this button to start using KMess, or to cancel a connection attempt + &Connect + + true + + + true + @@ -308,89 +372,212 @@ - - - - - - Qt::AlignCenter - - - - - + Qt::Vertical + + QSizePolicy::Fixed + 20 - 70 + 5 + + + + + 0 + 0 + + + + + + + Qt::RichText + + + Qt::AlignCenter + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 13 + 13 + + + + + + + + 4 + + + + + + 0 + 0 + + + + New Account + + + https://accountservices.passport.net/reg.srf + + + <html>Click here to register a new Live account, which you can use to connect to MSN.<br/>You can also use your existing email address</html> + + + + + + + Qt::Horizontal + + + QSizePolicy::MinimumExpanding + + + + 13 + 13 + + + + + + + + + 0 + 0 + + + + Password forgotten? + + + https://login.live.com/resetpw.srf + + + <html>Click here to go to the Live web site, to reset your account's password</html> + + + + + + + + + + 0 + 0 + + + + + 64 + 64 + + + + + + + + 0 + 0 + + + + + 64 + 64 + + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 17 + 17 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 17 + 17 + + + + + + kmessLogo_ + line_2 + + + + - + Qt::Horizontal - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 20 - 16 - - - - - - - - - 0 - 0 - - - - - 64 - 64 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 20 - 16 - - - - - + + + 12 + 20 + + + @@ -409,27 +596,8 @@ - initialStatus_ - rememberAccountCheckBox_ connectButton_ - - - passwordEdit_ - returnPressed() - connectButton_ - animateClick() - - - 282 - 237 - - - 236 - 480 - - - - +
    diff --git a/src/kmess.cpp b/src/kmess.cpp index e78a61f..e42de59 100644 --- a/src/kmess.cpp +++ b/src/kmess.cpp @@ -17,23 +17,28 @@ #include "kmess.h" +#include "emoticon.h" // workarround for mingw-g++ compiler bug "extraneous `char' ignored" +#include "emoticontheme.h" // +#include "emoticonmanager.h" // + #include "chat/chat.h" #include "chat/chatmaster.h" #include "contact/contact.h" -#include "contact/contactlist.h" #include "contact/group.h" #include "contact/msnstatus.h" #include "dialogs/addcontactdialog.h" #include "dialogs/awaymessagedialog.h" +#include "dialogs/chathistorydialog.h" #include "dialogs/contactaddeduserdialog.h" -#include "dialogs/networkwindow.h" +#include "dialogs/listexportdialog.h" #include "dialogs/transferwindow.h" +#include "model/contactlist.h" #include "network/msnnotificationconnection.h" #include "notification/notificationmanager.h" #include "notification/chatnotification.h" #include "notification/contactstatusnotification.h" #include "notification/newemailnotification.h" -#include "notification/passivepopup.h" +#include "notification/systemtraywidget.h" #include "settings/accountsettingsdialog.h" #include "utils/idletimer.h" #include "utils/kmessconfig.h" @@ -50,9 +55,9 @@ #include "kmessdebug.h" #include "kmessinterface.h" #include "kmessview.h" -#include "systemtraywidget.h" #include +#include #include #include @@ -60,11 +65,17 @@ #include #include #include +#include +#include #include #include #include #include +#ifdef KMESSTEST + #include "dialogs/networkwindow.h" +#endif + // The constructor @@ -151,6 +162,12 @@ KMess::~KMess() // Add the account to the GUI void KMess::slotAccountAdded(Account *account) { + // Check if the account is already present in the menus + if( connectMenuItems_.contains( account ) ) + { + return; + } + AccountAction *accountAction; // Make the action for the "Connect..." menu @@ -161,17 +178,8 @@ void KMess::slotAccountAdded(Account *account) connect( accountAction, SIGNAL( activated(Account*) ), this, SLOT ( connectWithAccount(Account*) ) ); - - // Make the action for the "Settings..." menu - accountAction = new AccountAction( account, this ); - settingsActionMenu_->addAction( accountAction ); - settingsMenuItems_[ account ] = accountAction; - - connect( accountAction, SIGNAL( activated(Account*) ), - this, SLOT ( showSettingsForAccount(Account*) ) ); - - // If the initial login window is visible, add the new account there, too - if( initialView_ ) + // If the initial login window is visible, add the new account there if it's not a guestAccount + if( initialView_ && ! account->isGuestAccount()) { initialView_->addAccount( account ); } @@ -185,24 +193,43 @@ void KMess::addNewContact() #ifdef KMESSTEST KMESS_ASSERT( msnNotificationConnection_ != 0 ); #endif -#ifdef KMESSDEBUG_KMESS - kDebug(); -#endif - QString groupId; + QStringList groupsId; QString newHandle; // Launch a modal dialog to get the new contact handle and, optionally, group - new AddContactDialog( newHandle, groupId, this ); + new AddContactDialog( newHandle, groupsId, this ); // Do nothing if the user has clicked cancel if( newHandle.isEmpty() ) { return; } +#ifdef KMESSDEBUG_KMESS + kDebug() << "Adding " << newHandle << "to groups: " << groupsId; +#endif + + // Check if the contact is already in contact list + Contact *contact = currentAccount_->getContactList()->getContactByHandle( newHandle ); + + if( contact != 0 ) + { + // If the contact is already in friendly list, stop the process + if( contact->isFriend() ) + { + QMessageBox::information( this, i18n( "Contact Information" ), i18n( "Contact %1 is already in your contact list.", newHandle ) ); + return; + } + else + { + // The user is adding one deleted contact + msnNotificationConnection_->addExistingContact( newHandle, groupsId ); + return; + } + } // Ask the server to add the contact - msnNotificationConnection_->addNewContact( newHandle, groupId ); + msnNotificationConnection_->addNewContact( newHandle, groupsId ); } @@ -223,12 +250,19 @@ void KMess::addNewGroup() newGroupName = i18n( "New Group" ); // Launch a dialog to get a new group name - newGroupName = KInputDialog::getText(i18n("Add a group"), - i18n("Enter the new name for this group:"), + newGroupName = KInputDialog::getText(i18nc( "Dialog box title", "Add a Group" ), + i18n( "Enter a name for the new group:" ), newGroupName, &okPressed, this); if(okPressed) { + // Check if the group already exists. + Group *group = currentAccount_->getContactList()->getGroupByName( newGroupName ); + if( group != 0 ) + { + return; + } + // Ask the server to add the group msnNotificationConnection_->addGroup( newGroupName ); } @@ -259,7 +293,7 @@ void KMess::applicationClosing() // An account's settings have been changed void KMess::slotAccountChanged( Account *account, QString oldHandle, QString oldFriendlyName ) { - QString newHandle = account->getHandle(); + QString newHandle( account->getHandle() ); #ifdef KMESSDEBUG_KMESS kDebug() << "Saving UI settings for" << newHandle; @@ -298,7 +332,6 @@ void KMess::slotAccountChanged( Account *account, QString oldHandle, QString old // Update the menu items connectMenuItems_ [ account ]->updateText(); - settingsMenuItems_[ account ]->updateText(); } @@ -331,73 +364,62 @@ void KMess::changedListPictureSize( int mode ) // A status was selected from the menu. -void KMess::changeStatus( int index ) +void KMess::changeStatus( QAction *action ) { - Status newStatus; - bool useAutoreply; - AwayMessageDialog *awayMessageDialog; - QString awayMessage; + QString awayMessage; + Status newStatus = (Status) action->data().toInt(); - isIdleForced_ = false; - currentAccount_->setAutoreply( false ); - - // Find out what status has been chosen - switch( index ) + // The user has set Away with Auto Reply, let it choose the message + if( newStatus == STATUS_AWAY_AUTOREPLY ) { - // Away with auto-reply - case 2: - newStatus = STATUS_AWAY; + awayMessage = currentAccount_->getAutoreplyMessage(); - // Create the away message dialog - awayMessageDialog = new AwayMessageDialog( this ); + // Create and show the away message dialog + AwayMessageDialog *awayMessageDialog = new AwayMessageDialog( this ); + bool useAutoreply = awayMessageDialog->useMessage( awayMessage ); + if( ! useAutoreply ) + { + awayMessage.clear(); + } - // Confirm the auto-away message with the user - awayMessage = CurrentAccount::instance()->getAutoreplyMessage(); - useAutoreply = false; - useAutoreply = awayMessageDialog->useMessage( awayMessage ); - if( useAutoreply ) - { - // Tell the account to respond with an autoreply message - CurrentAccount::instance()->setAutoreplyMessage( awayMessage ); - CurrentAccount::instance()->setAutoreply( true ); - } - delete awayMessageDialog; - break; - // Idle - case 3: - newStatus = STATUS_IDLE; - isIdleForced_ = true; - break; - - case 1: newStatus = STATUS_AWAY; break; - case 4: newStatus = STATUS_BE_RIGHT_BACK; break; - case 5: newStatus = STATUS_BUSY; break; - case 6: newStatus = STATUS_OUT_TO_LUNCH; break; - case 7: newStatus = STATUS_ON_THE_PHONE; break; - case 8: newStatus = STATUS_INVISIBLE; break; - case 0: - default: newStatus = STATUS_ONLINE; break; + delete awayMessageDialog; } -#ifdef KMESSDEBUG_KMESS - kDebug() << "Selected status: " << MsnStatus::getCode( newStatus ); -#endif + // The user wants to disconnect + if( newStatus == STATUS_OFFLINE ) + { + disconnectClicked(); + return; + } - msnNotificationConnection_->changeStatus( newStatus ); + changeStatus( newStatus, awayMessage ); } -// Tray notifications settings were changed -void KMess::changedNotificationsSettings() +// We should change status to this right away (can be called by changeStatus() or by other code) +void KMess::changeStatus( Status newStatus, QString autoReplyMessage ) { - chatNotification_ ->setEnabled( currentAccount_->getNotifyContactsChatStart(), - currentAccount_->getNotifyContactsChatMessages() ); - contactStatusNotification_->setEnabled( currentAccount_->getNotifyContactsOnline(), - currentAccount_->getNotifyContactsOffline(), - currentAccount_->getNotifyContactsStatus() ); - newEmailNotification_ ->setEnabled( currentAccount_->getNotifyInboxEmails(), - currentAccount_->getNotifyOtherEmails() ); +#ifdef KMESSDEBUG_KMESS + kDebug() << "Selected status:" << MsnStatus::getCode( newStatus ); +#endif + + // Is the status is set manually, idle is forced. + isIdleForced_ = true; + + // Set or unset the auto reply message + if( autoReplyMessage.isEmpty() ) + { + currentAccount_->setAutoreply( false ); + } + else + { + currentAccount_->setAutoreplyMessage( autoReplyMessage ); + currentAccount_->setAutoreply( true ); + } + + // Change status + msnNotificationConnection_->changeStatus( newStatus ); } @@ -448,7 +470,6 @@ void KMess::changedSong( const QString &artist, const QString &album, const QStr // The status was changed void KMess::changedStatus( Account *account ) { - int item = -1; Status newStatus; if( account != 0 ) @@ -472,37 +493,17 @@ void KMess::changedStatus( Account *account ) #endif // Make sure the drop down list matches the user's status - switch( newStatus ) + QList menuActions( status_->findChildren() ); + foreach( KAction *action, menuActions ) { - case STATUS_AWAY: - if ( !currentAccount_->getAutoreply() ) - { - // Change status to Away - item = 1; - } - else - { - // Change status to Away with autoreply - item = 2; - } - break; - case STATUS_IDLE: item = 3; break; - case STATUS_BE_RIGHT_BACK: item = 4; break; - case STATUS_BUSY: item = 5; break; - case STATUS_OUT_TO_LUNCH: item = 6; break; - case STATUS_ON_THE_PHONE: item = 7; break; - case STATUS_INVISIBLE: item = 8; break; - case STATUS_ONLINE: - default: item = 0; break; - } - -#ifdef KMESSDEBUG_KMESS - kDebug() << "Changed the select status to item " << item; -#endif - - if ( item >= 0 ) - { - status_->setCurrentItem( item ); + if( (Status) action->data().toInt() == newStatus ) + { + action->setEnabled( false ); + } + else + { + action->setEnabled( true ); + } } } @@ -521,35 +522,42 @@ void KMess::changeViewMode(int mode) // Show a "Contact added you" dialog -void KMess::showContactAddedUserDialog(const Contact *contact) +void KMess::showContactAddedUserDialog( const QString handle ) { - const QString &handle = contact->getHandle(); - #ifdef KMESSDEBUG_KMESS - kDebug() << "Contact added user"; + kDebug() << "Contact" << handle << "added user, showing dialog."; #endif // Show a dialog and let the user choose whether to add, allow, or block the contact. - ContactAddedUserDialog dialog; - ContactAddedUserDialog::ReturnCode returnValue = dialog.launch( handle, contact->getFriendlyName() ); + ContactAddedUserDialog *dialog = new ContactAddedUserDialog( handle , handle ); - switch( returnValue ) - { - case ContactAddedUserDialog::ADD: - // Add the contact to the allowed and friends lists - msnNotificationConnection_->addNewContact( handle ); - break; + connect( dialog, SIGNAL( userChoice(const QString&,const QStringList&,const int) ), + this, SLOT ( slotContactAddedUserDialogChoice(const QString&,const QStringList&,const int) ) ); - case ContactAddedUserDialog::ALLOW: - // Add the contact to the allowed list - msnNotificationConnection_->allowContact( handle ); - break; + dialog->show(); +} - case ContactAddedUserDialog::BLOCK: - // Add the contact to the blocked list. - msnNotificationConnection_->blockContact(handle); - break; - } + + +// Show the context-sensitive menu item +void KMess::showContextMenu() +{ + if( KMESS_NULL( view_ ) ) return; + if( KMESS_NULL( connectActionMenu_ ) ) return; + if( KMESS_NULL( contextMenuAction_ ) ) return; + + // HACK: Get where the triggered action is located, by asking a menu + QRect actionPos( connectActionMenu_->menu()->actionGeometry( contextMenuAction_ ) ); + + view_->showContextMenu( actionPos.bottomRight() ); // Approximate to a side of the action, can't really do more +} + + + +void KMess::showListExportDialog() +{ + ListExportDialog *listExportDialog = new ListExportDialog(); + listExportDialog->show(); } @@ -566,11 +574,11 @@ void KMess::showNetworkWindow() // Show a dialog before removing the contact void KMess::showRemoveContactDialog(QString handle) { - QString message = i18n( "Are you sure you want to remove the contact %1 from your contact list?", handle ); + QString message( i18n( "Are you sure you want to remove the contact %1 from your contact list?", handle ) ); - int result = KMessageBox::warningYesNoCancel( this, message, i18n( "Remove contact" ) + int result = KMessageBox::warningYesNoCancel( this, message, i18n( "Remove Contact" ) , KGuiItem(i18n("Remove"), "edit-delete") // Yes - , KGuiItem(i18n("Remove and block"), "list-remove") // No + , KGuiItem(i18n("Remove and Block"), "list-remove") // No , KStandardGuiItem::cancel() , QString() , KMessageBox::Dangerous @@ -618,16 +626,14 @@ void KMess::showRemoveGroupDialog(QString groupId) KMessageBox::error( this, i18nc( "dialog text", "The group \"%1\" is not empty: remove all contacts from it, then try again!", group->getName() ), - i18nc( "dialog title", "Group removal" ) ); + i18nc( "dialog title", "Group Removal" ) ); return; } - - int result = KMessageBox::warningContinueCancel( this, - i18nc( "dialog text", - "Are you sure you want to remove the group %1" - "from your contact list?", group->getName() ), - i18nc( "dialog title", "Group removal" ), + // Prompt to remove + QString message( i18nc( "dialog text", "Are you sure you want to remove the group %1 from your contact list?", group->getName() ) ); + int result = KMessageBox::warningContinueCancel( this, message, + i18nc( "dialog title", "Group Removal" ), KGuiItem( i18nc( "dialog button", "Remove" ), "edit-delete" ), KStandardGuiItem::cancel(), QString(), @@ -668,7 +674,7 @@ void KMess::showRenameGroupDialog(QString groupId) newGroupName = group->getName(); // Launch a dialog to get a new group name - newGroupName = KInputDialog::getText(i18n("Rename group"), + newGroupName = KInputDialog::getText(i18n("Rename Group"), i18n("Enter the new name for this group:"), newGroupName, &okPressed, this); @@ -681,6 +687,18 @@ void KMess::showRenameGroupDialog(QString groupId) } + +// Show the chat history dialog and, if requested, that of a specific contact +void KMess::showChatHistory( const QString &handle ) +{ + ChatHistoryDialog *dialog = new ChatHistoryDialog( this ); + + dialog->setContact( handle ); + dialog->show(); +} + + + // Opens the transfer manager void KMess::showTransferWindow() { @@ -704,21 +722,14 @@ void KMess::checkAutologin(QString handle) const QList accountsList = AccountsManager::instance()->getAccounts(); foreach( Account *account, accountsList ) { - // For completeness, also test for guest accounts. - if( account->isGuestAccount() ) + // We are searching for a saved account with the autologin flag on + if( account->isGuestAccount() || ! account->getUseAutologin() ) { continue; } -#ifdef KMESSDEBUG_KMESS - kDebug() << "Account " << account->getHandle() - << " useAutologin = " << account->getUseAutologin() << "." << endl; -#endif - if ( account->getUseAutologin() ) - { - loginAccount = account; - break; - } + loginAccount = account; + break; } } else @@ -742,14 +753,16 @@ void KMess::checkAutologin(QString handle) i18nc( "dialog text", "

    Cannot login automatically with account \"%1\":
    " "you must first save the account password!

    ", - handle ), - i18nc( "dialog title", "Autologin failed" ) ); + loginAccount->getHandle() ), + i18nc( "dialog title", "Autologin Failed" ) ); return; } - // Set the info about login - initialView_->startedConnecting( loginAccount->getHandle() ); - connectWithAccount( loginAccount ); + // Set the login info in the initial view and connect + if( initialView_->startConnecting( loginAccount->getHandle(), false /* emitConnectionSignal */ ) ) + { + connectWithAccount( loginAccount ); + } } } @@ -761,12 +774,6 @@ void KMess::connected() // Enable/disable the menus enableMenus( true ); - // Show the status bar now that we're connected - if( showStatusBar_->isChecked() ) - { - statusBar()->show(); - } - // Set up the toggle and view mode tools to match the account settings showAllowedAction_->setChecked( currentAccount_->getShowAllowedContacts() ); showOfflineAction_->setChecked( currentAccount_->getShowOfflineContacts() ); @@ -803,6 +810,9 @@ void KMess::connected() // Set the list's groups and contacts display mode viewMode_->setCurrentItem( currentAccount_->getContactListDisplayMode() ); + // Check the 'Show search bar' option if the user has left it open the last login + showSearchAction_->setChecked( currentAccount_->getShowSearchBar() ); + // Show the connected message statusMessage( i18n("Connected"), false ); @@ -813,14 +823,17 @@ void KMess::connected() // Notify ChatMaster we're connected chatMaster_->connected(); - // Also read the account settings -// msnNotificationConnection_->readProperties( config ); + // Enable showing the settings for this account now that we are connected + showSettingsAction_->setEnabled( true ); // Load and show the contact list switchViewToContactList(); // Set the caption setCaptionToUser(); + + // Show the status bar (if it's enabled) now that we're connected + showStatusBar(); } @@ -842,9 +855,13 @@ void KMess::connectWithAccount(Account *account) // Update the main view's controls to match this account's details. changedStatus( account ); - // Switch to the login view and tell it we're connecting - switchViewToInitialScreen(); - initialView_->startedConnecting( account->getHandle() ); + + // Update the initial view with account details and start the connection if everything is ok + if( ! initialView_->startConnecting( account->getHandle(), false /* emitConnectionSignal */ ) ) + { + show(); + return; + } // Copy the account to the current account #ifdef KMESSDEBUG_KMESS @@ -855,6 +872,9 @@ void KMess::connectWithAccount(Account *account) // Allow users to cancel the login attempt disconnect_->setEnabled( true ); + // Set UI state of chat to "Connecting" + chatMaster_->connecting(); + // Connect to the server. msnNotificationConnection_->openConnection(); } @@ -892,6 +912,17 @@ void KMess::connectWithAccount(QString handle, QString password, bool rememberAc +// The user wants to reconnect +void KMess::reconnect() +{ +#ifdef KMESSDEBUG + kDebug() << "Reconnecting"; +#endif + connectWithAccount( currentAccount_ ); +} + + + // Create the program's default directories in .kde/share/apps/ bool KMess::createDirectories() { @@ -945,22 +976,6 @@ void KMess::createNewAccount() -// The current account changed its name, so set the corresponding account's name -void KMess::currentAccountChangedName() -{ - Account *account = AccountsManager::instance()->getAccountByHandle( currentAccount_->getHandle() ); - if( account != 0 ) - { - // Set the account's name to the current account's name - account->setFriendlyName( currentAccount_->getFriendlyName( STRING_ORIGINAL ) ); - } - - // Set the caption to the account's new name - setCaptionToUser(); -} - - - // Delete the given account from the UI void KMess::slotAccountDeleted( Account *account ) { @@ -980,20 +995,37 @@ void KMess::slotAccountDeleted( Account *account ) connectActionMenu_->removeAction( accountAction ); delete connectMenuItems_.take( account ); } - - // Remove from settings menu. - // This can't be done from AccountAction, because the menu item should - // remain accessable when you're logged in. - accountAction = settingsMenuItems_[ account ]; - if( ! KMESS_NULL(accountAction) ) - { - settingsActionMenu_->removeAction(accountAction); - delete settingsMenuItems_.take( account ); - } } +// The user was presented the "contact added user" dialog and has made a choice +void KMess::slotContactAddedUserDialogChoice( const QString &handle, const QStringList &groupIds, const int code ) +{ +#ifdef KMESSDEBUG_KMESS + kDebug() << "Contact" << handle << "added user, who has choosen option:" << code + << "Group list:" << groupIds; +#endif + + switch( (ContactAddedUserDialog::ReturnCode) code ) + { + case ContactAddedUserDialog::ADD: + // Add the contact to the allowed and friends lists + msnNotificationConnection_->addNewContact( handle, groupIds ); + break; + + case ContactAddedUserDialog::ALLOW: + // Add the contact to the allowed list + msnNotificationConnection_->allowContact( handle ); + break; + + case ContactAddedUserDialog::BLOCK: + // Add the contact to the blocked list. + msnNotificationConnection_->blockContact( handle ); + break; + } +} + /** * @brief Update the UI when the network connection status changes * @@ -1004,14 +1036,27 @@ void KMess::slotAccountDeleted( Account *account ) */ void KMess::slotConnectionStatusChanged( Solid::Networking::Status newStatus ) { - // Do not disable the connection menu if we're connected already - if( isConnected() ) - { - return; - } +#ifdef KMESSDEBUG_KMESSINTERFACE + kDebug() << "Solid status changed to " << newStatus; +#endif // If Solid is unable to retrieve the status, assume we're connected bool isNetConnected = ( newStatus == Solid::Networking::Connected || newStatus == Solid::Networking::Unknown ); + + // Do not disable the connection menu if we're connected already + if( isConnected() ) + { + // Do update the status message if the network is down + if( newStatus == Solid::Networking::Unconnected ) + { + // TODO: this slightly interferes with the "Pings lost..." message, and doesn't recover directly if solid indicates so. + statusMessage( i18n("Connection could be down..."), false ); + } + + return; + } + + // Update the menu connectActionMenu_->setEnabled( isNetConnected ); } @@ -1066,8 +1111,8 @@ void KMess::disconnected() kDebug() << "Saving the CurrentAccount."; #endif - // Transfer account settings that are made in the GUI. - account->copyAccountUISettings( currentAccount_ ); + // Transfer account settings + account->copyAccount( currentAccount_ ); } } } @@ -1075,7 +1120,9 @@ void KMess::disconnected() // Update the GUI disconnect_->setEnabled( false ); enableMenus(false); - statusMessage( i18n("Disconnected"), true ); + statusMessage( i18nc( "Status bar message", "Disconnected"), true ); + showSearchAction_->setChecked( false ); + showSettingsAction_->setEnabled( false ); // Hide the status bar now that we're not connected if( showStatusBar_->isChecked() ) @@ -1164,6 +1211,11 @@ bool KMess::initialize() kDebug() << "Couldn't initialize the emoticon manager."; return false; } + if ( !initProxy() ) + { + kDebug() << "Couldn't initialize the proxy support."; + return false; + } if ( !createDirectories() ) { kDebug() << "Couldn't create local KDE directories."; @@ -1185,11 +1237,9 @@ bool KMess::initialize() // Connect current account connect( currentAccount_, SIGNAL( changedFriendlyName() ), - this, SLOT ( currentAccountChangedName() )); + this, SLOT ( setCaptionToUser() )); connect( currentAccount_, SIGNAL( changedNowListeningSettings() ), this, SLOT ( changedNowListeningSettings() )); - connect( currentAccount_, SIGNAL(changedNotificationsSettings() ), - this, SLOT (changedNotificationsSettings() )); connect( currentAccount_, SIGNAL( changedStatus() ), this, SLOT ( changedStatus() )); connect( currentAccount_, SIGNAL( changedMsnObject() ), @@ -1197,7 +1247,7 @@ bool KMess::initialize() connect( currentAccount_, SIGNAL( changedEmoticonSettings() ), EmoticonManager::instance(),SLOT(slotChangedEmoticonSettings() ) ); - // Connect the Account Changed signal to update the GUI + // Connect the account management signals AccountsManager *accountsManager = AccountsManager::instance(); connect( accountsManager, SIGNAL( accountAdded(Account*) ), this, SLOT ( slotAccountAdded(Account*) ) ); @@ -1205,6 +1255,16 @@ bool KMess::initialize() this, SLOT ( slotAccountChanged(Account*,QString,QString) ) ); connect( accountsManager, SIGNAL( accountDeleted(Account*) ), this, SLOT ( slotAccountDeleted(Account*) ) ); + // Fill up the account lists in the UI + const QList list( accountsManager->getAccounts() ); + foreach( Account *account, list ) + { + slotAccountAdded( account ); + } + + // Connect the action to show the connected account settings + connect( showSettingsAction_, SIGNAL( triggered(bool) ), + this, SLOT ( showSettingsForCurrentAccount() ) ); // Read the accounts and properties readProperties(); @@ -1275,6 +1335,9 @@ bool KMess::initChatMaster() connect( msnNotificationConnection_, SIGNAL( pingSent() ), chatMaster_, SLOT ( timedUpdate() )); + connect( chatMaster_, SIGNAL( reconnect() ), + this, SLOT ( reconnect() )); + #ifdef KMESSTEST KMESS_ASSERT( chatMaster_ != 0 ); #endif @@ -1333,9 +1396,10 @@ bool KMess::initIdleTimer() bool KMess::initMsnNotificationConnection() { bool initialized; - + msnNotificationConnection_ = new MsnNotificationConnection(); + initialized = msnNotificationConnection_->initialize(); if ( !initialized ) { @@ -1348,8 +1412,8 @@ bool KMess::initMsnNotificationConnection() this, SLOT ( connected() ) ); connect( msnNotificationConnection_, SIGNAL( disconnected() ), // Disconnected from msn this, SLOT ( disconnected() ) ); - connect( msnNotificationConnection_, SIGNAL( contactAddedUser(const Contact*) ), // Contact added user - this, SLOT ( showContactAddedUserDialog(const Contact*) ) ); + connect( msnNotificationConnection_, SIGNAL( contactAddedUser(const QString) ), // Contact added user + this, SLOT ( showContactAddedUserDialog(const QString) ) ); connect( msnNotificationConnection_, SIGNAL( statusMessage(QString,bool) ), // Display a status message this, SLOT ( statusMessage(QString,bool) ) ); @@ -1389,15 +1453,15 @@ bool KMess::initNotifications() // The warning is a bit obtruisive, but should help to user to fix the problem. if( KGlobal::dirs()->findResource( "data", "kmess/kmess.notifyrc" ).isNull() ) { - QString dirs = KGlobal::dirs()->findDirs( "data", QString::null ).join("/kmess
    - "); - if( dirs.isEmpty() ) + QString dirs( KGlobal::dirs()->findDirs( "data", QString() ).join("/kmess
    ") ); + if( ! dirs.isEmpty() ) { - dirs = "(none)"; - } - else - { - dirs = "
    - " + dirs + "/kmess"; + dirs = "
    " + dirs + "/kmess"; dirs = dirs.replace( "//kmess", "/kmess" ); // possibly added by /kmess suffix. + dirs = i18nc( "Paragraph to be added to the text of a message dialog box, but only when KDE gives a list of " + "folders where to search for an application file", + "

    KMess has searched for it in the following folders:
    %1

    ", + dirs ); } // Always show warning at the console. @@ -1405,12 +1469,17 @@ bool KMess::initNotifications() // Show the message in the GUI as well. // Allow to user to choose "don't show this message again", in case he/she doesn't know how to fix it. - KMessageBox::information( this, i18n( "

    KMess will not be able to play sounds and notifications.

    " - "

    The KMess file 'kmess.notifyrc' could not be found in one of the following folders: %1

    " - "

    Please verify your installation, and copy the missing file to one of the listed folders.

    " - "
    ", dirs ), - i18n( "Error with notifications" ), - "eventsrcNotFound" ); + KMessageBox::information( this, + i18nc( "Text for a message dialog box; %1 is an explanation about the list of folders " + "where the file was searched for, which is only shown if any folders are found", + "

    KMess will not be able to play sounds nor show notifications.

    " + "

    The required file 'kmess.notifyrc' could not be found in any application folder.

    " + "%1" + "

    Please verify your installation.

    " + "", + dirs ), + i18nc( "Message box title", "Error With Notifications" ), + "eventsrcNotFound" ); } @@ -1442,12 +1511,8 @@ bool KMess::initNotifications() newEmailNotification_, SLOT ( notify(QString, QString, bool, QString, QString, QString) ) ); // Connect the "Chat request" signals - connect( contactStatusNotification_, SIGNAL( startChat(QString,ChatInformation::ConnectionType) ), - msnNotificationConnection_, SLOT ( requestSwitchboard(QString,ChatInformation::ConnectionType) ) ); - - - // If specified in the settings, connect the relative signals - changedNotificationsSettings(); + connect( contactStatusNotification_, SIGNAL( startChat(QString) ), + chatMaster_, SLOT ( requestChat(QString) ) ); #ifdef KMESSTEST @@ -1474,7 +1539,63 @@ bool KMess::initNowListening() nowListeningClient_ = new NowListeningClient(); connect( nowListeningClient_, SIGNAL( changedSong( const QString&, const QString&, const QString&, bool ) ), this, SLOT ( changedSong( const QString&, const QString&, const QString&, bool ) )); - + + return true; +} + + + +// Initialize the proxy support. +bool KMess::initProxy() +{ + // NOTE: Due to the fact that KDE proxy settings do not have a signal to notify proxy + // config changes, KMess will need to be restarted if the user changes them. + + // No proxy, done already! + if( ! KProtocolManager::useProxy() ) + { +#ifdef KMESSDEBUG_KMESS + kDebug() << "No proxy support is needed (kde's proxy is turned off)."; +#endif + return true; + } + + QString proxyAddress( KProtocolManager::proxyForUrl( KUrl( "https://www.kmess.org/" ) ) ); + + // No need to use the proxy for HTTPS traffic + if( proxyAddress.isEmpty() || proxyAddress == "DIRECT" ) + { +#ifdef KMESSDEBUG_KMESS + kDebug() << "No proxy support is needed (no proxy is needed for HTTPS traffic)."; +#endif + return true; + } + +#ifdef KMESSDEBUG_KMESS + kDebug() << "Proxy URL:" << proxyAddress; +#endif + + KUrl proxyUrl( proxyAddress ); + QNetworkProxy::ProxyType proxyType = QNetworkProxy::NoProxy; + + // Configure the proxy + if( proxyUrl.protocol() == "socks" ) + { + proxyType = QNetworkProxy::Socks5Proxy; + } + else + { + proxyType = QNetworkProxy::HttpProxy; + } + + // Set the default proxy for the whole application + QNetworkProxy appProxy( proxyType, + proxyUrl.host(), + (quint16) proxyUrl.port(), + proxyUrl.user(), + proxyUrl.pass() ); + QNetworkProxy::setApplicationProxy( appProxy ); + return true; } @@ -1492,10 +1613,56 @@ bool KMess::isConnected() } +// Load the application's global state +void KMess::readGlobalProperties( KConfig *sessionConfig ) +{ +#ifdef KMESSDEBUG_KMESS + kDebug() << "Loading current state..."; +#endif + + KConfigGroup settings( sessionConfig->group( "state" ) ); + + // If the list window was visible, show it again + setVisible( settings.readEntry( "isVisible", false ) ); + + // If an account was connected, try connecting it again + QString connectedAccount( settings.readEntry( "connectedAccount", QString() ) ); + + // Delete the setting, if needed it'll be added again on session close + settings.deleteEntry( "connectedAccount" ); + + checkAutologin( connectedAccount ); +} + + +// Save the application's global state +void KMess::saveGlobalProperties( KConfig *sessionConfig ) +{ +#ifdef KMESSDEBUG_KMESS + kDebug() << "Saving current state..."; +#endif + + KConfigGroup settings( sessionConfig->group( "state" ) ); + + QString connectedAccount; + if( isConnected() ) + { + connectedAccount = currentAccount_->getHandle(); + } + + settings.writeEntry( "isVisible", isVisible() ); + settings.writeEntry( "connectedAccount", connectedAccount ); +} + + // Read in account and other properties void KMess::readProperties( const KConfigGroup &config ) { +#ifdef KMESSDEBUG_KMESS + kDebug() << "Reading properties"; +#endif + KConfigGroup group; // Choose the config group if it was not given @@ -1509,15 +1676,6 @@ void KMess::readProperties( const KConfigGroup &config ) } KMessInterface::readProperties( group ); - -#ifdef KMESSDEBUG_KMESS - kDebug() << "reading properties"; -#endif - - AccountsManager *accountsManager = AccountsManager::instance(); - - // Load the saved accounts from disk and create them - accountsManager->readProperties(); } @@ -1552,7 +1710,7 @@ void KMess::saveProperties( KConfigGroup &config ) foreach( Account *account, accountsList ) { // Avoid saving guest accounts - if( account->isGuestAccount() || account->isDeleted() ) + if( account->isGuestAccount() || account->isDeleted() ) { continue; } @@ -1560,11 +1718,11 @@ void KMess::saveProperties( KConfigGroup &config ) // If the account is the current account... if ( account->getHandle() == currentAccount_->getHandle() ) { - // Move some settings from the current account to the account that are set by the user interface + // Move the settings from the current account to the account #ifdef KMESSDEBUG_KMESS - kDebug() << "copying global user-interface settings from CurrentAccount to the Account object."; + kDebug() << "copying settings from CurrentAccount to the Account object."; #endif - account->copyAccountUISettings( currentAccount_ ); + account->copyAccount( currentAccount_ ); } // Save properties of accounts @@ -1580,14 +1738,25 @@ void KMess::saveProperties( KConfigGroup &config ) // Set the caption void KMess::setCaptionToUser() { - if ( currentAccount_ != 0 ) + // On start, use the default caption + if( currentAccount_ == 0 ) { - // Get the friendly name, but avoid newlines which cause problems to the titlebar layout - QString friendlyName( currentAccount_->getFriendlyName().replace( "\n", " " ) ); - - // Set the caption - setPlainCaption( i18nc( "Main window caption", "KMess - %1", friendlyName ) ); + setCaption( QString() ); + return; } + + // Get the friendly name, but avoid newlines which cause problems to the titlebar layout + QString friendlyName( currentAccount_->getFriendlyName().replace( "\n", " " ) ); + + // Set a standard caption if there is no friendly name yet (ie. first connection) + if( friendlyName.isEmpty() ) + { + setCaption( QString() ); + return; + } + + // Set the caption + setPlainCaption( i18nc( "Main window caption: switched order to easily distinguish it from chats", "KMess - %1", friendlyName ) ); } @@ -1619,7 +1788,8 @@ void KMess::showUserProfile() return; } - KMessShared::openProfile( currentAccount_->getHandle() ); + const QString url( currentAccount_->getUrlInformation().value( "PROFILE" ) ); + KMessShared::openBrowser( KUrl( url ) ); } @@ -1643,6 +1813,8 @@ void KMess::switchViewToContactList() view_->show(); // Connect other signals to msnNotificationConnection + connect( msnNotificationConnection_, SIGNAL( disconnected() ), // The connection was closed + view_, SLOT (slotDisconnected() ) ); connect( view_, SIGNAL( addContact(QString) ), // Add a contact msnNotificationConnection_, SLOT (addExistingContact(QString) ) ); connect( view_, SIGNAL( allowContact(QString) ), // Allow the contact @@ -1651,8 +1823,8 @@ void KMess::switchViewToContactList() msnNotificationConnection_, SLOT ( blockContact(QString) ) ); connect( view_, SIGNAL( changePersonalMessage(QString) ), // Change the personal message. msnNotificationConnection_, SLOT ( changePersonalMessage(QString) ) ); - connect( view_, SIGNAL( changeStatus(int) ), - this, SLOT ( changeStatus(int ) ) ); + connect( view_, SIGNAL( changeStatus(QAction*) ), + this, SLOT ( changeStatus(QAction*) ) ); connect( view_, SIGNAL( copyContact(QString, QString) ), msnNotificationConnection_, SLOT ( addContactToGroup(QString, QString) ) ); connect( view_, SIGNAL( moveContact(QString, QString, QString) ), // Move the contact @@ -1669,8 +1841,11 @@ void KMess::switchViewToContactList() this, SLOT ( showRemoveGroupDialog(QString) ) ); connect( view_, SIGNAL( renameGroup(QString) ), // Rename the group this, SLOT ( showRenameGroupDialog(QString) ) ); + connect( view_, SIGNAL( selectionChanged(const QItemSelection&) ), // The selection has changed + this, SLOT (updateContextMenu(const QItemSelection&) ) ); connect( view_, SIGNAL( unblockContact(QString) ), // Unblock the contact msnNotificationConnection_, SLOT ( unblockContact(QString) ) ); + // Set it as the application's main widget setCentralWidget( view_ ); @@ -1683,15 +1858,15 @@ void KMess::switchViewToContactList() // Switch the view to the initial login screen void KMess::switchViewToInitialScreen() { - // If the view was already set, do nothing + // If the view was already set, just reset it if( initialView_ ) { + initialView_->reset(); return; } // Create and set up the new widget initialView_ = new InitialView( this ); - initialView_->updateView(); initialView_->show(); // Connect it so it triggers the login process @@ -1700,6 +1875,12 @@ void KMess::switchViewToInitialScreen() connect( initialView_, SIGNAL( disconnectClicked() ), this, SLOT ( disconnectClicked() ) ); + // Show settings + connect( initialView_, SIGNAL( showSettings(Account*) ), + this, SLOT ( showSettingsForAccount(Account*) ) ); + + connect( msnNotificationConnection_, SIGNAL( reconnect(QString) ), + initialView_, SLOT ( reconnect(QString) ) ); connect( msnNotificationConnection_, SIGNAL( statusMessage(QString,bool) ), initialView_, SLOT ( statusMessage(QString) ) ); @@ -1729,6 +1910,17 @@ void KMess::toggleShowEmpty( bool show ) +// The "show history box" menu item has been toggled. +void KMess::toggleShowHistoryBox(bool show) +{ + if( view_ != 0 ) + { + view_->toggleShowHistoryBox( show ); + } +} + + + // The "show search in contact list" menu item has been toggled. void KMess::toggleShowSearchFrame(bool show) { @@ -1755,21 +1947,29 @@ void KMess::toggleShowRemoved(bool show) +// Show the context-sensitive menu item +void KMess::updateContextMenu( const QItemSelection &selection ) +{ + contextMenuAction_->setEnabled( ! selection.indexes().isEmpty() ); +} + + + // The user has gone idle void KMess::userIsIdle() { -#ifdef KMESSDEBUG_KMESS +#ifdef KMESSDEBUG_IDLETIMER kDebug(); #endif if ( ( currentAccount_ != 0 ) && ( msnNotificationConnection_ != 0 ) ) { -#ifdef KMESSDEBUG_KMESS +#ifdef KMESSDEBUG_IDLETIMER kDebug() << "Current status is " << currentAccount_->getStatus() << "."; #endif // Only change the state if the user is currently set as online if ( currentAccount_->getStatus() == STATUS_ONLINE ) { -#ifdef KMESSDEBUG_KMESS +#ifdef KMESSDEBUG_IDLETIMER kDebug() << "Change status to Idle."; #endif // Request a status change to Idle @@ -1784,25 +1984,25 @@ void KMess::userIsIdle() // The user is no longer idle void KMess::userIsNotIdle() { -#ifdef KMESSDEBUG_KMESS +#ifdef KMESSDEBUG_IDLETIMER kDebug(); #endif if ( ( currentAccount_ != 0 ) && ( msnNotificationConnection_ != 0 ) ) { -#ifdef KMESSDEBUG_KMESS +#ifdef KMESSDEBUG_IDLETIMER kDebug() << "User is no longer idle, current status is " << currentAccount_->getStatus(); #endif // Only change the state if the user is currently set as idle AND the idle status was not forced by the user if ( currentAccount_->getStatus() == STATUS_IDLE && ! isIdleForced_ ) { -#ifdef KMESSDEBUG_KMESS +#ifdef KMESSDEBUG_IDLETIMER kDebug() << "Change status to Online"; #endif // Request a status change to Online msnNotificationConnection_->changeStatus( STATUS_ONLINE ); } } -#ifdef KMESSDEBUG_KMESS +#ifdef KMESSDEBUG_IDLETIMER kDebug() << "Done userIsNotIdle()."; #endif } diff --git a/src/kmess.h b/src/kmess.h index c39550a..b61ce77 100644 --- a/src/kmess.h +++ b/src/kmess.h @@ -46,6 +46,7 @@ class KMessTest; class KMessView; class MsnNotificationConnection; class NowListeningClient; +class QItemSelection; @@ -76,10 +77,16 @@ class KMess : public KMessInterface bool initialize(); // Check if the connection to the server is active bool isConnected(); + // Something in the code wants to change status. (e.g. command handler.) + void changeStatus( Status newStatus, QString autoReplyMessage = QString() ); protected: // Protected methods + // Load the application's global state + virtual void readGlobalProperties( KConfig *sessionConfig ); // Read in account and other properties virtual void readProperties( const KConfigGroup &config = *((const KConfigGroup *)0) ); + // Save the application's global state + virtual void saveGlobalProperties( KConfig *sessionConfig ); // Save account and other properties virtual void saveProperties( KConfigGroup &config = *((KConfigGroup *)0) ); @@ -100,20 +107,21 @@ class KMess : public KMessInterface bool initNotifications(); // Initialize the now listening support. bool initNowListening(); - // Set the caption - void setCaptionToUser(); + // Initialize the proxy support. + bool initProxy(); // Switch the view to the contact list void switchViewToContactList(); // Switch the view to the initial login screen void switchViewToInitialScreen(); -public slots: + public slots: // Add the account and create the GUI elements void slotAccountAdded( Account *account ); // An account's settings have been changed void slotAccountChanged( Account *account, QString oldHandle, QString oldFriendlyName ); // Delete the given account from the UI void slotAccountDeleted( Account *account ); + private slots: // Private slots // "Add a new contact" was selected from the menu. void addNewContact(); @@ -122,9 +130,7 @@ public slots: // A view pictures mode has been selected from the menu. void changedListPictureSize( int mode ); // A status was selected from the menu. - void changeStatus( int index ); - // Tray notifications settings were changed - void changedNotificationsSettings(); + void changeStatus( QAction *action ); // The current now listening settings have changed. void changedNowListeningSettings(); // The currently playing song was changed. @@ -134,8 +140,14 @@ public slots: // A view mode has been selected from the menu. void changeViewMode(int mode); + // Set the caption + void setCaptionToUser(); // Show a "Contact added you" dialog - void showContactAddedUserDialog(const Contact *contact); + void showContactAddedUserDialog( const QString handle ); + // Show the context-sensitive menu item + virtual void showContextMenu(); + // Show "export contact list dialog" + void showListExportDialog(); // Show a dialog before removing the contact void showRemoveContactDialog(QString handle); // Show a dialog before removing the group @@ -146,18 +158,20 @@ public slots: // Open the network window void showNetworkWindow(); #endif + // Show the chat history dialog and, if requested, that of a specific contact + void showChatHistory( const QString &handle = QString() ); // Open the transfer manager void showTransferWindow(); // Detect changes in the status of the internet connection void slotConnectionStatusChanged( Solid::Networking::Status newStatus ); + // The user was presented the "contact added user" dialog and has made a choice + void slotContactAddedUserDialogChoice( const QString &handle, const QStringList &groupIds, const int code ); // A connection has been made with the notification server. void connected(); // Connect to the server with the given account void connectWithAccount(Account *account); // Connect to the server with the given account, possibly temporary or new. void connectWithAccount(QString handle, QString password, bool rememberAccount, bool rememberPassword, Status initialStatus ); - // The current account changed its name, so set the corresponding account's name - void currentAccountChangedName(); // "Add new account" has been selected from the menu. void createNewAccount(); // Disconnect was selected from the menu. @@ -175,6 +189,8 @@ public slots: void toggleShowAllowed(bool show); // The "show empty groups" menu item has been toggled. void toggleShowEmpty( bool show ); + // The "show history box" menu item has been toggled. + void toggleShowHistoryBox(bool show); // The "show search in contact list" menu item has been toggled. void toggleShowSearchFrame(bool show); // The "show offline contacts" menu item has been toggled. @@ -185,6 +201,10 @@ public slots: void userIsIdle(); // The user is no longer idle void userIsNotIdle(); + // The user wants to reconnect + void reconnect(); + // Show the context-sensitive menu item + void updateContextMenu( const QItemSelection &selection ); private: // Private attributes // The chat master - the object that controls the chat window @@ -215,8 +235,6 @@ public slots: NowListeningClient* nowListeningClient_; // The connection to the msn notification server MsnNotificationConnection *msnNotificationConnection_; - // The menu items of the settings menu - QHash settingsMenuItems_; // The main view widget KMessView *view_; // The DBus class diff --git a/src/kmessapplication.cpp b/src/kmessapplication.cpp index 7f0b426..940f773 100644 --- a/src/kmessapplication.cpp +++ b/src/kmessapplication.cpp @@ -17,6 +17,7 @@ #include "kmessapplication.h" +#include "accountsmanager.h" #include "kmess.h" #include "kmesstest.h" #include "kmessdebug.h" @@ -88,7 +89,37 @@ void KMessApplication::initializeMainWindow() { // Fetch the command line arguments KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); - QString autologinHandle = args->getOption("autologin"); + QString autologinHandle( args->getOption( "autologin" ) ); + + // Enable KDE session restore. + // We should use KMainWindow's RESTORE macro, or the kRestoreMainWindows + // macro (see kmainwindow.h). + // But they create new objects and also restore all windows: we have no + // point in restoring chat windows. Our initialization process is also + // different. + // So we just manually restore the KMess main window, which is the + // contact list window. + int restoredWindow = -1; + if( kapp->isSessionRestored() ) + { + int n = 0; + while( KMainWindow::canBeRestored( ++n ) ) + { +#ifdef KMESSDEBUG_KMESSAPPLICATION + kDebug() << "Checking if window" << n << "named" << KMainWindow::classNameOfToplevel( n ) << "can be restored..."; +#endif + if( KMainWindow::classNameOfToplevel( n ) != QLatin1String( "KMess" ) ) + { + continue; + } + +#ifdef KMESSDEBUG_KMESSAPPLICATION + kDebug() << "Contact List window found!"; +#endif + restoredWindow = n; + break; + } + } // Create the main window and initialize it contactListWindow_ = new KMess( 0 ); @@ -107,27 +138,37 @@ void KMessApplication::initializeMainWindow() connect( this, SIGNAL(lastWindowClosed()), this, SLOT(slotLastWindowClosed()) ); connect( this, SIGNAL(aboutToQuit()), this, SLOT(slotAboutToQuit()) ); -#ifdef KMESSTEST +#if ( KMESS_DEBUG == 1 ) // The debug build allows to run tests from the command line. - QString testName = args->getOption("runtest"); + QString testName( args->getOption( "runtest" ) ); if( ! testName.isEmpty() ) { - // KMessTest auto-deletes itself if necessary + // KMessTest is deleted when the app closes KMessTest *kmessTest = new KMessTest( contactListWindow_ ); kmessTest->runTest( testName ); + kmessTest->endTest(); return; } #endif - - // Avoid showing the main window is KMess is started with KDE. - if( ! kapp->isSessionRestored() ) + // We found session data for the Contact List, to restore it + if( kapp->isSessionRestored() && restoredWindow != -1 ) { - contactListWindow_->show(); - } + // Wait for the user passwords + AccountsManager::instance()->initializePasswordManager( true ); - // Start auto login - contactListWindow_->checkAutologin( autologinHandle ); + contactListWindow_->restore( restoredWindow, false ); + } + else + { + // Start auto login if needed, then show the login screen + contactListWindow_->checkAutologin( autologinHandle ); + + if( ! args->isSet( "hidden" ) ) + { + contactListWindow_->show(); + } + } } @@ -158,7 +199,7 @@ void KMessApplication::initializePaths() #endif // Test whether the prefix is correct. - if( KGlobal::dirs()->findResource( "appdata", "pics/kmesslogo.png" ).isNull() ) + if( KGlobal::dirs()->findResource( "appdata", "pics/kmesspic.png" ).isNull() ) { kWarning() << "KMess could not find resources in the search paths: " << KGlobal::dirs()->findDirs( "appdata", QString::null ).join(", ") << endl; diff --git a/src/kmessapplication.h b/src/kmessapplication.h index 9989b66..ceb5e4e 100644 --- a/src/kmessapplication.h +++ b/src/kmessapplication.h @@ -41,6 +41,8 @@ class KMessApplication : public KApplication { Q_OBJECT + friend class KMessTest; + public: // Constructor KMessApplication(); diff --git a/src/kmessdebug.h b/src/kmessdebug.h index 2c3966a..77f19c5 100644 --- a/src/kmessdebug.h +++ b/src/kmessdebug.h @@ -25,11 +25,12 @@ #include -#if ( KMESS_DEBUG == 1) +#if ( KMESS_DEBUG == 1 ) #define KMESSTEST #define KMESS_NETWORK_WINDOW #define KMESSDEBUG_KMESS + #define KMESSDEBUG_LIKEBACK #define KMESSDEBUG_KMESSAPPLICATION #define KMESSDEBUG_KMESSINTERFACE #define KMESSDEBUG_KMESSVIEW @@ -42,7 +43,7 @@ #define KMESSDEBUG_CONNECTION #define KMESSDEBUG_NOTIFICATION - #define KMESSDEBUG_CHALLENGEHANDLER +// #define KMESSDEBUG_CHALLENGEHANDLER #define KMESSDEBUG_SWITCHBOARD #define KMESSDEBUG_SERVERMESSAGES #define KMESSDEBUG_SSLLOGINHANDLER @@ -59,7 +60,7 @@ #define KMESSDEBUG_CONTACTEXTENSION #define KMESSDEBUG_CONTACTLIST // #define KMESSDEBUG_CONTACTLISTMODELTEST -// #define KMESSDEBUG_CONTACTLISTMODEL +// #define KMESSDEBUG_CONTACTLISTMODEL #define KMESSDEBUG_GROUP @@ -68,14 +69,15 @@ #define KMESSDEBUG_CHATWINDOW #define KMESSDEBUG_CHATVIEW #define KMESSDEBUG_CHATMESSAGEVIEW - #define KMESSDEBUG_CONTACTSIDEBAR - #define KMESSDEBUG_EMOTICONSIDEBAR + #define KMESSDEBUG_CONTACTSWIDGET + #define KMESSDEBUG_EMOTICONSWIDGET + #define KMESSDEBUG_WINKSWIDGET #define KMESSDEBUG_CONTACTFRAME #define KMESSDEBUG_INVITEDCONTACT #define KMESSDEBUG_EMOTICONS - #define KMESSDEBUG_RICHTEXTPARSER - #define KMESSDEBUG_IDLETIMER +// #define KMESSDEBUG_RICHTEXTPARSER +// #define KMESSDEBUG_IDLETIMER #define KMESSDEBUG_AUTOLOCK #define KMESSDEBUG_NOWLISTENINGCLIENT #define KMESSDEBUG_XSLTRANSFORMATION @@ -84,9 +86,11 @@ #define KMESSDEBUG_CRASHHANDLER #define KMESSDEBUG_SHAREDMETHODS #define KMESSDEBUG_KMESSDBUS + #define KMESSDEBUG_KMESSSENDPLUGIN #define KMESSDEBUG_MIMEMESSAGE #define KMESSDEBUG_MULTIPACKETMESSAGE + #define KMESSDEBUG_P2PMESSAGE #define KMESSDEBUG_APPLICATION #define KMESSDEBUG_APPLICATIONLIST #define KMESSDEBUG_MIMEAPPLICATION @@ -96,13 +100,14 @@ #define KMESSDEBUG_FILETRANSFER #define KMESSDEBUG_REMOTEDESKTOP #define KMESSDEBUG_WEBAPPLICATION_P2P + #define KMESSDEBUG_WEBCAMTRANSFER_P2P #define KMESSDEBUG_UPNP #define KMESSDEBUG_SOAPMESSAGE #define KMESSDEBUG_HTTPSOAPCONNECTION #define KMESSDEBUG_APPDIRECTORYSERVICE #define KMESSDEBUG_PASSPORTLOGINSERVICE - #define KMESSDEBUG_XMLFUNCTIONS +// #define KMESSDEBUG_XMLFUNCTIONS #define KMESSDEBUG_PASSIVEPOPUP diff --git a/src/kmessinterface.cpp b/src/kmessinterface.cpp index 80e5261..ec44cd9 100644 --- a/src/kmessinterface.cpp +++ b/src/kmessinterface.cpp @@ -17,12 +17,12 @@ #include "kmessinterface.h" +#include "notification/systemtraywidget.h" #include "settings/globalsettingsdialog.h" #include "utils/kmessconfig.h" #include "utils/kmessshared.h" #include "kmessapplication.h" #include "kmessdebug.h" -#include "systemtraywidget.h" #include #include @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -43,14 +44,20 @@ #include #include +#ifdef KMESSTEST + #include "utils/likeback/likeback.h" +#endif + // The constructor KMessInterface::KMessInterface( QWidget *parent ) - : KMainWindow( parent ) - , isErrorStatus_(true) - , initialized_(false) + : KXmlGuiWindow( parent ) + , actionCollection_( actionCollection() ) + , isErrorStatus_( true ) + , initialized_( false ) { + setObjectName( "ContactList" ); } @@ -65,21 +72,6 @@ KMessInterface::~KMessInterface() } -// Show the "about KDE" message. -void KMessInterface::aboutKDE() -{ - helpMenu_->aboutKDE(); -} - - - -// Show the "about KMess" message. -void KMessInterface::aboutKMess() -{ - helpMenu_->aboutApplication(); -} - - // "Add a new contact" was selected from the menu. void KMessInterface::addNewContact() @@ -87,7 +79,13 @@ void KMessInterface::addNewContact() kDebug() << "not implemented"; } +// Show the chat history dialog and, if requested, that of a specific contact +void KMessInterface::showChatHistory( const QString &handle ) +{ + Q_UNUSED( handle ); + kDebug() << "not implemented"; +} // "Add a new group" was selected from the menu. void KMessInterface::addNewGroup() @@ -113,8 +111,10 @@ void KMessInterface::changedListPictureSize( int /*mode*/ ) // A status was selected from the menu. -void KMessInterface::changeStatus( int /*index*/ ) +void KMessInterface::changeStatus( QAction *action ) { + Q_UNUSED( action ); + kDebug() << "not implemented"; } @@ -127,6 +127,14 @@ void KMessInterface::changeViewMode(int /*mode*/) } + +void KMessInterface::showListExportDialog() +{ + kDebug() << "not implemented"; +} + + + void KMessInterface::showNetworkWindow() { kDebug() << "not implemented"; @@ -140,245 +148,163 @@ void KMessInterface::showTransferWindow() -// Create the "Actions" menu -void KMessInterface::createActionsMenu() -{ - KAction *newAccount, *searchForContact, *searchByInterest; - KToggleAction *searchInContactList; - KMenu *actionsMenu; - - // Create the menu - actionsMenu = new KMenu( i18n("&Actions"), this ); - - // Create the "settings" menus - newContact_ = new KAction( KIcon("list-add-user"), i18n("New &Contact"), this ); - newGroup_ = new KAction( KIcon("user-group-new"), i18n("New &Group"), this ); - searchForContact = new KAction( KIcon("edit-find-user"), i18n("Search for Contact"), this ); - searchByInterest = new KAction( KIcon("system-search"), i18n("Search by &Interest"), this ); - - searchInContactList = new KToggleAction( KIcon("edit-find-user"), i18n("Search in Contact List"), actionCollection_ ); - searchInContactList->setShortcut( QKeySequence::fromString( tr( "Ctrl+f" ) ) ); - actionCollection_->addAction("edit-find-user", searchInContactList); - - newAccount = new KAction( KIcon("user-identity"), i18n("New &Account"), this ); - globalSettings_ = new KAction( KIcon("kmess"), i18n("Configure &KMess"), this ); - - connect( newContact_, SIGNAL( triggered(bool) ), - SLOT( addNewContact() ) ); - connect( newGroup_, SIGNAL( triggered(bool) ), - SLOT( addNewGroup() ) ); - connect( searchForContact, SIGNAL( triggered(bool) ), - SLOT( searchForContact() ) ); - connect( searchByInterest, SIGNAL( triggered(bool) ), - SLOT( searchForContactByInterest() ) ); - connect( searchInContactList, SIGNAL( triggered(bool) ), - SLOT( toggleShowSearchFrame(bool) ) ); - connect( newAccount, SIGNAL( triggered(bool) ), - SLOT( createNewAccount() ) ); - connect( globalSettings_, SIGNAL( triggered(bool) ), - SLOT( showGlobalSettings() ) ); - - // preferences-desktop-user - settingsActionMenu_ = new KActionMenu( KIcon("configure"), i18n("Account &Settings"), this ); - - // Plug the items into "settings" - actionsMenu->addAction( newContact_ ); - actionsMenu->addAction( newGroup_ ); - actionsMenu->addSeparator(); - actionsMenu->addAction( searchForContact ); - actionsMenu->addAction( searchByInterest ); - actionsMenu->addAction( searchInContactList ); - actionsMenu->addSeparator(); - actionsMenu->addAction( newAccount ); - actionsMenu->addAction( settingsActionMenu_ ); - actionsMenu->addAction( globalSettings_ ); - - // Plug the menu into the menubar - menuBar()->addMenu( actionsMenu ); -} - - - -// Create the "Connect" menu -void KMessInterface::createConnectMenu() -{ - KAction *close, *quit; - KMenu *connectMenu; - QStringList states; - - // Create the menu - connectMenu = new KMenu( i18n("&Connect"), this ); - - // Create the "connect" menu items - connectActionMenu_ = new KActionMenu( KIcon("network-connect"), i18n("Co&nnect"), this ); - disconnect_ = new KAction( KIcon("network-disconnect"), i18n("&Disconnect"), this ); - showProfile_ = new KAction( KIcon("preferences-desktop-user"), i18n("Show My &Profile"), this ); - status_ = new KSelectAction( KIcon("go-jump"), i18n("&My Status"), this ); - - - states << i18n("Online") - << i18n("Away") - << i18n("Away with auto-reply") - << i18n("Idle") - << i18n("Be Right Back") - << i18n("Busy") - << i18n("Out to Lunch") - << i18n("On the Phone") - << i18n("Invisible"); - status_->setItems(states); - - connect( disconnect_, SIGNAL( triggered(bool) ), - this, SLOT( disconnectClicked() ) ); - connect( showProfile_, SIGNAL( triggered(bool) ), - this, SLOT( showUserProfile() ) ); - connect( status_, SIGNAL( triggered(int) ), - this, SLOT( changeStatus(int) ) ); - - close = KStandardAction::close( this, SLOT( menuClose() ), actionCollection_ ); - quit = KStandardAction::quit ( this, SLOT( menuQuit() ), actionCollection_ ); - - // Plug the items into "connect" - connectMenu->addAction( connectActionMenu_ ); - connectMenu->addAction( disconnect_ ); - connectMenu->addSeparator( ); - connectMenu->addAction( status_ ); - connectMenu->addAction( showProfile_ ); - connectMenu->addSeparator(); - connectMenu->addAction( close ); - connectMenu->addAction( quit ); - - /* toolBar( "mainToolBar" )->addAction( disconnect_ ); - toolBar( "mainToolBar" )->addAction( status_ );*/ - - // Plug the menu into the menubar - menuBar()->addMenu( connectMenu ); -} - - - -// Create the "Help" menu -void KMessInterface::createHelpMenu() -{ - KAction *aboutKDE, *aboutKMess, *helpContents; - KMenu *helpMenu; - - // Create the menu - helpMenu = new KMenu( i18n("&Help"), this ); - - // Create the help menu. - helpMenu_ = new KHelpMenu(this, KGlobal::mainComponent().aboutData()); - - // Create the help menu items - helpContents = KStandardAction::helpContents( this, SLOT( helpContents() ), actionCollection_ ); - aboutKMess = KStandardAction::aboutApp ( this, SLOT( aboutKMess() ), this ); - aboutKDE = KStandardAction::aboutKDE ( this, SLOT( aboutKDE() ), this ); - - // Plug the items into "help-contents" - helpMenu->addAction( helpContents ); - helpMenu->addSeparator(); - helpMenu->addAction( aboutKMess ); - helpMenu->addAction( aboutKDE ); - - // Plug the menu into the menubar - menuBar()->addMenu( helpMenu ); -} - - - // Create the menus void KMessInterface::createMenus() { - // ActionCollection to collect the actions with a shortcut - actionCollection_ = new KActionCollection( this, KComponentData() ); - - // Create the 4 menus - createConnectMenu(); - createViewMenu(); - createActionsMenu(); - createHelpMenu(); - - // Add collected actions - addActions( actionCollection_->actions() ); -} + KAction *close, *quit; + KAction *newAccount, *searchForContact, *searchByInterest; + QStringList states; + QStringList viewModes, listPictureSizes; + // Create the actions for "Connect" menu + status_ = MsnStatus::getStatusMenu(); + connectActionMenu_ = new KActionMenu ( KIcon("network-connect"), i18n("&Connect"), this ); + disconnect_ = new KAction ( KIcon("network-disconnect"), i18n("&Disconnect"), this ); + showProfile_ = new KAction ( KIcon("preferences-desktop-user"), i18n("Show My &Profile"), this ); + close = KStandardAction::close( this, SLOT( menuClose() ), actionCollection_ ); + quit = KStandardAction::quit ( this, SLOT( menuQuit() ), actionCollection_ ); -// Create the "View" menu -void KMessInterface::createViewMenu() -{ - QStringList viewModes, listPictureSizes; + // Create the actions for "View" menu + showAllowedAction_ = new KToggleAction( i18n("Show &Allowed Contacts"), this ); + showOfflineAction_ = new KToggleAction( i18n("Show &Offline Contacts"), this ); + showRemovedAction_ = new KToggleAction( i18n("Show &Removed Contacts"), this ); + showHistoryBoxAction_ = new KToggleAction( KIcon("view-history"), i18n("Show &History Box"), this ); + showSearchAction_ = new KToggleAction( KIcon("edit-find-user"), i18n("&Show Search Bar"), this ); + showEmptyAction_ = new KToggleAction( i18n("Show &Empty Groups"), this ); + listPictureSize_ = new KSelectAction( KIcon("view-list-tree"), i18n("&Display Pictures Size"), this ); + viewMode_ = new KSelectAction( KIcon("view-list-tree"), i18n("&Sort Contacts by"), this ); + showTransferAction_ = new KAction ( KIcon("document-open-remote"), i18n("Show &Transfer Window..."), this ); + showStatusBar_ = KStandardAction::showStatusbar( this, SLOT( showStatusBar() ), this ); + showMenuBar_ = KStandardAction::showMenubar ( this, SLOT( showMenuBar() ), this ); - // Create the menu - viewMenu_ = new KMenu( i18n("&View"), this ); + // Create the actions for "Actions" menu + newContact_ = new KAction( KIcon("list-add-user"), i18n("New &Contact..."), this ); + newGroup_ = new KAction( KIcon("user-group-new"), i18n("New &Group..."), this ); + exportList_ = new KAction( KIcon("document-export"),i18n("&Export Contact List..."), this ); + searchForContact = new KAction( KIcon("edit-find-user"), i18n("Search for C&ontact"), this ); + searchByInterest = new KAction( KIcon("system-search"), i18n("Search by &Interest"), this ); + showHistory_ = new KAction( KIcon("user-identity"), i18n("Show Chat &History..."), this ); + newAccount = new KAction( KIcon("user-identity"), i18n("New &Account..."), this ); + showSettingsAction_ = new KAction( KIcon("configure"), i18n("Configure Account..."), this ); + globalSettings_ = new KAction( KIcon("kmess"), i18n("Configure &KMess..."), this ); + contextMenuAction_ = new KAction( KIcon("preferences-contact-list"), i18n("Show Selection &Menu"), this ); - // Create the "view" menu items - showAllowedAction_ = new KToggleAction( i18n("Show &Allowed Contacts"), this ); - showOfflineAction_ = new KToggleAction( i18n("Show &Offline Contacts"), this ); - showRemovedAction_ = new KToggleAction( i18n("Show &Removed Contacts"), this ); - showEmptyAction_ = new KToggleAction( i18n("Show &Empty Groups"), this ); - - // The list mode display picture - listPictureSize_ = new KSelectAction( KIcon("view-list-tree"), i18n("Display Pictures Size"), this ); - listPictureSizes << i18n( "Do not display" ) + // Populate PictureSize select + listPictureSizes << i18n( "Do Not Display" ) << i18n( "Small" ) << i18n( "Medium" ) << i18n( "Large" ); listPictureSize_->setItems( listPictureSizes ); - viewMode_ = new KSelectAction( KIcon("view-list-tree"), i18n("&Sort Contacts by"), this ); + // Populate ViewMode select viewModes << i18n("Group") // Account::VIEW_BYGROUP << i18n("Online/Offline") // Account::VIEW_BYSTATUS << i18n("Mixed"); // Account::VIEW_MIXED viewMode_->setItems(viewModes); - showTransferAction_ = new KAction( KIcon("document-open-remote"), i18n("Show &Transfer Window"), this ); - //showToolBar_ = new KToggleAction( i18n("Show &Tool bar"), this ); - showStatusBar_ = KStandardAction::showStatusbar( this, SLOT( showStatusBar() ), this ); - showMenuBar_ = KStandardAction::showMenubar( this, SLOT( showMenuBar() ), actionCollection_ ); + // Add shortcut for Search in ContactList + showSearchAction_->setShortcut( QKeySequence::fromString( tr( "Ctrl+f" ) ) ); + + // Disable the context menu, because there's no selection on start + contextMenuAction_->setEnabled( false ); + // Disable the 'Show Account Settings' action, there is no current account on start + showSettingsAction_->setEnabled( false ); + + // Connect slots to signals for "Connect" menu + connect( disconnect_, SIGNAL( triggered(bool) ), + this, SLOT ( disconnectClicked() ) ); + connect( showProfile_, SIGNAL( triggered(bool) ), + this, SLOT ( showUserProfile() ) ); + connect( status_, SIGNAL( triggered(QAction*) ), + this, SLOT ( changeStatus(QAction*) ) ); + + // Connect slots to signals for "View" menu + connect( viewMode_, SIGNAL( triggered(int) ), + this, SLOT ( changeViewMode(int) ) ); + connect( listPictureSize_, SIGNAL( triggered(int) ), + this, SLOT ( changedListPictureSize(int) ) ); + connect( showAllowedAction_, SIGNAL( triggered(bool) ), + this, SLOT ( toggleShowAllowed(bool) ) ); + connect( showOfflineAction_, SIGNAL( triggered(bool) ), + this, SLOT ( toggleShowOffline(bool) ) ); + connect( showRemovedAction_, SIGNAL( triggered(bool) ), + this, SLOT ( toggleShowRemoved(bool) ) ); + connect( showEmptyAction_, SIGNAL( triggered(bool) ), + this, SLOT ( toggleShowEmpty(bool) ) ); + connect( showTransferAction_, SIGNAL( triggered(bool) ), + this, SLOT ( showTransferWindow() ) ); + + // Connect slots to signals for "Actions" menu + connect( newContact_, SIGNAL( triggered(bool) ), + this, SLOT ( addNewContact() ) ); + connect( newGroup_, SIGNAL( triggered(bool) ), + this, SLOT ( addNewGroup() ) ); + connect( exportList_, SIGNAL( triggered(bool) ), + this, SLOT ( showListExportDialog() ) ); + connect( searchForContact, SIGNAL( triggered(bool) ), + this, SLOT ( searchForContact() ) ); + connect( searchByInterest, SIGNAL( triggered(bool) ), + this, SLOT ( searchForContactByInterest() ) ); + connect( showHistoryBoxAction_,SIGNAL( triggered(bool) ), + this, SLOT ( toggleShowHistoryBox(bool) ) ); + connect( showSearchAction_, SIGNAL( triggered(bool) ), + this, SLOT ( toggleShowSearchFrame(bool) ) ); + connect( showHistory_, SIGNAL( triggered(bool) ), + this, SLOT ( showChatHistory() ) ); + connect( newAccount, SIGNAL( triggered(bool) ), + this, SLOT ( createNewAccount() ) ); + connect( globalSettings_, SIGNAL( triggered(bool) ), + this, SLOT ( showGlobalSettings() ) ); + connect( contextMenuAction_, SIGNAL( triggered(bool) ), + this, SLOT ( showContextMenu() ) ); + + + // Add actions to actionCollection for "Connect" menu + actionCollection_->addAction( "status", status_->menuAction() ); + actionCollection_->addAction( "connect", connectActionMenu_ ); + actionCollection_->addAction( "disconnect", disconnect_ ); + actionCollection_->addAction( "showProfile", showProfile_ ); + actionCollection_->addAction( "close", close ); + actionCollection_->addAction( "quit", quit ); + + // Add actions to actionCollection for "View" menu + actionCollection_->addAction( "showAllowed", showAllowedAction_ ); + actionCollection_->addAction( "showOffline", showOfflineAction_ ); + actionCollection_->addAction( "showRemoved", showRemovedAction_ ); + actionCollection_->addAction( "showEmpty", showEmptyAction_ ); + actionCollection_->addAction( "pictureSizes", listPictureSize_ ); + actionCollection_->addAction( "viewModes", viewMode_ ); + actionCollection_->addAction( "showTransfers", showTransferAction_ ); + actionCollection_->addAction( "showMenuBar", showMenuBar_ ); + actionCollection_->addAction( "showStatusBar", showStatusBar_ ); + + // Add actions to actionCollection for "Actions" menu + actionCollection_->addAction( "newContact", newContact_ ); + actionCollection_->addAction( "newGroup", newGroup_ ); + actionCollection_->addAction( "exportList", exportList_ ); + actionCollection_->addAction( "searchForContact", searchForContact ); + actionCollection_->addAction( "searchByInterest", searchByInterest ); + actionCollection_->addAction( "showHistoryBox", showHistoryBoxAction_); + actionCollection_->addAction( "showSearch", showSearchAction_ ); + actionCollection_->addAction( "chatHistory", showHistory_ ); + actionCollection_->addAction( "newAccount", newAccount ); + actionCollection_->addAction( "settingsAccount", showSettingsAction_ ); + actionCollection_->addAction( "settingsGlobal", globalSettings_ ); + actionCollection_->addAction( "contextMenu", contextMenuAction_ ); + #ifdef KMESS_NETWORK_WINDOW - showNetworkAction_ = new KAction( KIcon("network-workgroup"), i18n("Show &Network Window"), this ); - connect( showNetworkAction_, SIGNAL( triggered(bool) ), this, SLOT( showNetworkWindow() ) ); + showNetworkAction_ = new KAction( KIcon("network-workgroup"), i18n("Show &Network Window..."), this ); + + connect( showNetworkAction_, SIGNAL( triggered(bool) ), + this, SLOT ( showNetworkWindow() ) ); + + actionCollection_->addAction( "showNetwork", showNetworkAction_ ); #endif - - // Connect the actions -// connect( showToolBar_, SIGNAL( triggered(bool) ), this, SLOT( showToolBar() ) ); - connect( viewMode_, SIGNAL( triggered(int) ), this, SLOT( changeViewMode(int) ) ); - connect( listPictureSize_,SIGNAL( triggered(int) ), this, SLOT( changedListPictureSize(int) ) ); - connect( showAllowedAction_, SIGNAL( triggered(bool) ), this, SLOT( toggleShowAllowed(bool) ) ); - connect( showOfflineAction_, SIGNAL( triggered(bool) ), this, SLOT( toggleShowOffline(bool) ) ); - connect( showRemovedAction_, SIGNAL( triggered(bool) ), this, SLOT( toggleShowRemoved(bool) ) ); - connect( showEmptyAction_, SIGNAL( triggered(bool) ), this, SLOT( toggleShowEmpty(bool) ) ); - connect( showTransferAction_, SIGNAL( triggered(bool) ), this, SLOT( showTransferWindow() ) ); - - // Plug the items into "view" - viewMenu_->addAction( showAllowedAction_ ); - viewMenu_->addAction( showRemovedAction_ ); - viewMenu_->addAction( showOfflineAction_ ); - viewMenu_->addAction( showEmptyAction_ ); - viewMenu_->addSeparator(); - viewMenu_->addAction( listPictureSize_); - viewMenu_->addSeparator(); - viewMenu_->addAction( viewMode_ ); - viewMenu_->addSeparator(); - viewMenu_->addAction( showTransferAction_ ); - viewMenu_->addSeparator(); -// viewMenu_->addAction( showToolBar_ ); - viewMenu_->addAction( showMenuBar_ ); - viewMenu_->addAction( showStatusBar_ ); - -#ifdef KMESS_NETWORK_WINDOW - viewMenu_->addSeparator(); - viewMenu_->addAction( showNetworkAction_ ); -#endif - - // Plug the menu into the menubar - menuBar()->addMenu( viewMenu_ ); } - - // "Add new account" has been selected from the menu. void KMessInterface::createNewAccount() { @@ -399,36 +325,16 @@ void KMessInterface::disconnectClicked() // connected to the server. void KMessInterface::enableMenus(bool connected) { - connectActionMenu_->setEnabled( !connected ); - disconnect_->setEnabled( connected ); if ( connected ) { disconnect_->setIcon( KIcon("network-connect") ); + stateChanged("connected"); } else { disconnect_->setIcon( KIcon("network-disconnect") ); + stateChanged("disconnected"); } - status_->setEnabled( connected ); - - newContact_ ->setEnabled( connected ); - newGroup_ ->setEnabled( connected ); - showAllowedAction_ ->setEnabled( connected ); - showOfflineAction_ ->setEnabled( connected ); - showRemovedAction_ ->setEnabled( connected ); - showEmptyAction_ ->setEnabled( connected ); - listPictureSize_->setEnabled( connected ); - showProfile_ ->setEnabled( connected ); - viewMode_ ->setEnabled( connected ); - // showNetworkAction should ALWAYS be enabled! -} - - - -// Show the user manual for KMess. -void KMessInterface::helpContents() -{ - KToolInvocation::invokeHelp("kmess/index"); } @@ -461,9 +367,36 @@ bool KMessInterface::initialize() connect( onlineTimer_, SIGNAL( timeout() ), this, SLOT( updateOnlineTimer() ) ); + +#ifdef KMESSTEST + // Enable LikeBack + LikeBack *likeBack = new LikeBack( LikeBack::AllButtons, true ); + likeBack->setServer( "www.kmess.org", "/likeback/send.php", 80 ); + likeBack->setWindowNamesListing( LikeBack::AllWindows ); + + QStringList acceptedLocales; + acceptedLocales << "en" << "nl" << "it" << "fr" << "de" << "es" << "el" << "hu"; + likeBack->setAcceptedLanguages( acceptedLocales ); + likeBack->sendACommentAction( actionCollection() ); +#endif + // Create the menus createMenus(); + // Build the gui from xml (without toolbar support) + setupGUI( ( Keys | StatusBar | Create | Save ), "kmessinterfaceui.rc" ); + + // Autosave all GUI settings +#if KDE_IS_VERSION(4,0,70) + setAutoSaveSettings( KMessConfig::instance()->getGlobalConfig( "ContactListWindow" ), + true /* save WindowSize */ ); +#else + setAutoSaveSettings( "ContactListWindow", true /* save WindowSize */ ); +#endif + + // Autosave all GUI settings + setAutoSaveSettings( "KMessInterface", true /* save WindowSize */ ); + if ( ! initSystemTrayWidget() ) { kDebug() << "Couldn't initialize the system tray widget."; @@ -481,8 +414,6 @@ bool KMessInterface::initialize() // Initialize the system tray widget bool KMessInterface::initSystemTrayWidget() { - bool initialized; - // Create the widget systemTrayWidget_ = new SystemTrayWidget( this ) ; if ( systemTrayWidget_ == 0 ) @@ -491,22 +422,14 @@ bool KMessInterface::initSystemTrayWidget() return false; } - // Initialize the widget - initialized = systemTrayWidget_->initialize(); - if ( !initialized ) - { - kDebug() << "Couldn't initialize system tray widget."; - return false; - } - // Plug some of the menu actions into the system tray widget's menu. QMenu *menu = systemTrayWidget_->menu(); menu->addAction( connectActionMenu_ ); menu->addAction( disconnect_ ); menu->addSeparator(); - menu->addAction( status_ ); + menu->addMenu( status_ ); menu->addSeparator(); - menu->addAction( settingsActionMenu_ ); + menu->addAction( showSettingsAction_ ); menu->addAction( globalSettings_ ); // Make the connections for the system tray widget @@ -617,7 +540,7 @@ bool KMessInterface::queryClose() } else { - // Tell that KMess is still visible in the tray + // Tell that KMess is still visible in the tray systemTrayWidget_->displayCloseMessage(); #ifdef KMESSDEBUG_KMESSINTERFACE @@ -651,6 +574,10 @@ void KMessInterface::readProperties( const KConfigGroup &config ) group = config; } + // Resize the window to decent dimensions if there's no saved state. + resize( 300, 500 ); + restoreWindowSize( group ); + // Pull in the window size and position QSize windowsize = group.readEntry( "Size", QSize() ); if(!windowsize.isEmpty()) @@ -663,7 +590,7 @@ void KMessInterface::readProperties( const KConfigGroup &config ) move(position); } - bool bViewMenubar = group.readEntry( "Show Menubar", true ); + bool bViewMenubar = group.readEntry( "ShowMenuBar", true ); showMenuBar_->setChecked( bViewMenubar ); menuBar()->setVisible( bViewMenubar ); @@ -674,8 +601,7 @@ void KMessInterface::readProperties( const KConfigGroup &config ) showToolBar(); */ - bool bViewStatusbar = group.readEntry( "Show Statusbar", true ); - showStatusBar_->setChecked( bViewStatusbar ); + showStatusBar_->setChecked( group.readEntry( "ShowStatusBar", true ) ); showStatusBar(); // bar position settings @@ -708,8 +634,8 @@ void KMessInterface::saveProperties(KConfigGroup &config) group.writeEntry("Size", size() ); group.writeEntry("Position", pos() ); // group.writeEntry("Show Toolbar", showToolBar_->isChecked() ); - group.writeEntry("Show Menubar", showMenuBar_->isChecked()); - group.writeEntry("Show Statusbar", showStatusBar_->isChecked() ); + group.writeEntry("ShowMenuBar", showMenuBar_ ->isChecked() ); + group.writeEntry("ShowStatusBar", showStatusBar_->isChecked() ); // save the toolbar settings /* KConfigGroup mainToolBarGroup = group.group( "mainToolBar" ); @@ -755,13 +681,33 @@ void KMessInterface::showGlobalSettings() // "Show menu bar" was toggled. void KMessInterface::showMenuBar() { - if( ! showMenuBar_->isChecked() ) + // Just show the menubar if it was hidden + if( ! menuBar()->isVisible() ) { - menuBar()->hide(); + menuBar()->setVisible( true ); + return; + } + + // Ask the user if he/she really wants to hide the menubar, to avoid mistakes + // TODO: If the user disables the shortcut for the menu action, no shortcuts will be shown + int res = KMessageBox::questionYesNo( this, + i18nc( "Question dialog box message", + "Are you sure you want to hide the menu bar? " + "You will be able to show it again by using this " + "keyboard shortcut: %1", + showMenuBar_->shortcut().primary().toString( QKeySequence::NativeText ) ), + i18nc( "Dialog box caption: hiding the menu bar", "Hiding the Menu" ), + KStandardGuiItem::yes(), + KStandardGuiItem::no(), + "hideMenuBarQuestion" ); + + if( res == KMessageBox::Yes ) + { + menuBar()->setVisible( showMenuBar_->isChecked() ); } else { - menuBar()->show(); + showMenuBar_->setChecked( true ); } } @@ -770,14 +716,7 @@ void KMessInterface::showMenuBar() // "Show status bar" was toggled. void KMessInterface::showStatusBar() { - if(!showStatusBar_->isChecked()) - { - statusBar()->hide(); - } - else - { - statusBar()->show(); - } + statusBar()->setVisible( showStatusBar_->isChecked() ); } @@ -803,8 +742,6 @@ void KMessInterface::showUserProfile() kDebug() << "not implemented"; } - - // Change the status bar message. void KMessInterface::statusMessage( QString message, bool isError ) { @@ -856,6 +793,14 @@ void KMessInterface::toggleShowEmpty(bool /*show*/) +// The "show history box" menu item has been toggled. +void KMessInterface::toggleShowHistoryBox(bool /*show*/) +{ + kDebug() << "not implemented"; +} + + + // The "show search in contact list" menu item has been toggled. void KMessInterface::toggleShowSearchFrame(bool /*show*/) { diff --git a/src/kmessinterface.h b/src/kmessinterface.h index d246a54..a9add68 100644 --- a/src/kmessinterface.h +++ b/src/kmessinterface.h @@ -21,9 +21,9 @@ #include "contact/msnstatus.h" #include "kmessdebug.h" -#include #include #include +#include // Forward declarations @@ -50,7 +50,7 @@ class SystemTrayWidget; * @author Mike K. Bennett * @ingroup Root */ -class KMessInterface : public KMainWindow +class KMessInterface : public KXmlGuiWindow { Q_OBJECT @@ -84,9 +84,11 @@ class KMessInterface : public KMainWindow // A view pictures mode has been selected from the menu. virtual void changedListPictureSize(int mode); // A status was selected from the menu. - virtual void changeStatus( int index ); + virtual void changeStatus( QAction *action ); // A view mode has been selected from the menu. virtual void changeViewMode(int mode); + // Request to display the export list dialog + virtual void showListExportDialog(); // Request to display the network window has been made virtual void showNetworkWindow(); // Request to display the transfer manager. @@ -95,14 +97,20 @@ class KMessInterface : public KMainWindow virtual void createNewAccount(); // Disconnect was selected from the menu. virtual void disconnectClicked(); + // "Show status bar" was toggled. + void showStatusBar(); // Show the user's MSN profile. virtual void showUserProfile(); + // Show the chat history dialog and, if requested, that of a specific contact + virtual void showChatHistory( const QString &handle = QString() ); // Change the status bar message. virtual void statusMessage(QString message, bool isError ); // The "show allowed contacts" menu item has been toggled. virtual void toggleShowAllowed(bool show); // The "show empty groups" menu item has been toggled. virtual void toggleShowEmpty( bool show ); + // The "show history box" menu item has been toggled. + virtual void toggleShowHistoryBox( bool show ); // The "show search in contact list" menu item has been toggled. virtual void toggleShowSearchFrame(bool show); // The "show offline contacts" menu item has been toggled. @@ -113,6 +121,8 @@ class KMessInterface : public KMainWindow void updateOnlineTimer(); protected: // Protected attributes + // The action to show the context-sensitive menu + KAction *contextMenuAction_; // The menu for "connect..." with a profile KActionMenu *connectActionMenu_; // The "disconnect" menu item @@ -121,8 +131,12 @@ class KMessInterface : public KMainWindow KAction *globalSettings_; // View list pictures mode KSelectAction *listPictureSize_; - // The menu for "settings..." with a profile - KActionMenu *settingsActionMenu_; + // Action to toggle the history box + KToggleAction *showHistoryBoxAction_; + // Action to toggle the contact list search bar + KToggleAction *showSearchAction_; + // Action to display the settings for the connected account + KAction *showSettingsAction_; // Toggle actions for showing allowed, offline, and removed contacts, and empty groups. KToggleAction *showAllowedAction_, *showOfflineAction_, *showRemovedAction_, *showEmptyAction_; // Show the network window @@ -133,8 +147,8 @@ class KMessInterface : public KMainWindow KToggleAction *showStatusBar_; // Show the transfer manager KAction *showTransferAction_; - // The select action for the user's status - KSelectAction *status_; + // The selection menu for the user's status + KMenu *status_; // The system tray widget SystemTrayWidget *systemTrayWidget_; // The menu for selecting the view mode. @@ -143,16 +157,8 @@ class KMessInterface : public KMainWindow KActionCollection *actionCollection_; private: // Private methods - // Create the "Actions" menu - void createActionsMenu(); - // Create the "Connect" menu - void createConnectMenu(); - // Create the "Help" menu - void createHelpMenu(); // Create the menus void createMenus(); - // Create the "View" menu - void createViewMenu(); // Initialize the system tray widget bool initSystemTrayWidget(); // Reject quitting unless the quit menu was pressed @@ -161,12 +167,6 @@ class KMessInterface : public KMainWindow bool queryClose(); private slots: // Private slots - // Show the "about KMess" message. - void aboutKMess(); - // Show the "about KDE" message. - void aboutKDE(); - // Show the user manual for KMess. - void helpContents(); // Close has been selected from the menu. void menuClose(); // Quit was selected from the menu. @@ -175,27 +175,27 @@ class KMessInterface : public KMainWindow void searchForContact(); // Open up the URL to MSN's "search by interest" page. void searchForContactByInterest(); + // Show the context-sensitive menu item + virtual void showContextMenu() = 0; // The "Show Global Settings" option was clicked. void showGlobalSettings(); // "Show menu bar" was toggled. void showMenuBar(); - // "Show status bar" was toggled. - void showStatusBar(); // "Show toolbar" was toggled. // void showToolBar(); private: // Private attributes + // Export list action + KAction *exportList_; // Whether the status is a warning or not bool isErrorStatus_; - // The help menu launcher - KHelpMenu *helpMenu_; // Whether or not the object was initialized bool initialized_; // Current message QString message_; // Some action menus that the child doesn't need, but need to be // made visible/invisible - KAction *newContact_, *newGroup_, *showProfile_; + KAction *newContact_, *newGroup_, *showProfile_, *showHistory_; // Minutes online unsigned int onlineTime_; // Online interval timer diff --git a/src/kmessinterfaceui.rc b/src/kmessinterfaceui.rc new file mode 100644 index 0000000..6f9bc26 --- /dev/null +++ b/src/kmessinterfaceui.rc @@ -0,0 +1,99 @@ + + + + + &Connect + + + + + + + + + + + + &View + + + + + + + + + + + + + + + + + + + &Actions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/kmesstest.cpp b/src/kmesstest.cpp index e4c9b3f..cc909c1 100644 --- a/src/kmesstest.cpp +++ b/src/kmesstest.cpp @@ -21,36 +21,40 @@ #include "chat/chatmaster.h" #include "chat/chatview.h" #include "chat/chatwindow.h" -#include "chat/contactsidebar.h" +#include "chat/contactswidget.h" #include "chat/xsltransformation.h" #include "contact/contact.h" #include "contact/contactbase.h" #include "contact/contactextension.h" -#include "contact/contactlist.h" #include "contact/group.h" +#include "contact/specialgroups.h" #include "dialogs/addcontactdialog.h" #include "dialogs/contactaddeduserdialog.h" #include "dialogs/transferentry.h" #include "dialogs/transferwindow.h" +#include "model/contactlist.h" #include "network/soap/httpsoapconnection.h" #include "network/upnp/manager.h" #include "network/soap/msnappdirectoryservice.h" #include "network/soap/soapmessage.h" +#include "network/msnchallengehandler.h" #include "network/msnnotificationconnection.h" #include "network/msnswitchboardconnection.h" #include "notification/contactstatusnotification.h" -#include "notification/passivepopup.h" +#include "notification/systemtraywidget.h" #include "settings/accountsettingsdialog.h" #include "utils/nowlisteningclient.h" #include "utils/richtextparser.h" -#include "contactlistviewdelegate.h" +#include "accountsmanager.h" +#include "kmessviewdelegate.h" #include "currentaccount.h" #include "emoticonmanager.h" #include "kmess.h" #include "kmessapplication.h" #include "kmessview.h" -#include "systemtraywidget.h" +#include "../tests/old_richtextparser.h" +#include #include #include @@ -60,10 +64,13 @@ // The constructor KMessTest::KMessTest(KMess *kmess) - : QObject() - , doNotDelete_(false) + : QObject(kmess) + , quitAfterTest_(false) , kmess_(kmess) { + // Used to quit. Could also be useful to the tests + kmessApp_ = static_cast( kapp ); + setObjectName("KMessTest"); } @@ -76,46 +83,69 @@ KMessTest::~KMessTest() } -#ifdef KMESSTEST -#define TESTCASE(name, action) if( testName == name ) { action; return; } +#define TESTCASE(name, action) testcases.append( name ); if( testName == name ) { action; return; } /** * The main testing function. - * Runs a given test based on a command line argumet. + * Runs a given test based on a command line argument. */ void KMessTest::runTest( const QString &testName ) { - // Add the tests, which can be run in the debug build using: + // Add the tests, which can be run from debug builds using: // ./kmess --runtest - kDebug() << "Running test " << testName << "\n\n\n" - "----------------------------------------"; - TESTCASE( "transferwindow", testTransferWindow() ); - TESTCASE( "chatwindow", testChatWindow() ); - TESTCASE( "crash", testCrash() ); - TESTCASE( "addcontact", testAddContactDialog() ); - TESTCASE( "contactaddeduser", testContactAddedUserDialog() ); - TESTCASE( "msnplus", testMsnPlus() ); - TESTCASE( "ns", testNotificationConnection() ); - TESTCASE( "contactlist", testContactList() ); - TESTCASE( "connect", testConnect() ); - TESTCASE( "settings", testSettings() ); - TESTCASE( "sb", testSwitchboardConnection() ); - TESTCASE( "notifications", testNotifications() ); - TESTCASE( "nowlistening", testNowListening() ); - TESTCASE( "soap", testSoapConnection() ); - TESTCASE( "upnp", testUpnpConnection() ); - TESTCASE( "xslt", testXslTransformation() ); - TESTCASE( "systemtray", testSystemTray() ); + kDebug() << "Running test:" << testName; + kDebug() << "----------------------------------------"; + kDebug(); - kDebug() << endl << "----------------------------------------"; - kDebug() << "Use Ctrl+C to quit"; + QStringList testcases; - if( ! doNotDelete_ ) + TESTCASE( "transferwindow", testTransferWindow() ); + TESTCASE( "chatwindow", testChatWindow() ); + TESTCASE( "challenge", testChallengeHandler() ); + TESTCASE( "crash", testCrash() ); + TESTCASE( "addcontact", testAddContactDialog() ); + TESTCASE( "contactaddeduser", testContactAddedUserDialog() ); + TESTCASE( "msnplus", testMsnPlus() ); + TESTCASE( "msnplusinteractive", testMsnPlusInteractive() ); + TESTCASE( "parserbenchmark", benchmarkParser() ); + TESTCASE( "ns", testNotificationConnection() ); + TESTCASE( "contactlist", testContactList() ); + TESTCASE( "connect", testConnect() ); + TESTCASE( "settings", testSettings() ); + TESTCASE( "sb", testSwitchboardConnection() ); + TESTCASE( "notifications", testNotifications() ); + TESTCASE( "nowlistening", testNowListening() ); + TESTCASE( "soap", testSoapConnection() ); + TESTCASE( "upnp", testUpnpConnection() ); + TESTCASE( "xslt", testXslTransformation() ); + TESTCASE( "systemtray", testSystemTray() ); + TESTCASE( "offlinemessages", testOfflineMessages() ); + qSort( testcases ); + kDebug() << "Test case not found, available cases:"; + kDebug() << testcases.join( ", " ); + + quitAfterTest_ = true; +} + + + +// Cleans up and schedules quitting kmess if necessary +void KMessTest::endTest() +{ + kDebug(); + kDebug() << "----------------------------------------"; + + if( quitAfterTest_ ) { - delete this; + // We can't quit (and also clean up the memory) now, since + // the event loop hasn't started yet. Delay it a bit. + kDebug() << "Test case ended, quitting KMess."; + + kmessApp_->setQuitSelected( true ); + QTimer::singleShot( 1000, kmess_, SLOT( menuQuit() ) ); } } @@ -145,31 +175,98 @@ void KMessTest::testChatWindow() testGroupsAndContacts(); EmoticonManager::instance()->connected(); - CurrentAccount::instance()->setTabbedChatMode( 0 ); + CurrentAccount::instance()->setStatusOptions( true, 5, true ); + CurrentAccount::instance()->setShowChatUserPicture( true ); + CurrentAccount::instance()->setStatus( STATUS_ON_THE_PHONE ); CurrentAccount::instance()->setFontColor( "#ff9900" ); + CurrentAccount::instance()->setChatInformation( true, true, true, true, true, true, true, true, true, true, 0, "Fresh" ); + CurrentAccount::instance()->setContactListOptions( false, false, true ); + CurrentAccount::instance()->setChatLoggingInformation( true, false, Account::EXPORT_HTML, "/home/valerio/kmess/logs", Account::SINGLEDIRECTORY ); + MimeMessage message( QString( "MIME-Version: 1.0\r\nContent-Type: text/plain;charset=UTF-8\r\nX-MMS-IM-Format: FN=Georgia; EF=; CO=c080ff; CS=0; PF=12\r\n\r\nTesting incoming chats! :D :D\r\n" ) ); + + // User-started chat MsnSwitchboardConnection *sb1 = new MsnSwitchboardConnection(); - ChatInformation chatInfo( kmess_->msnNotificationConnection_, "contact1@kmess.org", -1, ChatInformation::CONNECTION_OFFLINE ); - sb1->start( chatInfo ); + kmess_->chatMaster_->switchboardConnections_.append( sb1 ); + ChatInformation chatInfo1( kmess_->msnNotificationConnection_, "contact1@kmess.org", -1, ChatInformation::CONNECTION_OFFLINE ); sb1->initialize( "contact1@kmess.org" ); - - MsnSwitchboardConnection *sb2 = new MsnSwitchboardConnection(); - sb2->initialize( "contact2@kmess.org" ); - sb2->contactJoined( "contact2@kmess.org", "Contact 2", 0 ); - sb2->contactJoined( "contact5@kmess.org", "Contact 5", 0 ); - - MsnSwitchboardConnection *sb3 = new MsnSwitchboardConnection(); - sb3->initialize( "contact7@kmess.org" ); - sb3->contactJoined( "contact7@kmess.org", "Contact 7", 0 ); + sb1->start( chatInfo1 ); kmess_->chatMaster_->createChat( sb1 ); - kmess_->chatMaster_->createChat( sb2 ); - kmess_->chatMaster_->createChat( sb3 ); + sb1->parseChatMessage( "contact1@kmess.org", "Contact 1", "", message ); - doNotDelete_ = true; +/* + // Contact-started chat + MsnSwitchboardConnection *sb2 = new MsnSwitchboardConnection(); + kmess_->chatMaster_->switchboardConnections_.append( sb2 ); + ChatInformation chatInfo2( kmess_->msnNotificationConnection_, "contact7@kmess.org", "127.0.0.1", 1234, "5678.8765", "-1", ChatInformation::CONNECTION_CHAT ); + sb2->initialize( "contact7@kmess.org" ); + sb2->start( chatInfo2 ); + sb2->contactJoined( "contact7@kmess.org", "Contact 7", 0 ); + + kmess_->chatMaster_->createChat( sb2 ); + sb2->parseChatMessage( "contact7@kmess.org", "Contact 7", "", message ); +*/ +/* + // Contact-started group chat + MsnSwitchboardConnection *sb3 = new MsnSwitchboardConnection(); + ChatInformation chatInfo3( kmess_->msnNotificationConnection_, "contact2@kmess.org", "127.0.0.1", 1234, "5678.8765", "-1", ChatInformation::CONNECTION_OFFLINE ); + sb3->initialize( "contact2@kmess.org" ); + sb3->start( chatInfo3 ); + kmess_->chatMaster_->switchboardConnections_.append( sb3 ); + sb3->contactJoined( "contact1@kmess.org", "Contact 1", 0 ); + sb3->contactJoined( "contact2@kmess.org", "Contact 2", 0 ); + sb3->contactJoined( "contact3@kmess.org", "Contact 3", 0 ); + sb3->contactJoined( "contact4@kmess.org", "Contact 4", 0 ); + sb3->contactJoined( "contact5@kmess.org", "Contact 5", 0 ); + sb3->contactJoined( "contact6@kmess.org", "Contact 6", 0 ); + sb3->contactJoined( "contact7@kmess.org", "Contact 7", 0 ); + sb3->contactJoined( "contact8@kmess.org", "Contact 8", 0 ); + sb3->contactJoined( "contact9@kmess.org", "Contact 9", 0 ); + sb3->contactJoined( "contact10@kmess.org", "Contact 10", 0 ); + + kmess_->chatMaster_->createChat( sb3 ); + sb3->parseChatMessage( "contact2@kmess.org", "Contact 2", "", message ); + sb3->parseChatMessage( "contact5@kmess.org", "Contact 5", "", message ); +*/ + + QTimer *test = new QTimer(this); + connect(test, SIGNAL(timeout()), this, SLOT(testChatWindowSlot())); + connect(kmess_->disconnect_, SIGNAL(triggered(bool)), test, SLOT(stop())); +// test->start( 6000 ); } + +void KMessTest::testChatWindowSlot() +{ + if( kmess_->chatMaster_->switchboardConnections_.isEmpty() ) + { + QTimer *timer = static_cast( sender() ); + if( timer ) timer->stop(); + return; + } + + static int i = 0; +// ContactList *list = kmess_->msnNotificationConnection_->contactList_; +// list->getContactByHandle( "contact1@kmess.org" )->setPersonalStatus( QString("nuovo pm %1" ).arg( i++) ); + +// kmess_->chatMaster_->chats_.first()->slotReceivedNudge( CurrentAccount::instance()->getContactList()->getContactByHandle( "contact1@kmess.org" ) ); + + MsnSwitchboardConnection *sb1 = kmess_->chatMaster_->switchboardConnections_.first(); + if( sb1 == 0 ) + { + // KMess should be quitting... + return; + } + + MimeMessage message( QString( "MIME-Version: 1.0\r\nContent-Type: text/plain;charset=UTF-8\r\nX-MMS-IM-Format: FN=Georgia; EF=; CO=c080ff; CS=0; PF=12\r\n\r\nTesting incoming chats %1\r\n" ).arg( i++ ) ); + + sb1->parseChatMessage( "contact1@kmess.org", "Contact 1", "", message ); +} + + + void KMessTest::testCrash() { QObject *object = 0; @@ -179,19 +276,63 @@ void KMessTest::testCrash() void KMessTest::testAddContactDialog() { - QString handle, groupId; - new AddContactDialog( handle, groupId ); + QString handle; + QStringList groupsId; + new AddContactDialog( handle, groupsId ); - kDebug() << "adding " << handle << "on group id" << groupId; + kDebug() << "adding " << handle << "on groups: " << groupsId; } + +void KMessTest::testChallengeHandler() +{ + MSNChallengeHandler handler; + // Tested with + // PRODUCT_KEY "ILTXC!4IXB5FB*PX" + // PRODUCT_ID "PROD0119GSJUC$18" + kDebug() << handler.computeHash( "TEST"); // "299ef8849928ab29512748d378cb93b0" + kDebug() << handler.computeHash( "KMessTest"); // "6e7fbd3c1457c4192d18bc9d19ef4e3e" + kDebug() << handler.computeHash( "KMessKMessKmess"); // "736d5611bdd0f6f60b93343e169c6192" +} + + + void KMessTest::testContactAddedUserDialog() { - ContactAddedUserDialog *dialog = new ContactAddedUserDialog(); - ContactAddedUserDialog::ReturnCode code = dialog->launch( "someone@hotmail.com", "SomeNickName" ); + //set up groups to populate listwidget + testGroupsAndContacts(); - kDebug() << "result is " << code; + ContactAddedUserDialog *dialog = new ContactAddedUserDialog( "someone@hotmail.com", "SomeNickName" ); + + connect( dialog, SIGNAL( userChoice(const QString&, const QStringList&, const int) ), + this, SLOT ( testContactAddedUserDialogSlot(const QString&, const QStringList&, const int) ) ); + + dialog->show(); +} + + +void KMessTest::testContactAddedUserDialogSlot( const QString &handle, const QStringList &groupsId, const int code ) +{ + switch( (ContactAddedUserDialog::ReturnCode) code ) + { + case ContactAddedUserDialog::ADD: + kDebug() << "result: Add contact" << handle; + kDebug() << "result: Adding in groups" << groupsId; + break; + + case ContactAddedUserDialog::ALLOW: + kDebug() << "result: Allow contact" << handle; + break; + + case ContactAddedUserDialog::BLOCK: + kDebug() << "result: Block contact" << handle; + break; + + default: + kDebug() << "result: undefined, contact:" << handle; + break; + } } @@ -222,39 +363,71 @@ void KMessTest::testNowListening() } -void KMessTest::testNotificationConnection() { } -void KMessTest::testConnect() { } -void KMessTest::testSettings() { } -void KMessTest::testSwitchboardConnection() { } +void KMessTest::testNotificationConnection() { quitAfterTest_ = true; } +void KMessTest::testConnect() { quitAfterTest_ = true; } +void KMessTest::testSettings() { quitAfterTest_ = true; } +void KMessTest::testSwitchboardConnection() { quitAfterTest_ = true; } void KMessTest::testGroupsAndContacts() { + Account *account = CurrentAccount::instance(); + AccountsManager::instance()->addAccount(account); + account->setLoginInformation("test@test.com", "test", "test" ); + account->setGuestAccount( true ); + + Group *group; + Contact *contact; ContactList *list = kmess_->msnNotificationConnection_->contactList_; list->reset( true ); - /*Group *group1 = */list->addGroup( "friends", "My Friends" ); - /*Group *group2 = */list->addGroup( "work", "Work Mates" ); - list->addGroup( "empty", "Empty Group"); - Contact *contact1 = list->addContact( "contact1@kmess.org", "Contact 1 :)", 3, QStringList()<<"friends"<<"work", "c1" ); - Contact *contact2 = list->addContact( "contact2@kmess.org", "Contact 2", 3, QStringList()<<"friends", "c2" ); - Contact *contact3 = list->addContact( "contact3@kmess.org", "Contact 3", 3, QStringList()<<"work", "c3" ); - Contact *contact4 = list->addContact( "contact4@kmess.org", "Contact 4", 3, QStringList()<<"friends", "c4" ); - Contact *contact5 = list->addContact( "contact5@kmess.org", "Contact 5", 3, QStringList(), "c5" ); - Contact *contact6 = list->addContact( "contact6@kmess.org", "Contact 6 www.google.it", 3, QStringList()<<"work"<<"friends", "c6" ); - Contact *contact7 = list->addContact( "contact7@kmess.org", " Contact 7 ", 3, QStringList()<<"friends", "c7" ); - Contact *contact8 = list->addContact( "contact8@kmess.org", "Contact 8", 3, QStringList(), "c7" ); - contact1->setPersonalStatus( "Contact Status" ); - contact2->setPersonalStatus( "Contact Status" ); - contact3->setPersonalStatus( "Contact Status" ); - contact4->setPersonalStatus( "Contact Status", "Music", "Chemical Brothers - Got Glint?" ); - contact5->setPersonalStatus( "Contact Status" ); - contact6->setPersonalStatus( "Contact Status" ); - contact7->setPersonalStatus( "Contact Status" ); - contact8->setPersonalStatus( "Contact Status" ); - list->changeContactStatus( "contact2@kmess.org", STATUS_ONLINE, "Contact 2", 3, QString(), false ); + group = list->addGroup( "friends", "My Friends" ); + group = list->addGroup( "work", "Work Mates" ); + group->setExpanded( false ); + group = list->addGroup( "family", "Family" ); + group = list->addGroup( "empty", "Empty Group"); + + list->getGroupById( SpecialGroups::INDIVIDUALS )->setExpanded( false ); +// list->getGroupById( SpecialGroups::OFFLINE )->setExpanded( false ); + + contact = list->addContact( "contact1@kmess.org", "Contact 1", 11, QStringList()<<"friends"<<"work", "c1" ); + contact->manageEmoticonBlackList( true, "lol" ); + contact->manageEmoticonBlackList( true, "<aaaa" ); + contact->manageEmoticonBlackList( true, "'aaaasdsdfa" ); + + // Pending emoticons + contact->addEmoticonDefinition( "-pend", "1hashhashhash" ); + contact->addEmoticonDefinition( "-ing", "2shhashhashha" ); + + // Received emoticons + contact->addEmoticonDefinition( "-rece", "3ashhashhashh" ); + contact->addEmoticonDefinition( "-ived", "4hhashhashhas" ); + contact->addEmoticonFile( "3ashhashhashh", KIconLoader::global()->iconPath( "user-online", KIconLoader::Small ) ); + contact->addEmoticonFile( "4hhashhashhas", KIconLoader::global()->iconPath( "user-busy", KIconLoader::Small ) ); + + list->changeContactStatus( "contact1@kmess.org", STATUS_ONLINE, "[c=red]Contact 1[/c] :) & three", 3, QString(), false ); + contact->setPersonalStatus( "Contact 1 :) -- www.google.it - [u]adgdf dfgdfg[/u] asd &" ); + contact = list->addContact( "contact2@kmess.org", "Contact 2", 3, QStringList()<<"family", "c2" ); + list->changeContactStatus( "contact2@kmess.org", STATUS_OFFLINE, "Contact 2", 3, QString(), false ); + contact = list->addContact( "contact3@kmess.org", "Contact 3", 3, QStringList(), "c3" ); + contact = list->addContact( "contact4@kmess.org", "Contact 4", 3, QStringList(), "c4" ); + list->changeContactStatus( "contact4@kmess.org", STATUS_BUSY, "Contact 4", 3, QString(), false ); + contact = list->addContact( "contact5@kmess.org", "Contact 5", 3, QStringList()<<"work", "c5" ); + list->changeContactStatus( "contact5@kmess.org", STATUS_ON_THE_PHONE, "Contact 5", 3, QString(), false ); + contact->setPersonalStatus( "Contact 5 Status" ); + contact = list->addContact( "contact6@kmess.org", "Contact 6 www.google.it", 3, QStringList()<<"work"<<"friends", "c6" ); + list->changeContactStatus( "contact6@kmess.org", STATUS_OFFLINE, "Contact 6 www.google.it", 3, QString(), false ); + contact = list->addContact( "contact7@kmess.org", " Contact 7 ", 3, QStringList()<<"friends", "c7" ); + list->changeContactStatus( "contact7@kmess.org", STATUS_AWAY, " Contact 7 ", 3, QString(), false ); + contact->setPersonalStatus( "Contact 7 Status", "Music", "Chemical Brothers - Got Glint?" ); + contact = list->addContact( "contact8@kmess.org", "Contact 8", 3, QStringList(), "c8" ); + list->changeContactStatus( "contact8@kmess.org", STATUS_ONLINE, "Contact 8", 3, QString(), false ); + contact = list->addContact( "contact9@kmess.org", "Contact 9", 3, QStringList()<<"work", "c9" ); + list->changeContactStatus( "contact9@kmess.org", STATUS_BUSY, "Contact 9", 3, QString(), false ); + contact = list->addContact( "contact10@kmess.org", "Contact 10", 3, QStringList()<<"work", "c10" ); + list->changeContactStatus( "contact10@kmess.org", STATUS_OFFLINE, "Contact 10", 3, QString(), false ); } @@ -263,18 +436,21 @@ void KMessTest::testContactList() { testGroupsAndContacts(); - ContactList *list = kmess_->msnNotificationConnection_->contactList_; - list->dump(); - // Disable all extra fields Account *account = CurrentAccount::instance(); - account->setChatInformation( true, true, true, true, true, true, true, true, "Fresh" ); + account->setShowContactListBird( true ); + account->setChatInformation( true, true, true, true, true, true, true, true, true, true, 0, "Fresh" ); + account->setContactListOptions( true, false, true ); account->setEmailSupported( false ); - account->setContactListDisplayMode( Account::VIEW_MIXED ); - account->setShowAllowedContacts( true ); - account->setShowEmptyGroups( true ); + account->setContactListDisplayMode( Account::VIEW_MIXED ); // VIEW_MIXED VIEW_BYSTATUS VIEW_BYGROUP + account->setShowAllowedContacts( false ); + account->setShowEmptyGroups( false ); account->setShowOfflineContacts( true ); - account->setShowRemovedContacts( true ); + account->setShowRemovedContacts( false ); + account->setPersonalMessage( "omg! this [u]rocks![/u] :D " ); + +// ContactList *list = kmess_->msnNotificationConnection_->contactList_; +// list->dump(); kmess_->connected(); kmess_->window()->show(); @@ -284,36 +460,55 @@ void KMessTest::testContactList() kmess_->view_->slotUpdateEmailDisplay(); QTimer *test = new QTimer(this); - connect(test, SIGNAL(timeout()), this, SLOT(testSlot())); - test->start( 1000 ); - - doNotDelete_ = true; + connect(test, SIGNAL(timeout()), this, SLOT(testContactListSlot())); + connect(kmess_->disconnect_, SIGNAL(triggered(bool)), test, SLOT(stop())); +// test->start( 5000 ); } // A generic method to use as throwaway slot for delayed code -void KMessTest::testSlot() +void KMessTest::testContactListSlot() { kDebug() << "TEST - Switching contact status"; ContactList *list = kmess_->msnNotificationConnection_->contactList_; + static int i=0; static bool statusSwitch = true; - Status first = STATUS_ONLINE, second = STATUS_BUSY; + Status first = STATUS_AWAY, second = STATUS_OFFLINE; + +/* + if( i == 1 ) + { + QTimer *timer = static_cast( sender() ); + if( timer ) timer->stop(); + } +*/ if( statusSwitch ) { qSwap( first, second ); } statusSwitch = ! statusSwitch; + i++; - list->changeContactStatus( "contact5@kmess.org", first, "Contact 5", 3, QString(), false ); - list->changeContactStatus( "contact8@kmess.org", second, "Contact 8", 3, QString(), false ); + if( i == 3 ) + list->addContact( "contact11@kmess.org", "Contact 11", 3, QStringList(), "c11" ); + if( i == 5 ) + list->changeContactStatus( "contact11@kmess.org", STATUS_BE_RIGHT_BACK, "Contact 11", 3, QString(), false ); + + list->getContactByHandle( "contact5@kmess.org")->setPersonalStatus( QString("Contact 5 Status: %1").arg( i ), "Music", QString("Chemical Brothers - Got Glint? %1").arg( i ) ); + list->getContactByHandle( "contact8@kmess.org")->setPersonalStatus( QString("Contact 8 Status: %1").arg( i ) ); + list->changeContactStatus( "contact5@kmess.org", first, QString("Contact 5 name #%1").arg( i ), 3, QString(), true ); + list->changeContactStatus( "contact8@kmess.org", second, QString("Contact 8 name #%1").arg( i ), 3, QString(), true ); } void KMessTest::testMsnPlus() { + quitAfterTest_ = true; + + OldRichTextParser::initialize(); QStringList strings; strings << QString::fromUtf8( "[c=#0080FF][u][c=39][b](S) [c=29] Fede [/c](S)[/b][/c=39] forza azzurriiiiiii[/u][/c]" ); @@ -328,19 +523,173 @@ void KMessTest::testMsnPlus() // strings << QString::fromUtf8( "�$#F37AF0Vanitosa �$ �$#0A79F5Da strega cattiva a principessa..." ); foreach( QString str, strings ) { - QString original = str; - QString cleaned = str; + QString original( str ); + QString cleaned ( str ); + QString str2 ( str ); RichTextParser::getCleanString( cleaned ); RichTextParser::parseMsnString( str, true, true, true, true ); RichTextParser::getFormattedString( str ); - KMessageBox::information( kmess_, "" + original + "

    " + cleaned + "

    " + str + "" ); + OldRichTextParser::getCleanString( cleaned ); + OldRichTextParser::parseMsnString( str2, true, true, true, true ); + OldRichTextParser::getFormattedString( str2 ); + KMessageBox::information( kmess_, "" + original + "

    " + cleaned + "

    " + str + "

    " + str2 + "" ); } - - exit(0); } +void KMessTest::benchmarkParser() +{ + quitAfterTest_ = true; + + QString str, str2; + QStringList strings; + QTime startTime; + int i, timeTaken, olds, oldms, news, newms, oldtotal = 0, newtotal = 0; + const int timesToBenchmark = 50000; + OldRichTextParser::initialize(); + strings << QString::fromUtf8( "This string contains nothing special, but it is quite long nonetheless. The idea is " + "that nothing is changed in this string, so the parser reading efficiency is checked." ); + strings << QString::fromUtf8( "[c=#0080FF][u][c=39][b](S) [c=29] Fede [/c](S)[/b][/c=39] forza azzurriiiiiii[/u][/c]" ); + strings << QString::fromUtf8( "[b][a=1][c=10]- :) [T]ester boldExploit :P -[/c][/a][/b]" ); + strings << QString::fromUtf8( ":D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D" + ":D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D" + ":D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D" ); + strings << QString::fromUtf8( "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" + "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" + "ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word" ); + strings << QString::fromUtf8( "http://kmess.org/ http://kmess.org/ http://kmess.org/ http://kmess.org/ http://kmess.org/" ); + strings << QString::fromUtf8( "dazjorz.com javascript.js test.nl http://google.com/ test@example.com"); + strings << QString::fromUtf8( "www.google.com google.com bugs@kmess.org http://www.kmess.org http://www.kmess.org/weird_url-with?random&stuff"); + foreach( QString origstr, strings ) + { + timeTaken = 0; + kDebug() << timesToBenchmark << "times, string:" << origstr; + + startTime = QTime::currentTime(); + for( i = 0; i < timesToBenchmark; ++i ) + { + str = origstr; // this counts in the benchmark time, of course, but it happens in the other benchmark too. + OldRichTextParser::parseMsnString( str, true, true, true, true ); + } + timeTaken = QTime::currentTime().msecsTo( startTime ); + oldtotal += (-timeTaken); + olds = (-timeTaken) / 1000; + oldms = (-timeTaken) % 1000; + kDebug() << "Old parser:" << olds << "s" << oldms << "msec"; + + startTime = QTime::currentTime(); + for( i = 0; i < timesToBenchmark; ++i) + { + str2 = origstr; + RichTextParser::parseMsnString( str2, true, true, true, true ); + } + timeTaken = QTime::currentTime().msecsTo( startTime ); + newtotal += (-timeTaken); + news = (-timeTaken) / 1000; + newms = (-timeTaken) % 1000; + kDebug() << "New parser:" << news << "s" << newms << "msec"; + + if( str != str2 ) + { + kWarning() << "Result mismatch!"; + } + } + + kDebug() << "** Grand Totals: **"; + olds = oldtotal / 1000; + oldms = oldtotal % 1000; + news = newtotal / 1000; + newms = newtotal % 1000; + kDebug() << "Old parser:" << olds << "s" << oldms << "msec"; + kDebug() << "New parser:" << news << "s" << newms << "msec"; +} + + + +void KMessTest::testMsnPlusInteractive() +{ + testGroupsAndContacts(); + + static bool initialized = false; + static QDialog *dialog = new QDialog(kmess_); + static QVBoxLayout *verticalLayout = new QVBoxLayout(dialog); + static QLabel *label = new QLabel("Input string:",dialog); + static QTextEdit *input = new QTextEdit(dialog); + static QLabel *oldSourceLabel = new QLabel(dialog); + static QLabel *oldCleanLabel = new QLabel(dialog); + static QLabel *oldHtmlLabel = new QLabel(dialog); + static QLabel *newSourceLabel = new QLabel(dialog); + static QLabel *newCleanLabel = new QLabel(dialog); + static QLabel *newHtmlLabel = new QLabel(dialog); + + if( !initialized) + { + initialized = true; + + OldRichTextParser::initialize(); + verticalLayout->addWidget(label); + verticalLayout->addWidget(input); + verticalLayout->addWidget(oldSourceLabel); + verticalLayout->addWidget(oldCleanLabel); + verticalLayout->addWidget(oldHtmlLabel); + verticalLayout->addWidget(newSourceLabel); + verticalLayout->addWidget(newCleanLabel); + verticalLayout->addWidget(newHtmlLabel); + dialog->setLayout(verticalLayout); + + oldSourceLabel->setTextFormat( Qt::PlainText ); + newSourceLabel->setTextFormat( Qt::PlainText ); + oldSourceLabel->setWordWrap( true ); + oldCleanLabel->setWordWrap( true ); + oldHtmlLabel ->setWordWrap( true ); + newSourceLabel->setWordWrap( true ); + newCleanLabel->setWordWrap( true ); + newHtmlLabel ->setWordWrap( true ); + oldSourceLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); + newSourceLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); + oldSourceLabel->setFrameShape(QFrame::Box); + newSourceLabel->setFrameShape(QFrame::Box); + + connect( input, SIGNAL( textChanged() ), + this, SLOT ( testMsnPlusInteractive() ) ); + dialog->show(); + } + else + { + QString text; + QString cleaned, parsed; + + QString handle( "contact1@kmess.org" ); + QStringList pending; + // CurrentAccount::instance()->getContactByHandle( handle )->getPendingEmoticonPattern(); + + + // Old parser + text = input->document()->toPlainText(); + OldRichTextParser::parseMsnString( text, true, true, true, true, "contact1@kmess.org", pending ); + cleaned = parsed = text; + + OldRichTextParser::getCleanString( cleaned ); + OldRichTextParser::getFormattedString( parsed ); + oldSourceLabel->setText( "Old source: " + cleaned ); + oldCleanLabel->setText( "Old text: " + cleaned ); + oldHtmlLabel ->setText( "Old HTML: " + parsed ); + + // New parser + text = input->document()->toPlainText(); + RichTextParser::parseMsnString( text, true, true, true, true, "contact1@kmess.org", pending ); + cleaned = parsed = text; + + RichTextParser::getCleanString( cleaned ); + RichTextParser::getFormattedString( parsed ); + newSourceLabel->setText( "New source: " + cleaned ); + newCleanLabel->setText( "New text: " + cleaned ); + newHtmlLabel ->setText( "New HTML: " + parsed ); + } +} + + void KMessTest::testSoapConnection() { MsnAppDirectoryService *appDir = new MsnAppDirectoryService(); @@ -351,6 +700,8 @@ void KMessTest::testSoapConnection() void KMessTest::testSystemTray() { + quitAfterTest_ = true; + kmess_->systemTrayWidget_->displayCloseMessage(); } @@ -367,7 +718,7 @@ void KMessTest::testUpnpConnection() void KMessTest::testXslTransformation() { // A simple test using XSL/XML data of the KMess website - QString wwwRoot = "/srv/www/vhosts/kmess/htdocs"; + QString wwwRoot( "/srv/www/vhosts/kmess/htdocs" ); // Load XSL XslTransformation *xsl = new XslTransformation(); @@ -384,7 +735,7 @@ void KMessTest::testXslTransformation() // Load XML QByteArray fileData = file.readAll(); - QString xml = QString::fromUtf8(fileData.data(), fileData.size()); + QString xml( QString::fromUtf8(fileData.data(), fileData.size()) ); file.close(); // Transform XML @@ -396,6 +747,68 @@ void KMessTest::testXslTransformation() -#endif // KMESSTEST +void KMessTest::testOfflineMessages() +{ + // The MSN servers *sometimes* send the offline messages before the contact list. + // 1. make sure we have an empty contact list + // 2. receive an offline message from nonexistant@kmess.org + // 3. add contacts to the contact list + // 4. receive an offline message from an existing contact + + Account *account = CurrentAccount::instance(); + account->setGuestAccount( true ); + + ContactList *list = kmess_->msnNotificationConnection_->contactList_; + // Don't add any groups or contacts. + list->reset( true ); + + // An offline message sent yesterday, from an unknown user, received before + // the contact list was ever created + QString address ("nonexistant@kmess.org"); + ChatMessage message( ChatMessage::TYPE_OFFLINE_INCOMING, + ChatMessage::CONTENT_MESSAGE, + true, + QString("This message should come from the e-mail address ").append(address), + address, + address, + QString(), + QFont(), + QString(), + QDateTime::currentDateTime().addDays( -1 ) ); + kmess_->chatMaster_->showSpecialMessage(message); + + // re-add the contact list + testGroupsAndContacts(); + + // send another offline message + address = "contact1@kmess.org"; + + // emulate some of MsnNotificationConnection::receivedOfflineIm() behaviour. + const ContactBase *contact = CurrentAccount::instance()->getContactByHandle(address); + QString name, picture; + if( contact != 0 ) + { + name = contact->getFriendlyName(); + picture = contact->getContactPicturePath(); + } + else + { + name = "Warning: This message is a bug; the contact should be found in the contact list!"; + picture = QString::null; + } + + ChatMessage message2( ChatMessage::TYPE_OFFLINE_INCOMING, + ChatMessage::CONTENT_MESSAGE, + true, + QString("This message should come from a proper contact whose name is ").append(name), + address, + name, + picture, + QFont(), + QString(), + QDateTime::currentDateTime().addDays(-1)); + kmess_->chatMaster_->showSpecialMessage(message2); +} + #include "kmesstest.moc" diff --git a/src/kmesstest.h b/src/kmesstest.h index 14fc30b..a43039c 100644 --- a/src/kmesstest.h +++ b/src/kmesstest.h @@ -26,6 +26,7 @@ // forward declarations class Chat; class KMess; +class KMessApplication; class ChatWindow; @@ -54,36 +55,45 @@ class KMessTest : public QObject virtual ~KMessTest(); // The main testing function void runTest( const QString &testname ); + // Cleans up and exits kmess if necessary + void endTest(); -#ifdef KMESSTEST private: // Private methods - void testTransferWindow(); - void testChatWindow(); - void testCrash(); void testAddContactDialog(); - void testContactAddedUserDialog(); - void testMsnPlus(); - void testNotificationConnection(); - void testContactList(); + void testChallengeHandler(); + void testChatWindow(); void testConnect(); + void testContactAddedUserDialog(); + void testContactList(); + void testCrash(); void testGroupsAndContacts(); - void testSettings(); - void testSwitchboardConnection(); + void testMsnPlus(); + void benchmarkParser(); + void testNotificationConnection(); void testNotifications(); void testNowListening(); + void testSettings(); void testSoapConnection(); + void testSwitchboardConnection(); void testSystemTray(); + void testTransferWindow(); void testUpnpConnection(); void testXslTransformation(); + void testOfflineMessages(); + private slots: - void testSlot(); -#endif + void testContactAddedUserDialogSlot( const QString &handle, const QStringList &groupIds, const int code ); + void testContactListSlot(); + void testChatWindowSlot(); + void testMsnPlusInteractive(); private: // Private attributes - // Control whether or not to auto-delete the instance after running a test - bool doNotDelete_; + // Control whether or not to quit after performing the test + bool quitAfterTest_; // A pointer to the main widget, also used to gain access to all its attributes KMess *kmess_; + // Pointer to the kmess application object + KMessApplication *kmessApp_; }; #endif diff --git a/src/kmessview.cpp b/src/kmessview.cpp index 8f8bb5c..8fd2373 100644 --- a/src/kmessview.cpp +++ b/src/kmessview.cpp @@ -20,32 +20,27 @@ #include "kmessview.h" #include "contact/contact.h" -#include "contact/contactlist.h" #include "contact/group.h" #include "contact/msnstatus.h" +#include "contact/specialgroups.h" #include "dialogs/contactpropertiesdialog.h" -#include "network/specialgroups.h" +#include "model/contactlist.h" +#include "model/contactlistmodelfilter.h" #include "utils/kmessshared.h" +#include "utils/kmessconfig.h" #include "utils/richtextparser.h" -#include "contactlistviewdelegate.h" #include "currentaccount.h" #include "emoticonmanager.h" -#include "contactlistmodelfilter.h" #include "kmessdebug.h" +#include "kmessviewdelegate.h" #include -#include -#include +#include #include #include -#include -#include -#include #include -#include #include #include -#include #include #include @@ -54,13 +49,11 @@ #include #include #include -#include #include #include #include -#include #include -#include + #ifdef KMESSDEBUG_CONTACTLISTMODELTEST #include "../tests/modeltest/modeltest.h" @@ -71,7 +64,7 @@ #define KMESSDEBUG_KMESSVIEW_GENERAL #ifdef KMESSDEBUG_CONTACTLISTMODEL -// #define KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + #define KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY #endif #endif @@ -92,11 +85,16 @@ KMessView::KMessView( QWidget *parent ) // Capture focus events without subclassing the widget from the .UI file personalMessageInput_->installEventFilter(this); currentAccountDisplayPic_->installEventFilter(this); - contactListView_->installEventFilter(this); + contactListView_->viewport()->installEventFilter(this); // Fake an event to configure the personal message input QEvent ev(QEvent::FocusOut); eventFilter(personalMessageInput_, &ev); + + // Set up the group update timer + updateTimer_.setSingleShot( true ); + connect( &updateTimer_, SIGNAL( timeout() ), + this, SLOT ( slotUpdateGroups() ) ); } @@ -131,8 +129,9 @@ void KMessView::changedSong( const QString &artist, const QString &/*album*/, co } // Update label - QString longTitle = artist + (artist.isEmpty() ? "" : " - ") + track; - nowListeningLabel_->setText( i18n("Now listening to %1", longTitle) ); + bool showDash = ( ! track.isEmpty() && ! artist.isEmpty() ); + QString longTitle( track + ( showDash ? " - " : "" ) + artist ); + nowListeningLabel_->setText( longTitle ); } else { @@ -145,20 +144,22 @@ void KMessView::changedSong( const QString &artist, const QString &/*album*/, co // Get the specified item's or the current item's data -ModelDataList KMessView::getItemData( const QModelIndex &index ) +const ModelDataList KMessView::getItemData( const QModelIndex &index ) { - QModelIndex itemIndex = index; - QModelIndexList selection = selectionModel_->selectedIndexes(); + const QModelIndexList& selection( selectionModel_->selectedIndexes() ); + QModelIndex itemIndex( index ); // If the index is not valid, get the current selection + // TODO is this check necessary? isn't it better to return ModelDataList() to avoid any problems? if( ! itemIndex.isValid() && ! selection.isEmpty() ) { // Only one index can be returned at once by the contact list (has single selection mode) - itemIndex = selection.first(); + itemIndex = QModelIndex( selection.first() ); + // return ModelDataList(); } - // The index or the selection aren't valid, abort - if( ! itemIndex.isValid() ) + // The index or the selection aren't valid, abort. + if( ! itemIndex.isValid() || itemIndex.model() != viewModel_ ) { #ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY kDebug() << "Skipping an invalid item at index:" << index; @@ -167,7 +168,7 @@ ModelDataList KMessView::getItemData( const QModelIndex &index ) } // Get the item data - QVariant data( itemIndex.data() ); + const QVariant& data( itemIndex.data() ); // If the data is not a variant map, abort if( ! data.canConvert( QVariant::Map ) ) @@ -179,7 +180,7 @@ ModelDataList KMessView::getItemData( const QModelIndex &index ) } // Convert the variant data to a normal map - ModelDataList itemData( data.toMap() ); + const ModelDataList& itemData( data.toMap() ); // Do nothing if there's no data if( itemData.isEmpty() ) @@ -242,52 +243,24 @@ bool KMessView::initialize( QAbstractItemModel *viewModel ) // Set an icon for the email label // Using "knotify" icon because it's available everywhere. "multimedia" is SUSE-specific. - emailPixmapLabel_->setPixmap( loader->loadIcon( "mail-mark-unread", KIconLoader::NoGroup ) ); - nowListeningPixmapLabel_->setPixmap( loader->loadIcon( "speaker", KIconLoader::NoGroup ) ); - searchIcon_->setPixmap( loader->loadIcon( "edit-find-user", KIconLoader::Small ) ); + emailPixmapLabel_ ->setPixmap( loader->loadIcon( "mail-mark-unread", KIconLoader::NoGroup ) ); + nowListeningPixmapLabel_->setPixmap( loader->loadIcon( "speaker", KIconLoader::NoGroup ) ); + searchIcon_ ->setPixmap( loader->loadIcon( "edit-find-user", KIconLoader::Small ) ); - // Run the update functions with the current user data - slotUpdateEmailDisplay(); - slotUpdateUserStatus(); - slotUpdateNoEmails(); - slotUpdateDisplayPicture(); - - // Create the menu for status button - QMenu *menu = new QMenu(); - - QStringList states; - states << i18n("Online") - << i18n("Away") - << i18n("Away with auto-reply") - << i18n("Idle") - << i18n("Be Right Back") - << i18n("Busy") - << i18n("Out to Lunch") - << i18n("On the Phone") - << i18n("Invisible"); - - int i = 0; - QAction *action; - foreach( QString actionText, states ) - { - // Set the informations for actions - action = new QAction( this ); - action->setText( actionText ); - action->setData( i++ ); - menu ->addAction( action ); - } + // Create a menu for the status button // Set the menu into button and connect the signals + KMenu *menu = MsnStatus::getStatusMenu(); statusButton_->setMenu( menu ); - connect( statusButton_, SIGNAL( clicked() ), - statusButton_, SLOT( showMenu() ) ); + connect( statusButton_, SIGNAL( clicked() ), + statusButton_, SLOT ( showMenu() ) ); #if QT_VERSION >= 0x040400 - connect( statusButton_, SIGNAL( triggered(QAction*) ), - this, SLOT( slotForwardChangeStatus(QAction*) ) ); + connect( statusButton_, SIGNAL( triggered(QAction*) ), + this, SIGNAL( changeStatus(QAction*) ) ); #else - connect( menu, SIGNAL( triggered(QAction*) ), - this, SLOT( slotForwardChangeStatus(QAction*) ) ); + connect( menu, SIGNAL( triggered(QAction*) ), + this, SLOT ( changeStatus(QAction*) ) ); #endif // Enable the labels @@ -295,25 +268,30 @@ bool KMessView::initialize( QAbstractItemModel *viewModel ) emailLabel_->setEnabled(true); // Hide the now listening until something is playing - changedSong( QString::null, QString::null, QString::null, false ); - - // Refresh the personal message text - slotPersonalMessageLostFocus( true ); - + changedSong( QString(), QString(), QString(), false ); // Connect signals for the current account connect( currentAccount_, SIGNAL( changedMsnObject() ), this, SLOT ( slotUpdateDisplayPicture() ) ); // Changed users display pic - connect( currentAccount_, SIGNAL( changedNoEmails() ), // Changed e-mail count + connect( currentAccount_, SIGNAL( changedNoEmails() ), // Changed email count this, SLOT ( slotUpdateNoEmails() ) ); connect( currentAccount_, SIGNAL( changedStatus() ), // Changed status this, SLOT ( slotUpdateUserStatus() ) ); connect( currentAccount_, SIGNAL( changedFriendlyName() ), // Changed name this, SLOT ( slotUpdateUserStatus() ) ); - connect( currentAccount_, SIGNAL( changedEmailDisplaySettings() ), // Changed e-mail display settings + connect( currentAccount_, SIGNAL( changedEmailDisplaySettings() ), // Changed email display settings this, SLOT ( slotUpdateEmailDisplay() ) ); - connect( currentAccount_, SIGNAL( changedViewMode() ), // Changed the requested view mode - this, SLOT ( slotUpdateViewMode() ) ); + connect( currentAccount_, SIGNAL( changedDisplaySettings() ), + this, SLOT ( slotUpdateGroups() ) ); + connect( currentAccount_, SIGNAL( changedViewMode() ), + this, SLOT ( slotUpdateGroups() ) ); + connect( currentAccount_, SIGNAL( changedContactListOptions() ), // Changed contact list options + this, SLOT ( slotUpdateView() ) ); + // These update the display pic size depending on the email & now listening options + connect( currentAccount_, SIGNAL( changedNowListeningSettings() ), + this, SLOT ( slotUpdateDisplayPicture() ) ); + connect( currentAccount_, SIGNAL( changedEmailDisplaySettings() ), + this, SLOT ( slotUpdateDisplayPicture() ) ); // Connect signals for the contactlist const ContactList *contactList = currentAccount_->getContactList(); @@ -323,22 +301,38 @@ bool KMessView::initialize( QAbstractItemModel *viewModel ) this, SLOT( rebuildContactActions() ) ); connect( contactList, SIGNAL( groupRemoved(const Group*) ), // A group was removed this, SLOT( rebuildContactActions() ) ); - connect( contactList, SIGNAL( contactOnline(Contact*,bool) ), - this, SLOT( slotUpdateGroups() ) ); - connect( contactList, SIGNAL( contactOffline(Contact*,bool) ), - this, SLOT( slotUpdateGroups() ) ); // Connect signals for the history combobox and put the first string into it connect( contactList, SIGNAL( contactOnline( Contact*, bool ) ), this, SLOT( slotContactChangedStatus( Contact *, bool ) ) ); connect( contactList, SIGNAL( contactOffline( Contact*, bool ) ), this, SLOT( slotContactChangedStatus( Contact *, bool ) ) ); + connect( contactList, SIGNAL( contactOnline( Contact*, bool ) ), + this, SLOT( slotScheduleGroupUpdate() ) ); + connect( contactList, SIGNAL( contactOffline( Contact*, bool ) ), + this, SLOT( slotScheduleGroupUpdate() ) ); historyBox_->insertItem( 0, i18n( "[%1] Logged with %2", QTime::currentTime ().toString( "HH:mm:ss" ) , currentAccount_->getHandle() ) ); // Connect the search edit line with slot for searching - connect( searchEdit_, SIGNAL( textChanged ( QString ) ), this, SLOT( slotSearchContact( QString ) ) ); + connect( searchEdit_, SIGNAL( textChanged(QString) ), + this, SLOT ( slotSearchContact(QString) ) ); + + // Enable the search box if the user has left it open at the last disconnection + toggleShowSearchFrame( currentAccount_->getShowSearchBar() ); + + // Enable the history box + toggleShowHistoryBox( currentAccount_->getShowHistoryBox() ); + + // Run the update functions with the current user data + slotUpdateEmailDisplay(); + slotUpdateUserStatus(); + slotUpdateNoEmails(); + slotUpdateDisplayPicture(); + slotUpdateGroups(); + slotPersonalMessageLostFocus( true ); + return true; } @@ -350,18 +344,18 @@ void KMessView::slotContactChangedStatus( Contact *contact, bool showNotify ) // One contact is now online/offline, put it in history combobox if( showNotify ) { + const QString& friendlyname( contact->getFriendlyName() ); QString item; - QString friendlyname = contact->getFriendlyName(); if( contact->isOnline() ) { item = i18n( "[%1] %2 goes online", QTime::currentTime ().toString( "HH:mm:ss" ) - , Qt::escape( friendlyname ) ); + , friendlyname ); } else { item = i18n( "[%1] %2 goes offline", QTime::currentTime ().toString( "HH:mm:ss" ) - ,Qt::escape( friendlyname ) ); + , friendlyname ); } // Remove oldest item if the count is >= 500 elements @@ -377,12 +371,38 @@ void KMessView::slotContactChangedStatus( Contact *contact, bool showNotify ) +// The connection was closed, clean up before deletion +void KMessView::slotDisconnected() +{ + updateTimer_.stop(); + + contactListView_->setModel( 0 ); + + delete selectionModel_; + delete viewModel_; + selectionModel_ = 0; + viewModel_ = 0; +} + + + +// The "show history box" menu item has been toggled. +void KMessView::toggleShowHistoryBox( bool show ) +{ + historyBox_->setVisible( show ); + + // Save the current state to the Account + currentAccount_->setShowHistoryBox( show ); +} + + + // The "show search in contact list" menu item has been toggled. -void KMessView::toggleShowSearchFrame(bool show) +void KMessView::toggleShowSearchFrame( bool show ) { if( show ) { - searchFrame_->setShown( true ); + searchFrame_->show(); searchEdit_->setFocus(); } else @@ -391,9 +411,12 @@ void KMessView::toggleShowSearchFrame(bool show) searchEdit_->clearFocus(); searchEdit_->setText( QString() ); - searchFrame_->setShown( false ); + searchFrame_->hide(); contactListView_->setFocus(); } + + // Save the current state to the Account + currentAccount_->setShowSearchBar( show ); } @@ -403,7 +426,7 @@ bool KMessView::eventFilter(QObject *obj, QEvent *event) { if( obj != personalMessageInput_ && obj != currentAccountDisplayPic_ - && obj != contactListView_ ) + && obj != contactListView_->viewport() ) { #ifdef KMESSDEBUG_KMESSVIEW_GENERAL kWarning() << "Received event '" << event->type() << "' from object '" << obj->objectName() << "'."; @@ -430,11 +453,28 @@ bool KMessView::eventFilter(QObject *obj, QEvent *event) emit showSettings(); } } - else if( obj == contactListView_ ) + else if( obj == contactListView_->viewport() ) { if( eventType == QEvent::ToolTip ) { showToolTip( QCursor::pos() ); + return true; + } + else if( eventType == QEvent::KeyPress ) + { + int key = static_cast( event )->key(); + + // Detect enter key press to open a chat with the selected contact + if( key == Qt::Key_Return || key == Qt::Key_Enter ) + { + QModelIndexList selection = selectionModel_->selectedIndexes(); + + // Get the currently selected item + if( ! selection.isEmpty() ) + { + slotItemClicked( selection.first(), false ); + } + } } } else if( obj == personalMessageInput_ ) @@ -443,20 +483,20 @@ bool KMessView::eventFilter(QObject *obj, QEvent *event) { // Mouse enters widget's boundaries // Just a bit different from the original client, already change the background line web-forms also do. - personalMessageInput_->setStyleSheet( "background-color: base;" ); + personalMessageInput_->setStyleSheet( "QLineEdit{ background-color: base; }" ); } else if( eventType == QEvent::Leave ) { // Mouse leaves the widget. if( ! personalMessageInput_->hasFocus() ) { - personalMessageInput_->setStyleSheet( "background-color: transparent;" ); + personalMessageInput_->setStyleSheet( "QLineEdit{ background-color: transparent; }" ); } } else if( eventType == QEvent::FocusIn ) { // Personal status mesage got the focus - personalMessageInput_->setStyleSheet( "background-color: base;" ); + personalMessageInput_->setStyleSheet( "QLineEdit{ background-color: base; }" ); // Clear if there is no status message, but a placeholder label if( currentAccount_->getPersonalMessage().isEmpty() ) @@ -472,7 +512,7 @@ bool KMessView::eventFilter(QObject *obj, QEvent *event) else if( event->type() == QEvent::FocusOut ) { // Lost the focus - personalMessageInput_->setStyleSheet( "background-color: transparent;" ); + personalMessageInput_->setStyleSheet( "QLineEdit{ background-color: transparent; }" ); } } @@ -488,17 +528,10 @@ bool KMessView::initContactListView( QAbstractItemModel *viewModel ) kDebug() << "Initializing the contact list view."; #endif - KIconLoader *loader = KIconLoader::global(); - // Create a proxy model to filter and sort the raw contact list view viewModel_ = new ContactListModelFilter( this ); viewModel_->setSourceModel( viewModel ); -#ifdef KMESSDEBUG_CONTACTLISTMODELTEST - // Start the Contact List model filter tests - new ModelTest( viewModel_ ); -#endif - // Create a selection model to get data about the list selections selectionModel_ = new QItemSelectionModel( viewModel_ ); @@ -507,7 +540,7 @@ bool KMessView::initContactListView( QAbstractItemModel *viewModel ) contactListView_->setSelectionModel( selectionModel_ ); // Activate the custom list item painter - contactListView_->setItemDelegate( new ContactListViewDelegate( contactListView_ ) ); + contactListView_->setItemDelegate( new KMessViewDelegate( contactListView_ ) ); // Set the contact list view's properties #if QT_VERSION >= 0x040400 @@ -516,18 +549,15 @@ bool KMessView::initContactListView( QAbstractItemModel *viewModel ) contactListView_->header()->hide(); #endif contactListView_->setAnimated( true ); - contactListView_->setSelectionMode( QAbstractItemView::SingleSelection ); - contactListView_->setColumnHidden( 1, true ); // The model has 3 columns, but we display the first only - contactListView_->setColumnHidden( 2, true ); - contactListView_->setSortingEnabled( true ); - contactListView_->sortByColumn( 0, Qt::AscendingOrder ); + contactListView_->setDragEnabled( true ); + contactListView_->setDropIndicatorShown( true ); + contactListView_->setDragDropOverwriteMode( false ); + contactListView_->setDragDropMode( QAbstractItemView::DragDrop ); + contactListView_->viewport()->setAcceptDrops( true ); + contactListView_->setAcceptDrops( true ); - // Set a background pixmap - QString backgroundPicture = loader->iconPath( "background", KIconLoader::User ); - contactListView_->setStyleSheet( "QTreeView { background-image: url(" + backgroundPicture + "); " - " background-color: palette(alternate-base); }" - "QTreeView::branch:has-siblings:adjoins-item { border-image: url(empty.png) 0; }" - "QTreeView::branch:!has-children:!has-siblings:adjoins-item { border-image: url(empty.png) 0; }" ); + // Set the list stylesheet + slotUpdateView(); // Connect the list's signals connect( contactListView_, SIGNAL( clicked(const QModelIndex&) ), @@ -544,8 +574,9 @@ bool KMessView::initContactListView( QAbstractItemModel *viewModel ) connect( contactListView_, SIGNAL( customContextMenuRequested(const QPoint&) ), this, SLOT( showContextMenu(const QPoint&) ) ); - // Update the list's visible groups - slotUpdateGroups(); + // Connect the selection model's signals + connect( selectionModel_, SIGNAL( selectionChanged(const QItemSelection&,const QItemSelection&) ), + this, SIGNAL( selectionChanged(const QItemSelection&) ) ); return true; } @@ -557,7 +588,7 @@ bool KMessView::initContactPopup() { // Initialize context menu actions chatWithContact_ = new KAction( KIcon("user-group-new"), i18n("Cha&t"), this ); - emailContact_ = new KAction( KIcon("mail-message-new"), i18n("&Send email"), this ); + emailContact_ = new KAction( KIcon("mail-message-new"), i18n("&Send Email"), this ); msnProfile_ = new KAction( KIcon("preferences-desktop-user"), i18n("&View Profile"), this ); contactProperties_ = new KAction( KIcon("user-properties"), i18n("&Properties"), this ); @@ -566,12 +597,12 @@ bool KMessView::initContactPopup() blockContact_ = new KAction( KIcon("dialog-cancel"), i18n("&Block Contact"), this ); unblockContact_ = new KAction( KIcon("dialog-ok"), i18n("&Unblock Contact"), this ); removeContact_ = new KAction( KIcon("list-remove-user"), i18n("&Delete Contact"), this ); - removeFromGroup_ = new KAction( KIcon("list-remove"), i18n("&Remove from group"), this ); + removeFromGroup_ = new KAction( KIcon("list-remove"), i18n("&Remove From Group"), this ); popupCopyFriendlyName_ = new KAction( i18n("&Friendly Name"), this ); popupCopyPersonalMessage_ = new KAction( i18n("&Personal Message"), this ); popupCopyHandle_ = new KAction( i18n("&Email Address"), this ); - popupCopyMusic_ = new KAction( i18n("&Listening Music"), this ); + popupCopyMusic_ = new KAction( i18n("Song &Name"), this ); // Connect the actions connect( chatWithContact_, SIGNAL(activated()), this, SLOT(slotForwardStartChat()) ); @@ -605,7 +636,7 @@ bool KMessView::initContactPopup() rebuildContactActions(); // Initialize Copy sub popups - popupCopyMenu_ = new KActionMenu( i18n("&Copy..."), this ); + popupCopyMenu_ = new KActionMenu( i18n("&Copy"), this ); popupCopyMenu_ ->addAction( popupCopyFriendlyName_ ); popupCopyMenu_ ->addAction( popupCopyPersonalMessage_ ); popupCopyMenu_ ->addAction( popupCopyHandle_ ); @@ -620,20 +651,26 @@ bool KMessView::initContactPopup() contactActionPopup_->addAction( emailContact_ ); contactActionPopup_->addAction( msnProfile_ ); contactActionPopup_->addAction( popupCopyMenu_ ); - contactActionPopup_->addAction( contactProperties_ ); + contactActionPopup_->addSeparator(); - contactActionPopup_->addAction( addContact_ ); - contactActionPopup_->addAction( allowContact_ ); - - contactActionPopup_->addAction( blockContact_ ); - contactActionPopup_->addAction( unblockContact_ ); - contactActionPopup_->addAction( moveContactToGroup_ ); contactActionPopup_->addAction( copyContactToGroup_ ); contactActionPopup_->addAction( removeFromGroup_ ); + + contactActionPopup_->addSeparator(); + + contactActionPopup_->addAction( addContact_ ); + contactActionPopup_->addAction( allowContact_ ); contactActionPopup_->addAction( removeContact_ ); + contactActionPopup_->addAction( blockContact_ ); + contactActionPopup_->addAction( unblockContact_ ); + + contactActionPopup_->addSeparator(); + + contactActionPopup_->addAction( contactProperties_ ); + return true; } @@ -699,7 +736,7 @@ void KMessView::rebuildContactActions() // Since we need both a name to display and a group ID to distinguish groups, // but KActions only support the name, we'll use the Qt objectName to store // their internal id - QString id = group->getId(); + const QString& id( group->getId() ); KAction *copyAction = new KAction( group->getName(), copyContactToGroup_ ); KAction *moveAction = new KAction( group->getName(), moveContactToGroup_ ); copyAction->setObjectName( id ); @@ -723,28 +760,39 @@ void KMessView::rebuildContactActions() // The email label was clicked so open the user's preferred email url void KMessView::slotEmailLabelClicked() { -#ifdef KMESSDEBUG_KMESSVIEW_GENERAL - kDebug(); -#endif - currentAccount_->openMailAtInbox(); } -// Personal Status changed -void KMessView::slotForwardChangeStatus( QAction *action ) -{ - int index = action->data().toInt(); - emit changeStatus( index ); -} - - // A group was expanded or collapsed void KMessView::slotGroupChanged( const QModelIndex &index ) { + // When searching, the expanded status of the groups is altered, but the settings + // should not be applied to the actual groups + if( ! viewModel_->filterRegExp().isEmpty() ) + { + return; + } + +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Changed index:" << index; + kDebug() << "Current index at that row:" << viewModel_->index( index.row(), 0, QModelIndex() ); +#endif + + // Skip invalid items + if( ! index.isValid() + || ! viewModel_->hasIndex( index.row(), 0, QModelIndex() ) + || ! index.data().canConvert( QVariant::Map ) ) + { +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Skipping an invalid index:" << index; +#endif + return; + } + // Get the data from the selected index - ModelDataList itemData = getItemData( index ); + const ModelDataList& itemData( index.data().toMap() ); // Do nothing if the input index was not valid if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemGroup ) @@ -761,6 +809,9 @@ void KMessView::slotGroupChanged( const QModelIndex &index ) } group->setExpanded( contactListView_->isExpanded( index ) ); + + // Save the changed setting + currentAccount_->getContactList()->saveProperties( group ); } @@ -771,7 +822,7 @@ void KMessView::showContextMenu( const QPoint &point ) const ContactList *contactList = currentAccount_->getContactList(); // Get the data from the selected index - ModelDataList itemData = getItemData( contactListView_->indexAt( point ) ); + const ModelDataList& itemData( getItemData( contactListView_->indexAt( point ) ) ); // The index was empty if( itemData.isEmpty() ) @@ -782,58 +833,54 @@ void KMessView::showContextMenu( const QPoint &point ) // Depending on the item type, show the appropriate menu if( itemData[ "type" ] == ContactListModelItem::ItemContact ) { - Contact *contact = contactList->getContactByHandle( itemData[ "handle" ].toString() ); + const QString& handle( itemData[ "handle" ].toString() ); + const Contact *contact = contactList->getContactByHandle( handle ); - bool isAllowed = contact->isAllowed(); bool isBlocked = contact->isBlocked(); - bool isReverse = contact->isReverse(); bool isFriend = contact->isFriend(); - bool isOnline = contact->isOnline(); - QStringList contactGroups = contact->getGroupIds(); - - // Only chat if contact is friends list, and not blocked. - chatWithContact_ ->setVisible( isFriend && ! isBlocked && isOnline ); - - moveContactToGroup_ ->setVisible( isFriend ); - - // Only if the contact is not in the 'Implicit' group (group 0) or there is only one group; - // (this means it will be the fifth ('Implicit', Online, Offline, Allowed, Removed); - if( contactGroups.isEmpty() ) - { - copyContactToGroup_ ->setVisible( false ); - } - else if( contactList->getGroupList().count() == 5 ) - { - copyContactToGroup_ ->setVisible( false ); - moveContactToGroup_ ->setVisible( false ); - } - else - { - copyContactToGroup_ ->setVisible( isFriend ); - } + const QStringList& contactGroups( contact->getGroupIds() ); // Only if not added yet addContact_ ->setVisible( ! isFriend ); // Only allow if contact is on the "removed" group. - allowContact_ ->setVisible( ! isFriend && ! isAllowed && ! isBlocked ); + allowContact_ ->setVisible( ! isFriend && ! contact->isAllowed() && ! isBlocked ); // Only one of these is enabled: blockContact_ ->setVisible( ! isBlocked ); unblockContact_ ->setVisible( isBlocked ); - // Only if the contact is on the friends list, or no longer - // added to reverse list (otherwise an "contact has added you" message appears) - removeContact_ ->setVisible( isFriend || ! isReverse ); + removeContact_ ->setVisible( isFriend ); - // Only if the contact is in the 'Implicit' group - if( contactGroups.isEmpty() ) + // Only show the group management options when it makes sense to; contacts + // in the Allowed and Removed groups are technically not part of your friends list + if( itemData[ "group" ] == SpecialGroups::ALLOWED + || itemData[ "group" ] == SpecialGroups::REMOVED ) { - removeFromGroup_ ->setVisible(false); + copyContactToGroup_->setVisible( false ); + moveContactToGroup_->setVisible( false ); + removeFromGroup_ ->setVisible( false ); + } + else if( currentAccount_->getContactListDisplayMode() == CurrentAccount::VIEW_BYSTATUS + || ( currentAccount_->getContactListDisplayMode() == CurrentAccount::VIEW_MIXED + && ! contact->isOnline() ) + ) + { + copyContactToGroup_->setVisible( true ); + moveContactToGroup_->setVisible( false ); + removeFromGroup_ ->setVisible( false); + } + else if( contactGroups.isEmpty() ) + { + moveContactToGroup_->setVisible( true ); + copyContactToGroup_->setVisible( false ); + removeFromGroup_ ->setVisible( false ); } else { - removeFromGroup_ ->setVisible(true); + moveContactToGroup_->setVisible( isFriend ); + copyContactToGroup_->setVisible( isFriend ); + removeFromGroup_ ->setVisible( isFriend ); } // Show all copy and move actions @@ -845,7 +892,7 @@ void KMessView::showContextMenu( const QPoint &point ) // Then hide only the invalid choices int enabledCopyActions = groupCopyActionsList_.count(); int enabledMoveActions = groupMoveActionsList_.count(); - foreach( QString groupId, contactGroups ) + foreach( const QString &groupId, contactGroups ) { foreach( KAction *action, groupCopyActionsList_ ) { @@ -887,7 +934,8 @@ void KMessView::showContextMenu( const QPoint &point ) if( contact != 0 ) { // Append friendly name and personal message so cycle only one time to search links - QString nameAndPm = contact->getFriendlyName() + " " + contact->getPersonalMessage(); + const QString& nameAndPm( contact->getFriendlyName() + ' ' + contact->getPersonalMessage() ); + QStringList links; //Initialize index, link RegExp and found boolean for insert separator only at first found link int pos = 0; @@ -896,12 +944,19 @@ void KMessView::showContextMenu( const QPoint &point ) while( ( pos = linkRegExp.indexIn( nameAndPm, pos ) ) != -1 ) { // Grep the found link and update the position for the next cycle - QString foundLink = linkRegExp.cap( 0 ); + QString foundLink( linkRegExp.cap( 0 ) ); pos += linkRegExp.matchedLength(); + // Skip duplicated links + if( links.contains( foundLink ) ) + { + continue; + } + links.append( foundLink ); + // Put the found link into KAction, replace & with && to avoid shortcut problem and use tooltip // for future grep of link ( to avoid shortcut problem too ) - popupCopyLink_ = new KAction( foundLink.replace( "&", "&&" ), this ); + popupCopyLink_ = new KAction( foundLink.replace( '&', "&&" ), this ); popupCopyLink_->setToolTip( foundLink ); connect( popupCopyLink_, SIGNAL( triggered( bool ) ), this, SLOT( copyText() ) ); @@ -913,18 +968,24 @@ void KMessView::showContextMenu( const QPoint &point ) } } + // Forbid chatting with yourself + chatWithContact_->setEnabled( handle != currentAccount_->getHandle() ); + // Set tooltip ( informations ) of other copy actions popupCopyFriendlyName_ ->setToolTip( contact->getFriendlyName() ); popupCopyPersonalMessage_->setToolTip( contact->getPersonalMessage() ); popupCopyHandle_ ->setToolTip( contact->getHandle() ); popupCopyMusic_ ->setToolTip( contact->getCurrentMediaString() ); + // Hide the unavailable options + popupCopyPersonalMessage_->setVisible( ! contact->getPersonalMessage ().isEmpty() ); + popupCopyMusic_ ->setVisible( ! contact->getCurrentMediaString().isEmpty() ); // Show the popup contactActionPopup_->popup( QCursor::pos() ); } else if( itemData[ "type" ] == ContactListModelItem::ItemGroup ) { - Group *group = contactList->getGroupById( itemData[ "id" ].toString() ); + const Group *group = contactList->getGroupById( itemData[ "id" ].toString() ); // No context menu for special groups if( ! group || group->isSpecialGroup() ) @@ -961,11 +1022,11 @@ void KMessView::copyText() // Show the contact & group tool tip void KMessView::showToolTip( const QPoint &point ) { + const QModelIndex& index( contactListView_->indexAt( contactListView_->mapFromGlobal( point ) ) ); QString tipText; - QModelIndex index( contactListView_->indexAt( contactListView_->mapFromGlobal( point ) ) ); // Read the actual data off the model index - ModelDataList itemData( index.data().toMap() ); + const ModelDataList& itemData( index.data().toMap() ); // Do nothing if the index is not valid if( ! index.isValid() || itemData.isEmpty() ) @@ -973,45 +1034,52 @@ void KMessView::showToolTip( const QPoint &point ) return; } - // Fields used for the Contact tooltip - QString clientName, mediaType, mediaString, friendlyName, personalMessage, lastSeenString, lastMessageString; - QDateTime lastSeen, lastMessage; - // Paint the different types of list items switch( itemData[ "type" ].toInt() ) { case ContactListModelItem::ItemContact: - tipText = "" + { + tipText = "
    " "" - "" - "" + "" "" "" - "" + "" "" - "
    " - "%2 (%3)
    " - "%4 %5" + "
    " + "" + "" + "
    " + "
    " + "%2 (%3)
    " + "%4 %5 %6" "
    " - "%6%7%8%9" - "
    "; + "" + "" + "%7%8%9%10%11" + "
    " + ""; // Add the display picture (if there is any), or the default KMess logo tipText = tipText.arg( itemData[ "displayPicture" ].toString() ); // Add the contact's real name - the alias is not shown: // you can read it in the contact list, after all - friendlyName = Qt::escape( itemData[ "trueFriendly" ].toString() ); + QString friendlyName( itemData[ "trueFriendly" ].toString() ); + // Escape HTML, replace standard emoticons, but no links and formatting + RichTextParser::parseMsnString( friendlyName, true, true, false, false ); tipText = tipText.arg( friendlyName ); // Add status tipText = tipText.arg( MsnStatus::getName( (Status) itemData[ "status" ].toInt() ) ); // Add the personal message - personalMessage = Qt::escape( itemData[ "personalMessage" ].toString() ); + QString personalMessage( itemData[ "personalMessage" ].toString() ); if( ! personalMessage.isEmpty() ) { - tipText = tipText.arg( "" + personalMessage + "" ); + // Escape HTML, replace standard emoticons, but no links and formatting + RichTextParser::parseMsnString( personalMessage, true, true, false, false ); + tipText = tipText.arg( "" + personalMessage + "
    " ); } else { @@ -1019,82 +1087,136 @@ void KMessView::showToolTip( const QPoint &point ) } // If the contact is listening to music, show it - mediaType = itemData[ "mediaType" ].toString(); - mediaString = itemData[ "mediaString" ].toString(); + const QString& mediaType ( itemData[ "mediaType" ].toString() ); + const QString& mediaString( itemData[ "mediaString" ].toString() ); if( ! mediaString.isEmpty() ) { QString mediaEmoticon; - QString newlineBefore( personalMessage.isEmpty() ? "" : "
    " ); // Determine icon for special media types if( mediaType == "Music" ) { - mediaEmoticon = "(8)"; + mediaEmoticon = EmoticonManager::instance()->getReplacement( "(8)", true ); } else if( mediaType == "Gaming" ) { - mediaEmoticon = "(xx)"; + mediaEmoticon = EmoticonManager::instance()->getReplacement( "(xx)", true ); } - // Set the icon if it's found in the emoticon theme. - if( ! mediaEmoticon.isEmpty() ) - { - mediaEmoticon = EmoticonManager::instance()->getReplacement( mediaEmoticon, true ); - } - - tipText = tipText.arg( newlineBefore + "" + mediaEmoticon + Qt::escape( mediaString ) + "" ); + tipText = tipText.arg( "" + + mediaEmoticon + Qt::escape( mediaString ) + + "
    " ); } else { tipText = tipText.arg( "" ); } + // Add a message about our presence in this contact's list + if( itemData[ "isReverse" ].toBool() ) + { + tipText = tipText.arg( "" ); + } + else + { + tipText = tipText.arg( "" + + i18nc( "Message in list tooltip", + "This person does not have you in his or her contact list." ) + + "" ); + } + + // Here starts the list of simple property:value lines + + const QString propertyLine( "%1:%2" ); + // Add handle - tipText = tipText.arg( i18nc( "Contact email in list tooltip", "Email: %1", Qt::escape( itemData[ "handle" ].toString() ) ) ); + tipText = tipText.arg( propertyLine.arg( i18nc( "Contact email label in list tooltip", "Email address" ) ) + .arg( itemData[ "handle" ].toString() ) ); // Add client identifier - clientName = itemData[ "clientName" ].toString(); + const QString& clientName( itemData[ "clientName" ].toString() ); if( ! clientName.isEmpty() ) { - tipText = tipText.arg( "
    " + i18nc( "Contact MSN client in list tooltip", "Client: %1", Qt::escape( clientName ) ) ); + tipText = tipText.arg( propertyLine.arg( i18nc( "Contact MSN client label in list tooltip", "Client" ) ) + .arg( Qt::escape( clientName ) ) ); } else { tipText = tipText.arg( "" ); } - lastSeen = itemData[ "lastSeen" ].toDateTime(); - lastMessage = itemData[ "lastMessage" ].toDateTime(); + //add info whether the contact is blocked + QString blockedString; + if( itemData[ "isBlocked" ].toBool() ) + { + blockedString = i18n( "Yes" ); + } + else + { + blockedString = i18n( "No" ); + } - lastSeenString = ( lastSeen.isNull() ) ? i18n( "Not seen yet" ) : lastSeen.toString(); - lastSeenString = ( ( (Status) itemData[ "status" ].toInt() ) != STATUS_OFFLINE ) - ? i18n( "Connected" ) : lastSeenString; + tipText = tipText.arg( propertyLine.arg( i18nc( "Contact blocked status label in list tooltip", "Blocked" ) ) + .arg( blockedString ) ); - lastMessageString = ( lastMessage.isNull() ) ? i18n( "No messages yet" ) : lastMessage.toString(); + // Add last seen date + const QDateTime& lastSeen( itemData[ "lastSeen" ].toDateTime() ); + QString lastSeenString; - tipText = tipText.arg( "
    " + i18nc( "Last time the contact was seen online", "Last seen: %1", lastSeenString ) ); - tipText = tipText.arg( "
    " + i18nc( "Last time a message was received", "Last message: %1", lastMessageString ) ); + if( ( (Status) itemData[ "status" ].toInt() ) != STATUS_OFFLINE ) + { + lastSeenString = i18n( "Connected" ); + } + else if( lastSeen.toTime_t() == 0 || lastSeen.isNull() ) + { + lastSeenString = i18n( "Not seen yet" ); + } + else + { + lastSeenString = lastSeen.toString(); + } - break; + tipText = tipText.arg( propertyLine.arg( i18nc( "Contact last presence label in list tooltip", "Last seen" ) ) + .arg( lastSeenString ) ); + + // Add last message date + const QDateTime& lastMessage( itemData[ "lastMessage" ].toDateTime() ); + QString lastMessageString; + if( lastMessage.toTime_t() == 0 || lastMessage.isNull() ) + { + lastMessageString = i18n( "No messages yet" ); + } + else + { + lastMessageString = lastMessage.toString(); + } + + tipText = tipText.arg( propertyLine.arg( i18nc( "Contact last message label in list tooltip", "Last message" ) ) + .arg( lastMessageString ) ); + } + break; case ContactListModelItem::ItemGroup: - tipText = "%1
    (%2)
    "; + tipText = "%1
    (%2)
    "; // Add the group name tipText = tipText.arg( i18nc( "Group name in group tooltip", "Group %1", itemData[ "name" ].toString() ) ); - // Add the number of contacts - if( itemData[ "isSpecialGroup" ].toBool() ) + // Only non-empty and non-special groups also have an Online contacts count. + // (Individuals is trated as a non-special group) + if( ( ! itemData[ "isSpecialGroup" ].toBool() || itemData[ "group" ].toString() == SpecialGroups::INDIVIDUALS ) + && itemData[ "totalContacts" ].toInt() > 0 ) { - tipText = tipText.arg( i18nc( "Contacts count in special group tooltip", "%1 contacts", itemData[ "totalContacts" ].toString() ) ); + tipText = tipText.arg( i18ncp( "Contacts counters in normal group tooltip", + "%1 contact, %2 online", "%1 contacts, %2 online", + itemData[ "totalContacts" ].toInt(), + itemData[ "onlineContacts" ].toInt() ) ); } else { - tipText = tipText.arg( i18nc( "Contacts counters in normal group tooltip", - "%1 contacts, %2 online", - itemData[ "totalContacts" ].toString(), - itemData[ "onlineContacts" ].toString() ) ); + tipText = tipText.arg( i18ncp( "Contacts count in special group tooltip", + "%1 contact", "%1 contacts", itemData[ "totalContacts" ].toInt() ) ); } break; @@ -1110,11 +1232,11 @@ void KMessView::showToolTip( const QPoint &point ) -// E-mail the current contact +// Email the current contact void KMessView::slotEmailContact() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was not valid, do nothing if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) @@ -1165,7 +1287,7 @@ void KMessView::slotItemSingleClicked( const QModelIndex &index ) void KMessView::slotItemClicked( const QModelIndex &index, const bool accidental ) { // Get the data from the selected index - ModelDataList itemData = getItemData( index ); + const ModelDataList& itemData( getItemData( index ) ); // The index was empty if( itemData.isEmpty() ) @@ -1208,7 +1330,7 @@ void KMessView::slotMoveGroupDown() const ContactList *contactList = currentAccount_->getContactList(); // Get the group data from the selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); Group *group = contactList->getGroupById( itemData[ "id" ].toString() ); if( ! group || itemData.isEmpty() ) { @@ -1222,6 +1344,10 @@ void KMessView::slotMoveGroupDown() return; } +#ifdef KMESSDEBUG_KMESSVIEW_GENERAL + kDebug() << "Selected group:" << group->getId() << "to move down in place of group:" << nextGroup->getId(); +#endif + // Get the group sorting position for both groups int oldGroupPos = group ->getSortPosition(); int newGroupPos = nextGroup->getSortPosition(); @@ -1229,9 +1355,6 @@ void KMessView::slotMoveGroupDown() // Swap them group ->setSortPosition( newGroupPos ); nextGroup->setSortPosition( oldGroupPos ); - - // Re-sort the list - contactListView_->sortByColumn( 1, Qt::AscendingOrder ); } @@ -1242,7 +1365,7 @@ void KMessView::slotMoveGroupUp() const ContactList *contactList = currentAccount_->getContactList(); // Get the group data from the selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); Group *group = contactList->getGroupById( itemData[ "id" ].toString() ); if( ! group || itemData.isEmpty() ) { @@ -1256,6 +1379,10 @@ void KMessView::slotMoveGroupUp() return; } +#ifdef KMESSDEBUG_KMESSVIEW_GENERAL + kDebug() << "Selected group:" << group->getId() << "to move up in place of group:" << prevGroup->getId(); +#endif + // Get the group sorting position for both groups int oldGroupPos = group ->getSortPosition(); int newGroupPos = prevGroup->getSortPosition(); @@ -1264,8 +1391,9 @@ void KMessView::slotMoveGroupUp() group ->setSortPosition( newGroupPos ); prevGroup->setSortPosition( oldGroupPos ); - // Re-sort the list - contactListView_->sortByColumn( 1, Qt::AscendingOrder ); + // Save the changed setting + contactList->saveProperties( group ); + contactList->saveProperties( prevGroup ); } @@ -1274,7 +1402,7 @@ void KMessView::slotMoveGroupUp() void KMessView::slotForwardAddContact() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was not empty if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) @@ -1292,7 +1420,7 @@ void KMessView::slotForwardAddContact() void KMessView::slotForwardAllowContact() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was not empty if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) @@ -1310,7 +1438,7 @@ void KMessView::slotForwardAllowContact() void KMessView::slotForwardBlockContact() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was not empty if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) @@ -1328,7 +1456,7 @@ void KMessView::slotForwardBlockContact() void KMessView::slotForwardCopyContact( const QString &newGroupId ) { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was not empty if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) @@ -1346,9 +1474,9 @@ void KMessView::slotForwardCopyContact( const QString &newGroupId ) void KMessView::slotForwardMoveContact( const QString &newGroupId ) { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); - // The index was not empty + // The selection was not valid if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) { return; @@ -1356,10 +1484,9 @@ void KMessView::slotForwardMoveContact( const QString &newGroupId ) // Get the old group ID, and if it's not valid, set it to zero QString oldGroupId; - ModelDataList parentItemData = getItemData( selectionModel_->selectedIndexes().first().parent() ); - if( ! parentItemData.isEmpty() && parentItemData[ "type" ] == ContactListModelItem::ItemGroup ) + if( itemData[ "isInSpecialGroup" ].toBool() == false ) { - oldGroupId = parentItemData[ "id" ].toString(); + oldGroupId = itemData[ "group" ].toString(); } else { @@ -1382,7 +1509,7 @@ void KMessView::slotForwardMoveContact( const QString &newGroupId ) void KMessView::slotForwardRemoveContact() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was empty if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) @@ -1398,7 +1525,7 @@ void KMessView::slotForwardRemoveContact() void KMessView::slotForwardRemoveFromGroup() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was invalid if( itemData.isEmpty() ) @@ -1407,7 +1534,7 @@ void KMessView::slotForwardRemoveFromGroup() } // Get the ID of the group which contained this instance of the contact - ModelDataList parentItemData = getItemData( selectionModel_->selectedIndexes().first().parent() ); + const ModelDataList& parentItemData( getItemData( selectionModel_->selectedIndexes().first().parent() ) ); if( parentItemData.isEmpty() || parentItemData[ "type" ] != ContactListModelItem::ItemGroup ) { return; @@ -1422,7 +1549,7 @@ void KMessView::slotForwardRemoveFromGroup() void KMessView::slotForwardRemoveGroup() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was invalid if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemGroup ) @@ -1441,7 +1568,7 @@ void KMessView::slotForwardRemoveGroup() void KMessView::slotForwardRenameGroup() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was invalid if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemGroup ) @@ -1468,7 +1595,7 @@ void KMessView::slotForwardStartChat() void KMessView::slotForwardUnblockContact() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was not empty if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) @@ -1501,7 +1628,8 @@ void KMessView::slotPersonalMessageEnterPressed() */ void KMessView::slotPersonalMessageLostFocus( bool refreshOnly ) { - const QString defaultMessage( i18nc( "Default personal message shown in the contact list", "<Enter your personal message here>" ) ); + const QString& defaultMessage( i18nc( "Default personal message shown in the contact list", "<Enter your personal message here>" ) ); + const QString& defaultTooltip( i18nc( "Default personal message tooltip", "Enter here a message to show to your contacts: they will see it along with your friendly name" ) ); personalMessageInput_->clearFocus(); contactListView_->setFocus(); @@ -1514,13 +1642,15 @@ void KMessView::slotPersonalMessageLostFocus( bool refreshOnly ) #endif // Refresh the message - const QString &message = currentAccount_->getPersonalMessage(); + const QString &message( currentAccount_->getPersonalMessage( STRING_ORIGINAL ) ); if( message.isEmpty() ) { + personalMessageInput_->setToolTip( defaultTooltip ); personalMessageInput_->setText( defaultMessage ); } else { + personalMessageInput_->setToolTip( message ); personalMessageInput_->setText( message ); } @@ -1528,7 +1658,7 @@ void KMessView::slotPersonalMessageLostFocus( bool refreshOnly ) } // Get message - QString message = personalMessageInput_->text(); + const QString& message( personalMessageInput_->text() ); #ifdef KMESSDEBUG_KMESSVIEW_GENERAL kDebug() << "Updating personal message to:" << message; @@ -1543,10 +1673,11 @@ void KMessView::slotPersonalMessageLostFocus( bool refreshOnly ) } // Only update the message if it's been changed - if( currentAccount_->getPersonalMessage() != message ) + if( currentAccount_->getPersonalMessage( STRING_ORIGINAL ) != message ) { // Update message and save the changes currentAccount_->setPersonalMessage( message ); + personalMessageInput_->setToolTip( message ); // Commit changes to disk, now currentAccount_->saveProperties(); @@ -1557,17 +1688,33 @@ void KMessView::slotPersonalMessageLostFocus( bool refreshOnly ) // Restore the placeholder. if( message.isEmpty() ) { + personalMessageInput_->setToolTip( defaultTooltip ); personalMessageInput_->setText( defaultMessage ); } } +// Delay a bit updating the groups status +void KMessView::slotScheduleGroupUpdate() +{ +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Scheduling another groups update"; +#endif + updateTimer_.start( 250 ); +} + + + // Slot for searching contact void KMessView::slotSearchContact( const QString& searchFor ) { +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Search expression changed to:" << searchFor; +#endif + QString searchExpression; - const QString regexpMagic( "regexp:" ); + const QString& regexpMagic( "regexp:" ); // If the search string starts with "regexp:", allow searching with a regexp :) if( searchFor.startsWith( regexpMagic ) ) @@ -1586,7 +1733,8 @@ void KMessView::slotSearchContact( const QString& searchFor ) } else { - searchExpression = QRegExp::escape( searchFor ); + // Remove trailing spaces and other unneeded (invisible) characters, then escape the searchstring + searchExpression = QRegExp::escape( searchFor.simplified() ); searchEdit_->setStyleSheet( "" ); } @@ -1594,32 +1742,39 @@ void KMessView::slotSearchContact( const QString& searchFor ) // Show or hide groups which do or do not contain results - int rows = viewModel_->rowCount(); - for( int row = 0; row < rows; row++ ) + for( int row = viewModel_->rowCount() - 1; row >= 0; --row ) { - QModelIndex index( viewModel_->index( row, 0, QModelIndex() ) ); + const QModelIndex& index( viewModel_->index( row, 0, QModelIndex() ) ); // Skip invalid items if( ! index.isValid() ) { +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Skipping invalid index" << index; +#endif continue; } // Access the index's data - ModelDataList itemData = getItemData( index ); + const ModelDataList& itemData( getItemData( index ) ); // Skip items which have no children if( itemData.isEmpty() || itemData[ "type" ].toInt() != ContactListModelItem::ItemGroup ) { +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Skipping non-group index" << index; + kDebug() << "-- Index data:" << itemData; +#endif continue; } // Hide groups which don't contain results if( ! searchFor.isEmpty() ) { - bool isVisible = ( viewModel_->hasChildren( index ) ); - contactListView_->setRowHidden( row, QModelIndex(), ! isVisible ); - contactListView_->setExpanded( index, isVisible ); + bool isHidden = ( ! viewModel_->hasChildren( index ) ); + + contactListView_->setRowHidden( row, QModelIndex(), isHidden ); + contactListView_->setExpanded( index, true ); } // When the search terms are removed, enable back all groups else @@ -1636,7 +1791,7 @@ void KMessView::slotSearchContact( const QString& searchFor ) void KMessView::slotShowContactProfile() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was not empty if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) @@ -1644,7 +1799,8 @@ void KMessView::slotShowContactProfile() return; } - KMessShared::openProfile( itemData[ "handle" ].toString() ); + const QString& handle ( itemData[ "handle" ].toString() ); + KMessShared::openBrowser( KUrl( "http://members.msn.com/default.msnw?mem=" + handle + "&mkt=" + KGlobal::locale()->language() + "&pgmarket" ) ); } @@ -1653,7 +1809,7 @@ void KMessView::slotShowContactProfile() void KMessView::slotShowContactProperties() { // Get the data from the currently selected index - ModelDataList itemData = getItemData(); + const ModelDataList& itemData( getItemData() ); // The index was not empty if( itemData.isEmpty() || itemData[ "type" ] != ContactListModelItem::ItemContact ) @@ -1680,21 +1836,49 @@ void KMessView::slotShowContactProperties() } + // Update the users display pic void KMessView::slotUpdateDisplayPicture() { - QString image = ""; - - if( currentAccount_->getShowPicture() ) + // Adjust the picture size depending on the rest of the widgets: + // it should be small only when both now playing and new email info are off. + int size = 96; + if( ! currentAccount_->getShowNowListening() + && ( ! currentAccount_->getShowEmail() || ! currentAccount_->getEmailSupported() ) ) { - displayPicFrame_->show(); - image = currentAccount_->getPicturePath(); - currentAccountDisplayPic_->setPixmap( QPixmap( image ) ); + size = 64; } - else // The user does not want to show a display pic, so just show an icon for their sign in status + + currentAccountDisplayPic_->setFixedSize( size, size ); + + // The user does not want to show a display pic, so just show an icon for their sign in status + if( ! currentAccount_->getShowPicture() ) { displayPicFrame_->hide(); + return; } + + // Show the picture frame first + displayPicFrame_->show(); + + // The picture is unchanged, do nothing + const QString &pictureFileName( currentAccount_->getPicturePath() ); + if( displayPicFrame_->property( "PictureFileName" ) == pictureFileName ) + { +#ifdef KMESSDEBUG_KMESSVIEW + kDebug() << "No need to change the display picture"; +#endif + return; + } + +#ifdef KMESSDEBUG_KMESSVIEW + kDebug() << "Changing display picture to path:" << pictureFileName; +#endif + + // Change the picture + const QPixmap& image( pictureFileName ); + currentAccountDisplayPic_->setPixmap( image ); + displayPicFrame_->setProperty( "PictureFileName", pictureFileName ); } @@ -1721,18 +1905,31 @@ void KMessView::slotUpdateEmailDisplay() // Update the expanded status of the list groups void KMessView::slotUpdateGroups() { - int rows = viewModel_->rowCount(); + // When searching, the expanded status of the groups is altered, but the settings + // should not be applied to the actual groups + if( ! viewModel_->filterRegExp().isEmpty() ) + { + return; + } #ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY - kDebug() << "Updating groups expanded status for" << rows << "rows"; + kDebug() << "Updating groups expanded status for" << viewModel_->rowCount() << "rows"; #endif - for( int row = 0; row < rows; row++ ) + for( int row = viewModel_->rowCount() - 1; row >= 0; row-- ) { - QModelIndex index( viewModel_->index( row, 0, QModelIndex() ) ); + const QModelIndex& index( viewModel_->index( row, 0, QModelIndex() ) ); + +#ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY + kDebug() << "Current row:" << row << "of" << viewModel_->rowCount(); + kDebug() << "Index:" << index; + kDebug() << "Model has it?" << viewModel_->hasIndex( row, 0, QModelIndex() ); +#endif // Skip invalid items - if( ! index.isValid() ) + if( ! index.isValid() + || ! viewModel_->hasIndex( row, 0, QModelIndex() ) + || ! index.data().canConvert( QVariant::Map ) ) { #ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY kDebug() << "Skipping an invalid item at row" << row << ":" << index; @@ -1741,7 +1938,7 @@ void KMessView::slotUpdateGroups() } // Access the index's data - ModelDataList itemData = getItemData( index ); + const ModelDataList& itemData( index.data().toMap() ); // Skip items which have no children if( itemData.isEmpty() || itemData[ "type" ].toInt() != ContactListModelItem::ItemGroup ) @@ -1755,6 +1952,7 @@ void KMessView::slotUpdateGroups() // Set the expanded status contactListView_->setExpanded( index, itemData[ "isExpanded" ].toBool() ); + #ifdef KMESSDEBUG_KMESSVIEW_ITEM_VISIBILITY kDebug() << "Group" << itemData[ "name" ].toString() << "is" << ( itemData[ "isExpanded" ].toBool() ? "expanded" : "contracted" ); @@ -1767,8 +1965,9 @@ void KMessView::slotUpdateGroups() // Update the email count. void KMessView::slotUpdateNoEmails() { - QString message = i18np( "%1 new email message", "%1 new email messages", - currentAccount_->getNoEmails() ); + const QString& message( i18np( "%1 new email message", + "%1 new email messages", + currentAccount_->getNoEmails() ) ); // Update the label emailLabel_->setText( message ); @@ -1782,49 +1981,46 @@ void KMessView::slotUpdateNoEmails() // Update the user's status. void KMessView::slotUpdateUserStatus() { - QString friendlyName; - QString image; - Status status; - - FormattingMode mode = currentAccount_->getUseListFormatting() - ? STRING_FORMATTED : STRING_CLEANED; + const Status status( currentAccount_->getStatus() ); // Avoid newlines, which cause problems to the layout. - friendlyName = currentAccount_->getFriendlyName( mode ).replace( "\n", " " ); - - // Escape the friendly name if the mode is cleaned. - if( mode == STRING_CLEANED ) - { - friendlyName = Qt::escape( friendlyName ); - } - status = currentAccount_->getStatus(); + QString friendlyName( currentAccount_->getFriendlyName( STRING_LIST_SETTING_ESCAPED ).replace( '\n', ' ' ) ); #ifdef KMESSDEBUG_KMESSVIEW_GENERAL kDebug() << "Updating user status to " << MsnStatus::getName( status ); #endif // Update the widgets - statusButton_->setText( "(" + MsnStatus::getName( status ) + ")" ); + statusButton_->setText( '(' + MsnStatus::getName( status ) + ')' ); onlineStatusLabel_->setText( friendlyName ); onlineStatusPixmapLabel_->setPixmap( MsnStatus::getIcon( status ) ); } -// Update the way contact groups are displayed -void KMessView::slotUpdateViewMode() +// Update the contact list widgets +void KMessView::slotUpdateView() { - // Make the groups visible, contacts are already added to the - // online/offline groups to make this viewmode update - // easier and faster. (no need to move the contacts) - slotUpdateGroups(); + QString listStyle( "QTreeView::branch:has-siblings:adjoins-item { border-image: url(empty.png) 0; }\n" + "QTreeView::branch:!has-children:!has-siblings:adjoins-item { border-image: url(empty.png) 0; }\n" ); - // If there's a search in progress, refresh the search view to avoid strange results - if( ! searchEdit_->text().isEmpty() ) + // Set a background pixmap (but allow not to, by popular request) + if( currentAccount_->getShowContactListBird() ) { - slotSearchContact( searchEdit_->text() ); + listStyle += "QTreeView { background-attachment: fixed; " + "background-position: bottom right;" + "background-repeat: no-repeat;" + "background-image: url(" + + KIconLoader::global()->iconPath( "background", KIconLoader::User ) + + "); background-color: palette(alternate-base); }"; } + + contactListView_->setStyleSheet( listStyle ); + + // Using update() to refresh the widgets is suggested by Qt + update(); } + #include "kmessview.moc" diff --git a/src/kmessview.h b/src/kmessview.h index 3d32b49..02c5e25 100644 --- a/src/kmessview.h +++ b/src/kmessview.h @@ -20,10 +20,11 @@ #ifndef KMESSVIEW_H #define KMESSVIEW_H -#include "contact/contactlistmodelitem.h" +#include "model/contactlistmodelitem.h" #include "ui_kmessview.h" #include +#include #include #include @@ -70,8 +71,10 @@ class KMessView : public QWidget, private Ui::KMessView void changedSong( const QString &artist, const QString &album, const QString &track, bool playing ); // Initialize the class bool initialize( QAbstractItemModel *viewModel ); + // The "show history box" menu item has been toggled. + void toggleShowHistoryBox( bool show ); // The "show search in contact list" menu item has been toggled. - void toggleShowSearchFrame(bool show); + void toggleShowSearchFrame( bool show ); protected: // The personal status message received an event. @@ -79,28 +82,29 @@ class KMessView : public QWidget, private Ui::KMessView private: // Private methods // Get the specified item's or the current item's data - ModelDataList getItemData( const QModelIndex &index = QModelIndex() ); + const ModelDataList getItemData( const QModelIndex &index = QModelIndex() ); // Initialize the contact list view - bool initContactListView( QAbstractItemModel *viewModel ); + bool initContactListView( QAbstractItemModel *viewModel ); // Initialize the contact popup - bool initContactPopup(); + bool initContactPopup(); // Initialize the group popup - bool initGroupPopup(); + bool initGroupPopup(); + public slots: // Public slots + // Show the context menu + void showContextMenu( const QPoint &point ); private slots: // Private slots // Called when a contact is now online/offline void slotContactChangedStatus( Contact *contact, bool showNotify ); - // Show the context menu - void showContextMenu( const QPoint &point ); // Show the contact & group tool tip void showToolTip( const QPoint &point ); - // Send an e-mail to the current contact. + // The connection was closed, clean up before deletion + void slotDisconnected(); + // Send an email to the current contact. void slotEmailContact(); // The email label was clicked so open the user's preferred email url void slotEmailLabelClicked(); - // Personal Status changed - void slotForwardChangeStatus( QAction *action ); // A group was expanded or collapsed void slotGroupChanged( const QModelIndex &index ); // An item was clicked @@ -141,6 +145,8 @@ class KMessView : public QWidget, private Ui::KMessView void slotPersonalMessageLostFocus( bool refreshOnly = false ); // Generate the lists of actions for the "copy/move contact to group" menus void rebuildContactActions(); + // Delay a bit updating the groups status + void slotScheduleGroupUpdate(); // Slot for searching contact void slotSearchContact( const QString& searchFor ); // Display the profile of the current contact @@ -148,7 +154,7 @@ class KMessView : public QWidget, private Ui::KMessView // Display the properties of the current contact void slotShowContactProperties(); // Update the users display pic - void slotUpdateDisplayPicture(); + void slotUpdateDisplayPicture(); // Change whether the email label is displayed based on account settings. void slotUpdateEmailDisplay(); // Update the expanded status of the list groups @@ -157,8 +163,8 @@ class KMessView : public QWidget, private Ui::KMessView void slotUpdateNoEmails(); // Update the user's status. void slotUpdateUserStatus(); - // Update the way contact groups are displayed - void slotUpdateViewMode(); + // Update the contact list widgets + void slotUpdateView(); // Copy some details of the contact to the clipboard void copyText(); @@ -210,26 +216,11 @@ class KMessView : public QWidget, private Ui::KMessView QPixmap backgroundPixmap_; // Selection model used to access selected items in the list QItemSelectionModel *selectionModel_; + // Timed used to posticipate update events + QTimer updateTimer_; // Quick ref to the tree view's filter model ContactListModelFilter *viewModel_; - - - // Private class for tooltips - class ToolTip : public QToolTip - { - public: - ToolTip( KMessView *kmessView ); - virtual ~ToolTip(); - protected: - void maybeTip(const QPoint &p); - private: - KMessView *kmessView_; - }; - - // Reference to the current tooltip - ToolTip *toolTip_; - signals: // Request to add a contact void addContact(QString handle); @@ -239,8 +230,8 @@ class KMessView : public QWidget, private Ui::KMessView void blockContact(QString handle); // Request to change the personal message. void changePersonalMessage(QString personalMessage); - // Request to change the personal status - void changeStatus( int index ); + // Request to change the personal status (emitted from a popup menu) + void changeStatus( QAction *action ); // Request a private chat with a contact void requestChat( QString handle ); // Show the settings of the current account. @@ -257,6 +248,8 @@ class KMessView : public QWidget, private Ui::KMessView void removeGroup(QString groupId); // Request to rename a group. void renameGroup(QString groupId); + // Notify about a change in the selection within the contact list view + void selectionChanged( const QItemSelection &selection ); // Request to unblock a contact. void unblockContact(QString handle); }; diff --git a/src/kmessview.ui b/src/kmessview.ui index 53ece9f..d733f71 100644 --- a/src/kmessview.ui +++ b/src/kmessview.ui @@ -28,13 +28,6 @@ 2 - - - - Qt::Horizontal - - - @@ -202,15 +195,6 @@ false - - Enter your personal message here - - - false - - - - 256 @@ -391,7 +375,7 @@ - KSqueezedTextLabel + @@ -421,7 +405,7 @@ - QFrame::StyledPanel + QFrame::NoFrame QFrame::Raised @@ -470,6 +454,12 @@ + + true + + + QAbstractItemView::SingleSelection + QAbstractItemView::SelectRows @@ -479,6 +469,9 @@ false + + false + true diff --git a/src/contactlistviewdelegate.cpp b/src/kmessviewdelegate.cpp similarity index 71% rename from src/contactlistviewdelegate.cpp rename to src/kmessviewdelegate.cpp index bd440f9..88d8da0 100644 --- a/src/contactlistviewdelegate.cpp +++ b/src/kmessviewdelegate.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - contactlistviewdelegate.cpp - description + kmessviewdelegate.cpp - description ------------------- begin : Sat Feb 16 2008 copyright : (C) 2008 by Valerio Pilo @@ -15,12 +15,13 @@ * * ***************************************************************************/ -#include "contactlistviewdelegate.h" +#include "kmessviewdelegate.h" #include "currentaccount.h" #include "emoticonmanager.h" -#include "contact/contactlistmodelitem.h" #include "contact/msnstatus.h" +#include "contact/specialgroups.h" +#include "model/contactlistmodelitem.h" #include "utils/richtextparser.h" #include "kmessdebug.h" @@ -40,8 +41,8 @@ * * @param parent The parent object, usually a QTreeView */ -ContactListViewDelegate::ContactListViewDelegate( QWidget *parent ) - : QAbstractItemDelegate( parent ) +KMessViewDelegate::KMessViewDelegate( QWidget *parent ) + : QStyledItemDelegate( parent ) , iconLoader_( KIconLoader::global() ) { // Create test document @@ -49,6 +50,12 @@ ContactListViewDelegate::ContactListViewDelegate( QWidget *parent ) // Save the current account's reference currentAccount_ = CurrentAccount::instance(); + + fontBold_.setBold( true ); + + // Cache the icons for the various media types + mediaEmoticonMusic_ = EmoticonManager::instance()->getReplacement( "(8)", true ); + mediaEmoticonGaming_ = EmoticonManager::instance()->getReplacement( "(xx)", true ); } @@ -56,7 +63,7 @@ ContactListViewDelegate::ContactListViewDelegate( QWidget *parent ) /** * Destructor */ -ContactListViewDelegate::~ContactListViewDelegate() +KMessViewDelegate::~KMessViewDelegate() { delete textDocument_; } @@ -74,33 +81,27 @@ ContactListViewDelegate::~ContactListViewDelegate() * @param option Contains some details about the item we have to draw * @param index Points to the actual data to be represented */ -void ContactListViewDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const +void KMessViewDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const { - Flags statusFlags; - QString groupIconName; - QString text; - + QStyledItemDelegate::paint( painter, option, index ); // Only render column zero if( index.column() != 0 ) { return; } + QString text; + // Save the painter state to avoid messing up further painting operations with it painter->save(); // Reset coordinate translation in the painter (defaults are relative to the parent's window) - and make rendering prettier possibly - painter->translate( QPoint( 0, 0 ) ); - painter->setRenderHint( QPainter::Antialiasing, true ); - - // Paint the item as selected, that is with a colored background - if( option.state & QStyle::State_Selected ) - { - painter->fillRect( option.rect, option.palette.highlight() ); - } + painter->translate( 0, 0 ); + painter->setRenderHints( QPainter::Antialiasing | QPainter::SmoothPixmapTransform | + QPainter::TextAntialiasing , true ); // Read the actual data off the model index - ModelDataList itemData( index.data().toMap() ); + const ModelDataList& itemData( index.data().toMap() ); // Set the initial position where to paint. // Leave one pixel above, and one on the left, to help spacing. @@ -113,9 +114,12 @@ void ContactListViewDelegate::paint( QPainter *painter, const QStyleOptionViewIt { case ContactListModelItem::ItemGroup: { + QString groupIconName; + bool showOfflineContacts = currentAccount_->getShowOfflineContacts(); + // Only show the expansion arrow if there are contacts to show - if( ( currentAccount_->getShowOfflineContacts() && itemData[ "totalContacts" ].toInt() > 0 ) - || ( ! currentAccount_->getShowOfflineContacts() && itemData[ "onlineContacts" ].toInt() > 0 ) ) + if( ( showOfflineContacts && itemData[ "totalContacts" ].toInt() > 0 ) + || ( ! showOfflineContacts && itemData[ "onlineContacts" ].toInt() > 0 ) ) { groupIconName = ( itemData[ "isExpanded" ].toBool() ? "arrow-down" : "arrow-right" ); } @@ -126,9 +130,9 @@ void ContactListViewDelegate::paint( QPainter *painter, const QStyleOptionViewIt } // Get the contact's picture - QPixmap pixmap( KIconLoader::global()->loadIcon( groupIconName - , KIconLoader::NoGroup - , KIconLoader::SizeSmall ) ); + const QPixmap& pixmap( iconLoader_->loadIcon( groupIconName + , KIconLoader::NoGroup + , KIconLoader::SizeSmall ) ); painter->drawPixmap( position, pixmap ); @@ -137,14 +141,8 @@ void ContactListViewDelegate::paint( QPainter *painter, const QStyleOptionViewIt position.ry() += pixmap.height() -3; // Prepare and paint the group name - if( itemData[ "isSpecialGroup" ].toBool() ) - { - text = i18nc( "Group name in the contact list with total contacts of that group" - , "%1 (%2)" - , Qt::escape( itemData[ "name" ].toString() ) - , itemData[ "totalContacts" ].toString() ); - } - else + if( ! itemData[ "isSpecialGroup" ].toBool() + || itemData[ "id" ] == SpecialGroups::INDIVIDUALS ) { text = i18nc( "Group name in the contact list with online/total contacts of that group" , "%1 (%2/%3)" @@ -152,11 +150,16 @@ void ContactListViewDelegate::paint( QPainter *painter, const QStyleOptionViewIt , itemData[ "onlineContacts" ].toString() , itemData[ "totalContacts" ].toString() ); } + else + { + text = i18nc( "Group name in the contact list with total contacts of that group" + , "%1 (%2)" + , Qt::escape( itemData[ "name" ].toString() ) + , itemData[ "totalContacts" ].toString() ); + } // Set bold font - QFont font; - font.setBold( true ); - painter->setFont( font ); + painter->setFont( fontBold_ ); painter->drawText( position, text ); break; } @@ -169,12 +172,19 @@ void ContactListViewDelegate::paint( QPainter *painter, const QStyleOptionViewIt // Use this variable to store the position when we draw the icon status on bottom edge. QPoint oldPosition; + // If the contact hasn't us in its CL, colorize the line + if( ! itemData[ "isReverse" ].toBool() ) // The contact does not have us in its list + { + painter->fillRect( option.rect, QColor( 255,0,0,20 ) ); + } + // Only show the picture if it's been enabled by the user if( displayPictureSize != 0 ) { QPixmap pixmap( itemData[ "displayPicture" ].toString() ); + // Fast scaled pixmap = pixmap.scaled( displayPictureSize, displayPictureSize, - Qt::KeepAspectRatio, Qt::FastTransformation ); + Qt::KeepAspectRatio ); painter->drawPixmap( position, pixmap ); @@ -192,7 +202,7 @@ void ContactListViewDelegate::paint( QPainter *painter, const QStyleOptionViewIt } // Determine which status image to load - statusFlags = FlagNone; + Flags statusFlags = FlagNone; if( itemData[ "isBlocked" ].toBool() ) { statusFlags = FlagBlocked; @@ -213,62 +223,73 @@ void ContactListViewDelegate::paint( QPainter *painter, const QStyleOptionViewIt // Get the contact information. QString friendlyName, personalMessage; - QString mediaType = itemData[ "mediaType" ].toString(); - QString mediaString = itemData[ "mediaString" ].toString(); // Parse the name and message of the contact, adding emoticons and formatting if( currentAccount_->getUseListFormatting() ) { - friendlyName = itemData[ "friendlyFormatted" ].toString(); + if( ! currentAccount_->getShowContactEmail() ) + { + friendlyName = itemData[ "friendlyFormatted" ].toString(); + } + else + { + friendlyName = itemData[ "handle" ].toString(); + } + personalMessage = itemData[ "personalMessageFormatted" ].toString(); } else { - friendlyName = Qt::escape( itemData[ "friendly" ].toString() ); - personalMessage = Qt::escape( itemData[ "personalMessage" ].toString() ); + if( ! currentAccount_->getShowContactEmail() ) + { + friendlyName = itemData[ "friendly" ].toString(); + RichTextParser::parseMsnString( friendlyName, true, true, false, false ); + } + else + { + friendlyName = itemData[ "handle" ].toString(); + } + + // Display the emoticons alone when MSN Plus formatting is disabled: the formatted + // version has emoticons already. + personalMessage = itemData[ "personalMessage" ].toString(); + RichTextParser::parseMsnString( personalMessage, true, true, false, false ); + } + + // If it's empty, then the user wants to see the email in the contact list + if( friendlyName.isEmpty() ) + { + friendlyName = itemData[ "handle" ].toString(); } QString messageString; + const QString& mediaString( itemData[ "mediaString" ].toString() ); if( ! mediaString.isEmpty() ) { // Determine icon for the various media types - QString mediaEmoticon; + const QString& mediaType ( itemData[ "mediaType" ].toString() ); if( mediaType == "Music" ) { - mediaEmoticon = "(8)"; + messageString = mediaEmoticonMusic_ + "" + Qt::escape( mediaString ) + ""; } else if( mediaType == "Gaming" ) { - mediaEmoticon = "(xx)"; + messageString = mediaEmoticonGaming_ + "" + Qt::escape( mediaString ) + ""; } - - // Set the icon if it's found in the emoticon theme. - if( ! mediaEmoticon.isEmpty() ) - { - mediaEmoticon = EmoticonManager::instance()->getReplacement( mediaEmoticon, true ); - } - - messageString = mediaEmoticon + Qt::escape( mediaString ); } else if( ! personalMessage.isEmpty() ) // When there's no media, show the PM { messageString = "" + personalMessage + ""; } - // Fix HTML entities in the friendly name - if( ! itemData[ "isReverse" ].toBool() ) // The contact does not have us in its list - { - friendlyName = "" + friendlyName + ""; - } - // Draw the text widget if( messageString.isEmpty() ) { // Only person name text = friendlyName; } - else if( ! currentAccount_->getListPictureSize() ) + else if( ! displayPictureSize ) { // Person with message after it text = friendlyName + " - " + messageString + ""; @@ -305,14 +326,14 @@ void ContactListViewDelegate::paint( QPainter *painter, const QStyleOptionViewIt * @param index Points to the actual list item * @return The ize for the given index */ -QSize ContactListViewDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const +QSize KMessViewDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const { Q_UNUSED( option ); // Read the actual data off the model index - ModelDataList itemData( index.data().toMap() ); + const ModelDataList& itemData( index.data().toMap() ); - QSize size( KIconLoader::SizeSmall + 2, KIconLoader::SizeSmall + 4 ); + const QSize size( KIconLoader::SizeSmall + 2, KIconLoader::SizeSmall + 4 ); if( itemData.isEmpty() ) { diff --git a/src/contactlistviewdelegate.h b/src/kmessviewdelegate.h similarity index 61% rename from src/contactlistviewdelegate.h rename to src/kmessviewdelegate.h index 04d6629..b962612 100644 --- a/src/contactlistviewdelegate.h +++ b/src/kmessviewdelegate.h @@ -1,5 +1,5 @@ /*************************************************************************** - contactlistviewdelegate.h - description + kmessviewdelegate.h - description ------------------- begin : Sat Feb 16 2008 copyright : (C) 2008 by Valerio Pilo @@ -15,16 +15,18 @@ * * ***************************************************************************/ -#ifndef CONTACTLISTVIEWDELEGATE_H -#define CONTACTLISTVIEWDELEGATE_H +#ifndef KMESSVIEWDELEGATE_H +#define KMESSVIEWDELEGATE_H -#include +#include // Forward declarations class CurrentAccount; class KIconLoader; class QTextDocument; +class QFont; + /** @@ -37,26 +39,40 @@ class QTextDocument; * @author Valerio Pilo * @ingroup Root */ -class ContactListViewDelegate : public QAbstractItemDelegate +class KMessViewDelegate : public QStyledItemDelegate { public: + // Constructor - ContactListViewDelegate( QWidget *parent = 0 ); + KMessViewDelegate( QWidget *parent = 0 ); // Destructor - ~ContactListViewDelegate(); + ~KMessViewDelegate(); + + + public: // Public methods // Paint an item of the contact list - void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const; + void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const; // Return an hint about the size of an item - QSize sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const; + QSize sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const; + + + private: // Private properties - private: // Private properties // Reference to the current account's properties CurrentAccount *currentAccount_; - // Icon loader to make paint a bit faster - KIconLoader *iconLoader_; - // Text Document for rich text - QTextDocument *textDocument_; + // Bold font + QFont fontBold_; + // Icon loader to make painting a bit faster + KIconLoader *iconLoader_; + // Cached emoticon replacement for the now listening icon + QString mediaEmoticonMusic_; + // Cached emoticon replacement for the now playing icon + QString mediaEmoticonGaming_; + // Text Document for rich text painting + QTextDocument *textDocument_; }; + + #endif diff --git a/src/main.cpp b/src/main.cpp index 28c90d5..2d2288c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,17 +25,6 @@ #include -/** - * @brief Define to ignore translations - * - * This define is used for contributors names, which should never be translated. - * Without a known i18n call, the script will avoid to extract the names. - * This is all required since the contributors names are given as parameters to a method which requires - * KLocalizedString objects. - */ -#define IGNORE_I18N ki18n - - /** * @brief Main starting point of KMess. @@ -54,103 +43,126 @@ int main(int argc, char *argv[]) KMESS_VERSION, // app version from config-kmess.h ki18n("A MSN Messenger client for KDE"), // short description KAboutData::License_GPL, // license - IGNORE_I18N("(c) 2002-2008, Mike K. Bennett\n" // copyright - "(c) 2005-2008, Diederik van der Boor\n" - "(c) 2007-2008, Valerio Pilo\n" - "(c) 2008, Antonio Nastasi\n"), + ki18n("(c) 2002-2008, Mike K. Bennett\n" // copyright + "(c) 2005-2008, Diederik van der Boor\n" + "(c) 2007-2008, Valerio Pilo\n" + "(c) 2008, Antonio Nastasi\n" + "(c) 2008, Ruben Vandamme\n"), KLocalizedString(), "http://www.kmess.org/", // home page "bugs" "@" "kmess" "." "org" // address for bugs ); - // Note all e-mail addresses are written in an anti-spam style. + // Note all email addresses are written in an anti-spam style. // Tab 2: Authors // TODO: escape the special characters to some Unicode format. (how?) - aboutData.addAuthor( IGNORE_I18N("Mike K. Bennett"), ki18n("Developer and project founder"), "mkb137" "@" "users.sourceforge" "." "net" ); - aboutData.addAuthor( IGNORE_I18N("Michael Curtis"), ki18n("Developer"), "mdcurtis" "@" "users.sourceforge" "." "net" ); - aboutData.addAuthor( IGNORE_I18N("Jan Tönjes"), ki18n("Project support"), "jan" "@" "kmess" "." "org" ); - aboutData.addAuthor( IGNORE_I18N("Diederik van der Boor"), ki18n("Current developer"), "diederik" "@" "kmess" "." "org" ); - aboutData.addAuthor( IGNORE_I18N("Valerio Pilo"), ki18n("Current developer"), "amroth" "@" "kmess" "." "org" ); - aboutData.addAuthor( IGNORE_I18N("Antonio Nastasi"), ki18n("Current developer"), "sifcenter" "@" "gmail" "." "com" ); + aboutData.addAuthor( ki18n("Mike K. Bennett"), ki18n("Developer and project founder"), "mkb137" "@" "users.sourceforge" "." "net" ); + aboutData.addAuthor( ki18n("Michael Curtis"), ki18n("Developer"), "mdcurtis" "@" "users.sourceforge" "." "net" ); + aboutData.addAuthor( ki18n("Jan Tönjes"), ki18n("Project support"), "jan" "@" "kmess" "." "org" ); + aboutData.addAuthor( ki18n("Diederik van der Boor"), ki18n("Current developer"), "diederik" "@" "kmess" "." "org" ); + aboutData.addAuthor( ki18n("Valerio Pilo"), ki18n("Current developer"), "amroth" "@" "kmess" "." "org" ); + aboutData.addAuthor( ki18n("Antonio Nastasi"), ki18n("Current developer"), "sifcenter" "@" "gmail" "." "com" ); + aboutData.addAuthor( ki18n("Ruben Vandamme"), ki18n("Current developer"), "vandammeru" "@" "gmail" "." "com" ); // Tab 3: Credits - aboutData.addCredit( IGNORE_I18N("Jan Tönjes"), ki18n("German translation, testing, documentation, web master, project management, etc..."), "jan" "." "toenjes" "@" "web" "." "de"); - aboutData.addCredit( IGNORE_I18N("Dane Harnett"), ki18n("Web design"), "dynamitedane" "@" "hotmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("David Vignoni"), ki18n("The main and yellow/blue/violet emoticon sets and Italian translation"), "dvgn" "@" "libero" "." "it"); - aboutData.addCredit( IGNORE_I18N("Julien Joubin"), ki18n("Cartoon emoticons"), "jujubinche" "@" "netscape" "." "net"); - aboutData.addCredit( IGNORE_I18N("Christian Müller"), ki18n("Default sound theme"), "cmue81" "@" "gmx" "." "de"); - aboutData.addCredit( IGNORE_I18N("Michael Anderton"), ki18n("KMess icon in Oxygen style"), "mike" "." "s" "." "anderton" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Jan Tönjes"), ki18n("German translation, testing, documentation, web master, project management, etc..."), "jan" "." "toenjes" "@" "web" "." "de"); + aboutData.addCredit( ki18n("Dane Harnett"), ki18n("Web design"), "dynamitedane" "@" "hotmail" "." "com"); + aboutData.addCredit( ki18n("David Vignoni"), ki18n("Main and yellow/blue/violet emoticon sets, Italian translation"), "dvgn" "@" "libero" "." "it"); + aboutData.addCredit( ki18n("Julien Joubin"), ki18n("Cartoon emoticons"), "jujubinche" "@" "netscape" "." "net"); + aboutData.addCredit( ki18n("Christian Müller"), ki18n("Default sound theme"), "cmue81" "@" "gmx" "." "de"); + aboutData.addCredit( ki18n("Michael Anderton"), ki18n("KMess icon in Oxygen style"), "mike" "." "s" "." "anderton" "@" "gmail" "." "com"); // Translations // Sorted by Alphabetic order of language. - aboutData.addCredit( IGNORE_I18N("Mohamed Aser"), ki18n("Arabic translation, internationalization of file saving fix" "." ""), "mohasr" "@" "link" "." "net"); - aboutData.addCredit( IGNORE_I18N("Youssef Chahibi"), ki18n("More Arabic translation"), "chahibi" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Mauricio Rother"), ki18n("Brazilian Portuguese translation"), "mauricio" "@" "digicomm" "." "com.br"); - aboutData.addCredit( IGNORE_I18N("Jaume Cornadó"), ki18n("Catalan translation"), "jaumec" "@" "lleida" "." "net"); + aboutData.addCredit( ki18n("Panagiotis Papadopoulos"), ki18n("Translations Maintainer"), "pano_90" "@" "gmx" "." "net"); + aboutData.addCredit( ki18n("Mohamed Aser"), ki18n("Arabic translation, internationalization of file saving fix" "." ""), "mohasr" "@" "link" "." "net"); + aboutData.addCredit( ki18n("Youssef Chahibi"), ki18n("More Arabic translation"), "chahibi" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Mauricio Rother"), ki18n("Brazilian Portuguese translation"), "mauricio" "@" "digicomm" "." "com.br"); + aboutData.addCredit( ki18n("Leonel Freire"), ki18n("More Brazilian Portuguese translation"), "leonelfreire" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Maurício Arozi Moraes"), ki18n("More Brazilian Portuguese translation")); + aboutData.addCredit( ki18n("Jaume Cornadó"), ki18n("Catalan translation"), "jaumec" "@" "lleida" "." "net"); - aboutData.addCredit( IGNORE_I18N("Lin Haoxiang"), ki18n("Simplified Chinese translation, file send bug fix, proxy connect code"), "linhaoxiang" "@" "hotmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Liu Sizhuang"), ki18n("More Simplified Chinese translation"), "chinatslsz" "@" "hotmail.com"); - aboutData.addCredit( IGNORE_I18N("Yen-chou Chen"), ki18n("Traditional Chinese translation"), "yenchou" "." "mse90" "@" "nctu" "." "edu" "." "tw"); + aboutData.addCredit( ki18n("Lin Haoxiang"), ki18n("Simplified Chinese translation, file send bug fix, proxy connect code"), "linhaoxiang" "@" "hotmail" "." "com"); + aboutData.addCredit( ki18n("Liu Sizhuang"), ki18n("More Simplified Chinese translation"), "chinatslsz" "@" "hotmail.com"); + aboutData.addCredit( ki18n("Cheng Yang"), ki18n("More Simplified Chinese translation"), "yangzju" "@" "gmail.com"); + aboutData.addCredit( ki18n("Yen-chou Chen"), ki18n("Traditional Chinese translation"), "yenchou" "." "mse90" "@" "nctu" "." "edu" "." "tw"); + aboutData.addCredit( ki18n("Tryneeds-Chinese"), ki18n("More Traditional Chinese translation"), "tryneeds@gmail.com"); - aboutData.addCredit( IGNORE_I18N("Lars Sommer"), ki18n("Danish translation"), "admin" "@" "lasg" "." "dk"); - aboutData.addCredit( IGNORE_I18N("Pascal d'Hermilly"), ki18n("More Danish translation"), "pascal" "@" "tipisoft" "." "dk"); - aboutData.addCredit( IGNORE_I18N("Arend van Beelen Jr."), ki18n("Dutch translation"), "arend" "@" "auton" "." "nl"); - aboutData.addCredit( IGNORE_I18N("Diederik van der Boor"), ki18n("More Dutch translation"), "diederik" "@" "kmess" "." "org"); - aboutData.addCredit( IGNORE_I18N("Jaap Woldringh"), ki18n("More Dutch translation"), "jjh" "." "woldringh" "@" "planet" "." "nl"); + aboutData.addCredit( ki18n("Lars Sommer"), ki18n("Danish translation"), "admin" "@" "lasg" "." "dk"); + aboutData.addCredit( ki18n("Pascal d'Hermilly"), ki18n("More Danish translation"), "pascal" "@" "tipisoft" "." "dk"); + aboutData.addCredit( ki18n("Arend van Beelen Jr."), ki18n("Dutch translation"), "arend" "@" "auton" "." "nl"); + aboutData.addCredit( ki18n("Diederik van der Boor"), ki18n("More Dutch translation"), "diederik" "@" "kmess" "." "org"); + aboutData.addCredit( ki18n("Jaap Woldringh"), ki18n("More Dutch translation"), "jjh" "." "woldringh" "@" "planet" "." "nl"); + aboutData.addCredit( ki18n("Elve"), ki18n("More Dutch translation"), "elve" "@" "savage-elve" "." "net"); + aboutData.addCredit( ki18n("Sander Pientka"), ki18n("More Dutch translation"), "cumulus0007" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Jyri Toomessoo"), ki18n("Estonian translation"), "nuubik" "@" "hotmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Markus Vuori"), ki18n("Finnish translation"), "markus" "@" "vuoret" "." "net"); - aboutData.addCredit( IGNORE_I18N("Joonas Niilola"), ki18n("More Finnish translation"), "juippis" "@" "roskakori" "." "org"); - aboutData.addCredit( IGNORE_I18N("Jussi Timperi"), ki18n("More Finnish translation"), "jussi.timperi" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Panagiotis Papadopoulos"), ki18n("More German translation, Greek translation"), "pano_90" "@" "gmx" "." "net"); + aboutData.addCredit( ki18n("Dimitrios Glentadakis"), ki18n("More Greek translation"), "dglent" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Choplair"), ki18n("French translation"), "pachilor" "@" "yahoo" "." "co" "." "jp"); - aboutData.addCredit( IGNORE_I18N("Vincent Fretin"), ki18n("More French translation, MSN6 emoticon definitions"), "fretinvincent" "@" "hotmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Andrea Blankenstijn"), ki18n("More French translation"), "darkan9el" "@" "gmail" "." "com" ); // or "andrea" "@" "zenephiris" "." "ch" + aboutData.addCredit( ki18n("Jyri Toomessoo"), ki18n("Estonian translation"), "nuubik" "@" "hotmail" "." "com"); + aboutData.addCredit( ki18n("Markus Vuori"), ki18n("Finnish translation"), "markus" "@" "vuoret" "." "net"); + aboutData.addCredit( ki18n("Joonas Niilola"), ki18n("More Finnish translation"), "juippis" "@" "roskakori" "." "org"); + aboutData.addCredit( ki18n("Jussi Timperi"), ki18n("More Finnish translation"), "jussi.timperi" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Páder Rezsõ"), ki18n("Hungarian translation"), "rezso" "@" "rezso" "." "net"); - aboutData.addCredit( IGNORE_I18N("Valerio Pilo"), ki18n("More Italian translation"), "amroth" "@" "coldshock" "." "net"); - aboutData.addCredit( IGNORE_I18N("Vincenzo Reale"), ki18n("More Italian translation"), "smart2128" "@" "baslug" "." "org"); - aboutData.addCredit( IGNORE_I18N("Park Dong Cheon"), ki18n("Korean translation"), "pdc" "@" "kaist" "." "ac.kr"); - aboutData.addCredit( IGNORE_I18N("Øyvind Sæther"), ki18n("Norsk Bokmål translation"), "oyvind" "@" "sather" "." "tk"); + aboutData.addCredit( ki18n("Choplair"), ki18n("French translation"), "pachilor" "@" "yahoo" "." "co" "." "jp"); + aboutData.addCredit( ki18n("Vincent Fretin"), ki18n("More French translation, MSN6 emoticon definitions"), "fretinvincent" "@" "hotmail" "." "com"); + aboutData.addCredit( ki18n("Andrea Blankenstijn"), ki18n("More French translation"), "darkan9el" "@" "gmail" "." "com" ); // or "andrea" "@" "zenephiris" "." "ch" + aboutData.addCredit( ki18n("Barthe Guillaume"), ki18n("More French translation"), "gu_barthe" "@" "yahoo" "." "fr" ); - aboutData.addCredit( IGNORE_I18N("Matjaž kaše"), ki18n("Slovenian translation"), "matjaz" "." "kase" "@" "g-kabel" "." "si"); - aboutData.addCredit( IGNORE_I18N("Johanna Gersch"), ki18n("Spanish translation")); - aboutData.addCredit( IGNORE_I18N("J.C.A. Javi"), ki18n("More Spanish translation"), "yovoya30ks" "@" "hotmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Alejandro Araiza Alvarado"), ki18n("More Spanish translation"), "mebrelith" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Jaume Corbí"), ki18n("More Spanish translation"), "jaume4" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Christian Kaiser"), ki18n("More Spanish translation"), "k39" "@" "users" "." "sourceforge" "." "net"); - aboutData.addCredit( IGNORE_I18N("Christian Lundgren"), ki18n("Swedish translation"), "zeflunk" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Páder Rezső"), ki18n("Hungarian translation"), "rezso" "@" "rezso" "." "net"); + aboutData.addCredit( ki18n("Pauli Henrik"), ki18n("More Hungarian translation"), "henrik.pauli" "@" "drangolin" "." "net"); + aboutData.addCredit( ki18n("Valerio Pilo"), ki18n("More Italian translation"), "valerio" "@" "kmess" "." "org"); + aboutData.addCredit( ki18n("Vincenzo Reale"), ki18n("More Italian translation"), "smart2128" "@" "baslug" "." "org"); + aboutData.addCredit( ki18n("Park Dong Cheon"), ki18n("Korean translation"), "pdc" "@" "kaist" "." "ac.kr"); + aboutData.addCredit( ki18n("Øyvind Sæther"), ki18n("Norsk Bokmål translation"), "oyvind" "@" "sather" "." "tk"); - aboutData.addCredit( IGNORE_I18N("Rachan Hongpairote"), ki18n("Thai translation"), "rachanh" "@" "yahoo" "." "com"); - aboutData.addCredit( IGNORE_I18N("Gorkem Cetin"), ki18n("Turkish translation"), "gorkem" "@" "gelecek" "." "com" "." "tr"); - aboutData.addCredit( IGNORE_I18N("Barbaros Ulutas"), ki18n("More Turkish translation"), "ulutas" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Uğur Çetin"), ki18n("More Turkish translation"), "ugur" "." "jnmbk" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Zoran Milovanović"), ki18n("Serbian translation"), "provalisam" "@" "gmail" "." "com"); + + aboutData.addCredit( ki18n("Rastislav Krupanský"), ki18n("Slovak translation"), "ra100" "@" "atlas" "." "sk"); + aboutData.addCredit( ki18n("Matjaž kaše"), ki18n("Slovenian translation"), "matjaz" "." "kase" "@" "g-kabel" "." "si"); + aboutData.addCredit( ki18n("Johanna Gersch"), ki18n("Spanish translation")); + aboutData.addCredit( ki18n("J.C.A. Javi"), ki18n("More Spanish translation"), "yovoya30ks" "@" "hotmail" "." "com"); + aboutData.addCredit( ki18n("Alejandro Araiza Alvarado"), ki18n("More Spanish translation"), "mebrelith" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Jaume Corbí"), ki18n("More Spanish translation"), "jaume4" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Christian Kaiser"), ki18n("More Spanish translation"), "k39" "@" "users" "." "sourceforge" "." "net"); + aboutData.addCredit( ki18n("Juan Pablo González Tognarelli"), ki18n("More Spanish translation"), "jotapesan" "@" "gmail" "." "com" ); + aboutData.addCredit( ki18n("Alexis Daniel Medina Medina"), ki18n("More Spanish translation"), "alexismedina" "@" "gmail" "." "com"); + + aboutData.addCredit( ki18n("Christian Lundgren"), ki18n("Swedish translation"), "zeflunk" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Mattias Newzella"), ki18n("More Swedish translation"), "newzella" "@" "gmail" "." "com"); + + aboutData.addCredit( ki18n("Rachan Hongpairote"), ki18n("Thai translation"), "rachanh" "@" "yahoo" "." "com"); + aboutData.addCredit( ki18n("Gorkem Cetin"), ki18n("Turkish translation"), "gorkem" "@" "gelecek" "." "com" "." "tr"); + aboutData.addCredit( ki18n("Barbaros Ulutas"), ki18n("More Turkish translation"), "ulutas" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Uğur Çetin"), ki18n("More Turkish translation"), "ugur" "." "jnmbk" "@" "gmail" "." "com"); // Other contributors - aboutData.addCredit( IGNORE_I18N("Richard Conway"), ki18n("MSNP12 support, various patches."), "richardconway" "@" "users" "." "sourceforge.net"); - aboutData.addCredit( IGNORE_I18N("Guido Solinas"), ki18n("Pictures in contact list code, contact client info, chat font zoom"), "whereismwhite" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Pedro Ferreira"), ki18n("File transfer thumbnails"), "pedro." "ferreira" "@" "fe" "." "up.pt"); - aboutData.addCredit( IGNORE_I18N("Liu Sizhuang"), ki18n("P4-Context field support"), "chinatslsz" "@" "hotmail.com"); - aboutData.addCredit( IGNORE_I18N("Scott Morgan"), ki18n("Xinerama fixes"), "blumf" "@" "blumf" "." "freeserve" "." "co" "." "uk"); - aboutData.addCredit( IGNORE_I18N("Laurence Anderson"), ki18n("Original file receive code"), "l.d" "." "anderson" "@" "warwick" ".ac.uk"); - aboutData.addCredit( IGNORE_I18N("Ruben Vandamme"), ki18n("Basic DBus support,tab closing message,menu hiding shortcut,toolbars lock"), "vandammeru" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Matteo Nardi"), ki18n("KWallet support"), "91.matteo" "@" "gmail" "." "com"); - aboutData.addCredit( IGNORE_I18N("Adam Goossens"), ki18n("Notifications blocking option,winks disabling option,last message date feature"), "fontknocker" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Richard Conway"), ki18n("MSNP12 support, various patches"), "richardconway" "@" "users" "." "sourceforge.net"); + aboutData.addCredit( ki18n("Guido Solinas"), ki18n("Pictures in contact list code, contact client info, chat font zoom"), "whereismwhite" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Pedro Ferreira"), ki18n("File transfer thumbnails"), "pedro." "ferreira" "@" "fe" "." "up.pt"); + aboutData.addCredit( ki18n("Liu Sizhuang"), ki18n("P4-Context field support"), "chinatslsz" "@" "hotmail.com"); + aboutData.addCredit( ki18n("Scott Morgan"), ki18n("Xinerama fixes"), "blumf" "@" "blumf" "." "freeserve" "." "co" "." "uk"); + aboutData.addCredit( ki18n("Laurence Anderson"), ki18n("Original file receive code"), "l.d" "." "anderson" "@" "warwick" ".ac.uk"); + aboutData.addCredit( ki18n("Matteo Nardi"), ki18n("KWallet support"), "91.matteo" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Adam Goossens"), ki18n("Notifications blocking option, winks disabling option, last message date feature"), "fontknocker" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Sjors Gielen"), ki18n("IRC-like commands in the chat window"), "dazjorz" "@" "dazjorz" "." "com"); + aboutData.addCredit( ki18n("Andrea Decorte"), ki18n("Group selection in 'contact added user' dialog"), "adecorte" "@" "gmail" "." "com"); + aboutData.addCredit( ki18n("Dario Freddi"), ki18n("Chat history dialog"), "drf_av" "@" "users" "." "sourceforge" "." "net"); // Lin Haoxiang (file send bug fix, proxy connect code) already above // Mohamed Aser (internationalization of file saving fix) already above - aboutData.addCredit( IGNORE_I18N("Alexandre Peixoto Ferreira"), ki18n("Various internationalization fixes"), "alexandref" "@" "o2" ".net" ".br"); - aboutData.addCredit( IGNORE_I18N("Choe Hwanjin"), ki18n("Various internationalization fixes" "." ""), "hjchoe" "@" "hancom" "." "com"); + aboutData.addCredit( ki18n("Alexandre Peixoto Ferreira"), ki18n("Various internationalization fixes"), "alexandref" "@" "o2" ".net" ".br"); + aboutData.addCredit( ki18n("Choe Hwanjin"), ki18n("Various internationalization fixes" "." ""), "hjchoe" "@" "hancom" "." "com"); // Vincent Fretin (MSN6 emoticon definitions) already above - aboutData.addCredit( IGNORE_I18N("Damien Sandras"), ki18n("GnomeMeeting developer"), "dsandras" "@" "seconix" "." "com"); - aboutData.addCredit( IGNORE_I18N("Tobias Tönjes"), ki18n("Guy with a bag over his head"), ""); + aboutData.addCredit( ki18n("Damien Sandras"), ki18n("GnomeMeeting developer"), "dsandras" "@" "seconix" "." "com"); + aboutData.addCredit( ki18n("Tobias Tönjes"), ki18n("Guy with a bag over his head"), ""); // Other apps - aboutData.addCredit( IGNORE_I18N("KMerlin (kmerlin.olsd.de)"), ki18n("Inspiration and assorted code")); - aboutData.addCredit( IGNORE_I18N("Kopete (kopete.kde.org)"), ki18n("Old popup balloons code, initial p2p code, msn challenge handler")); - aboutData.addCredit( IGNORE_I18N("KScreensaver"), ki18n("Idle timer code")); - aboutData.addCredit( IGNORE_I18N("BasKet"), ki18n("Close-to-tray icon screenshot code")); - aboutData.addCredit( IGNORE_I18N("Amarok"), ki18n("Custom crash handler implementation")); + aboutData.addCredit( ki18n("KMerlin (kmerlin.olsd.de)"), ki18n("Inspiration and assorted code")); + aboutData.addCredit( ki18n("Kopete (kopete.kde.org)"), ki18n("Old popup balloons code, initial p2p code, msn challenge handler")); + aboutData.addCredit( ki18n("KScreensaver"), ki18n("Idle timer code")); + aboutData.addCredit( ki18n("BasKet"), ki18n("Close-to-tray icon screenshot code")); + aboutData.addCredit( ki18n("Amarok"), ki18n("Custom crash handler implementation")); // Nice community detail (very subtle at the bottom..) aboutData.addCredit( ki18n("Your name here?"), ki18n("You are welcome to send bugfixes and patches to the KMess help forums!\nIf you feel your name is missing here, please contact us too!"), "you@kmess.org"); @@ -163,6 +175,7 @@ int main(int argc, char *argv[]) // Configure command line options // Those are handled in KMessApplication. KCmdLineOptions options; + options.add( "hidden", ki18n("Do not show the Contact List window initially") ); options.add( "autologin ", ki18n("Autologin with the given email address") ); // For the developer build, @@ -186,5 +199,6 @@ int main(int argc, char *argv[]) // Create the KApplication object // and start the event loop KMessApplication kmessApp; + return kmessApp.exec(); } diff --git a/src/contact/contactlist.cpp b/src/model/contactlist.cpp similarity index 56% rename from src/contact/contactlist.cpp rename to src/model/contactlist.cpp index 44cff88..dc9093c 100644 --- a/src/contact/contactlist.cpp +++ b/src/model/contactlist.cpp @@ -18,16 +18,17 @@ #include "contactlist.h" +#include "../contact/contact.h" +#include "../contact/contactextension.h" +#include "../contact/group.h" #include "../contact/msnobject.h" -#include "../network/specialgroups.h" +#include "../contact/specialgroups.h" #include "../utils/kmessconfig.h" #include "../currentaccount.h" #include "../kmessdebug.h" -#include "contact.h" -#include "contactextension.h" -#include "group.h" #include +#include #include @@ -51,6 +52,10 @@ ContactList::ContactList() // The destructor ContactList::~ContactList() { +#ifdef KMESSDEBUG_CONTACTLIST_GENERAL + kDebug() << "DESTROYING..."; +#endif + // Destroy the list's contents, without regenerating the special groups and the model reset( false ); @@ -71,30 +76,38 @@ Contact * ContactList::addContact( QString handle, QString friendlyName, int lis #ifdef KMESSDEBUG_CONTACTLIST_GENERAL kDebug() << "Adding to list contact" << handle << " in groups" << groupIds; #endif + #ifdef KMESSTEST KMESS_ASSERT( ! handle.isEmpty() ); #endif - // More consistency checks - if(getContactByHandle(handle) != 0) + if( handle.isEmpty() ) { - kWarning() << "attempted to add contact " << handle << " twice."; return 0; } - if(handle.isEmpty()) + // More consistency checks + // TODO we could return the Contact* founded ?! + if( getContactByHandle( handle ) != 0 ) { + kWarning() << "attempted to add contact " << handle << " twice."; return 0; } // Create the contact Contact *contact = new Contact( handle, friendlyName, lists, groupIds, guid ); - contacts_[ handle ] = contact; + contacts_.insert( handle, contact ); // Add the contact to the special groups if( contact->isFriend() ) { + // Add contacts without group to the Individuals group + if( groupIds.isEmpty() ) + { + groupIds << SpecialGroups::INDIVIDUALS; + } + // Initially, all friends are Offline (we receive the status for connected ones later) groupIds << SpecialGroups::OFFLINE; } @@ -110,35 +123,23 @@ Contact * ContactList::addContact( QString handle, QString friendlyName, int lis } } - // Update the model + emit layoutAboutToBeChanged(); + // Add it to the nodes it belongs to - foreach( QString id, groupIds ) + foreach( const QString &id, groupIds ) { - ContactListModelItem *group = rootNode_->childGroup( id ); - if( ! group ) + ContactListModelItem *groupNode = rootNode_->childGroup( id ); + if( ! groupNode ) { kWarning() << "Contact's group" << id << "doesn't exist!"; continue; } - int row = group->childCount(); - - beginInsertRows( index( group->row(), 0, QModelIndex() ), row, row ); - new ContactListModelItem( contact, group ); - endInsertRows(); - } - - // If the contact hasn't been added to any node - other than the Offline or Online one - add it to the root node - if( contact->isFriend() && groupIds.count() == 1 ) - { - int row = rootNode_->childCount(); - - beginInsertRows( QModelIndex(), row, row ); - new ContactListModelItem( contact, rootNode_ ); - endInsertRows(); + new ContactListModelItem( contact, groupNode ); } + emit layoutChanged(); // Attach the signals connect( contact, SIGNAL( changedMsnObject(Contact*) ), // Contact changed msnobject @@ -152,13 +153,16 @@ Contact * ContactList::addContact( QString handle, QString friendlyName, int lis connect( contact, SIGNAL( changedList(Contact*) ), // Contact was added/removed from certain lists this, SLOT ( slotContactMoved(Contact*) )); + // Notify the addition to any listener + emit contactAdded( contact ); + return contact; } // Add a group to the contact list -Group * ContactList::addGroup( QString groupId, QString groupName ) +Group* ContactList::addGroup( QString groupId, QString groupName ) { // Ignore call if we are closing... // TODO: prevent this issue from happening in the first place. @@ -191,14 +195,14 @@ Group * ContactList::addGroup( QString groupId, QString groupName ) } // Update the model. - int row = rootNode_->childCount(); - beginInsertRows( QModelIndex(), row, row ); - new ContactListModelItem( group, rootNode_ ); - endInsertRows(); + emit layoutAboutToBeChanged(); + new ContactListModelItem( group, rootNode_ ); + + emit layoutChanged(); // Signal the UI - emit groupAdded(group); + emit groupAdded( group ); return group; } @@ -214,11 +218,7 @@ void ContactList::changeContactStatus( QString handle, Status status, QString fr if( KMESS_NULL(rootNode_) ) return; // Get the contact - Contact *contact; - bool wasOnline; - Status oldStatus; - - contact = getContactByHandle( handle ); + Contact *contact = getContactByHandle( handle ); if ( contact == 0 ) { kWarning() << "changeContactStatus - Couldn't find contact " << handle << " in the contact list."; @@ -226,90 +226,88 @@ void ContactList::changeContactStatus( QString handle, Status status, QString fr } // Store the old online state to detect a change - wasOnline = contact->isOnline(); - oldStatus = contact->getStatus(); + bool wasOnline = contact->isOnline(); + Status oldStatus = contact->getStatus(); // Update the settings - if( ! friendlyName.isEmpty() ) - { - contact->setFriendlyName( friendlyName ); - } + contact->setFriendlyName( friendlyName ); contact->setStatus( status, showBaloon ); contact->loadMsnObject( msnObjectString ); contact->setCapabilities( capabilities ); // also resets clientName if caps changed. - // Try to detect the client name when the contact was offline before (e.g. connected/reconnected with a new client). - if( ! wasOnline ) + // Read the new state + bool isOnline = contact->isOnline(); + + // Try to detect the client name when it's reset (e.g. connected/reconnected with a new client). + if( isOnline && contact->getClientName().isEmpty() ) { - if( contact->getClientName().isEmpty() ) - { - const MsnObject *msnObject = contact->getMsnObject(); // only in derived Contact class, not in ContactBase - contact->detectClientAppName( capabilities, msnObject ); - } + const MsnObject *msnObject = contact->getMsnObject(); + contact->detectClientAppName( capabilities, msnObject ); } - // Signal that the contact has changed status - if( oldStatus != status ) + // The contact is changing status but not switching between online/offline + if( wasOnline == isOnline || ! contact->isFriend() ) { - emit contactChangedStatus( contact, showBaloon ); + if( oldStatus != status ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Changing contact" << handle << "'s status"; +#endif + // Signal that the contact has changed status, but not switched between an online status and the offline one + emit contactChangedStatus( contact, showBaloon ); + } + +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Status unchanged, skipping."; +#endif + forwardDataChanged( rootNode_->childContacts( handle ) ); + return; } - // Switch the contact between the Offline and Online groups as needed - if( wasOnline != contact->isOnline() ) + // Switch the contact between the Offline and Online groups, as it has connected or disconnected + + // Get references to both the Online and Offline groups + ContactListModelItem *sourceGroup, *destinationGroup; + if( contact->isOnline() ) { - // Get references to both groups - ContactListModelItem *onlineGroup = rootNode_->childGroup( SpecialGroups::ONLINE ); - ContactListModelItem *offlineGroup = rootNode_->childGroup( SpecialGroups::OFFLINE ); - if( ! onlineGroup || ! offlineGroup ) - { - kWarning() << "The Online or Offline groups are not available!"; - return; - } - QModelIndex onlineGroupIndex ( createIndex( onlineGroup ->row(), 0, onlineGroup ) ); - QModelIndex offlineGroupIndex( createIndex( offlineGroup->row(), 0, offlineGroup ) ); - if( ! onlineGroupIndex.isValid() || ! offlineGroupIndex.isValid() ) - { - kWarning() << "The Online or Offline groups indices are not valid!"; - return; - } - - // Then find the contact in both groups and move it - // NOTE The childContacts() calls in the two foreach loops should return only one item, - // because we're searching for a contact into a specific group - if( contact->isOnline() ) - { - ModelItemList offlineList( offlineGroup->childContacts( handle ) ); - foreach( ContactListModelItem *item, offlineList ) - { - int oldPos = item->row(); - int newPos = onlineGroup->childCount(); - - // Move the item to the new group and notify the views - beginInsertRows( onlineGroupIndex, newPos, newPos ); - beginRemoveRows( offlineGroupIndex, oldPos, oldPos ); - item->setParent( onlineGroup ); - endRemoveRows(); - endInsertRows(); - } - } - else - { - ModelItemList onlineList( onlineGroup->childContacts( handle ) ); - foreach( ContactListModelItem *item, onlineList ) - { - int oldPos = item->row(); - int newPos = offlineGroup->childCount(); - - // Move the item to the new group and notify the views - beginInsertRows( offlineGroupIndex, newPos, newPos ); - beginRemoveRows( onlineGroupIndex, oldPos, oldPos ); - item->setParent( offlineGroup ); - endRemoveRows(); - endInsertRows(); - } - } + // The contact is now online, move it from offline to online + sourceGroup = rootNode_->childGroup( SpecialGroups::OFFLINE ); + destinationGroup = rootNode_->childGroup( SpecialGroups::ONLINE ); } + else + { + // The contact is now offline, move it from online to offline + sourceGroup = rootNode_->childGroup( SpecialGroups::ONLINE ); + destinationGroup = rootNode_->childGroup( SpecialGroups::OFFLINE ); + } + + if( ! sourceGroup || ! destinationGroup ) + { + kWarning() << "The Online or Offline groups are not available!"; + return; + } + + // Move the contact from the first group and put it in the other one + +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Moving contact" << handle << "from" << sourceGroup << "to" << destinationGroup; +#endif + + ContactListModelItem *contactItem = sourceGroup->childContact( handle ); + if( ! contactItem ) + { + kWarning() << "Unable to find contact" << handle << "(now online?" << contact->isOnline(); + kWarning() << "The contact is in groups:" << rootNode_->childContacts( handle ); + return; + } + + emit layoutAboutToBeChanged(); + + // Move the node to the new place + contactItem->moveTo( destinationGroup ); + + emit layoutChanged(); } @@ -317,13 +315,18 @@ void ContactList::changeContactStatus( QString handle, Status status, QString fr /** * Get the number of columns present in an index * - * @param parent The index to count columns of + * Just returns the root node's number of columns as it doesn't change. + * + * @param parent The index to count columns of (ignored) * @return int */ int ContactList::columnCount( const QModelIndex &/*parent*/ ) const { if( rootNode_ == 0 ) { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kWarning() << "Called columnCount() without a root node!"; +#endif return 0; } @@ -349,26 +352,271 @@ bool ContactList::contactExists( QString handle ) */ QVariant ContactList::data( const QModelIndex &index, int role ) const { - // If the index isn't valid or the caller wants a non-displayable role, do nothing - if( role != Qt::DisplayRole && role != Qt::UserRole ) - { -#ifdef KMESSDEBUG_CONTACTLISTMODEL - kDebug() << "Role is not useable:" << role << "- Index:" << index; -#endif - return QVariant(); - } - - ContactListModelItem *item = static_cast( index.internalPointer() ); + const ContactListModelItem *item = static_cast( index.internalPointer() ); + // If the index isn't valid or contained non valid data, do nothing if( ! index.isValid() || ! item ) { -#ifdef KMESSDEBUG_CONTACTLISTMODEL - kDebug() << "Invalid item for index:" << index; -#endif return QVariant(); } - return item->data( ( role == Qt::DisplayRole ) ? index.column() : 1 ); + return item->data( role ); +} + + + +// Insert dropped data in the model (move/copy around stuff, in fact) +bool ContactList::dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent ) +{ + Q_UNUSED( row ); + + if( action == Qt::IgnoreAction ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Ignore action"; +#endif + return true; + } + + // Only accept our special mimetype + if( ! data->hasFormat( "application/kmess.list.item" ) ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Invalid format:" << data->formats(); +#endif + return false; + } + + if ( column > 0 ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Invalid column:" << column; +#endif + return false; + } + +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Drop info - parent:" << parent << "Data:" << parent.data(); +#endif + + QByteArray encodedData( data->data( "application/kmess.list.item" ) ); + QDataStream stream( &encodedData, QIODevice::ReadOnly ); + + while( ! stream.atEnd() ) + { + quint64 itemObject; // It will contain a pointer + ContactListModelItem *sourceItem, *targetItem; + + stream >> itemObject; + sourceItem = (ContactListModelItem*)itemObject; + + if( sourceItem == 0 ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Invalid item extracted from mime data!"; +#endif + continue; + } + + targetItem = static_cast( parent.internalPointer() ); + + if( targetItem == 0 ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Invalid target item!"; +#endif + continue; + } + +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Extracted item:" << sourceItem; +#endif + + // Take action, depending on the type of dropped item + switch( sourceItem->getType() ) + { + case ContactListModelItem::ItemContact: + { + /** + * A Contact dropped to... + * - root: no action + * - another group: will be moved there + * - its own group: no action + * - a contact in another group: will be moved to that contact's group + * - a contact in its own group: no action + */ + const Contact *contact = static_cast( sourceItem->object() ); + + Group *sourceGroup = static_cast( sourceItem->parent()->object() ); + if( sourceGroup->isSpecialGroup() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact within a special group."; +#endif + continue; + } + + switch( targetItem->getType() ) + { + // Contact dropped to root + case ContactListModelItem::ItemRoot: +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact to root."; +#endif + continue; + + // Contact dropped to a group + case ContactListModelItem::ItemGroup: + { + if( targetItem == sourceItem->parent() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact to its own group."; +#endif + continue; + } + + const Group *group = static_cast( targetItem->object() ); + + // Avoid moving the contact where it already is + if( contact->getGroupIds().contains( group->getId() ) ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact where it already is."; +#endif + continue; + } + + kWarning() << "Got to move the contact to group" << group->getId(); + break; + } + + // Contact dropped to another contact + case ContactListModelItem::ItemContact: + { + if( targetItem == sourceItem ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact to itself."; +#endif + continue; + } + + const Group *group = static_cast( targetItem->parent()->object() ); + + // Avoid moving the contact where it already is + if( contact->getGroupIds().contains( group->getId() ) ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a contact where it already is."; +#endif + continue; + } + + kWarning() << "Got to move the contact to group" << group->getId(); + break; + } + } + + break; + } + // End of handling of dropped contacts + + case ContactListModelItem::ItemGroup: + { + /** + * A Group dropped to... + * - root: no action + * - another group: will be moved above it + * - a contact within another group: will be moved above it + * - itself: no action + * - a contact within itself: no action + */ + Group *sourceGroup = static_cast( sourceItem->object() ); + + if( sourceGroup->isSpecialGroup() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a special group."; +#endif + continue; + } + + switch( targetItem->getType() ) + { + // Group dropped to the root + case ContactListModelItem::ItemRoot: +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a group to root."; +#endif + continue; + + // Group dropped to another group + case ContactListModelItem::ItemGroup: + { + if( targetItem == sourceItem ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a group to itself."; +#endif + continue; + } + + const Group *targetGroup = static_cast( targetItem->object() ); + + if( targetGroup->isSpecialGroup() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move to a special group."; +#endif + continue; + } + + kWarning() << "Got to move the group above of group" << targetGroup->getId(); + break; + } + + // Group dropped to a contact + case ContactListModelItem::ItemContact: + { + const Group *targetGroup = static_cast( targetItem->parent()->object() ); + + if( targetItem->parent() == sourceItem ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move a group to itself."; +#endif + continue; + } + + if( targetGroup->isSpecialGroup() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Cannot move to a special group."; +#endif + continue; + } + + kWarning() << "Got to move the group above of group" << targetGroup->getId(); + break; + } + } + + break; + } + // End of handling of dropped groups + + case ContactListModelItem::ItemRoot: + { + /** + * Root can't be moved, let alone dropped anywhere :) + */ + break; + } + } + } + + return true; } @@ -376,8 +624,8 @@ QVariant ContactList::data( const QModelIndex &index, int role ) const /** * Dumps the contact list contents to the debug output * - * This method is temporary and for debugging purposes exclusively. - * This method is recursive. Do not call with any arguments, they are for internal use only. + * This method is exclusively meant for debugging purposes. + * This method is also recursive. Do not call with any arguments, they are for internal use only. * * @param start Item in the model where to start from * @param depth Current search depth @@ -385,14 +633,20 @@ QVariant ContactList::data( const QModelIndex &index, int role ) const void ContactList::dump( ContactListModelItem *start, int depth ) const { #ifdef KMESSDEBUG_CONTACTLISTMODEL + if( ! rootNode_ ) + { + kDebug() << "Contact List model is empty!"; + return; + } + bool started = false; if( ! start ) { start = rootNode_; kDebug() << "Contact List model stats"; kDebug() << "--------------------------------------"; - kDebug() << "Columns:" << columnCount( createIndex( 0, 0, rootNode_ ) ); - kDebug() << "Rows:" << rowCount( createIndex( 0, 0, rootNode_ ) ); + kDebug() << "Columns:" << columnCount(); + kDebug() << "Rows:" << rowCount(); kDebug() << "Root group Columns:" << rootNode_->columnCount(); kDebug() << "Root group Rows:" << rootNode_->childCount(); kDebug(); @@ -402,7 +656,7 @@ void ContactList::dump( ContactListModelItem *start, int depth ) const started = true; } - QString spacer = QString().fill( '-', 2 * depth ) + ">"; + QString spacer( QString().fill( '-', 2 * depth ) + ">" ); // Print the current node's contents, and manage children recursively for( int i = 0; i < start->childCount(); i++ ) @@ -463,7 +717,7 @@ bool ContactList::hasChildren( const QModelIndex &parent ) const return ( rootNode_->childCount() > 0 ); } - ContactListModelItem *item = static_cast( parent.internalPointer() ); + const ContactListModelItem *item = static_cast( parent.internalPointer() ); if( ! item ) { @@ -494,7 +748,7 @@ bool ContactList::hasIndex( int row, int column, const QModelIndex &parent ) con return false; } - ContactListModelItem *item = static_cast( parent.internalPointer() ); + const ContactListModelItem *item = static_cast( parent.internalPointer() ); if( ! item ) { @@ -533,7 +787,10 @@ Qt::ItemFlags ContactList::flags( const QModelIndex &index ) const if( ! index.isValid() ) return 0; - return Qt::ItemIsEnabled | Qt::ItemIsSelectable; + return Qt::ItemIsEnabled + | Qt::ItemIsSelectable + | Qt::ItemIsDragEnabled + | Qt::ItemIsDropEnabled; } @@ -569,7 +826,16 @@ void ContactList::forwardDataChanged( ModelItemList itemList ) foreach( ContactListModelItem *item, itemList ) { - QModelIndex changedIndex ( createIndex( item->row(), 0, item ) ); + QModelIndex changedIndex; + + if( item->parent() == rootNode_ ) + { + changedIndex = index( item->row(), 0, QModelIndex() ); + } + else + { + changedIndex = createIndex( item->row(), 0, item ); + } /* // Useful debugging statements, but way too verbose @@ -587,12 +853,91 @@ void ContactList::forwardDataChanged( ModelItemList itemList ) kDebug() << "Parent index's parent :" << changedIndex.parent().parent(); #endif */ + emit dataChanged( changedIndex, changedIndex ); } } +// Provide a MIME representation of some of the model's indexes +QMimeData *ContactList::mimeData( const QModelIndexList &indexes ) const +{ + QStringList addresses; + QByteArray encodedData; + QMimeData *mimeData = new QMimeData(); + + QDataStream stream( &encodedData, QIODevice::WriteOnly ); + + // Encode into a byte array the details about dragged items + foreach( const QModelIndex &index, indexes ) + { + if( ! index.isValid() ) + { + continue; + } + + const ContactListModelItem *item = static_cast( index.internalPointer() ); + + if( item == 0 ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Invalid item!"; +#endif + continue; + } + + ContactListModelItem::ItemType itemType = item->getType(); + + if( itemType != ContactListModelItem::ItemContact + && itemType != ContactListModelItem::ItemGroup ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Non draggable item!"; +#endif + continue; + } + +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Preparing drag data for item" << item; +#endif + + // Save the pointer as a 64-bit unsigned integer + stream << (quint64) item; + + if( itemType == ContactListModelItem::ItemContact ) + { + const Contact *contact = static_cast( item->object() ); + if( contact ) + { + addresses.append( contact->getHandle() ); + } + } + + continue; + } + + mimeData->setData( "application/kmess.list.item", encodedData ); + + // External apps may want these. A better format should be used, if needed + if( addresses.count() > 0 ) + { + mimeData->setText( addresses.join( "; " ) ); + } + + return mimeData; +} + + + +// Return the supported drag&drop mimetypes +QStringList ContactList::mimeTypes() const + { + return QStringList() << "application/kmess.list.item"; + } + + + // Return the contact with the given guid Contact* ContactList::getContactByGuid( QString guid ) const { @@ -643,6 +988,22 @@ Group* ContactList::getGroupById( QString groupId ) const +// Return the group with the given name +Group* ContactList::getGroupByName( QString name ) const +{ + foreach( Group *group, groups_ ) + { + if( group->getName() == name ) + { + return group; + } + } + + return 0; +} + + + // Return the group with the given sort position Group* ContactList::getGroupBySortPosition( int sortPosition, bool next ) const { @@ -693,6 +1054,9 @@ bool ContactList::groupExists( QString groupId ) /** * Return the text for a list or tree column header. * + * Currently unused. We don't use headers in our model - we may end up needing them + * when another model view will show up. + * * @see http://doc.trolltech.com/4.3/qt.html#ItemDataRole-enum for available roles * * @param section Row or column of the header text to return @@ -702,8 +1066,9 @@ bool ContactList::groupExists( QString groupId ) */ QVariant ContactList::headerData( int section, Qt::Orientation orientation, int role ) const { - if( rootNode_ && orientation == Qt::Horizontal && role == Qt::DisplayRole ) - return rootNode_->data( section ); + Q_UNUSED( section ); + Q_UNUSED( orientation ); + Q_UNUSED( role ); return QVariant(); } @@ -720,7 +1085,7 @@ QVariant ContactList::headerData( int section, Qt::Orientation orientation, int */ QModelIndex ContactList::index( int row, int column, const QModelIndex &parent ) const { - if( ! hasIndex( row, column, parent ) ) + if( ! hasIndex( row, column, parent ) || ! rootNode_ ) { return QModelIndex(); } @@ -794,12 +1159,12 @@ QModelIndex ContactList::parent( const QModelIndex &index ) const */ void ContactList::slotContactMoved( Contact *contact ) { - ModelItemList oldNodes; - ModelItemList newNodes; - QStringList groupIds = contact->getGroupIds(); + const QStringList& groupIds( contact->getGroupIds() ); + const QString& handle (contact->getHandle() ); // Add the current groups to the nodes in which the contact should now be visible - foreach( QString groupId, groupIds ) + ModelItemList newNodes; + foreach( const QString &groupId, groupIds ) { ContactListModelItem *item = rootNode_->childGroup( groupId ); if( item ) @@ -811,10 +1176,10 @@ void ContactList::slotContactMoved( Contact *contact ) // Add the current lists to the nodes in which the contact should now be visible if( contact->isFriend() ) { - // Friends with no groups are displayed in root + // Friends with no groups are displayed in the Individuals group if( groupIds.isEmpty() ) { - newNodes << rootNode_; + newNodes << rootNode_->childGroup( SpecialGroups::INDIVIDUALS ); } if( contact->isOnline() ) @@ -838,94 +1203,33 @@ void ContactList::slotContactMoved( Contact *contact ) } } - // Loop through the nodes which did contain this contact. - // Moves items between groups only: if the contact is still in a group, don't move it - ModelItemList itemsList( rootNode_->childContacts( contact->getHandle() ) ); - foreach( ContactListModelItem *oldNode, itemsList ) + emit layoutAboutToBeChanged(); + + ModelItemList allGroups( rootNode_->childGroups() ); + foreach( ContactListModelItem *node, allGroups ) { - if( newNodes.contains( oldNode->parent() ) ) + // If new nodes doesn't contain current node, remove contact from it if it's in. + if( ! newNodes.contains( node ) ) { - // It was and is still in this node, don't move it - newNodes.removeAll( oldNode->parent() ); + ContactListModelItem *childContact = node->childContact( handle ); + // If we found the contact, remove it + if( childContact != 0 ) + { + delete childContact; + } } else { - // It's not in this node anymore, we can move this node elsewhere - oldNodes << oldNode; + ContactListModelItem *childContact = node->childContact( handle ); + if( childContact == 0 ) + { + new ContactListModelItem( contact, node ); + } + // else leave it } } - // The contact is still in the same nodes, avoid any moving around - if( oldNodes.isEmpty() && newNodes.isEmpty() ) - { -#ifdef KMESSDEBUG_CONTACTLISTMODEL - kDebug() << "Not moving anything, the contact's nodes are unchanged."; -#endif - // Just update the contact's nodes - forwardDataChanged( rootNode_->childContacts( contact->getHandle() ) ); - return; - } - -#ifdef KMESSDEBUG_CONTACTLISTMODEL - kDebug() << "Moving" << contact->getHandle() << "from nodes:" << oldNodes << "to nodes:" << newNodes; -#endif - - // Move the contact's items between changed nodes - for( int idx = 0; idx < qMax( oldNodes.count(), newNodes.count() ); ++idx ) - { - bool hasOldNode = ( idx < oldNodes.count() ); - bool hasNewNode = ( idx < newNodes.count() ); - - int insertIntoPos, removeFromPos; - QModelIndex oldParentIndex, newParentIndex; - ContactListModelItem *item = 0, *oldNode = 0, *newNode = 0; - - // If there's an item to add to a node, start an addition process - if( hasNewNode ) - { - newNode = newNodes.at( idx ); - insertIntoPos = newNode->childCount(); - newParentIndex = ( newNode == rootNode_ ) ? QModelIndex() : index( newNode->row(), 0, QModelIndex() ); - - beginInsertRows( newParentIndex, insertIntoPos, insertIntoPos ); - } - // If there's an item to remove from a node, start a removal process - if( hasOldNode ) - { - item = oldNodes.at( idx ); - oldNode = item->parent(); - removeFromPos = item->row(); - oldParentIndex = ( oldNode == rootNode_ ) ? QModelIndex() : index( oldNode->row(), 0, QModelIndex() ); - - beginRemoveRows( oldParentIndex, removeFromPos, removeFromPos ); - } - - // Move the contact between two nodes - if( hasOldNode && hasNewNode ) - { - item->setParent( newNode ); - } - // Remove an item now unneeded - else if( hasOldNode ) - { - delete item; - } - // Add a new item - else if( hasNewNode ) - { - new ContactListModelItem( contact, newNode ); - } - - // Complete the addition and/or deletion process - if( hasOldNode ) - { - endRemoveRows(); - } - if( hasNewNode ) - { - endInsertRows(); - } - } + emit layoutChanged(); } @@ -943,28 +1247,35 @@ void ContactList::slotGroupMoved( Group *group, int newPosition ) } // Signal that the groups have changed - ContactListModelItem *newPosItem = rootNode_->childGroup( group->getId() ); ContactListModelItem *oldPosItem = rootNode_->childGroup( oldGroup->getId() ); int newPosRow = newPosItem->row(); int oldPosRow = oldPosItem->row(); - QModelIndex newPosIndex( createIndex( newPosRow, 0, newPosItem ) ); - QModelIndex oldPosIndex( createIndex( oldPosRow, 0, oldPosItem ) ); + QModelIndex newPosIndex( index( newPosRow, 0, QModelIndex() ) ); + QModelIndex oldPosIndex( index( oldPosRow, 0, QModelIndex() ) ); if( oldPosRow < newPosRow ) { - emit dataChanged( oldPosIndex, newPosIndex ); + emit dataChanged( oldPosIndex, newPosIndex ); } else { - emit dataChanged( newPosIndex, oldPosIndex ); + emit dataChanged( newPosIndex, oldPosIndex ); } } +// Specify which drag and drop operations are supported +Qt::DropActions ContactList::supportedDropActions() const +{ + return Qt::CopyAction | Qt::MoveAction; +} + + + // Forward from a contact that it is offline void ContactList::slotForwardContactOffline(Contact *contact, bool showBaloon) { @@ -1003,6 +1314,48 @@ void ContactList::slotForwardContactOnline(Contact *contact, bool showBaloon) +// Remove a contact from the list completely +void ContactList::removeContact( QString contactId ) +{ + Contact *contact = getContactByGuid( contactId ); + + if( contact == 0 ) + { + kWarning() << "Contact" << contactId << "doesn't exist in the contact list."; + return; + } + + QString handle( contact->getHandle() ); + const ModelItemList& nodesToRemove( rootNode_->childContacts( handle ) ); + + if( nodesToRemove.isEmpty() ) + { + kWarning() << "No matching contact" << contactId << "was found!"; + return; + } + + emit layoutAboutToBeChanged(); + + foreach( ContactListModelItem *item, nodesToRemove ) + { + // Delete the contact's node from the model + delete item; + + // Also delete it from the internal list of contacts + contacts_.remove( handle ); + } + + emit layoutChanged(); + + // Signal the deletion to the UI + emit contactRemoved( contact ); + + // When all receivers have deleted the contact from their lists, we delete it too + delete contact; +} + + + // Remove a group void ContactList::removeGroup( QString groupId ) { @@ -1011,21 +1364,22 @@ void ContactList::removeGroup( QString groupId ) if ( group == 0 || nodeToRemove == 0 ) { - kDebug() << "Group " << groupId << " doesn't exist in the contact list."; + kWarning() << "Group" << groupId << "doesn't exist in the contact list."; return; } if( nodeToRemove->childCount() ) { kWarning() << "Group" << groupId << "was not empty!"; + return; } - int row = nodeToRemove->row(); - // Delete the group's node in the model - beginRemoveRows( QModelIndex(), row, row ); + emit layoutAboutToBeChanged(); + delete nodeToRemove; - endRemoveRows(); + + emit layoutChanged(); // Also delete it from the internal list of groups groups_.removeAll( group ); @@ -1094,15 +1448,23 @@ void ContactList::reset( bool restore ) #endif // Delete everything from the model tree - for( int row = 0; row < rootNode_->childCount(); row++ ) - { - beginRemoveRows( QModelIndex(), row, row ); - delete rootNode_->child( row ); - endRemoveRows(); - } + int childItemsCount = rootNode_->childCount(); - // Notify views that the old model is gone - QAbstractItemModel::reset(); + emit layoutAboutToBeChanged(); + for( int row = 0; row < childItemsCount; row++ ) + { + ContactListModelItem *item = rootNode_->child( row ); + if( item != 0 ) + { + continue; + } + int childItemsCount2 = item->childCount(); + for( int row2 = 0; row2 < childItemsCount2; row2++ ) + { + delete item->child( row2 ); + } + } + emit layoutChanged(); // Delete the root node delete rootNode_; @@ -1138,14 +1500,15 @@ void ContactList::reset( bool restore ) rootNode_ = new ContactListModelItem(); // Create the special groups - addGroup( SpecialGroups::ONLINE, i18n("Online") ); - addGroup( SpecialGroups::OFFLINE, i18n("Offline") ); - addGroup( SpecialGroups::ALLOWED, i18n("Allowed") ); - addGroup( SpecialGroups::REMOVED, i18n("Removed") ); + addGroup( SpecialGroups::INDIVIDUALS, i18n("Individuals") ); + addGroup( SpecialGroups::ONLINE, i18n("Online") ); + addGroup( SpecialGroups::OFFLINE, i18n("Offline") ); + addGroup( SpecialGroups::ALLOWED, i18n("Allowed") ); + addGroup( SpecialGroups::REMOVED, i18n("Removed") ); #ifdef KMESSTEST - KMESS_ASSERT( groups_.count() == 4 ); - KMESS_ASSERT( rootNode_->childCount() == 4 ); + KMESS_ASSERT( groups_.count() == 5 ); + KMESS_ASSERT( rootNode_->childCount() == 5 ); #endif } @@ -1158,41 +1521,15 @@ void ContactList::readProperties() kDebug() << "Loading properties for the contact list"; #endif - KConfigGroup config; - QString handle = CurrentAccount::instance()->getHandle(); - - config = KMessConfig::instance()->getContactListConfig( handle, "Groups" ); - - // Load all groups - QList sortedList( groups_ ); - Group *group; - int newPosition; + const QString& handle( CurrentAccount::instance()->getHandle() ); + KConfigGroup config( KMessConfig::instance()->getContactListConfig( handle, "Groups" ) ); + // Load the settings for all groups for( int i = 0; i < groups_.count(); i++ ) { - group = groups_.value( i ); - group->readProperties( config ); - - // Signal that this group has changed, so it will be correctly repainted - forwardDataChanged( rootNode_->childGroup( group->getId() ) ); - - if( group->isSpecialGroup() ) - { - continue; - } - - newPosition = group->getSortPosition(); - if( newPosition >= groups_.count() ) - { - newPosition = groups_.count() - 1; - } - - sortedList.swap( i, newPosition ); + groups_.value( i )->readProperties( config ); } - groups_.clear(); - groups_ = sortedList; - config.sync(); config = KMessConfig::instance()->getContactListConfig( handle, "Contacts" ); @@ -1255,31 +1592,20 @@ void ContactList::saveProperties() } // Get the position of the contacts settings of this account - KConfigGroup config; - QString handle = CurrentAccount::instance()->getHandle(); + const QString& handle( CurrentAccount::instance()->getHandle() ); - // Skip saving groups if there aren't any - if( groups_.count() > 0 ) + // There always are at least some special groups to be saved: we can never skip saving + // like it's done with contacts below + KConfigGroup config( KMessConfig::instance()->getContactListConfig( handle, "Groups" ) ); + + // Save all groups + foreach( Group *group, groups_ ) { - config = KMessConfig::instance()->getContactListConfig( handle, "Groups" ); - - // Save all groups - foreach( Group *group, groups_ ) - { - // The position for contact is the same of the group in qlist - group->setSortPosition( groups_.indexOf( group ) ); - group->saveProperties( config ); - } - - // Write the data now! - config.sync(); + group->saveProperties( config ); } -#ifdef KMESSDEBUG_CONTACTLIST_GENERAL - else - { - kDebug() << "No groups to save"; - } -#endif + + // Write the data now! + config.sync(); // Skip saving contacts if there aren't any, as above if( ! contacts_.isEmpty() ) @@ -1288,7 +1614,7 @@ void ContactList::saveProperties() // We want to delete unused contact info; so here we get a list of all contacts and remove // the used ones. Then we remove what's left in this list - QStringList pendingRemoval = config.groupList(); + QStringList pendingRemoval( config.groupList() ); // Save all contact extensions foreach( Contact *contact, contacts_ ) @@ -1300,7 +1626,7 @@ void ContactList::saveProperties() // Delete the remaining contacts info, which at this point are only old contacts not in list anymore QFile picture; KConfigGroup contactConfig; - foreach( QString unusedContact, pendingRemoval ) + foreach( const QString &unusedContact, pendingRemoval ) { #ifdef KMESSDEBUG_CONTACTLIST_GENERAL kDebug() << "Deleting unused contact info for " << unusedContact; @@ -1329,4 +1655,36 @@ void ContactList::saveProperties() +// Save the properties of a group +void ContactList::saveProperties( const Group *group ) const +{ + const QString& handle( CurrentAccount::instance()->getHandle() ); + KConfigGroup config( KMessConfig::instance()->getContactListConfig( handle, "Groups" ) ); + + // Save the group, by removing the const + Group *internalGroup = const_cast( group ); + internalGroup->saveProperties( config ); + + // Write the data now! + config.sync(); +} + + + +// Save the properties of a contact +void ContactList::saveProperties( const Contact *contact ) const +{ + const QString& handle( CurrentAccount::instance()->getHandle() ); + KConfigGroup config( KMessConfig::instance()->getContactListConfig( handle, "Contacts" ) ); + + // Save the contact + Contact *internalContact = const_cast( contact ); + internalContact->saveProperties( config ); + + // Write the data now! + config.sync(); +} + + + #include "contactlist.moc" diff --git a/src/contact/contactlist.h b/src/model/contactlist.h similarity index 85% rename from src/contact/contactlist.h rename to src/model/contactlist.h index bca1daf..0ae6b99 100644 --- a/src/contact/contactlist.h +++ b/src/model/contactlist.h @@ -50,6 +50,7 @@ class KMessTest; * the administration of the contacts is still done through the MsnNotificationConnection class, * * @author Mike K. Bennett + * @author Valerio Pilo * @ingroup Contact */ class ContactList : public QAbstractItemModel @@ -65,8 +66,6 @@ class ContactList : public QAbstractItemModel virtual ~ContactList(); // Add a contact to the contact list Contact * addContact( QString handle, QString friendlyName, int lists, QStringList groupIds, QString guid ); - // Add a group to the contact list - Group * addGroup( QString groupId, QString groupName ); // Change a contact's status (and update the friendly name) void changeContactStatus( QString handle, Status status, QString friendlyName = QString(), uint capabilities = 0, QString msnObjectString = QString(), bool showBaloon = true ); @@ -78,6 +77,8 @@ class ContactList : public QAbstractItemModel const QHash& getContactList() const; // Return the group with the given id Group* getGroupById( QString groupId ) const; + // Return the group with the given name + Group* getGroupByName( QString name ) const; // Return the group with the given sort position Group* getGroupBySortPosition( int sortPosition, bool next ) const; // Return the list of groups @@ -86,22 +87,34 @@ class ContactList : public QAbstractItemModel bool isGroupEmpty( const QString &groupId ) const; // Read groups and contacts properties void readProperties(); - // Remove a group - void removeGroup( QString groupId ); // Change a contact's name void renameContact( QString handle, QString newName ); - // Change a group's name - void renameGroup( QString groupId, QString newName ); // Restore the orginal state of the contact list (empty it) void reset( bool restore = true ); // Save groups and contacts properties void saveProperties(); + // Save the properties of a contact + void saveProperties( const Contact *contact ) const; + // Save the properties of a group + void saveProperties( const Group *group ) const; + + public slots: + // Add a group to the contact list + Group* addGroup( QString groupId, QString groupName ); + // Remove a contact from the list completely + void removeContact( QString contactId ); + // Remove a group + void removeGroup( QString groupId ); + // Change a group's name + void renameGroup( QString groupId, QString newName ); public: // Public model methods // Get the number of columns present in an index int columnCount( const QModelIndex &parent = QModelIndex() ) const; // Return the data contained by an index in the model QVariant data( const QModelIndex &index, int role ) const; + // Insert dropped data in the model (move/copy around stuff, in fact) + bool dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent ); // Dumps the contact list contents to the debug output void dump( ContactListModelItem *start = 0, int depth = 1 ) const; // Return the flags which characterize the index @@ -114,10 +127,16 @@ class ContactList : public QAbstractItemModel QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; // Obtain a model index for a specificly located item QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const; + // Provide a MIME representation of some of the model's indexes + QMimeData *mimeData( const QModelIndexList &indexes ) const; + // Return the supported drag&drop mimetypes + QStringList mimeTypes() const; // Obtain a model index's parent index QModelIndex parent( const QModelIndex &index ) const; // Get the number of rows present in an index int rowCount( const QModelIndex &parent = QModelIndex() ) const; + // Specify which drag and drop operations are supported + Qt::DropActions supportedDropActions() const; private: // Private methods // Return whether or not the contact with the given handle exists @@ -157,11 +176,15 @@ class ContactList : public QAbstractItemModel void contactOffline( Contact *contact, bool showBaloon ); // Signal that a contact is online void contactOnline( Contact *contact, bool showBaloon ); + // Signal that a contact has been added + void contactAdded( Contact *contact ); + // Signal that a contact has been removed + void contactRemoved( Contact *contact ); // Signal that a group has been added void groupAdded( const Group *group ); // Signal that a group has been modified void groupChanged(const Group *group); - // Signal that a group has been added + // Signal that a group has been removed void groupRemoved(const Group *group); }; diff --git a/src/model/contactlistmodelfilter.cpp b/src/model/contactlistmodelfilter.cpp new file mode 100644 index 0000000..0ea30cd --- /dev/null +++ b/src/model/contactlistmodelfilter.cpp @@ -0,0 +1,403 @@ +/*************************************************************************** + contactlistmodelfilter.cpp - description + ------------------- + begin : Thu Jul 10 2008 + copyright : (C) 2008 by Valerio Pilo + email : valerio@kmess.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "contactlistmodelfilter.h" + +#include "../contact/specialgroups.h" +#include "../currentaccount.h" +#include "../kmessdebug.h" +#include "contactlistmodelitem.h" + + +#ifdef KMESSDEBUG_CONTACTLISTMODEL +// #define KMESSDEBUG_CONTACTLISTMODELFILTER_VISIBILITY +#endif + + +// The constructor +ContactListModelFilter::ContactListModelFilter( QObject *parent ) +: QSortFilterProxyModel( parent ) +, currentAccount_( 0 ) +, showAllowed_ ( true ) +, showEmpty_ ( false ) +, showGroupsMode_( Account::VIEW_MIXED ) +, showOffline_ ( true ) +, showRemoved_ ( true ) +{ + // Set filtering options + setDynamicSortFilter( true ); + setFilterKeyColumn( 0 ); + setFilterRole( ContactListModelItem::SearchRole ); + setFilterCaseSensitivity( Qt::CaseInsensitive ); + setSortRole( ContactListModelItem::SortRole ); + setSortCaseSensitivity( Qt::CaseInsensitive ); +} + + + +/** + * Dumps the contact list contents to the debug output + * + * This method is temporary and for debugging purposes exclusively. + * This method is recursive. Do not call with any arguments, they are for internal use only. + * + * @param start Item in the model where to start from + * @param depth Current search depth + */ +void ContactListModelFilter::dump( QModelIndex start, int depth ) const +{ +#ifdef KMESSDEBUG_CONTACTLISTMODEL + bool started = false; + + if( ! start.isValid() ) + { + start = QModelIndex(); + kDebug() << "Contact List Filter model stats"; + kDebug() << "--------------------------------------"; + kDebug() << "Columns:" << columnCount(); + kDebug() << "Rows:" << rowCount(); + kDebug(); + kDebug() << "Contact List Filter model dump"; + kDebug() << "--------------------------------------"; + kDebug() << "Root @" << start; + started = true; + } + + QString spacer( QString().fill( '-', 2 * depth ) + ">" ); + + // Print the current node's contents, and manage children recursively + for( int i = 0; i < rowCount( start ); i++ ) + { + QModelIndex itemIndex( index( i, 0, start ) ); + ModelDataList itemData( itemIndex.data().toMap() ); + + switch( itemData["type"].toInt() ) + { + case ContactListModelItem::ItemContact: + kDebug() << spacer << (i+1) << ") Contact:" + << itemData["handle"].toString() + << "@" << itemIndex; + break; + + case ContactListModelItem::ItemGroup: + kDebug() << spacer << (i+1) << ") Group:" + << itemData["id"].toString() + << "@" << itemIndex; + dump( itemIndex, depth + 1 ); + break; + + default: + kDebug() << spacer << "Unknown type of item: " + itemData["type"].toInt() << "@" << itemIndex; + break; + } + } + + if( started ) + { + kDebug() << "--------------------------------------"; + kDebug() << "Persistent indices:" << endl << persistentIndexList(); + kDebug() << "--------------------------------------"; + } +#else + Q_UNUSED( start ); + Q_UNUSED( depth ); +#endif +} + + + +/** + * @brief Determine if a row is visible or not + * + * Uses the internal data from the given index to determine if, according to the current + * account options, a row should be hid or shown. + * + * @param sourceRow Where the item to check is located inside the sourceParent index + * @param sourceParent The index containing the item to check + */ +bool ContactListModelFilter::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const +{ + bool isVisible = true; + + // Retrieve the item data from the source model + const QModelIndex index( sourceModel()->index( sourceRow, 0, sourceParent ) ); + + if( ! index.isValid() || ! index.data().isValid() || ! index.data().canConvert( QVariant::Map ) ) + { + return false; + } + + const ModelDataList& itemData( index.data().toMap() ); + + if( itemData.isEmpty() ) + { +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Item" << index << "does not contain any data!"; +#endif + return false; + } + + + /** + * Contact searches HOWTO: Most groups should be kept visible - the view will + * autonomously hide any group without results (we can't do it here, because + * the list is recursively iterated by the filter, so the group is filtered + * before its children are). + * The groups of the current view mode should be kept visible: we must however + * make sure that, regardless of the current view mode, all possible contacts + * are included in the search. + */ + + + switch( itemData[ "type" ].toInt() ) + { + case ContactListModelItem::ItemContact: + { + Status contactStatus = (Status) itemData[ "status" ].toInt(); + + // Contacts in special groups are always visible. Their group may be not, though. + // Also apply filtering to contacts in the Individuals group + if( ! itemData[ "isInSpecialGroup" ].toBool() + || itemData[ "group" ] == SpecialGroups::INDIVIDUALS ) + { + switch( showGroupsMode_ ) + { + /** + * When showing the list by status, the user-defined groups are not visible, + * therefore the contacts within aren't, either, regardless if the contacts + * are visible or not. + */ + case Account::VIEW_BYSTATUS: + // Keep the item visible anyways. + isVisible = true; + break; + + /** + * When showing by group, a contact is visible depending on the 'Show Offline + * Contacts' option: + * + * - If it is enabled: an offline contact should be visible within its group, + * but not within the Offline group (which will be hidden) + * - If it is disabled: an offline contact should always be hidden. + */ + case Account::VIEW_BYGROUP: + isVisible = ( showOffline_ || contactStatus != STATUS_OFFLINE ); + break; + + /** + * On other view modes, a contact is visible if it's not offline. + */ + default: + isVisible = ( ( (Status) itemData[ "status" ].toInt() ) != STATUS_OFFLINE ); + break; + } + } + + // Manage contact searches: the list view sets the filter expression, and we use it here + if( isVisible && ! filterRegExp().isEmpty() ) + { + isVisible = ( QSortFilterProxyModel::filterAcceptsRow( sourceRow, sourceParent ) ); + break; + } + } + break; + + + case ContactListModelItem::ItemGroup: + { + QString id( itemData[ "id" ].toString() ); + + /** + * The Allowed and Removed groups are visible only depending on their list view + * options, not the group mode. In the next switch, these two groups will be + * ignored because they're always handled here. + * When searching, these two groups need to always be included in the search, + * and therefore need to be kept visible. + */ + if( id == SpecialGroups::ALLOWED ) + { + isVisible = ( showAllowed_ || ! filterRegExp().isEmpty() ); + break; + } + else if( id == SpecialGroups::REMOVED ) + { + isVisible = ( showRemoved_ || ! filterRegExp().isEmpty() ); + break; + } + + switch( showGroupsMode_ ) + { + /** + * When showing the list by status, the user-defined groups are not visible; + * the Online special group is visible; the Offline group is visible if the + * "Show Offline Contacts" option is enabled; and the Individuals group is + * not visible. + * When searching, the Offline group cannot be hidden, or searching would + * miss offline contacts. + */ + case Account::VIEW_BYSTATUS: + if( id == SpecialGroups::ONLINE ) + { + isVisible = true; + } + else if( id == SpecialGroups::OFFLINE ) + { + isVisible = ( showOffline_ || ! filterRegExp().isEmpty() ); + } + else + { + isVisible = false; + } + break; + + /** + * When showing by group, the user-defined and the Individuals groups are + * visible (if they're not empty and the "Show Empty Groups" option is on), + * but the Online and Offline ones are not. + * Searching does not affect this mode. + */ + case Account::VIEW_BYGROUP: + if( itemData[ "isSpecialGroup" ].toBool() == false || id == SpecialGroups::INDIVIDUALS ) + { + // TODO: Groups with no contacts at all (like new groups) are always + // shown, because they would disappear from the view and that would + // be confusing for users. Maybe there's a better way? + if( ! showEmpty_ && itemData[ "totalContacts" ].toInt() > 0 ) + { + isVisible = ( itemData[ "onlineContacts" ].toInt() > 0 ); + } + } + else + { + isVisible = false; + } + break; + + /** + * On the Mixed view mode, the Online group is hidden; the Offline group is shown + * if the user enables the "Show Offline Contacts" option; the Individuals + * group and the user-defined ones are hidden if they're empty (and if the + * "Show Empty Groups" option is off). + * Here, too, searching requires the Offline group to be shown. + */ + case Account::VIEW_MIXED: + if( id == SpecialGroups::ONLINE ) + { + isVisible = false; + } + else if( id == SpecialGroups::OFFLINE ) + { + isVisible = ( showOffline_ || ! filterRegExp().isEmpty() ); + } + else // Individuals and user-defined groups + { + // TODO: Groups with no contacts at all (like new groups) are always + // shown, because they would disappear from the view and that would + // be confusing for users. Maybe there's a better way? + if( ! showEmpty_ && itemData[ "totalContacts" ].toInt() > 0 ) + { + isVisible = ( itemData[ "onlineContacts" ].toInt() > 0 ); + } + } + break; + } + } + break; + + // Invalid items + default: + kWarning() << "Unknown contents for index:" << index; + kWarning() << "-- Item data:" << itemData; + break; + + } + +#ifdef KMESSDEBUG_CONTACTLISTMODELFILTER_VISIBILITY + switch( itemData[ "type" ].toInt() ) + { + case ContactListModelItem::ItemContact: + kDebug() << "Visibility check: contact" << itemData[ "handle" ].toString() << "is" + << ( isVisible ? "visible" : "hidden" ); + break; + case ContactListModelItem::ItemGroup: + kDebug() << "Visibility check: group" << itemData[ "name" ].toString() << "is" + << ( isVisible ? "visible" : "hidden" ); + break; + default: + break; + } +#endif + + return isVisible; +} + + + +/** + * @brief Sets the given sourceModel to be processed by the proxy model. + * + * Overridden from QSortFilterProxyModel to instantly refresh the proxy + * with the current view settings. + * + * @param sourceModel Model to filter + */ +void ContactListModelFilter::setSourceModel( QAbstractItemModel *sourceModel ) +{ + QSortFilterProxyModel::setSourceModel( sourceModel ); + + // Update the account-dependant options and re-sort the list + updateOptions(); +} + + + +/** + * @brief Update the internal filter/sort options + * + * Updates the internal preferences to reflect the current account's + */ +void ContactListModelFilter::updateOptions() +{ +#ifdef KMESSDEBUG_CONTACTLISTMODEL + kDebug() << "Updating account options from" << sender() << "( this:" << this << ", source model:" << sourceModel() << ")"; +#endif + + // Connect the account signals that we need + if( CurrentAccount::instance() != currentAccount_ ) + { + currentAccount_ = CurrentAccount::instance(); + connect( currentAccount_, SIGNAL( changedDisplaySettings() ), + this, SLOT ( updateOptions() ) ); + connect( currentAccount_, SIGNAL( changedViewMode() ), + this, SLOT ( updateOptions() ) ); + } + + // Read the settings + showAllowed_ = currentAccount_->getShowAllowedContacts(); + showRemoved_ = currentAccount_->getShowRemovedContacts(); + showGroupsMode_ = currentAccount_->getContactListDisplayMode(); + showOffline_ = currentAccount_->getShowOfflineContacts(); + showEmpty_ = currentAccount_->getShowEmptyGroups(); + + // Invalidate the proxy model, to update sorting and visibility of the model's items + invalidate(); + sort( 0, Qt::AscendingOrder ); +} + + + +#include "contactlistmodelfilter.moc" diff --git a/src/contactlistmodelfilter.h b/src/model/contactlistmodelfilter.h similarity index 94% rename from src/contactlistmodelfilter.h rename to src/model/contactlistmodelfilter.h index ebc4106..d76500e 100644 --- a/src/contactlistmodelfilter.h +++ b/src/model/contactlistmodelfilter.h @@ -46,8 +46,8 @@ class ContactListModelFilter : public QSortFilterProxyModel // The constructor ContactListModelFilter( QObject* parent = 0 ); - // Set the original model which will be filtered - void setSourceModel( QAbstractItemModel *newSourceModel ); + // Sets the given sourceModel to be processed by the proxy model. + void setSourceModel( QAbstractItemModel *sourceModel ); protected: // Protected methods @@ -55,12 +55,17 @@ class ContactListModelFilter : public QSortFilterProxyModel // Determine if a row is visible or not bool filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const; + + public slots: // Public slots + + // Dumps the model contents to the debug output + void dump( QModelIndex start = QModelIndex(), int depth = 1 ) const; + + private slots: // Private slots // Update the internal filter/sort options void updateOptions(); - // Dumps the model contents to the debug output - void dump( QModelIndex start = QModelIndex(), int depth = 1 ) const; private: // Private properties diff --git a/src/model/contactlistmodelitem.cpp b/src/model/contactlistmodelitem.cpp new file mode 100644 index 0000000..c8d5c96 --- /dev/null +++ b/src/model/contactlistmodelitem.cpp @@ -0,0 +1,756 @@ +/*************************************************************************** + contactlistmodelitem.cpp - description + ------------------- + begin : Sat Feb 16 2008 + copyright : (C) 2008 by Valerio Pilo + email : valerio@kmess.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "contactlistmodelitem.h" + +#include "../contact/contact.h" +#include "../contact/contactextension.h" +#include "../contact/group.h" +#include "../contact/specialgroups.h" +#include "../kmessdebug.h" + + + +/** + * Root constructor + * + * Creates a root tree node. It can contain only Groups. + */ +ContactListModelItem::ContactListModelItem() + : parentNode_(0) + , object_(0) + , itemType_(ItemRoot) +{ +} + + + +/** + * Contact constructor + * + * Creates a Contact tree leaf. It cannot contain anything. + */ +ContactListModelItem::ContactListModelItem( Contact *contact, ContactListModelItem *parent ) + : parentNode_(parent) + , object_(contact) + , itemType_(ItemContact) +{ + // Add this item as a child of the parent + parent->appendChild( this ); +} + + + +/** + * Group constructor + * + * Creates a Group tree node. It can only contain Contacts. + */ +ContactListModelItem::ContactListModelItem( Group *group, ContactListModelItem *parent ) + : parentNode_(parent) + , object_(group) + , itemType_(ItemGroup) +{ + // Add this node as a child of the parent + parent->appendChild( this ); +} + + + +/** + * Destructor + * + * Since the objects associated to the items are directly managed by ContactList, their deletion + * is performed by the Contact List itself. + */ +ContactListModelItem::~ContactListModelItem() +{ + qDeleteAll( childItems_ ); + childItems_.clear(); + + // Delete this item from the parent's children + if( parentNode_ ) + { + parentNode_->removeChild( this ); + } +} + + + +/** + * Add a new child item to this one + * + * Insert the given item as a child of this node. A root item can only contain Groups, Groups can only + * contain Contacts. There cannot be duplicate items within the same parent. + * + * @param item Item to add as child + */ +void ContactListModelItem::appendChild( ContactListModelItem *item ) +{ + // Only add groups to the root, and contacts to groups + if( ( itemType_ == ItemRoot && item->getType() != ItemGroup ) + || ( itemType_ == ItemGroup && item->getType() != ItemContact ) + || itemType_ == ItemContact ) + { + kWarning() << "Cannot insert this item:" << item << "into this one:" << this; + return; + } + + // Also, don't add items which are already present + if( childItems_.contains( item ) ) + { + kWarning() << "Tried to add twice item:" << item; + return; + } + + childItems_.append( item ); +} + + + +/** + * Return the row-th child of this item + * + * @param row Requested row + * @return Item at the requested position, or a null pointer + */ +ContactListModelItem *ContactListModelItem::child( int row ) +{ + if( row < 0 || row >= childItems_.count() ) + { + return 0; + } + + return childItems_.at( row ); +} + + + +/** + * Return a child Contact item + * + * This method can only be called on a Group node. + * + * @param handle Handle of the contact to find + * @return Item of the contact with the requested handle, or null + */ +ContactListModelItem *ContactListModelItem::childContact( const QString &handle ) +{ + // Prevent incorrect usage + if( itemType_ != ItemGroup ) + { + kWarning() << "Called childContact() on a non-group item:" << this; + return 0; + } + + foreach( ContactListModelItem *item, childItems_ ) + { + if( item->getType() == ItemContact + && static_cast( item->object() )->getHandle() == handle ) + { + return item; + } + } + + return 0; +} + + + +/** + * Return all Contact items in the tree matching a contact handle + * + * This method is made so that Contacts added in different Groups are all found (for example, + * a Contact may be in the Online group and in an user-defined group too). + * You cannot call this method from a Contact leaf. Calling it from a Group node will return + * a list with 0 or 1 items, depending if the Contact was found or not. + * + * @param handle Handle of the contact to find + * @return List of items with the requested Contact + */ +ModelItemList ContactListModelItem::childContacts( const QString &handle ) +{ + ModelItemList list; + + if( itemType_ == ItemRoot ) + { + foreach( ContactListModelItem *item, childItems_ ) + { + list << item->childContacts( handle ); + } + } + else if( itemType_ == ItemGroup ) + { + foreach( ContactListModelItem *item, childItems_ ) + { + if( item->getType() != ItemContact ) + { + kWarning() << "Invalid item in group" << this << ":" << item; + return ModelItemList(); + } + + if( static_cast( item->object() )->getHandle() == handle ) + { + list << item; + break; // Only one Contact for each Group :) + } + } + } + else + { + kWarning() << "Called childContacts() from a Contact item:" << this; + return ModelItemList(); + } + + return list; +} + + + +/** + * Return a child Group identified by its ID + * + * Can only be called from the root node. + * + * @param id Id of the requested group + * @return Node of the group or null + */ +ContactListModelItem *ContactListModelItem::childGroup( const QString &id ) +{ + // Prevent incorrect usage + if( itemType_ != ItemRoot ) + { + kWarning() << "Called childGroup() on a non-root item:" << this; + return 0; + } + + foreach( ContactListModelItem *item, childItems_ ) + { + if( item->getType() != ItemGroup ) + { + kWarning() << "Invalid item in root" << this << ":" << item; + return 0; + } + + if( static_cast( item->object() )->getId() == id ) + { + return item; + } + } + + return 0; +} + + + +// Return all Groups children +ModelItemList ContactListModelItem::childGroups() +{ + if( itemType_ != ItemRoot ) + { + return ModelItemList(); + } + + ModelItemList list; + foreach( ContactListModelItem *item, childItems_ ) + { + if( item->getType() == ItemGroup ) + { + list << item; + } + } + + return list; +} + + + +/** + * Return the number of children of this item + * + * @return int + */ +int ContactListModelItem::childCount() const +{ + return childItems_.count(); +} + + + +/** + * Return the number of data columns + * + * We only have and use one. Different data is returned depending on the given role. + * + * @return int + */ +int ContactListModelItem::columnCount() const +{ + return 1; +} + + + +/** + * Return a collection of data from this item + * + * The role selects which different piece of data will be extracted from the item; + * DisplayRole gets you the full map of item data, SearchRole a string to perform + * filtering during search, SortRole a numeric value used to sort the items. Other + * roles can be easily added if needed :) + * + * @param role Specify the kind of item data to obtain + * @return QVariant containing int, QMap or QString for the three columns respectively. + */ +const QVariant ContactListModelItem::data( int role ) const +{ + switch( role ) + { + // Output the sorting information + case SortRole: + { + int sortIndex; + + if( itemType_ == ItemContact ) + { + const Contact *contact = static_cast( object_ ); + sortIndex = 7000; // default sortIndex + + if( contact == 0 ) + { + return QVariant( sortIndex ); + } + + // Contacts are sorted by their status + switch( contact->getStatus() ) + { + case STATUS_ONLINE: sortIndex = 1000; break; + case STATUS_BE_RIGHT_BACK: sortIndex = 2000; break; + case STATUS_AWAY: sortIndex = 3000; break; + case STATUS_IDLE: sortIndex = 3000; break; + case STATUS_OUT_TO_LUNCH: sortIndex = 4000; break; + case STATUS_ON_THE_PHONE: sortIndex = 5000; break; + case STATUS_BUSY: sortIndex = 6000; break; + case STATUS_INVISIBLE: + case STATUS_OFFLINE: + default: sortIndex = 7000; break; + } + + // Add to the index the first character of the friendly name, so that + // when two contacts have the same status, there's a (rough but fast) + // sorting method + const QString& sortChar( contact->getFriendlyName().mid( 0, 1 ) ); + if( ! sortChar.isEmpty() ) + { + sortIndex += sortChar.at( 0 ).toUpper().toAscii(); + } + } + else if( itemType_ == ItemGroup ) + { + const Group *group = static_cast( object_ ); + sortIndex = 32766; // default sortIndex + + if( group == 0 ) + { + return QVariant( sortIndex ); + } + + const QString& groupId( group->getId() ); + + // These numbers are set so that the groups always come after the contacts in the root group + + // Non-special groups must be the first + if( ! group->isSpecialGroup() ) + { + sortIndex = 10000 + group->getSortPosition(); + } + // The Individuals group must come right after them + else if( groupId == SpecialGroups::INDIVIDUALS ) + { + sortIndex = 32762; + } + // The Online group must come right after it + else if( groupId == SpecialGroups::ONLINE ) + { + sortIndex = 32763; + } + // The Offline group must follow Online + else if( groupId == SpecialGroups::OFFLINE ) + { + sortIndex = 32764; + } + // Then the remaining special groups, Allowed + else if( groupId == SpecialGroups::ALLOWED ) + { + sortIndex = 32765; + } + // And Removed + else + { + sortIndex = 32766; + } + } + else + { + // Avoid crashing without hints + kWarning() << "Called data( SortRole ) on an invalid item: (see below)"; + kWarning() << this; + return QVariant( 0 ); + } + + return QVariant( sortIndex ); + } + break; + + // Return a string for full contact list search + case SearchRole: + { + if( itemType_ == ItemContact ) + { + const Contact *contact = static_cast( object_ ); + if( contact == 0 ) + { + return QVariant( QString() ); + } + + // Enable searching by email, friendly name, personal message and music + QString searchBy( contact->getHandle() + " " + + contact->getFriendlyName() + " " + + contact->getPersonalMessage() + " " + + contact->getCurrentMediaString() ); + + // Enable searching by email, true friendly name, and alias + if( contact->getExtension() && contact->getExtension()->getUseAlternativeName() ) + { + searchBy += " " + contact->getTrueFriendlyName(); + } + + return QVariant( searchBy ); + } + else if( itemType_ == ItemGroup ) + { + Group *group = static_cast( object_ ); + if( group == 0 ) + { + return QVariant( QString() ); + } + + return QVariant( group->getName() ); + } + else + { + // Avoid crashing without hints + kWarning() << "Called data( SearchRole ) on an invalid item: (see below)"; + kWarning() << this; + return QVariant( QString() ); + } + } + break; + + case DataRole: + { + ModelDataList itemData; + + // Fill the returned data map with a selection of useful contact information + if( itemType_ == ItemContact ) + { + Contact *contact = static_cast( object_ ); + if( contact == 0 ) + { + return QVariant( ModelDataList() ); + } + + itemData[ "type" ] = ItemContact; + itemData[ "handle" ] = contact->getHandle(); + itemData[ "friendly" ] = contact->getFriendlyName( STRING_CLEANED ); + itemData[ "friendlyFormatted" ] = contact->getFriendlyName( STRING_FORMATTED ); + itemData[ "trueFriendly" ] = contact->getTrueFriendlyName( STRING_CLEANED ); + itemData[ "trueFriendlyFormatted" ] = contact->getTrueFriendlyName( STRING_FORMATTED ); + itemData[ "personalMessage" ] = contact->getPersonalMessage( STRING_CLEANED ); + itemData[ "personalMessageFormatted" ] = contact->getPersonalMessage( STRING_FORMATTED ); + itemData[ "displayPicture" ] = contact->getContactPicturePath(); + itemData[ "groups" ] = contact->getGroupIds(); + itemData[ "mediaType" ] = contact->getCurrentMediaType(); + itemData[ "mediaString" ] = contact->getCurrentMediaString(); + itemData[ "status" ] = (int) contact->getStatus(); + itemData[ "isBlocked" ] = contact->isBlocked(); + itemData[ "isReverse" ] = contact->isReverse(); + itemData[ "clientName" ] = contact->getClientAppName(); + itemData[ "lastSeen" ] = contact->getExtension()->getLastSeen(); + itemData[ "lastMessage" ] = contact->getExtension()->getLastMessageDate(); + + if( parentNode_->object() ) + { + Group *group = static_cast( parentNode_->object() ); + if( group != 0 ) + { + itemData[ "group" ] = group->getId(); + itemData[ "isInSpecialGroup" ] = group->isSpecialGroup(); + } + } + else + { + itemData[ "group" ] = QString(); + itemData[ "isInSpecialGroup" ] = false; + } + } + else if( itemType_ == ItemGroup ) + { + // Get the item's group to retrieve its data + Group *group = static_cast( object_ ); + if( group == 0 ) + { + return QVariant( ModelDataList() ); + } + + // Find out how many of the group's contacts are online + uint numOnlineContacts = 0; + foreach( ContactListModelItem *item, childItems_ ) + { + if( item->getType() != ItemContact ) + { + continue; + } + + Contact *contact = static_cast( item->object() ); + + if( contact && contact->isOnline() ) + { + numOnlineContacts++; + } + } + + itemData[ "type" ] = ItemGroup; + itemData[ "id" ] = group->getId(); + itemData[ "name" ] = group->getName(); + itemData[ "onlineContacts" ] = QString::number( numOnlineContacts ); + itemData[ "totalContacts" ] = QString::number( childCount() ); + itemData[ "isExpanded" ] = group->isExpanded(); + itemData[ "isSpecialGroup" ] = group->isSpecialGroup(); + } + else if( itemType_ == ItemRoot ) + { + itemData[ "type" ] = ItemRoot; + } + else + { + // Avoid crashing without hints + kWarning() << "Called data( DisplayRole ) on an invalid item: (see below)"; + kWarning() << this; + return QVariant( ModelDataList() ); + } + + return QVariant( itemData ); + } + break; + + default: + // Called with an invalid role, do nothing + break; + } + + return QVariant( QString() ); +} + + + +/** + * Return the type of the internal stored object + * + * @return ItemType + */ +ContactListModelItem::ItemType ContactListModelItem::getType() const +{ + return itemType_; +} + + + +/** + * Move this item to another parent + * + * @param newParent New parent node. Can not be null + */ +void ContactListModelItem::moveTo( ContactListModelItem *newParent ) +{ + if( itemType_ == ItemRoot ) + { + kWarning() << "Called moveTo() on a root item! Item:" << this; + return; + } + + if( newParent == 0 ) + { + kWarning() << "Called moveTo() with an empty new parent! Item:" << this; + return; + } + + if( parentNode_ == 0 ) + { + kWarning() << "Called moveTo() on a parentless item! Item:" << this; + return; + } + + // Remove ourselves from the old node + parentNode_->removeChild( this ); + + // Add ourselves to the new node + newParent->appendChild( this ); + + // Change the internal parent pointer + parentNode_ = newParent; +} + + + +/** + * Return the stored object + * + * The object should be casted accordingly to the result of a getType() call. + * + * @return void* + */ +void *ContactListModelItem::object() const +{ + return object_; +} + + + +/** + * Get the parent node of this item + * + * @return Parent node + */ +ContactListModelItem *ContactListModelItem::parent() const +{ + return parentNode_; +} + + + +/** + * Remove a child item + * + * The child's object itself is not deleted, but is removed from the parent node only. + * You have to manually call delete on it after removal. + * + * @param child The item to delete + * @return int Number of deleted items (usually 0 or 1) + */ +int ContactListModelItem::removeChild( ContactListModelItem *child ) +{ + return childItems_.removeAll( child ); +} + + + +/** + * Get this item's position within the parent node + * + * @return int + */ +int ContactListModelItem::row() const +{ + if( itemType_ == ItemRoot || ! parentNode_ || parentNode_->childItems_.isEmpty() ) + { + kWarning() << "Called row() on a root item or an item with invalid parent! Item:" << this; + return 0; + } + + return parentNode_->childItems_.indexOf( const_cast( this ) ); +} + + + +/** + * Custom operator to display nodes and items in the debug output + * + * @param out Output debugging stream + * @param item Item to print + * @return QDebug The debug stream itself + */ +QDebug operator<<( QDebug out, const ContactListModelItem *item ) +{ + QString type; + Contact *contact; + Group *group; + + switch( item->getType() ) + { + case ContactListModelItem::ItemRoot: + type = "Root node"; + break; + + case ContactListModelItem::ItemGroup: + group = static_cast( item->object() ); + if( group ) + { + type = "Group node, id " + group->getId(); + } + else + { + type = "Group node, invalid object"; + } + break; + + case ContactListModelItem::ItemContact: + contact = static_cast( item->object() ); + + if( contact ) + { + type = "Contact node, handle " + contact->getHandle(); + } + else + { + type = "Contact node, invalid object"; + } + + if( item->parent()->getType() == ContactListModelItem::ItemRoot ) + { + type += " in root node"; + } + // Only the root node should have no parent, this is symptom of an error + else if( ! item->parent() ) + { + type += " without parent (!)"; + } + else + { + group = static_cast( item->parent()->object() ); + if( group ) + { + type += " in node " + group->getId(); + } + else + { + type += " within invalid node (!)"; + } + } + break; + + default: + type = "Unknown node type"; + break; + } + + out << type << "(at address" << QString::number( (qlonglong)item, 16 ) << ")"; + + return out; +} + + diff --git a/src/contact/contactlistmodelitem.h b/src/model/contactlistmodelitem.h similarity index 67% rename from src/contact/contactlistmodelitem.h rename to src/model/contactlistmodelitem.h index 94d794d..74043f2 100644 --- a/src/contact/contactlistmodelitem.h +++ b/src/model/contactlistmodelitem.h @@ -18,7 +18,6 @@ #ifndef CONTACTLISTMODELITEM_H #define CONTACTLISTMODELITEM_H -#include #include #include @@ -41,12 +40,15 @@ QDebug operator<<( QDebug s, const ContactListModelItem *item ); /** - * This class represent a Contact List node or item in the Model/View paradigm. + * This class represent a Contact List node or leaf in the Model/View paradigm. * * The Model is a way to universally represent data which could be reused later by different views: - * for example, the contact list, or a list of contacts available to be invited in a chat. - * The data output by the model can be easily expanded for future uses. - * A model's item doesn't contain anything. A node is an element which contains other nodes or items. + * for example, the contact list, or a list of contacts available to be invited in a chat. The data is + * organized in form of a tree, with a root element containing the user's groups, and the contacts within + * the groups. + * The Model Item is an element of the tree. It can assume the role of a root element, of a node (a group) or + * of a contact (a leaf). + * The data output by the model items can be easily expanded for future uses. * * @author Valerio Pilo * @ingroup Contact @@ -60,45 +62,55 @@ class ContactListModelItem , ItemGroup = 1 // Groups have this item type , ItemContact = 2 // Contacts have this type }; + enum DataRoles + { + DataRole = Qt::DisplayRole // Role used to retrieve the actual object data + , SortRole = Qt::UserRole + 1 // Role used to obtain sorting data + , SearchRole = Qt::UserRole + 2 // Role used to obtain searching data + }; public: // Public methods - // Contact constructor, creates a root node + // Contact constructor, creates a root item ContactListModelItem(); - // Contact constructor, creates a Contact node - ContactListModelItem( Contact *contact, ContactListModelItem *parent = 0 ); - // Group constructor, creates a Group node - ContactListModelItem( Group *group, ContactListModelItem *parent = 0 ); + // Contact constructor, creates a Contact item + explicit ContactListModelItem( Contact *contact, ContactListModelItem *parent = 0 ); + // Group constructor, creates a Group item + explicit ContactListModelItem( Group *group, ContactListModelItem *parent = 0 ); // Destructor ~ContactListModelItem(); - // Add a new child node - void appendChild( ContactListModelItem *child ); - // Return a child identified by its row + // Return a child item identified by its row ContactListModelItem *child( int row ); + // Return a child Contact identified by its handle + ContactListModelItem *childContact( const QString &handle ); // Return all Contact children identified by an handle - ModelItemList childContacts( QString handle ); + ModelItemList childContacts( const QString &handle ); // Return the number of children of this item int childCount() const; // Return a child Group identified by its ID - ContactListModelItem *childGroup( QString id ); + ContactListModelItem *childGroup( const QString &id ); + // Return all Groups children + ModelItemList childGroups(); // Return the number of data columns int columnCount() const; // Return a collection of data from this item - QVariant data( int column ) const; + const QVariant data( int role ) const; // Return the type of the internal stored object ItemType getType() const; - // Move a child item up or down the internal list - void moveChild( int movement, ContactListModelItem *item ); + // Move this item to another parent + void moveTo( ContactListModelItem *newParent ); // Return the stored object void *object() const; // Get the parent node of this item ContactListModelItem *parent() const; - // Remove a child item - void removeChild( ContactListModelItem *child ); // Get this item's position within the parent node int row() const; - // Set another node to be the parent of this item - void setParent( ContactListModelItem *newParent ); + + private: // Private methods + // Add a new child item + void appendChild( ContactListModelItem *child ); + // Remove a child item + int removeChild( ContactListModelItem *child ); private: // Private properties // The internal list of the item's children diff --git a/src/network/applications/application.cpp b/src/network/applications/application.cpp index 259d8f8..334b4f0 100644 --- a/src/network/applications/application.cpp +++ b/src/network/applications/application.cpp @@ -537,9 +537,9 @@ void Application::offerAcceptOrReject(const QString& appHtml) html += ""; html += "
    "; html += ""; - html += i18n( "Do you want to accept or cancel?", - "kmess://application/accept/" + handle + "?" + cookie, - "kmess://application/reject/" + handle + "?" + cookie ); + html += i18n( "Do you want to accept or cancel?", + "\"kmess://application/accept/" + handle + "?" + cookie + "\"", + "\"kmess://application/reject/" + handle + "?" + cookie + "\"" ); html += ""; // Send the message to the chat window. @@ -578,8 +578,8 @@ void Application::offerCancel(const QString& appHtml) html += ""; html += "
    "; html += ""; - html += i18n( "Click to cancel.", - "kmess://application/cancel/" + getContactHandle() + "?" + cookie ); + html += i18n( "Click to cancel.", + "\"kmess://application/cancel/" + getContactHandle() + "?" + cookie + "\"" ); html += ""; // Send the message to the chat window. diff --git a/src/network/applications/applicationlist.cpp b/src/network/applications/applicationlist.cpp index 30c30b3..476c64e 100644 --- a/src/network/applications/applicationlist.cpp +++ b/src/network/applications/applicationlist.cpp @@ -481,7 +481,7 @@ bool ApplicationList::contactLeftChat(bool userInitiated) MimeApplication * ApplicationList::createApplication(const MimeMessage &message) { MimeApplication *app = 0; - QString appGuid = message.getValue("Application-GUID"); + QString appGuid( message.getValue("Application-GUID") ); // If no GUID is found: if( appGuid.isEmpty() ) @@ -540,14 +540,14 @@ P2PApplication * ApplicationList::createApplication(const P2PMessage &message) P2PApplication *app = 0; // Extract the SLP data message - QString slpMessage = QString::fromUtf8( message.getData(), (int) message.getDataSize() ); + QString slpMessage( QString::fromUtf8( message.getData(), (int) message.getDataSize() ) ); if(! slpMessage.startsWith("INVITE")) { // Not an invite message // this belongs to another session, but gotMessage() couldn't find it. // Likely a P2PApplication object terminated prematurely. - QString preamble = slpMessage.left( qMin(slpMessage.indexOf(":"), 20) ); + QString preamble( slpMessage.left( qMin(slpMessage.indexOf(":"), 20) ) ); kWarning() << "P2P message can't be handled, detected SLP message but no INVITE. " "P2PApplication already terminated? " "(slp-preamble=" << preamble << @@ -983,7 +983,9 @@ void ApplicationList::gotMessage(const P2PMessage &message) } } } - else if( message.getFlags() != 0 && message.getDataSize() == 0 ) + else if( message.getFlags() != 0 + && message.getFlags() != P2PMessage::MSN_FLAG_OBJECT_DATA // WLM2009 uses 0x1000000 instead of 0x00. + && message.getDataSize() == 0 ) { // This can also be a connection handshake, even though it shouldn't appear at the switchboard. // That occurs when the connection was closed before that packet could be sent. @@ -1013,8 +1015,7 @@ void ApplicationList::gotMessage(const P2PMessage &message) // HACK: added for bot Bot2k3 4.1 (sends first ack without UniqueID, flags or any other context) kWarning() << "SwitchBoard P2P message has no ACK fields set at all, assuming base identifier message!"; } - else if( message.getFlags() == 0 - && message.getDataSize() > 0) // HACK: added size constraint for Bot2k3 4.1 (sends an empty message with a zero flag) + else if( message.isSlpData() ) { // It's a negotiation/MSNSLP message if( message.getDataOffset() > 0 ) @@ -1041,7 +1042,7 @@ void ApplicationList::gotMessage(const P2PMessage &message) } else { - QString callID = callRE.cap(1); + QString callID( callRE.cap(1) ); // See if it's a null-guid. // This happens for the out-of-band SLP "application/x-msnmsgr-transdestaddrupdate" and "application/x-msnmsgr-transudpswitch" messages. @@ -1139,7 +1140,9 @@ void ApplicationList::gotMessage(const P2PMessage &message) // If we didn't find the application, the message had bad fields // or we don't support the invitation type: - if( message.getFlags() != 0 && message.getDataSize() == 0 ) + if( message.getFlags() != 0 + && message.getFlags() != P2PMessage::MSN_FLAG_OBJECT_DATA // WLM2009 uses 0x1000000 instead of 0x00. + && message.getDataSize() == 0 ) { #ifdef KMESSDEBUG_APPLICATIONLIST_GENERAL kDebug() << "Not sending a P2P Error response for error message."; @@ -1459,7 +1462,7 @@ void ApplicationList::resumeApplications(bool /*isPrivateChat*/) */ void ApplicationList::sendMessage(const MimeApplication *source, const MimeMessage &messageData) { - QString messageBody = messageData.getFields(); + QString messageBody( messageData.getFields() ); #ifdef KMESSTEST // Check whether a QByteArray is passed. gcc is able to create the cast // because MimeMessage() has a constructor which accepts a QByteArray. diff --git a/src/network/applications/filetransfer.cpp b/src/network/applications/filetransfer.cpp index 49e1a43..83a1200 100644 --- a/src/network/applications/filetransfer.cpp +++ b/src/network/applications/filetransfer.cpp @@ -19,6 +19,7 @@ #include "filetransfer.h" +#include "../../utils/kmessconfig.h" #include "../../currentaccount.h" #include "../../kmessdebug.h" #include "../extra/msnftpconnection.h" @@ -60,7 +61,7 @@ FileTransfer::FileTransfer(const QString &contactHandle, const QString &filename , connectionEstablished_(false) , connectivity_('?') , file_(0) - , fileName_(filename) + , filePath_(filename) , msnFtpConnection_(0) , transferID_(-1) { @@ -71,6 +72,10 @@ FileTransfer::FileTransfer(const QString &contactHandle, const QString &filename // The destructor FileTransfer::~FileTransfer() { +#ifdef KMESSDEBUG_FILETRANSFER_GENERAL + kDebug(); +#endif + // Displays the cancel state in the transfer window TransferWindow::getInstance()->failTransfer( transferID_ ); @@ -93,16 +98,45 @@ void FileTransfer::connectMsnFtpConnection() KMESS_ASSERT( msnFtpConnection_ != 0 ); #endif - connect(msnFtpConnection_, SIGNAL( connectionEstablished() ) , // The direct connection was established - this, SLOT( slotMsnFtpConnectionEstablished() ) ); - connect(msnFtpConnection_, SIGNAL( statusMessage(QString,int) ) , // Display a message in the dialog/chat window - this, SLOT( slotMsnFtpStatusMessage(QString,int) ) ); - connect(msnFtpConnection_, SIGNAL( transferComplete() ) , // Signal that the transfer is complete - this, SLOT( slotMsnFtpTransferComplete() ) ); - connect(msnFtpConnection_, SIGNAL( transferFailed() ) , // Signal that the transfer failed (and clean up) - this, SLOT( slotMsnFtpTransferFailed() ) ); - connect(msnFtpConnection_, SIGNAL( transferProgess(unsigned long) ) , // Signal that the transfer made progress - this, SLOT( slotMsnFtpTransferProgess(unsigned long) ) ); + connect(msnFtpConnection_, SIGNAL( connectionEstablished() ) , // The direct connection was established + this, SLOT( slotMsnFtpConnectionEstablished() ) ); + connect(msnFtpConnection_, SIGNAL( statusMessage(QString,int) ) , // Display a message in the dialog/chat window + this, SLOT( slotMsnFtpStatusMessage(QString,int) ) ); + connect(msnFtpConnection_, SIGNAL( statusMessage(KLocalizedString,int) ) , // Display a message in the dialog/chat window + this, SLOT( slotMsnFtpStatusMessage(KLocalizedString,int) ) ); + connect(msnFtpConnection_, SIGNAL( transferComplete() ) , // Signal that the transfer is complete + this, SLOT( slotMsnFtpTransferComplete() ) ); + connect(msnFtpConnection_, SIGNAL( transferFailed() ) , // Signal that the transfer failed (and clean up) + this, SLOT( slotMsnFtpTransferFailed() ) ); + connect(msnFtpConnection_, SIGNAL( transferProgess(unsigned long) ) , // Signal that the transfer made progress + this, SLOT( slotMsnFtpTransferProgess(unsigned long) ) ); +} + + +/** + * The contact cancelled the session + */ +void FileTransfer::contactAborted(const QString &message) +{ +#ifdef KMESSDEBUG_FILETRANSFER_GENERAL + kDebug(); +#endif + Q_UNUSED( message ); + + // Displays the cancel state in the transfer window + TransferWindow::getInstance()->failTransfer( transferID_, i18n("Cancelled") ); + + // Also display it in chat + modifyOfferMessage(); + + if( message.isEmpty() ) + { + showEventMessage( getContactAbortMessage(), ChatMessage::CONTENT_APP_CANCELED, true ); + } + else + { + showEventMessage( message, ChatMessage::CONTENT_APP_CANCELED, true ); + } } @@ -113,17 +147,16 @@ void FileTransfer::contactStarted1_ContactInvitesUser(const MimeMessage& message #ifdef KMESSDEBUG_FILETRANSFER_GENERAL kDebug(); #endif - QString html; // Get the file name and size from the message - shortFileName_ = message.getValue("Application-File"); - fileSize_ = message.getValue("Application-FileSize").toInt(); - connectivity_ = '?'; + suggestedFileName_ = message.getValue("Application-File"); + fileSize_ = message.getValue("Application-FileSize").toInt(); + connectivity_ = '?'; // Get the optional fields. if( message.hasField("Connectivity") ) { - QString connectivity = message.getValue("Connectivity"); + QString connectivity( message.getValue("Connectivity") ); if( connectivity.size() > 0 ) { connectivity_ = connectivity.at(0).toLatin1(); @@ -131,12 +164,9 @@ void FileTransfer::contactStarted1_ContactInvitesUser(const MimeMessage& message } // Send the message to the chat window. - html = i18n("Do you want to accept the file: %1 (%2)", - "" + shortFileName_ + "", - toReadableBytes( fileSize_ ) - ); - - offerAcceptOrReject( html ); + offerAcceptOrReject( i18n( "The contact wants to send you a file: "%1" (%2).", + "" + suggestedFileName_ + "", + toReadableBytes( fileSize_ ) ) ); } @@ -145,85 +175,136 @@ void FileTransfer::contactStarted1_ContactInvitesUser(const MimeMessage& message void FileTransfer::contactStarted2_UserAccepts() { #ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kDebug(); + kDebug() << "Starting."; #endif #ifdef KMESSTEST - KMESS_ASSERT( file_ == 0 ); + KMESS_ASSERT( file_ == 0 ); + KMESS_ASSERT( filePath_.isEmpty() ); #endif - bool open; - QString startFolder; // QString::null by default - QString recentFolderTag = ":filedownload"; + QFileInfo fileInfo; - // Open a file dialog so that the user can save the file to a particular directory and name. - bool hasFile = false; - while( ! hasFile ) + // Open the options and get the default downloads directory + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "General" ); + QString startFolder( group.readEntry( "receivedFilesDir", QDir::homePath() ) ); + + if( group.readEntry( "useReceivedFilesDir", false ) && ! startFolder.isEmpty() ) { - // Set an initial path to the file - KUrl startDir = KFileDialog::getStartUrl( startFolder, recentFolderTag ); - startDir.addPath( shortFileName_ ); + int index = -1; - delayDeletion( true ); - - // Ask the user for a file. - fileName_ = KFileDialog::getSaveFileName( startDir.url() ); - - delayDeletion( false ); - if( isClosing() ) + do { - endApplication(); - return; + // The ++ ensures that at the next iteration a suffix is appended to the name + if( index++ < 0 ) + { + filePath_ = startFolder + "/" + suggestedFileName_; + } + else + { + fileInfo.setFile( suggestedFileName_ ); + filePath_ = startFolder + "/" + fileInfo.baseName() + "(" + QString::number( index ) + ")." + fileInfo.completeSuffix(); + } } + while( QFile::exists( filePath_ ) ); - if( fileName_.isNull() ) + fileInfo.setFile( filePath_ ); + fileName_ = fileInfo.fileName(); + } + else + { + // Ask the user to specify where to put the file + QString recentFolderTag( ":filedownload" ); + + // Open a file dialog so that the user can save the file to a particular directory and name. + bool hasFile = false; + while( ! hasFile ) { -#ifdef KMESSDEBUG_FILETRANSFER_GENERAL - kDebug() << "User cancelled in file save dialog"; + // Set an initial path to the file + KUrl startDir = KFileDialog::getStartUrl( startFolder, recentFolderTag ); + startDir.addPath( suggestedFileName_ ); + + delayDeletion( true ); + + // Ask the user for a file. + filePath_ = KFileDialog::getSaveFileName( startDir.url() ); + + delayDeletion( false ); + if( isClosing() ) + { + endApplication(); + return; + } + + if( filePath_.isNull() ) + { +#ifdef KMESSDEBUG_FILETRANSFER_P2P + kDebug() << "User cancelled in file save dialog"; #endif - // Dialog cancelled, cancel afterall - userRejected(); - return; - } + // Dialog cancelled, cancel afterall + modifyOfferMessage(); + userRejected(); + return; + } - hasFile = true; - QFileInfo fileinfo( fileName_ ); - QString shortName = fileinfo.fileName(); + hasFile = true; + fileInfo.setFile( filePath_ ); + fileName_ = fileInfo.fileName(); - // Check if the selected file exists and if the user wants to overwrite it. - // The while loop is for the prompt to keep appearing if the user - // chooses the same filename but does not want to overwrite the file. - if( QFile::exists(fileName_) ) - { - if( KMessageBox::warningContinueCancel( 0, - i18n("The file '%1' already exists.\ndo you want to overwrite it?", shortName), - i18n("Overwrite File"), KGuiItem( i18n("Over&write") ) ) == KMessageBox::Cancel ) + // Check if the selected file exists and if the user wants to overwrite it. + // The while loop is for the prompt to keep appearing if the user + // chooses the same filename but does not want to overwrite the file. + if( QFile::exists(filePath_) ) { - // User does not want to override - hasFile = false; - startFolder = fileinfo.path(); + if( KMessageBox::warningContinueCancel( 0, + i18n("The file "%1" already exists.\ndo you want to overwrite it?", fileName_ ), + i18n("Overwrite File"), KGuiItem( i18n("Over&write") ) ) == KMessageBox::Cancel ) + { + // User does not want to overwrite + hasFile = false; + startFolder = fileInfo.path(); + } } } } - // Create a file object, open for writing - file_ = new QFile(fileName_); - open = file_->open(QIODevice::WriteOnly); + // Now we try to open the file + file_ = new QFile(filePath_); + bool success = (file_ != 0) && file_->open(QIODevice::WriteOnly); - if(! open) + if( ! success ) { - // Important: undo what we created - delete file_; - file_ = 0; - fileName_ = QString::null; +#ifdef KMESSDEBUG_FILETRANSFER_P2P + kDebug() << "Cancelling session"; +#endif - // Cancel invitation afterall - slotMsnFtpStatusMessage( i18n("The transfer of %1 failed. Couldn't open file."), MsnFtpConnection::STATUS_CHAT ); - sendCancelMessage(CANCEL_FAILED); + // Notify the user, even if debug mode is not enabled. + kWarning() << "Unable to open file: " << filePath_ << "!"; + + // Close the file (also causes gotData() to fail) + delete file_; + file_ = 0; + + // Tell the user about it + modifyOfferMessage(); + showEventMessage( i18n("The transfer of file "%1" failed. Couldn't save the file.", + "" + fileName_ + ""), + ChatMessage::CONTENT_APP_FAILED, false + ); + + slotMsnFtpStatusMessage( i18n( "The transfer of %1 failed. Couldn't open the destination file." ), + MsnFtpConnection::STATUS_CHAT ); + + // Send 500 Internal Error back if we failed (this is still the accept stage) + sendCancelMessage( CANCEL_FAILED ); return; } +#ifdef KMESSDEBUG_FILETRANSFER_P2P + kDebug() << "Sending accept message"; +#endif + // All passed. Send the accept message MimeMessage message; message.addField( "Invitation-Command", "ACCEPT" ); @@ -248,7 +329,7 @@ void FileTransfer::contactStarted3_ContactConfirmsAccept(const MimeMessage& mess #endif #ifdef KMESSTEST KMESS_ASSERT( ! fileName_.isEmpty() ); - KMESS_ASSERT( ! shortFileName_.isEmpty() ); + KMESS_ASSERT( ! suggestedFileName_.isEmpty() ); KMESS_ASSERT( file_ != 0 ); KMESS_ASSERT( msnFtpConnection_ == 0 ); #endif @@ -288,7 +369,7 @@ void FileTransfer::contactStarted3_ContactConfirmsAccept(const MimeMessage& mess * Using IP-Address on Port and IP-Address-Internal on PortX-Internal should be sufficient. */ - QString externalIp = getExternalIp(); + QString externalIp( getExternalIp() ); if(ip == externalIp) { // The other client must be at the same network..! @@ -310,8 +391,7 @@ void FileTransfer::contactStarted3_ContactConfirmsAccept(const MimeMessage& mess #endif // Initialize the MSNFTP connection - msnFtpConnection_ = new MsnFtpConnection(); - msnFtpConnection_->setAuthInfo( CurrentAccount::instance()->getHandle(), authCookie ); + msnFtpConnection_ = new MsnFtpConnection( CurrentAccount::instance()->getHandle(), authCookie ); connectMsnFtpConnection(); // Initialize the progess dialog @@ -332,11 +412,35 @@ QString FileTransfer::getAppId() -// Return a cancel message to display +/** + * Return a cancel message to display. + */ +QString FileTransfer::getContactAbortMessage() const +{ + // Application::getUserAbortMessage() returns "The contact cancelled the session". + return i18n("The contact has cancelled the transfer of file "%1".", ( fileName_.isEmpty() ? suggestedFileName_ : fileName_ ) ); +} + + + +/** + * Return a cancel message to display. + */ QString FileTransfer::getUserAbortMessage() const { // Application::getUserAbortMessage() returns "You have cancelled the session". - return i18n("The transfer was cancelled"); + return i18n( "You have cancelled the transfer of file "%1".", ( fileName_.isEmpty() ? suggestedFileName_ : fileName_ ) ); +} + + + +/** + * Return a cancel message to display. + */ +QString FileTransfer::getUserRejectMessage() const +{ + // Application::getUserAbortMessage() returns "You have cancelled the session". + return i18n( "You have rejected the transfer of file "%1".", ( fileName_.isEmpty() ? suggestedFileName_ : fileName_ ) ); } @@ -389,6 +493,33 @@ void FileTransfer::slotMsnFtpConnectionEstablished() +// Display a status message (as a raw localization string) +void FileTransfer::slotMsnFtpStatusMessage( KLocalizedString message, int statusType ) +{ + // Parse the %1 placeholder for file name + switch( statusType ) + { + case MsnFtpConnection::STATUS_DIALOG: + case MsnFtpConnection::STATUS_DIALOG_FAILED: + message = message.subs( fileName_ ); + break; + + // A message to display in the chat window + case MsnFtpConnection::STATUS_CHAT_FAILED: + message = message.subs( "" + fileName_ + "" ); + break; + case MsnFtpConnection::STATUS_CHAT: + default: + message = message.subs( "" + fileName_ + "" ); + break; + } + + // Call the real handler with the completed localization string + slotMsnFtpStatusMessage( message.toString(), statusType ); +} + + + // Display a status message void FileTransfer::slotMsnFtpStatusMessage(QString message, int statusType) { @@ -399,23 +530,14 @@ void FileTransfer::slotMsnFtpStatusMessage(QString message, int statusType) switch(statusType) { - // A message for the transfer dialog + // A message for the transfer window case MsnFtpConnection::STATUS_DIALOG: { - // Parse %1 placeholder for filename, and display the message in the transfer window - if( message.contains("%1") ) - { - message = message.arg( fileName_ ); - } TransferWindow::getInstance()->setStatusMessage( transferID_, message ); break; } case MsnFtpConnection::STATUS_DIALOG_FAILED: { - if( message.contains("%1") ) - { - message = message.arg( fileName_ ); - } TransferWindow::getInstance()->failTransfer( transferID_, message ); break; } @@ -423,14 +545,12 @@ void FileTransfer::slotMsnFtpStatusMessage(QString message, int statusType) // A message to display in the chat window case MsnFtpConnection::STATUS_CHAT_FAILED: { - if(message.contains("%1")) message = message.arg("" + shortFileName_ + ""); showEventMessage( message, ChatMessage::CONTENT_APP_FAILED, ! isUserStartedApp() ); break; } case MsnFtpConnection::STATUS_CHAT: default: { - if(message.contains("%1")) message = message.arg("" + shortFileName_ + ""); showEventMessage( message, ChatMessage::CONTENT_APP_FAILED, ! isUserStartedApp() ); break; } @@ -449,18 +569,22 @@ void FileTransfer::slotMsnFtpTransferComplete() // Displays the success in the transfer window TransferWindow::getInstance()->finishTransfer( transferID_ ); - QFileInfo fileinfo( fileName_ ); - QString shortName = fileinfo.fileName(); - QString fileURL = "" + shortName + ""; + // Send an event to the chat + QString fileURL( "" + "" + fileName_ + "" + "" ); - showEventMessage( i18n( "Successfully transferred file: %1", - "" + fileURL + "" - ), - ChatMessage::CONTENT_APP_ENDED, ! isUserStartedApp() - ); - - // Terminate this application - endApplication(); + // Show an appropriate message + QString message; + if( isUserStartedApp() ) + { + message = i18n( "Successfully sent file "%1".", fileURL ); + } + else + { + message = i18n( "Successfully received file "%1".", fileURL ); + } + showEventMessage( message, ChatMessage::CONTENT_APP_ENDED, ! isUserStartedApp() ); } @@ -564,7 +688,6 @@ void FileTransfer::userAborted() // MsnFtpConnection already does the same thing. // Finally delete this object - showEventMessage( getUserAbortMessage(), ChatMessage::CONTENT_APP_FAILED, false ); endApplication(); return; } @@ -591,62 +714,66 @@ void FileTransfer::userStarted1_UserInvitesContact() kDebug(); #endif #ifdef KMESSTEST - KMESS_ASSERT( ! fileName_.isEmpty() ); + KMESS_ASSERT( ! filePath_.isEmpty() ); #endif QString sizeString; MimeMessage message; - // Get a short file name so slotMsnFtpStatusMessage() can use that. - QFileInfo fileinfo( fileName_ ); - shortFileName_ = fileinfo.fileName(); + file_ = new QFile(filePath_); + bool success = (file_ != 0) && file_->open(QIODevice::ReadOnly); - // Create a file object - file_ = new QFile(fileName_); - - // Open the file for reading - bool open = file_->open(QIODevice::ReadOnly); - if( ! open ) + // Stop if the file can't be openend. + if( ! success ) { - // Notify the user, even if debug mode is not enabled. - kWarning() << "Unable to open file: " << fileName_ << "!"; +#ifdef KMESSDEBUG_FILETRANSFER_P2P + kDebug() << "Cancelling session"; +#endif - // Important: undo what we created + // Notify the user, even if debug mode is not enabled. + kWarning() << "Unable to open file: " << filePath_ << "!"; + + // Close the file delete file_; file_ = 0; - // Leave - if( ! QFile::exists(fileName_) ) + // Tell the user about it + if( ! QFile::exists(filePath_) ) { - slotMsnFtpStatusMessage( i18n("The transfer of %1 failed. The file does not exist."), MsnFtpConnection::STATUS_CHAT ); + showEventMessage( i18n( "The transfer of file "%1" failed. The file does not exist.", + "" + filePath_ + ""), ChatMessage::CONTENT_APP_CANCELED, false ); } else { - slotMsnFtpStatusMessage( i18n("The transfer of %1 failed. The file could not be read."), MsnFtpConnection::STATUS_CHAT ); + showEventMessage( i18n( "The transfer of file "%1" failed. The file could not be read.", + "" + filePath_ + ""), ChatMessage::CONTENT_APP_CANCELED, false ); } - - endApplication(); return; } + // Set the short file name + QFileInfo fileInfo( filePath_ ); + fileName_ = fileInfo.fileName(); - // Get the file parameters for the message - fileSize_ = file_->size(); - sizeString = QString::number(fileSize_); + // Read the file parameters + fileSize_ = (uint)file_->size(); + sizeString = QString::number(fileSize_); // Create the invitation message // connectivity_ = 'U'; // Or 'N' if the port is mapped with NAT - message.addField( "Application-Name", "File Transfer" ); - message.addField( "Application-GUID", getAppId() ); - message.addField( "Invitation-Command", "INVITE" ); - message.addField( "Invitation-Cookie", getCookie() ); - message.addField( "Application-File", shortFileName_ ); - message.addField( "Application-FileSize", sizeString ); + message.addField( "Application-Name", "File Transfer" ); + message.addField( "Application-GUID", getAppId() ); + message.addField( "Invitation-Command", "INVITE" ); + message.addField( "Invitation-Cookie", getCookie() ); + message.addField( "Application-File", fileName_ ); + message.addField( "Application-FileSize", sizeString ); // message.addField( "Connectivity", connectivity_ ); sendMessage( message ); // Give the user the option of cancelling the transfer - offerCancel( i18n("Sending file %1", "" + shortFileName_ + "") ); + offerCancel( i18n( "Sending file "%1" (%2).", + "" + fileName_ + "", + toReadableBytes( fileSize_ ) ) ); } @@ -669,14 +796,15 @@ void FileTransfer::userStarted2_ContactAccepts(const MimeMessage& /*message*/) modifyOfferMessage(); // Create a message showing that the transfer was accepted. - showEventMessage( i18n("Transfer accepted."), ChatMessage::CONTENT_APP_STARTED, true ); + showEventMessage( i18n( "The contact has accepted the transfer of file "%1".", fileName_ ), + ChatMessage::CONTENT_APP_STARTED, + true ); // Get the authorisation cookie to use authCookie = generateCookie(); // Initialize the msnftp connection class - msnFtpConnection_ = new MsnFtpConnection(); - msnFtpConnection_->setAuthInfo(getContactHandle(), authCookie); + msnFtpConnection_ = new MsnFtpConnection( getContactHandle(), authCookie ); connectMsnFtpConnection(); // Get the IP,port to use diff --git a/src/network/applications/filetransfer.h b/src/network/applications/filetransfer.h index 9da35be..e5304a9 100644 --- a/src/network/applications/filetransfer.h +++ b/src/network/applications/filetransfer.h @@ -24,6 +24,8 @@ #include +#include + class MsnFtpConnection; class QFile; @@ -47,6 +49,8 @@ class FileTransfer : public MimeApplication FileTransfer(const QString &contactHandle, const QString &filename); // The destructor virtual ~FileTransfer(); + // The contact cancelled the session + void contactAborted( const QString &message ); // Return the application's GUID static QString getAppId(); // The user cancelled the session @@ -62,7 +66,11 @@ class FileTransfer : public MimeApplication // Step three of a contact-started chat: the contact confirms the accept void contactStarted3_ContactConfirmsAccept(const MimeMessage& message); // Return a cancel message to display + QString getContactAbortMessage() const; + // Return a cancel message to display QString getUserAbortMessage() const; + // Return a cancel message to display. + QString getUserRejectMessage() const; // Create and initilize the progress dialog. void initializeProgressDialog(bool incoming = false); // Convert a string to some more readable form @@ -81,6 +89,8 @@ class FileTransfer : public MimeApplication void slotMsnFtpConnectionEstablished(); // Display a status message void slotMsnFtpStatusMessage(QString message, int statusType); + // Display a status message (as a raw localization string) + void slotMsnFtpStatusMessage( KLocalizedString message, int statusType ); // Signal that the transfer was succesful void slotMsnFtpTransferComplete(); // Signal that the transfer failed @@ -98,12 +108,14 @@ class FileTransfer : public MimeApplication QFile *file_; // The complete file name QString fileName_; + // Full path of the file where the data should be stored. + QString filePath_; // The file size in bytes unsigned long fileSize_; // The server socket which listens for incoming connections. MsnFtpConnection *msnFtpConnection_; - // The short file name - QString shortFileName_; + // The suggested file name + QString suggestedFileName_; // The ID of this transfer, used by the Transfer Window int transferID_; }; diff --git a/src/network/applications/filetransferp2p.cpp b/src/network/applications/filetransferp2p.cpp index 61c886e..5f9fcfe 100644 --- a/src/network/applications/filetransferp2p.cpp +++ b/src/network/applications/filetransferp2p.cpp @@ -118,8 +118,8 @@ void FileTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &mess // First stage of the file transfer: initiate the session // Read the values from the message - unsigned long int appID = message.getValue("AppID").toUInt(); - QString context = message.getValue("Context"); + unsigned long int appID = message.getValue("AppID").toUInt(); + QString context( message.getValue("Context") ); if(appID != 2) { @@ -196,7 +196,7 @@ void FileTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &mess // Generate a default preview icon // The "preview_" value is displayed later in the transfer window too. KIconLoader *loader = KIconLoader::global(); - QString iconTitle = KMimeType::iconNameForUrl( KUrl( suggestedFileName_ ) ); + QString iconTitle ( KMimeType::iconNameForUrl( KUrl( suggestedFileName_ ) ) ); preview_ = QImage( loader->iconPath( iconTitle, 48, false ) ); // Save as PNG for encoding @@ -230,19 +230,18 @@ void FileTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage &mess // Everything seams OK, allow the user to accept the file. // Generate accept message - QString html = i18n( "The contact wants to send you a file: "%1" (%2).", - "" + suggestedFileName_ + "", - toReadableBytes( fileSize_ ) - ); + QString html( i18n( "The contact wants to send you a file: "%1" (%2).", + "" + suggestedFileName_ + "", + toReadableBytes( fileSize_ ) ) ); // Add preview to the top if( ! noPreview ) { - QString imageHtml = "\""
    "; - html = imageHtml + html; + html.prepend( "\""" + "
    " ); } @@ -275,26 +274,24 @@ void FileTransferP2P::contactStarted2_UserAccepts() // Open the options and get the default downloads directory KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "General" ); - QString startFolder( group.readEntry( "receivedFilesDir", QDir::homePath() ) ); + QString startFolder( group.readEntry( "receivedFilesDir", QDir::homePath() ) + "/" ); if( group.readEntry( "useReceivedFilesDir", false ) && ! startFolder.isEmpty() ) { - int index = -1; - - do + QString suffix; + int nextNumber = 0; + fileInfo.setFile( suggestedFileName_ ); + if( KMessShared::selectNextFile( startFolder, fileInfo.baseName(), suffix, + fileInfo.completeSuffix(), nextNumber ) ) { - // The ++ ensures that at the next iteration a suffix is appended to the name - if( index++ < 0 ) - { - filePath_ = startFolder + "/" + suggestedFileName_; - } - else - { - fileInfo.setFile( suggestedFileName_ ); - filePath_ = startFolder + "/" + fileInfo.baseName() + "(" + QString::number( index ) + ")." + fileInfo.completeSuffix(); - } + // The file already exists, choose the next one + filePath_ = startFolder + fileInfo.baseName() + "." + QString::number( nextNumber ) + "." + fileInfo.completeSuffix(); + } + else + { + // New file, use the suggested name + filePath_ = startFolder + suggestedFileName_; } - while( QFile::exists( filePath_ ) ); fileInfo.setFile( filePath_ ); fileName_ = fileInfo.fileName(); @@ -302,7 +299,7 @@ void FileTransferP2P::contactStarted2_UserAccepts() else { // Ask the user to specify where to put the file - QString recentFolderTag = ":filedownload"; + QString recentFolderTag( ":filedownload" ); // Open a file dialog so that the user can save the file to a particular directory and name. bool hasFile = false; @@ -331,6 +328,7 @@ void FileTransferP2P::contactStarted2_UserAccepts() #endif // Dialog cancelled, cancel afterall + modifyOfferMessage(); userRejected(); return; } @@ -381,7 +379,7 @@ void FileTransferP2P::contactStarted2_UserAccepts() ); // Send 500 Internal Error back if we failed (this is still the accept stage) - sendCancelMessage(CANCEL_ABORT); + sendCancelMessage(CANCEL_FAILED); return; } @@ -473,12 +471,9 @@ QString FileTransferP2P::createContextField( const QFile *fileData, bool usePrev << ( usePreview ? "with thumbnail." : "without thumbnail." ); #endif - // Create the short name - uint shortNameLength = fileName_.length(); - - // Get the file data (preview - ulong filesize = fileData->size(); - int flags = (hasPreview ? 0 : 1); + // Get the file data and preview + quint32 filesize = (quint32) fileData->size(); + int flags = (hasPreview ? 0 : 1); // Determine the context length int length = 574; // Somehow MSN always uses 550 bytes for the filename (+24 for the size of fields 1-6). @@ -493,14 +488,7 @@ QString FileTransferP2P::createContextField( const QFile *fileData, bool usePrev P2PMessage::insertBytes( context, flags, 16 ); // Field 4: 1 if NO preview data // Field 5: the file name - const unsigned short * utf16Name = fileName_.utf16(); - int offset = 20; - for(uint i = 0; i < shortNameLength; ++i) - { - P2PMessage::insertShortBytes(context, utf16Name[i], offset); - offset += 2; - } - + P2PMessage::insertUtf16String( context, fileName_, 20 ); P2PMessage::insertBytes(context, 0xFFFFFFFF, 570); // Field 6: some splitter field. // Insert preview data @@ -511,7 +499,7 @@ QString FileTransferP2P::createContextField( const QFile *fileData, bool usePrev // Encode the context QByteArray encodedContext = context.toBase64(); - QString base64Context = QString::fromUtf8( encodedContext.data(), encodedContext.size() ); + QString base64Context( QString::fromUtf8( encodedContext.data(), encodedContext.size() ) ); #ifdef KMESSDEBUG_FILETRANSFER_P2P kDebug() << "Context size=" << context.size() << " base64 size=" << base64Context.length() << "."; @@ -557,7 +545,7 @@ QString FileTransferP2P::getAppId() */ QString FileTransferP2P::getContactAbortMessage() const { - // Application::getUserAbortMessage() returns "The contact cancelled the session". + // Application::getContactAbortMessage() returns "The contact cancelled the session". return i18n("The contact has cancelled the transfer of file "%1".", ( fileName_.isEmpty() ? suggestedFileName_ : fileName_ ) ); } @@ -574,6 +562,17 @@ QString FileTransferP2P::getUserAbortMessage() const +/** + * Return a cancel message to display. + */ +QString FileTransferP2P::getUserRejectMessage() const +{ + // Application::getUserAbortMessage() returns "You have cancelled the session". + return i18n( "You have rejected the transfer of file "%1".", ( fileName_.isEmpty() ? suggestedFileName_ : fileName_ ) ); +} + + + /** * Called when data is received. * Once all data is received, the SLP BYE message will be sent. @@ -664,10 +663,10 @@ void FileTransferP2P::showTransferComplete() // Displays the success in the transfer window TransferWindow::getInstance()->finishTransfer( transferID_ ); - // Send an event to the switchboard - QString fileURL = "" - "" + fileName_ + "" - ""; + // Send an event to the chat + QString fileURL( "" + "" + fileName_ + "" + "" ); // Show an appropriate message QString message; @@ -836,6 +835,7 @@ void FileTransferP2P::userStarted1_UserInvitesContact() } + /** * @brief Called when the thumbnail is generated. */ @@ -843,18 +843,14 @@ void FileTransferP2P::userStarted1_gotThumbnailResult() { bool hasPreview = thumbnailProvider_->isSuccessful(); - // Create the session id and context field - QString context = createContextField( file_, hasPreview ); - uint sessionID = (uint)KMessShared::generateID(); - // Send the invitation - sendSlpSessionInvitation(sessionID, getAppId(), 2, context); - + QString context( createContextField( file_, hasPreview ) ); + sendSlpSessionInvitation( KMessShared::generateID(), getAppId(), 2, context ); // Generate the HTML to cancel the transfer - QString html = i18n( "Sending file "%1" (%2).", + QString html( i18n( "Sending file "%1" (%2).", "" + fileName_ + "", - toReadableBytes( fileSize_ ) ); + toReadableBytes( fileSize_ ) ) ); // Generate fallback image so there is always an icon in the chat window. diff --git a/src/network/applications/filetransferp2p.h b/src/network/applications/filetransferp2p.h index 54e04cb..6a549f2 100644 --- a/src/network/applications/filetransferp2p.h +++ b/src/network/applications/filetransferp2p.h @@ -74,6 +74,8 @@ class FileTransferP2P : public P2PApplication QString getContactAbortMessage() const; // Return a cancel message to display. QString getUserAbortMessage() const; + // Return a cancel message to display. + QString getUserRejectMessage() const; // Called when data is received void gotData(const P2PMessage &message); // Show the file transfer dialog diff --git a/src/network/applications/inktransferp2p.cpp b/src/network/applications/inktransferp2p.cpp index 596001b..d91a465 100644 --- a/src/network/applications/inktransferp2p.cpp +++ b/src/network/applications/inktransferp2p.cpp @@ -59,6 +59,7 @@ InkTransferP2P::~InkTransferP2P() */ void InkTransferP2P::gotData(const P2PMessage &message) { + kDebug() << "Received data..."; // Write the data in the buffer. bool success = writeP2PDataToFile( message, &inkBuffer_ ); if( ! success ) @@ -84,7 +85,7 @@ void InkTransferP2P::showTransferComplete() // Read the complete string. It's transmitted in multi byte format. const QByteArray &bufferDataUcs2 = inkBuffer_.data(); - QString bufferData = QString::fromUtf16( reinterpret_cast( bufferDataUcs2.data() ), bufferDataUcs2.size() / 2 ); + QString bufferData( QString::fromUtf16( reinterpret_cast( bufferDataUcs2.data() ), bufferDataUcs2.size() / 2 ) ); // When a MimeMessage is sent over P2P, // there is a null-terminator after the head and body parts. @@ -121,7 +122,7 @@ void InkTransferP2P::showTransferComplete() } // Get body - QString mimeBody = bufferData.mid( bodyStart, bodyEnd - bodyStart ); + QString mimeBody( bufferData.mid( bodyStart, bodyEnd - bodyStart ) ); // Emit the signal. emit inkReceived( mimeBody, getContactHandle() ); diff --git a/src/network/applications/inktransferp2p.h b/src/network/applications/inktransferp2p.h index d3b4761..a3ce433 100644 --- a/src/network/applications/inktransferp2p.h +++ b/src/network/applications/inktransferp2p.h @@ -51,11 +51,11 @@ class InkTransferP2P : public P2PApplication virtual ~InkTransferP2P(); // Read the buffer, send the inkReceived() signal. - virtual void showTransferComplete(); + void showTransferComplete(); protected: // Called when data is received - virtual void gotData( const P2PMessage &message ); + void gotData( const P2PMessage &message ); signals: // Signal that an ink image was received. diff --git a/src/network/applications/mimeapplication.cpp b/src/network/applications/mimeapplication.cpp index cf93c61..7c0ed5a 100644 --- a/src/network/applications/mimeapplication.cpp +++ b/src/network/applications/mimeapplication.cpp @@ -40,11 +40,53 @@ MimeApplication::~MimeApplication() +/** + * @brief The contact aborted the session + * + * @param message Optional message to display, defaults to getContactAbortMessage(). + */ +void MimeApplication::contactAborted(const QString &message) +{ +#ifdef KMESSDEBUG_APPLICATION + kDebug(); +#endif + + // Make sure a second message is not displayed here. + // The contact could be sending multiple error messages. + if( isClosing() ) + { + kWarning() << "Attempted to close application twice " + "(contact=" << getContactHandle() << + " action=endapplication)"; + + // Make sure the timer is started again. + endApplication(); + return; + } + + + // Remove the accept links + modifyOfferMessage(); + + if( message.isEmpty() ) + { + showEventMessage( getContactAbortMessage(), ChatMessage::CONTENT_APP_CANCELED, true ); + } + else + { + showEventMessage( message, ChatMessage::CONTENT_APP_CANCELED, true ); + } + + endApplication(); +} + + + // Generate a random session ID QString MimeApplication::generateSessionId() const { // The official client only changes the session ID if you quit the application. - QString sessionId = "{6672F94C-45BF-11D7-B4AE-00010A1008DF}"; + QString sessionId( "{6672F94C-45BF-11D7-B4AE-00010A1008DF}" ); #ifdef KMESSDEBUG_MIMEAPPLICATION kDebug() << "Generated session ID " << sessionId << "."; @@ -74,12 +116,12 @@ void MimeApplication::gotMessage(const MimeMessage& message) kDebug() << "An application message was received"; #endif - QString invitationCommand = message.getValue("Invitation-Command"); + QString invitationCommand( message.getValue("Invitation-Command") ); if(invitationCommand == "INVITE") { // This is the start of a contact-started app. Get the app's cookie - QString cookie = message.getValue("Invitation-Cookie"); + QString cookie( message.getValue("Invitation-Cookie") ); startByInvite(cookie); contactStarted1_ContactInvitesUser(message); } @@ -99,7 +141,7 @@ void MimeApplication::gotMessage(const MimeMessage& message) else if(invitationCommand == "CANCEL") { // The contact canceled the app. - QString cancelCode = message.getValue("Cancel-Code"); + QString cancelCode( message.getValue("Cancel-Code") ); if(cancelCode == "REJECT" ) { @@ -207,4 +249,78 @@ void MimeApplication::sendCancelMessage(const ApplicationCancelReason cancelReas } +/** + * @brief Called when the user aborted the application. + * + * Displays a message using getUserAbortMessage() and notifies the contact. + * + * This method may be overwritten to add additional event handling. + */ +void MimeApplication::userAborted() +{ +#ifdef KMESSDEBUG_MIMEAPPLICATION + kDebug() << "user requests to abort the session."; +#endif + + // Make sure a second message is not displayed here. + if( isClosing() ) + { + kWarning() << "Attempted to close application twice " + " contact=" << getContactHandle() << + " class=" << metaObject()->className() << + " action=endapplication)"; + + endApplication(); + return; + } + + // Display abort message + modifyOfferMessage(); + showEventMessage( getUserAbortMessage(), ChatMessage::CONTENT_APP_CANCELED, false ); + + // Send cancel message. + // Prepares the application to abort. + sendCancelMessage( CANCEL_ABORT ); + + // Set the state to avoid crashes. + setClosing( true ); +} + + + +/** + * @brief Called when the user rejected (declined) the application. + * + * Displays a message using getUserRejectMessage() and notifies the contact. + */ +void MimeApplication::userRejected() +{ + if( isClosing() ) + { +#ifdef KMESSDEBUG_MIMEAPPLICATION + kWarning() << "Attempted to close application twice " + " contact=" << getContactHandle() << + " class=" << metaObject()->className() << + " action=endapplication)"; +#endif + + endApplication(); + return; + } + +#ifdef KMESSDEBUG_MIMEAPPLICATION + kDebug() << "user requests to reject the invitation."; +#endif + + // Send abort messages + modifyOfferMessage(); + showEventMessage( getUserRejectMessage(), ChatMessage::CONTENT_APP_CANCELED, false ); + sendCancelMessage( CANCEL_INVITATION ); + + // Set the state to avoid crashes. + setClosing( true ); +} + + + #include "mimeapplication.moc" diff --git a/src/network/applications/mimeapplication.h b/src/network/applications/mimeapplication.h index 395341b..b13b833 100644 --- a/src/network/applications/mimeapplication.h +++ b/src/network/applications/mimeapplication.h @@ -44,8 +44,12 @@ class MimeApplication : public Application // The descructor virtual ~MimeApplication(); + // The contact aborted the session + virtual void contactAborted( const QString &message = QString() ); // Parse a received message (implements a pure virtual method) void gotMessage(const MimeMessage& message); + // The user aborted the application + virtual void userAborted(); protected: // Return the session ID, generating one if it doesn't exist @@ -54,6 +58,8 @@ class MimeApplication : public Application void sendCancelMessage(const ApplicationCancelReason cancelReason); // Send a message to the contact void sendMessage(const MimeMessage& message); + // The user rejected (declined) the application + virtual void userRejected(); private: // Private methods // Generate a random session ID diff --git a/src/network/applications/msnobjecttransferp2p.cpp b/src/network/applications/msnobjecttransferp2p.cpp index 237900f..10eac07 100644 --- a/src/network/applications/msnobjecttransferp2p.cpp +++ b/src/network/applications/msnobjecttransferp2p.cpp @@ -90,7 +90,7 @@ void MsnObjectTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage // Extract the fields from the message unsigned long int appID = message.getValue("AppID").toUInt(); - QString context = message.getValue("Context"); + QString context( message.getValue("Context") ); // Extract the MSNObject from the context field, to determine which picture/emoticon the contact wants @@ -153,7 +153,10 @@ void MsnObjectTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage // But don't use "default" so the check remains intact. case MsnObject::BACKGROUND: case MsnObject::DELUXE_DISPLAYPIC: + break; case MsnObject::WINK: + contactStarted1_gotWinkRequest(); + return; case MsnObject::VOICECLIP: case MsnObject::ROAMING_OBJECT: break; @@ -209,7 +212,7 @@ void MsnObjectTransferP2P::contactStarted1_gotDisplayPictureRequest() */ void MsnObjectTransferP2P::contactStarted1_gotEmoticonRequest() { - QString themePath = EmoticonManager::instance()->getThemePath( true ); + QString themePath( EmoticonManager::instance()->getThemePath( true ) ); // Find if there is a picture named as the one the contact wants QFile pictureFile( themePath + msnObject_.getLocation() ); @@ -255,6 +258,27 @@ void MsnObjectTransferP2P::contactStarted1_gotEmoticonRequest() +// Step one continued, the request is for an wink. +void MsnObjectTransferP2P::contactStarted1_gotWinkRequest() +{ + fileName_ = KMessConfig::instance()->getMsnObjectFileName( msnObject_ ); + +#ifdef KMESSDEBUG_MSNOBJECTTRANSFER_P2P + kDebug() << "Requested wink, sending: " + fileName_; +#endif + + if( QFile::exists( fileName_ ) ) + { + contactStarted2_UserAccepts(); + return; + } + + // Abort the sending because the file doesn't exist + sendCancelMessage( CANCEL_FAILED ); +} + + + /** * Step two of a contact-started chat: the user accepts. */ @@ -447,7 +471,7 @@ void MsnObjectTransferP2P::showTransferComplete() if( KMESS_NULL(file_) ) return; bool success = false; - QString pictureFileName = file_->fileName(); + QString pictureFileName( file_->fileName() ); // Don't send an ACK here, it's already ACK-ed // (with a special BYE-request ACK) @@ -457,7 +481,7 @@ void MsnObjectTransferP2P::showTransferComplete() file_->close(); // Check if the received image is valid. Will cost some CPU though. - QString fileHash = KMessShared::generateFileHash( pictureFileName ).toBase64(); + QString fileHash( KMessShared::generateFileHash( pictureFileName ).toBase64() ); success = ( msnObject_.getDataHash() == fileHash ); // Clean up @@ -500,6 +524,32 @@ void MsnObjectTransferP2P::showTransferComplete() } break; + case MsnObject::WINK: + { + // Read the stamp value, there is the certificate of the wink + // This is a X509 certificate, signed by the Microsoft + // If this value is missing, we can show the wink anyway and be able to sent it to no WLM clients + const QString& stamp( msnObject_.getAttribute( QString( "stamp" ), msnObject_.objectString() ) ); + if( stamp.isEmpty() ) + { + break; + } + + // Write the stamp value to the file. Note that if we doens't write this value + // we can't send the wink to WLM, because it checks for the certificate + QFile file( pictureFileName + ".stamp" ); + if ( ! file.open(QIODevice::WriteOnly | QIODevice::Text ) ) + { + break; + } + + QTextStream out(&file); + out << stamp; + out.flush(); + file.close(); + break; + } + // Avoid gcc warnings. default: break; diff --git a/src/network/applications/msnobjecttransferp2p.h b/src/network/applications/msnobjecttransferp2p.h index 6116777..1c4ccba 100644 --- a/src/network/applications/msnobjecttransferp2p.h +++ b/src/network/applications/msnobjecttransferp2p.h @@ -73,6 +73,8 @@ class MsnObjectTransferP2P : public P2PApplication void contactStarted1_gotDisplayPictureRequest(); // Step one continued, the request is for an emoticon. void contactStarted1_gotEmoticonRequest(); + // Step one continued, the request is for an wink. + void contactStarted1_gotWinkRequest(); // Step two of a contact-started chat: the user accepts void contactStarted2_UserAccepts(); // Step three of a contact-started chat: the contact confirms the accept diff --git a/src/network/applications/msnremotedesktop.cpp b/src/network/applications/msnremotedesktop.cpp index 23ad614..88a0faf 100644 --- a/src/network/applications/msnremotedesktop.cpp +++ b/src/network/applications/msnremotedesktop.cpp @@ -120,8 +120,8 @@ void MsnRemoteDesktop::contactStarted3_ContactConfirmsAccept(const MimeMessage& */ // Dummy, we don't know the values yet - QString login = "User-0925"; - QString password = "4557"; + QString login ( "User-0925" ); + QString password( "4557" ); // Create the context message contextMessage.addField( "Invitation-Command", "Context" ); diff --git a/src/network/applications/p2papplication.cpp b/src/network/applications/p2papplication.cpp index 40ae140..b941cdd 100644 --- a/src/network/applications/p2papplication.cpp +++ b/src/network/applications/p2papplication.cpp @@ -283,7 +283,7 @@ const QString& P2PApplication::getInvitationContentType() const * * @return The 'SessionID' field from the SLP payload of the invitation message. */ -unsigned long P2PApplication::getInvitationSessionID() const +quint32 P2PApplication::getInvitationSessionID() const { return invitationSessionID_; } @@ -299,7 +299,7 @@ unsigned long P2PApplication::getInvitationSessionID() const * * @return The session ID field used in the binary P2P header. */ -unsigned long P2PApplication::getSessionID() const +quint32 P2PApplication::getSessionID() const { return sessionID_; } @@ -450,6 +450,15 @@ void P2PApplication::gotAck(const P2PMessage &message, const P2PMessageType acke "waitingState=" << (int) getWaitingState() << " ackedMessageType=" << ackedMessageType << "."; #endif + // See if the derived class needs to handle this ack. + if( gotUnhandledAck( message, ackedMessageType ) ) + { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Message is handled by gotUnhandledAck(), no further action needed."; +#endif + return; + } + // Avoid warnings when we're waiting for something else, and the ACK is not important. if( isWaitingState( P2P_WAIT_FOR_CONNECTION ) ) { @@ -646,9 +655,7 @@ void P2PApplication::gotAck_slpSessionInvitation() // Continue to wait for the contact to send the accept message (SLP OK). setWaitingState( P2P_WAIT_CONTACT_ACCEPT, P2PAPPLICATION_TIMEOUT_ACCEPT ); - - // note KMess uses a fixed time user to accept/decline here. - // WLM8 has no timeout here for file transfer. + stopWaitingTimer(); } @@ -870,9 +877,15 @@ void P2PApplication::gotData(const P2PMessage &/*message*/) * @brief Called internally after all data is received. * * It determines how to continue the session. + * + * It's possible to overwrite this method. + * However don't forget to class this parent method too + * if you want to make sure the BYE message is sent/received properly. */ -void P2PApplication::gotDataAckSent() +void P2PApplication::gotDataComplete( const P2PMessage &lastMessage ) { + Q_UNUSED( lastMessage ); + // Determine what to send next if(isUserStartedApp()) { @@ -931,7 +944,7 @@ void P2PApplication::gotDirectConnectionHandshake(const P2PMessage &message) MsnDirectConnection *directConnection = applicationList_->getDirectConnection(); // Get connection info - QString nonce = message.getNonce(); + QString nonce ( message.getNonce() ); bool isServer = directConnection->isServer(); // Verify the nonce @@ -1155,7 +1168,7 @@ void P2PApplication::gotNegotiationMessage(const MimeMessage &slpMessage, const { // Parse the "negotiation message" (P2PMessage with sessionID 0) // Verify it is indeed directed to us.. - QString msgTo = slpMessage.getValue("To"); + QString msgTo( slpMessage.getValue("To") ); if(! msgTo.isEmpty()) { @@ -1353,6 +1366,7 @@ void P2PApplication::gotSlpBye( const MimeMessage &slpMessage ) // means that both clients have finished sending, so don't issue errors. This fixes the double message // "transfer completed" followed by "transfer canceled" when sending files to Mercury Messenger. + setCurrentMessageType( P2P_MSG_SESSION_BYE ); sendP2PAck(); bool isComplete = isTransferComplete(); // TODO: this only works for incoming data. @@ -1467,7 +1481,7 @@ void P2PApplication::gotSlpInvite(const MimeMessage &slpMessage) MimeMessage slpMimeBody( slpMessage.getBody() ); // Set global fields from INVITE message. - QString slpVia = slpMessage.getValue("Via"); + QString slpVia ( slpMessage.getValue("Via") ); callID_ = slpMessage.getValue("Call-ID"); invitationCSeq_ = slpMessage.getValue("CSeq").toInt(); invitationContentType_ = slpMessage.getValue("Content-Type"); @@ -1490,6 +1504,7 @@ void P2PApplication::gotSlpInvite(const MimeMessage &slpMessage) if( invitationContentType_ == "application/x-msnmsgr-sessionreqbody" ) { // Send the ACK message + setCurrentMessageType( P2P_MSG_SESSION_INVITATION ); sendP2PAck(); // Client invites us for a session @@ -1499,6 +1514,7 @@ void P2PApplication::gotSlpInvite(const MimeMessage &slpMessage) else if( invitationContentType_ == "application/x-msnmsgr-transreqbody" ) { // Send the ACK message + setCurrentMessageType( P2P_MSG_TRANSFER_INVITATION ); sendP2PAck(); // Client requested to transfer the session @@ -1508,6 +1524,7 @@ void P2PApplication::gotSlpInvite(const MimeMessage &slpMessage) else if( invitationContentType_ == "application/x-msnmsgr-transrespbody" ) { // Send the ACK message + setCurrentMessageType( P2P_MSG_TRANSFER_INVITATION ); sendP2PAck(); // Client sent a second invitation to become a direct-connection server because we can't be. @@ -1573,7 +1590,7 @@ void P2PApplication::gotSlpOk(const MimeMessage &slpMessage) setWaitingState( P2P_WAIT_DEFAULT, 0 ); // Parse the data of the message - QString contentType = slpMessage.getValue("Content-Type"); + QString contentType( slpMessage.getValue("Content-Type") ); MimeMessage slpMimeBody( slpMessage.getBody() ); // body consists of more mime fields @@ -1585,6 +1602,10 @@ void P2PApplication::gotSlpOk(const MimeMessage &slpMessage) KMESS_ASSERT( slpMimeBody.getValue("SessionID").toULong() == getSessionID() ); #endif + // Send ACK now, with proper message type. + setCurrentMessageType( P2P_MSG_SESSION_OK ); + sendP2PAck(); + // Tell the derived class the invitation was accepted userStarted2_ContactAccepts(slpMimeBody); } @@ -1592,12 +1613,18 @@ void P2PApplication::gotSlpOk(const MimeMessage &slpMessage) // HACK: allow transreqbody too for broken clients, including KMess 1.4.2: (contentType == "application/x-msnmsgr-transreqbody" && slpMimeBody.hasField("Nonce") )) { + // Send ACK now, with proper message type. + setCurrentMessageType( P2P_MSG_TRANSFER_OK ); + sendP2PAck(); + // Message tells us how we can create the direct connection. // This response is handled here, so it's transparent for the derived class. gotSlpTransferResponse( slpMimeBody ); } else { + sendP2PAck(); + // Unsupported response type. kWarning() << "Received unexpected 200/OK message " "(type=" << contentType << @@ -1657,7 +1684,7 @@ Context: PG1zbm9ia.. void P2PApplication::gotSlpSessionInvitation( const MimeMessage &slpMimeBody ) { // Read requested session id from the message - invitationSessionID_ = slpMimeBody.getValue("SessionID").toULong(); + invitationSessionID_ = slpMimeBody.getValue("SessionID").toUInt(); // Don't accept invites if we sent one. if( ! isFirstMessageSent() && isUserStartedApp() ) @@ -1740,8 +1767,8 @@ void P2PApplication::gotSlpStatus(const MimeMessage &slpMessage, const QString & // Parse the preamble QRegExp re("MSNSLP/\\d+\\.\\d+ (\\d+) ([^\r\n]+)"); re.indexIn( preamble ); - int code = re.cap(1).toUInt(); - QString detail = re.cap(2); + int code = re.cap(1).toUInt(); + QString detail( re.cap(2) ); // Reset the waiting state if we were waiting. @@ -1756,11 +1783,12 @@ void P2PApplication::gotSlpStatus(const MimeMessage &slpMessage, const QString & // If the invitation was accepted case 200: // We don't need to do much here: - // The message will be ACK-ed automatically with the correct session ID + // The message will be ACK-ed with the correct session ID automatically // because that ID was given in the sendSlpInvitation() method. - - // This the first ACK to be sent with the SessionID set. - sendP2PAck(); + // That will be the first ACK to be sent with the SessionID set. + + // NOTE: sendAck() is not called here, but in gotSlpOk() so + // it can set setCurrentMessageType() before the sendAck() call. // Parse in separate function gotSlpOk( slpMessage ); @@ -1769,6 +1797,7 @@ void P2PApplication::gotSlpStatus(const MimeMessage &slpMessage, const QString & // We sent a bad address in the to: header case 404: + setCurrentMessageType( P2P_MSG_SLP_ERROR ); sendP2PAck(); // Inform the user KMess has an error @@ -1784,6 +1813,7 @@ void P2PApplication::gotSlpStatus(const MimeMessage &slpMessage, const QString & // Somehow a message was sent twice (e.g. BYE) // or the contact aborts exactly when all data is being received + acked (so we sent the BYE). case 481: // No Such Call + setCurrentMessageType( P2P_MSG_SLP_ERROR ); sendP2PAck(); // Content-Type of this message is "application/x-msnmsgr-session-failure-respbody" @@ -1800,6 +1830,7 @@ void P2PApplication::gotSlpStatus(const MimeMessage &slpMessage, const QString & // Something was not supported case 500: + setCurrentMessageType( P2P_MSG_SLP_ERROR ); sendP2PAck(); // Content-Type of this message is application/x-msnmsgr-session-failure-respbody @@ -1831,6 +1862,7 @@ void P2PApplication::gotSlpStatus(const MimeMessage &slpMessage, const QString & // The invitation was declined case 603: + setCurrentMessageType( P2P_MSG_SESSION_DECLINE ); // FIXME test if it's a transfer decline or not (like gotSlpOk()). sendP2PAck(); // Contact Declined @@ -2013,15 +2045,15 @@ void P2PApplication::gotSlpTransferInvitation(const MimeMessage &slpMimeBody) bool startListening = false; // Get network details - QString localIp = getLocalIp(); - QString externalIp = getExternalIp(); + QString localIp ( getLocalIp() ); + QString externalIp( getExternalIp() ); // Read the data from the message - QString bridges = slpMimeBody.getValue("Bridges"); // Transport layers the client supports -// int netID = slpMimeBody.getValue("NetID").toInt(); // Some ID, unused - QString connectionType = slpMimeBody.getValue("Conn-Type"); // Suggested connection type - QString hasUPnPNat = slpMimeBody.getValue("UPnPNat"); // uses UPnP-enabled NAT router - QString hasICF = slpMimeBody.getValue("ICF"); // uses Internet Connection Firewall + QString bridges ( slpMimeBody.getValue( "Bridges" ) ); // Transport layers the client supports +// int netID = slpMimeBody.getValue("NetID").toInt(); // Some ID, unused + QString connectionType ( slpMimeBody.getValue( "Conn-Type") ); // Suggested connection type + QString hasUPnPNat ( slpMimeBody.getValue( "UPnPNat" ) ); // uses UPnP-enabled NAT router + QString hasICF ( slpMimeBody.getValue( "ICF" ) ); // uses Internet Connection Firewall // Based on the contact's network configuration, @@ -2403,6 +2435,28 @@ void P2PApplication::gotSlpTransferResponse(const MimeMessage &slpMimeBody, bool +/** + * @brief Called when an ack is received, which is not handled internally. + * + * This method can be overwritten by the derived class, in case it needs to handle a specific ack message. + * + * @return Whether the ack was handled by this method. + */ +bool P2PApplication::gotUnhandledAck( const P2PMessage &message, P2PMessageType ackedMessageType ) +{ + Q_UNUSED( message ); + Q_UNUSED( ackedMessageType ); + +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL + kDebug() << "Not handling the unknown ack"; +#endif + + // Derived class can implement some handling. + return false; +} + + + /** * @brief Notify the derived class it can initiate the file transfer. * @@ -2728,12 +2782,12 @@ void P2PApplication::sendSlpBye() #endif // Handle - QString myHandle = CurrentAccount::instance()->getHandle(); + QString myHandle( CurrentAccount::instance()->getHandle() ); // Determine content. // In the last, the official client only had "\r\n\0" as content (length = 3). - QString contentType = "application/x-msnmsgr-sessionclosebody"; - QString content = "SessionID: " + QString::number( sessionID_ ) + "\r\n\r\n\0"; + QString contentType ( "application/x-msnmsgr-sessionclosebody" ); + QString content ( "SessionID: " + QString::number( sessionID_ ) + "\r\n\r\n\0" ); uint contentLength = content.length(); // Create the message @@ -2787,14 +2841,13 @@ void P2PApplication::sendSlpError( const QString &statusLine, #ifdef KMESSTEST // Test, as other invocations likely result in undefined client behavour - // ( KMESS_ASSERT( gotSlpMessage_ ); - KMESS_ASSERT( isWaitingState( P2P_WAIT_DEFAULT ) ); + KMESS_ASSERT( isWaitingState( P2P_WAIT_DEFAULT ) || isWaitingState( P2P_WAIT_USER_ACCEPT ) ); KMESS_ASSERT( ! callID_.isEmpty() ); KMESS_ASSERT( ! branch_.isEmpty() ); #endif - QString myHandle = CurrentAccount::instance()->getHandle(); + QString myHandle( CurrentAccount::instance()->getHandle() ); // Determine Content-Type and Content-Length fields QString content; @@ -2896,10 +2949,10 @@ void P2PApplication::sendSlpInvitation(const MimeMessage &message, const QString #endif // Mime message conversion - QString mimeBody = message.getFields(); + QString mimeBody( message.getFields() ); // Content handles - QString myHandle = CurrentAccount::instance()->getHandle(); + QString myHandle( CurrentAccount::instance()->getHandle() ); // Generate identifiers if( callID_.isNull() ) @@ -2975,10 +3028,10 @@ void P2PApplication::sendSlpOkMessage(const MimeMessage &message) // Get message content and Content-Type bool gotTransferInvitation = (invitationContentType_ == "application/x-msnmsgr-transreqbody"); - QString content = message.getFields(); - QString contentType = (gotTransferInvitation ? "application/x-msnmsgr-transrespbody" : invitationContentType_); + QString content ( message.getFields() ); + QString contentType( (gotTransferInvitation ? "application/x-msnmsgr-transrespbody" : invitationContentType_) ); - QString myHandle = CurrentAccount::instance()->getHandle(); + QString myHandle( CurrentAccount::instance()->getHandle() ); // Send the SLP OK message to tell the other client you'd like to start the transfer. QString slpMessage; @@ -3048,7 +3101,7 @@ void P2PApplication::sendSlpOkMessage(const MimeMessage &message) * @param appId The numeric app-Id value, which also identifies the application type. * @param context The context field. */ -void P2PApplication::sendSlpSessionInvitation( ulong sessionID, const QString &eufGuid, const int appId, const QString &context ) +void P2PApplication::sendSlpSessionInvitation( quint32 sessionID, const QString &eufGuid, const int appId, const QString &context ) { // Create the message MimeMessage invitation; @@ -3166,7 +3219,7 @@ void P2PApplication::sendSlpTransferInvitation() /** * Assign a fixed session ID (used for p2p ink transfers) */ -void P2PApplication::setDataCastSessionID( unsigned long sessionID ) +void P2PApplication::setDataCastSessionID( quint32 sessionID ) { #ifdef KMESSTEST KMESS_ASSERT( sessionID_ == 0 ); @@ -3340,6 +3393,9 @@ void P2PApplication::showTimeoutMessage( P2PWaitingState waitingState ) // Each case calling endApplication() contains a "return;" // All debug cases use "break;" so the final endApplication() is called. + // Clear any active invitation links first + modifyOfferMessage(); + // Put a message at the console switch( waitingState ) { @@ -3543,7 +3599,7 @@ void P2PApplication::userAborted() // Make sure a second message is not displayed here. if( isClosing() ) { - kWarning() << "P2PApplication::userAborted: Attempted to close application twice " + kWarning() << "Attempted to close application twice " "(state=" << (int) getWaitingState() << " contact=" << getContactHandle() << " session=" << sessionID_ << @@ -3612,7 +3668,7 @@ void P2PApplication::userRejected() if( isClosing() ) { #ifdef KMESSDEBUG_APPLICATION - kWarning() << "P2PApplication::userAborted: Attempted to close application twice " + kWarning() << "Attempted to close application twice " "(state=" << (int) getWaitingState() << " contact=" << getContactHandle() << " session=" << sessionID_ << @@ -3626,8 +3682,9 @@ void P2PApplication::userRejected() } else { - +#ifdef KMESSDEBUG_APPLICATION kDebug() << "user requests to reject the invitation."; +#endif // Send abort messages modifyOfferMessage(); diff --git a/src/network/applications/p2papplication.h b/src/network/applications/p2papplication.h index 96b7073..61d156c 100644 --- a/src/network/applications/p2papplication.h +++ b/src/network/applications/p2papplication.h @@ -127,7 +127,7 @@ class P2PApplication : public P2PApplicationBase // Returns the nonce that's being expected. const QString & getNonce() const; // Returns the session ID. - unsigned long getSessionID() const; + quint32 getSessionID() const; // The user cancelled the session virtual void userAborted(); @@ -141,21 +141,25 @@ class P2PApplication : public P2PApplicationBase // Return the content type read from the invitation message const QString& getInvitationContentType() const; // Return the session id read from the invitation message - unsigned long getInvitationSessionID() const; + quint32 getInvitationSessionID() const; // Called when data is received virtual void gotData(const P2PMessage &message); + // Called when all data is received, and the ack is sent. + virtual void gotDataComplete( const P2PMessage &lastMessage ); + // Called when an ack is received, which is not handled by the normal class. + virtual bool gotUnhandledAck( const P2PMessage &message, P2PMessageType ackedMessageType ); // Send a cancel message void sendCancelMessage(const ApplicationCancelReason cancelReason); // Send the data preparation ACK. void sendDataPreparationAck(); // Send the invitation for a normal session - void sendSlpSessionInvitation( ulong sessionID, const QString &eufGuid, const int appId, const QString &context ); + void sendSlpSessionInvitation( quint32 sessionID, const QString &eufGuid, const int appId, const QString &context ); // Send the invitation for a direct connection. void sendSlpTransferInvitation(); // Send an SLP 200/OK message void sendSlpOkMessage(const MimeMessage &message); // Assign a fixed session ID (used for p2p ink transfers) - void setDataCastSessionID( unsigned long sessionID ); + void setDataCastSessionID( quint32 sessionID ); // The user rejected the invitation virtual void userRejected(); @@ -182,10 +186,6 @@ class P2PApplication : public P2PApplicationBase void gotAck_slpTransferInvitation(); // Called when the ACK for the SLP transfer OK mesages was received. void gotAck_slpTransferOk(); - // Called when all data is received. - void gotDataAckSent(); - // Called when all data is received. - void gotDataComplete(); // Called when the data preparation message is received void gotDataPreparation(const P2PMessage &message); // Got an direct connection handshake. @@ -245,11 +245,11 @@ class P2PApplication : public P2PApplicationBase // CSeq field from the invitation message int invitationCSeq_; // SessionID field from the invitaiton message - unsigned long invitationSessionID_; + quint32 invitationSessionID_; // The nonce for direct connections QString nonce_; // Session ID, identifies the session at MSNP2P level. - unsigned long sessionID_; + quint32 sessionID_; // True if the user needs to acknowledge the data preparation message. (doesn't send an ACK automatically) bool userShouldAcknowledge_; }; diff --git a/src/network/applications/p2papplicationbase.cpp b/src/network/applications/p2papplicationbase.cpp index 0ee8f78..33d2802 100644 --- a/src/network/applications/p2papplicationbase.cpp +++ b/src/network/applications/p2papplicationbase.cpp @@ -86,6 +86,7 @@ P2PApplicationBase::P2PApplicationBase(ApplicationList *applicationList) lastIncomingMessage_.sessionID = 0; lastIncomingMessage_.totalSize = 0; lastIncomingMessage_.ackSessionID = 0; + lastIncomingMessage_.footerCode = 0; // Initiaize the timer waitingTimer_ = new QTimer(this); @@ -286,7 +287,7 @@ P2PApplicationBase::UnAckedMessage * P2PApplicationBase::getUnAckedMessage(const } // Also attempt to match on the messageID alone if: - // - it's a 0x80 message. In this case sendP2PMessage() has overwritten the previous uniqueID. + // - it's a 0x80 message. In this case sendP2PMessageImpl() has overwritten the previous uniqueID. // - the UniqueID is not set. (also happens with normal ack messages in GAIM 1.5). // // This happens with 0x01 control messages: @@ -368,6 +369,148 @@ P2PApplicationBase::P2PWaitingState P2PApplicationBase::getWaitingState() const * * @param message The received data message. */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + void P2PApplicationBase::gotDataFragment(const P2PMessage &message) { #ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL @@ -486,22 +629,18 @@ void P2PApplicationBase::gotDataFragment(const P2PMessage &message) else { #ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kDebug() << "Got the last fragment. About to send ACK, but calling showTransferComplete() first so it can still abort."; + kDebug() << "Got the last fragment. Sending ack, calling gotDataComplete() and showTransferComplete()."; #endif // After all data is received, ACK it and send the BYE - shouldSendAck_ = true; // could be false if received out of order. - - // Signal derived class the transfer is complete - // By calling this first, the derived class can confirm the data transfer was successful. - showTransferComplete(); - - // If the derived class didn't send a message, send the ACK ourselves. // TODO: if the messages were received out of order, should we ACK the final message instead? - if( shouldSendAck_ ) - { - sendP2PAckImpl(); - } + shouldSendAck_ = true; // could be false if received out of order. + sendP2PAckImpl(); + + // Notify the derived class, so it can process it's buffered data. + // The P2PApplication class also uses this to send the SLP BYE if needed. + setWaitingState( P2P_WAIT_DEFAULT, 0 ); + gotDataComplete( message ); // For datacast applications (ink), request termination immediately. if( getMode() == APP_MODE_DATACAST ) @@ -509,12 +648,33 @@ void P2PApplicationBase::gotDataFragment(const P2PMessage &message) #ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL kDebug() << "Application is a datacast handler, request termination immediately."; #endif + // FIXME we must decide if it's better implement in derived ink class the method + // gotDataComplete called few lines above or keep showTransferComplete(). Also we check + // if it's possible to move this code fragment ( from if statement ) over the "sendP2PAckImp()" + // line and figure out if the send Ack is necessary also for INK... + showTransferComplete(); endApplication(); return; } - // Determine what to send next - gotDataAckSent(); + // Warn if developers mess up with gotDataComplete() + // e.g. forget to call the parent P2PApplication::gotDataComplete() method to send the BYE. + if( waitingState_ == P2P_WAIT_DEFAULT ) + { + kWarning() << "The overwritten gotDataComplete() method did not send anything, nor changed the waiting state, " + "(contact=" << getContactHandle() << + " session=" << getSessionID() << + " class=" << metaObject()->className() << + ")."; + } + + // Signal derived class the transfer is complete + showTransferComplete(); + + // Next, either the derived class: + // - terminated this object, or + // - sent the SLP BYE, or + // - waits for the SLP BYE from the contact. } } @@ -677,9 +837,8 @@ void P2PApplicationBase::gotMessage(const P2PMessage &p2pMessage) if( getMode() == APP_MODE_ERROR_HANDLER ) { // Make an exception for SLP packets - bool isSlpMessage = (p2pMessage.getSessionID() == 0 && - p2pMessage.getDataSize() > 20 && // for cvs produced data-preparation messages without a session-id - p2pMessage.getFlags() == 0); + bool isSlpMessage = ( p2pMessage.isSlpData() && + p2pMessage.getDataSize() > 20 ); // for cvs produced data-preparation messages without a session-id if(! isSlpMessage) { // We received an unknown control message, this object was initialized to send the correct response. @@ -798,6 +957,7 @@ void P2PApplicationBase::gotMessage(const P2PMessage &p2pMessage) lastIncomingMessage_.sessionID = p2pMessage.getSessionID(); lastIncomingMessage_.totalSize = p2pMessage.getTotalSize(); lastIncomingMessage_.ackSessionID = p2pMessage.getAckSessionID(); + lastIncomingMessage_.footerCode = 0; // Special cases (abuse of the P2P system) @@ -812,7 +972,7 @@ void P2PApplicationBase::gotMessage(const P2PMessage &p2pMessage) // Session ID is 0? -> the clients negotiate for session. if(p2pMessage.getSessionID() == 0) { - if(p2pMessage.getFlags() == 0) + if( p2pMessage.isSlpData() ) { // Parse the fragment gotNegotiationFragment(p2pMessage); @@ -841,15 +1001,14 @@ void P2PApplicationBase::gotMessage(const P2PMessage &p2pMessage) else { // Check for data preparation messages - if( p2pMessage.getFlags() == 0 - && p2pMessage.getDataSize() == 4 - && p2pMessage.getTotalSize() == 4 ) + if( p2pMessage.isDataPreparation() ) { shouldSendAck_ = true; + lastIncomingMessage_.messageType = P2P_MSG_DATA_PREPARATION; gotDataPreparation(p2pMessage); } else if( waitingState_ != P2P_WAIT_FOR_FILE_DATA - && p2pMessage.isMsnObjectData() + && p2pMessage.isData() && p2pMessage.getDataSize() == 4 && p2pMessage.getTotalSize() == 4 ) { @@ -861,17 +1020,18 @@ void P2PApplicationBase::gotMessage(const P2PMessage &p2pMessage) " session=" << getSessionID() << " class=" << metaObject()->className() << ")!"; shouldSendAck_ = true; + lastIncomingMessage_.messageType = P2P_MSG_DATA_PREPARATION; gotDataPreparation(p2pMessage); } - // Check for data messages - else if(p2pMessage.isMsnObjectData() - || p2pMessage.isFileData()) + // Check for normal data messages + else if( p2pMessage.isData() ) { + lastIncomingMessage_.messageType = P2P_MSG_DATA; gotDataFragment(p2pMessage); } - else if(waitingState_ == P2P_WAIT_FOR_FILE_DATA - && p2pMessage.getFlags() == 0 - && p2pMessage.isFragment()) + else if( waitingState_ == P2P_WAIT_FOR_FILE_DATA + && p2pMessage.getFlags() == 0 + && p2pMessage.isFragment()) { // HACK: added for Kopete 0.9.2 code (has no flag set with data messages). kWarning() << "Expecting data message, " @@ -880,8 +1040,22 @@ void P2PApplicationBase::gotMessage(const P2PMessage &p2pMessage) " contact=" << getContactHandle() << " session=" << getSessionID() << " class=" << metaObject()->className() << ")!"; + lastIncomingMessage_.messageType = P2P_MSG_DATA; gotDataFragment(p2pMessage); } + else if( p2pMessage.getFlags() == 0 + && p2pMessage.getDataSize() >= 18 + && ( p2pMessage.getData()[0] == '\x80' // start of each webcam data message + || fragmentTracker_.getMessageID() == p2pMessage.getMessageID() ) // continuation of setup message ()) TODO: add native support for "data streams" in this base class. + ) + { + // Webcam setup. Even WLM sends this without flags. + // At the switchboard the "footercode" is set to 4. + // Pass it to the WebcamTransferP2P class to deal with it. + lastIncomingMessage_.messageType = P2P_MSG_WEBCAM_SETUP; + lastIncomingMessage_.footerCode = 4; // FIXME: direct assumption. + gotDataFragment( p2pMessage ); + } else { // Unknown p2p message @@ -968,9 +1142,9 @@ void P2PApplicationBase::gotNegotiationFragment(const P2PMessage &p2pMessage) // Remove the first preamble line, because it's not in MIME format. // Parse the remaining as MIME fields. - int preambleEnd = slpData.indexOf("\r\n"); - QString preamble = slpData.left( (preambleEnd == -1) ? 20 : preambleEnd ); - QString slpMimePart = slpData.mid( (preambleEnd == -1) ? 0 : preambleEnd + 2 ); + int preambleEnd = slpData.indexOf("\r\n"); + QString preamble ( slpData.left( (preambleEnd == -1) ? 20 : preambleEnd ) ); + QString slpMimePart ( slpData.mid ( (preambleEnd == -1) ? 0 : preambleEnd + 2 ) ); MimeMessage slpMessage( slpMimePart ); // Parse the negotiation message @@ -1187,14 +1361,14 @@ void P2PApplicationBase::sendData(QIODevice *dataSource, P2PDataType dataType) // Reserve the next message ID. nextMessageID_++; - // Set the total size field, this causes sendP2PMessage() + // Set the total size field, this causes sendP2PMessageImpl() // to handle fragmented messages correctly. // The 'fragmentMessageID_' is set so KMess sends all fragments with the same message ID. // It could happen the client receives a SLP ACK meanwhile, and ACKs it with a new message ID. // The current fragmented message should not be affected. fragmentMessageID_ = nextMessageID_; fragmentOffset_ = 0; - fragmentTotalSize_ = dataSource->size(); + fragmentTotalSize_ = (quint32) qAbs( dataSource->size() ); // Inform the application list this application wants to send a file. // It will call sendNextDataParts() each time the connection or switchboard can accept new packets. @@ -1220,7 +1394,7 @@ void P2PApplicationBase::sendDataPreparation() // TODO: Check the various footer codes send for certain transfers. QByteArray p2pMessage( 4, 0x00 ); - sendP2PMessage(p2pMessage, 0, 1, P2P_MSG_DATA_PREPARATION); + sendP2PMessageImpl( p2pMessage, 0, P2P_TYPE_PICTURE, P2P_MSG_DATA_PREPARATION ); // TODO: after the data preparation is sent, WLM8 starts a direct connection setup: // - it does not send an ACK yet @@ -1373,23 +1547,17 @@ bool P2PApplicationBase::sendNextDataParts( int preferredFragments ) << " buffer=" << bytesRead; #endif - // Determine the progress value now because mesageOffset_ it reset by the last sendP2PMessage() call. - unsigned long nextProgressValue = ( fragmentOffset_ + bytesRead ); + // Determine the progress value now because mesageOffset_ it reset by the last sendP2PMessageImpl() call. + unsigned long nextProgressValue = ( fragmentOffset_ + (quint32)bytesRead ); // Determine the flags: // Funny, MSN6 doesn't seam to care which flag was set // while transferring the file. KMess however, does. - bool writeSuccess = false; + uint flag = 0; switch( dataType_ ) { - case P2P_TYPE_PICTURE: - writeSuccess = sendP2PMessage( data, P2PMessage::MSN_FLAG_OBJECT_DATA, 1, P2P_MSG_DATA, fragmentMessageID_ ); - break; - - case P2P_TYPE_FILE: - writeSuccess = sendP2PMessage( data, P2PMessage::MSN_FLAG_FILE_DATA, 2, P2P_MSG_DATA, fragmentMessageID_ ); - break; - + case P2P_TYPE_PICTURE: flag = P2PMessage::MSN_FLAG_OBJECT_DATA; break; + case P2P_TYPE_FILE: flag = P2PMessage::MSN_FLAG_FILE_DATA; break; default: // Display error message for the first message only. if( fragmentOffset_ == 0 ) @@ -1401,10 +1569,11 @@ bool P2PApplicationBase::sendNextDataParts( int preferredFragments ) " class=" << metaObject()->className() << " action=tryflag)."; } - - writeSuccess = sendP2PMessage( data, 0, 1, P2P_MSG_DATA, fragmentMessageID_ ); // The best solution in this situation } + // Send the message + bool writeSuccess = sendP2PMessageImpl( data, flag, dataType_, P2P_MSG_DATA, fragmentMessageID_ ); + // Avoid next round if write was blocked already. // This could happen if a direct connection can't write all data. // The DirectConnectionBase class will automatically send the remaining parts, so don't worry about that here. @@ -1510,7 +1679,7 @@ bool P2PApplicationBase::sendP2PAck() if( ! shouldSendAck_ ) { #ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL - kDebug() << "NOTICE: not sending 0x02 ack packet, something is already sent."; + kDebug() << "NOTICE: not sending 0x02 ack packet, something is already sent (or nothing needs to be sent)."; #endif return false; @@ -1524,7 +1693,7 @@ bool P2PApplicationBase::sendP2PAck() /** - * @brief Send a P2P ACK message. + * @brief Internal function to send a P2P ACK message. * * This method is the internal implementation for sendP2PAck() and others. * @@ -1592,7 +1761,7 @@ void P2PApplicationBase::sendP2PAckImpl(int ackType, UnAckedMessage *originalMes QByteArray header( 48, 0x00 ); // Determine the message ID - unsigned long messageID; + quint32 messageID; if( nextMessageID_ == 0 ) { // We don't have a message ID set yet, we're acknowledging @@ -1612,10 +1781,10 @@ void P2PApplicationBase::sendP2PAckImpl(int ackType, UnAckedMessage *originalMes } // Determine the ack settings. - unsigned long ackTotalSize = 0; - unsigned long ackSessionID = 0; - unsigned long ackUniqueID = 0; - unsigned long ackDataSize = 0; + quint32 ackTotalSize = 0; + quint32 ackSessionID = 0; + quint32 ackUniqueID = 0; + quint32 ackDataSize = 0; // New ack field schema seen with Windows Live Messenger: if( ackType == P2PMessage::MSN_FLAG_ERROR ) @@ -1680,8 +1849,11 @@ void P2PApplicationBase::sendP2PAckImpl(int ackType, UnAckedMessage *originalMes P2PMessage::insertBytes(header, ackUniqueID, 36); // ID referring to a specific fragment. P2PMessage::insertBytes(header, ackDataSize, 40); // reference to the Size of that message. + // The Ack needs to have the same footer code (visible in webcam setup for example). + uint footerCode = originalMessageData->footerCode; + // Deliver the message over the correct link (switchboard or direct connection) - applicationList_->sendMessage(this, header); + applicationList_->sendMessage(this, header, QByteArray(), footerCode); shouldSendAck_ = false; #ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL @@ -1693,7 +1865,53 @@ void P2PApplicationBase::sendP2PAckImpl(int ackType, UnAckedMessage *originalMes /** - * @brief Sends a P2P Message. + * @brief Sends a complete P2P message payload. + * + * It splits the data message into chunks which fit in the individual P2P messages. + * + * If you need to send data, use sendData() instead. + * This method is stream based, and also takes care of state changes. + * + * @param messageData The message payload to send. + * @param flagField The value for the flag field in the P2P header. + * @param footerCode The message footer, which is appended when the message is sent over the switchboard. + * @param messageType The type of the message. This value is returned with gotAck(). + */ +void P2PApplicationBase::sendP2PMessage(const QByteArray &messageData, int flagField, P2PDataType footerCode, P2PMessageType messageType) +{ + // Make sure the message gets sent in chunks of 1202 bytes. + // Only set fragmentTotalSize_ if there are chunks, for useless debug messages. + int remainingBytes = messageData.size(); + fragmentOffset_ = 0; + fragmentTotalSize_ = ( remainingBytes <= 1202 ? 0 : remainingBytes ); + + do + { + // Let another QByteArray encapsulate a part of the utf8Message + const char *dataPointer = messageData.data() + fragmentOffset_; + uint dataSize = qMin( remainingBytes, 1202 ); + QByteArray messagePart = QByteArray::fromRawData( dataPointer, dataSize ); + + // Send the message with the generic sendP2PMessageImpl() method + // fragmentOffset_ is updated automatically + sendP2PMessageImpl( messagePart, flagField, footerCode, messageType ); + remainingBytes -= dataSize; + +#ifdef KMESSTEST + KMESS_ASSERT( (uint) remainingBytes == fragmentTotalSize_ - fragmentOffset_ ); +#endif + } + while( remainingBytes > 0 ); + + // Reset for normal operations + fragmentOffset_ = 0; + fragmentTotalSize_ = 0; +} + + + +/** + * @brief Internal function to send a single P2P message. * * This method constructs the P2P binary header fields. * The constructed message is delivered to ApplicationList::sendMessage(). @@ -1705,18 +1923,20 @@ void P2PApplicationBase::sendP2PAckImpl(int ackType, UnAckedMessage *originalMes * - outgoingMessages_ is updated to trace ACKs back later. * * The fragmentTotalSize_ should be set to the total size before sending message fragments. - * This is done automatically by sendSlpMessage(). + * This is done automatically by sendP2PMessage() function, which is part of the public API. * * @param messageData The message payload to send. This can be binary file data or a SLP MIME data. * @param flagField The value for the flag field in the P2P header. * @param footerCode The message footer, which is appended when the message is sent over the switchboard. * @param messageType The type of the message. This value is stored with in the unacked message queue. * This value is used later to respond to ACKs of certain special messages. - * @param messageID Optional message ID to enforce. If nothing is selected, the next available message ID will be used automatically. + * @param messageID Optional message ID to enforce. If nothing is selected, + * the next available message ID will be used automatically. + * This parameter is used to send file data with a specific message ID. * @return Whether the message can be sent. If the socket would block, false is returned. * This only occurs for direct connections connections. */ -bool P2PApplicationBase::sendP2PMessage(const QByteArray &messageData, int flagField, uint footerCode, P2PMessageType messageType, unsigned long messageID) +bool P2PApplicationBase::sendP2PMessageImpl(const QByteArray &messageData, int flagField, P2PDataType footerCode, P2PMessageType messageType, quint32 messageID) { #ifdef KMESSTEST KMESS_ASSERT( messageData.size() <= 1202 ); @@ -1762,9 +1982,10 @@ bool P2PApplicationBase::sendP2PMessage(const QByteArray &messageData, int flagF // Determine the message size: - uint messageSize = messageData.size(); - ulong totalSize; - ulong offsetField; + // Internal trick: fragmentTotalSize_ is set by the caller if this is a splitted message. + quint32 messageSize = messageData.size(); + quint32 totalSize; + quint32 offsetField; if( fragmentTotalSize_ == 0 ) { @@ -1781,11 +2002,12 @@ bool P2PApplicationBase::sendP2PMessage(const QByteArray &messageData, int flagF // Generate ack session identifier for this message - unsigned long ackSessionID = KMessShared::generateID(); + quint32 ackSessionID = KMessShared::generateID(); // Set session ID to zero when SLP messages are sent. - unsigned long sessionID = getSessionID(); - if( flagField == 0 + quint32 sessionID = getSessionID(); + if( flagField == 0 + && footerCode == 0 // fixes all data transfers, like msnobjects and webcam. && messageType != P2P_MSG_DATA_PREPARATION ) { sessionID = 0; @@ -1804,7 +2026,7 @@ bool P2PApplicationBase::sendP2PMessage(const QByteArray &messageData, int flagF // Deliver the message over the correct link (switchboard or direct connection) - bool writeSuccess = applicationList_->sendMessage( this, header, messageData, footerCode ); + bool writeSuccess = applicationList_->sendMessage( this, header, messageData, (uint) footerCode ); if( ! writeSuccess ) { // This only happens when a direct connection transfer is congested. @@ -1896,7 +2118,7 @@ bool P2PApplicationBase::sendP2PMessage(const QByteArray &messageData, int flagF */ void P2PApplicationBase::sendP2PWaitingError() { - sendP2PMessage(0, P2PMessage::MSN_FLAG_WAITING, 0); + sendP2PMessageImpl( 0, P2PMessage::MSN_FLAG_WAITING ); shouldSendAck_ = false; } @@ -1905,15 +2127,14 @@ void P2PApplicationBase::sendP2PWaitingError() /** * @brief Send a complete SLP message in multiple P2P packets. * - * It splits the SLP message into chunks which fit in the P2P payload. - * Each part will be sent with sendP2PMessage(). - * The messages always have a Session ID of zero. - * * This is a low-level function which is primary used by * P2PApplication::sendSlpInvitation(), P2PApplication::sendSlpBye(), etc.. * + * It converts the SLP string to the payload data, + * which could be splitted across multiple P2P messages. + * * @param slpMessage The whole SLP message to send, including SLP headers. - * @param messageType The type of the message, used to trace ACK messages back later. + * @param messageType The type of the message. This value is returned with gotAck(). */ void P2PApplicationBase::sendSlpMessage(const QString &slpMessage, P2PMessageType messageType) { @@ -1928,33 +2149,26 @@ void P2PApplicationBase::sendSlpMessage(const QString &slpMessage, P2PMessageTyp // Make sure the extra padded '\0' character is there. MSN 6-WLM rely on this. utf8Message.append('\0'); - // Make sure the message gets sent in chunks of 1202 bytes. - // Only set fragmentTotalSize_ if there are chunks, for useless debug messages. - int remainingBytes = utf8Message.size(); - fragmentOffset_ = 0; - fragmentTotalSize_ = ( remainingBytes <= 1202 ? 0 : remainingBytes ); + sendP2PMessage( utf8Message, 0, P2P_TYPE_NEGOTIATION, messageType ); // will split the message. +} - do + + +/** + * @brief Set the current message type, for debugging. + * + * This method can be set from gotNegotiationMessage() to set the current message type. + * It's used for debugging, and setting the proper footer code in ACK responses. + */ +void P2PApplicationBase::setCurrentMessageType( P2PMessageType messageType ) +{ + // Only send an ACK is this is really needed. + if( ! shouldSendAck_ ) { - // Let another QByteArray encapsulate a part of the utf8Message - char *dataPointer = utf8Message.data() + fragmentOffset_; - uint dataSize = qMin(remainingBytes, 1202); - messagePart = QByteArray::fromRawData( dataPointer, dataSize ); - - // Send the message with the generic sendP2PMessage() method - // fragmentOffset_ is updated automatically - sendP2PMessage(messagePart, 0, 0, messageType); - remainingBytes -= dataSize; - -#ifdef KMESSTEST - KMESS_ASSERT( (uint) remainingBytes == fragmentTotalSize_ - fragmentOffset_ ); -#endif + kWarning() << "NOTICE: ack is likely sent already, setting setCurrentMessageType() has no use anymore."; } - while(remainingBytes > 0); - // Reset for normal operations - fragmentOffset_ = 0; - fragmentTotalSize_ = 0; + lastIncomingMessage_.messageType = messageType; } @@ -1983,9 +2197,9 @@ void P2PApplicationBase::setUserAborted( bool userAborted ) */ void P2PApplicationBase::setWaitingState( P2PWaitingState waitingState, int timeout ) { +#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL unsigned long sessionID = getSessionID(); -#ifdef KMESSDEBUG_P2PAPPLICATION_GENERAL if( timeout == 0 ) { #ifdef KMESSTEST @@ -2137,7 +2351,7 @@ void P2PApplicationBase::slotCleanup() } // Send the message - sendP2PMessage(0, waitFlag, 0); // TODO: pass the original message which is unacked!! + sendP2PMessageImpl(0, waitFlag, 0); // TODO: pass the original message which is unacked!! */ testUnAckedMessages( true ); // TODO: argument is not used, and replaces sendP2PWaitingError(). @@ -2272,7 +2486,7 @@ bool P2PApplicationBase::writeP2PDataToFile( const P2PMessage &message, QIODevic #endif // File position was different and could not be changed.. - unsigned long fileSize = file->size(); + unsigned long fileSize = (quint32)file->size(); // See if the offset is too far ahead.. (e.g. don't make us allocate 1GB) if( offset > ( fileSize + 100000 ) ) // ~100 kB diff --git a/src/network/applications/p2papplicationbase.h b/src/network/applications/p2papplicationbase.h index 8f10197..38a2bda 100644 --- a/src/network/applications/p2papplicationbase.h +++ b/src/network/applications/p2papplicationbase.h @@ -200,7 +200,7 @@ class P2PApplicationBase : public Application // Return the message ID used in the previous message received from the contact. unsigned long getLastContactMessageID() const; // Returns the session ID. - virtual unsigned long getSessionID() const = 0; + virtual quint32 getSessionID() const = 0; // Parse a received message... (implements pure virtual method from base class) void gotMessage(const P2PMessage &p2pMessage); // Verify whether the application can handle the given ACK message. @@ -219,16 +219,20 @@ class P2PApplicationBase : public Application */ enum P2PMessageType { - P2P_MSG_UNKNOWN = 0, ///< Default value, message type is not relevant. - P2P_MSG_SESSION_INVITATION = 1, ///< The SLP INVITE message. - P2P_MSG_SESSION_OK = 2, ///< The SLP OK message. - P2P_MSG_TRANSFER_INVITATION = 9, ///< The SLP INVITE message for the transfer. - P2P_MSG_TRANSFER_OK = 3, ///< The SLP OK message for the transfer invitation. - P2P_MSG_DATA_PREPARATION = 4, ///< The data preparation message. - P2P_MSG_DATA = 5, ///< The actual data message. - P2P_MSG_SESSION_BYE = 6, ///< The SLP BYE message. - P2P_MSG_TRANSFER_DECLINE = 7, ///< The SLP 603 Decline message. - P2P_MSG_SLP_ERROR = 8 ///< One of the possible SLP error messages. + P2P_MSG_UNKNOWN = 0, ///< Default value, message type is not relevant. + P2P_MSG_SESSION_INVITATION = 1, ///< The SLP INVITE message. + P2P_MSG_SESSION_OK = 2, ///< The SLP OK message. + P2P_MSG_TRANSFER_INVITATION = 9, ///< The SLP INVITE message for the transfer. + P2P_MSG_TRANSFER_OK = 3, ///< The SLP OK message for the transfer invitation. + P2P_MSG_DATA_PREPARATION = 4, ///< The data preparation message. + P2P_MSG_DATA = 5, ///< The actual data message. + P2P_MSG_SESSION_BYE = 6, ///< The SLP BYE message. + P2P_MSG_SESSION_DECLINE = 10, ///< The SLP BYE message. + P2P_MSG_TRANSFER_DECLINE = 7, ///< The SLP 603 Decline message. + P2P_MSG_SLP_ERROR = 8, ///< One of the possible SLP error messages. + P2P_MSG_WEBCAM_SETUP = 11, ///< One of the possible webcam setup messages. + P2P_MSG_WEBCAM_SYN = 12, ///< Webcam setup 'syn' message. + P2P_MSG_WEBCAM_ACK = 13 ///< Webcam setup 'ack' message. }; /** @@ -242,6 +246,7 @@ class P2PApplicationBase : public Application , P2P_TYPE_PICTURE = 1 ///< Packet contains MsnObject data. , P2P_TYPE_FILE = 2 ///< Packet contains file data. , P2P_TYPE_INK = 3 ///< Packet contains an Ink message. + , P2P_TYPE_WEBCAM = 4 ///< Packet contains a webcam setup message. }; /** @@ -260,6 +265,7 @@ class P2PApplicationBase : public Application P2P_WAIT_DEFAULT = 0, ///< Not waiting at all. P2P_WAIT_FOR_SLP_OK_ACK = 1, ///< Waiting for remote client to ack the the SLP OK message. P2P_WAIT_FOR_FILE_DATA = 2, ///< Waiting for remote client to send file data. + P2P_WAIT_FOR_WEBCAM_DATA = 19, ///< Waiting for remote client to send webcam invite data. P2P_WAIT_FOR_PREPARE = 3, ///< Waiting for remote client to send some prepare message. P2P_WAIT_FOR_PREPARE_ACK = 4, ///< Waiting for remote client to ack the data preparation. P2P_WAIT_FOR_SLP_BYE = 5, ///< Waiting for remote client to send the SLP BYE. @@ -301,7 +307,7 @@ class P2PApplicationBase : public Application // Called when data is received virtual void gotData(const P2PMessage &message) = 0; // Called when all data is received. - virtual void gotDataAckSent() = 0; + virtual void gotDataComplete(const P2PMessage &lastMessage) = 0; // Called when the data preparation message is received virtual void gotDataPreparation(const P2PMessage &message) = 0; // Got an direct connection handshake. @@ -332,10 +338,14 @@ class P2PApplicationBase : public Application void sendP2PAbort(); // Send an low-level ACK message for a received message if this is needed. bool sendP2PAck(); + // Send a low-level P2P data message + void sendP2PMessage(const QByteArray &messageData, int flagField = 0, P2PDataType footerCode = P2P_TYPE_NEGOTIATION, P2PMessageType messageType = P2P_MSG_UNKNOWN); // Send a low-level error message that the application is waiting for a certain message. void sendP2PWaitingError(); // Send a given string using sendP2PMessage() void sendSlpMessage(const QString &slpMessage, P2PMessageType messageType); + // Set the current message type, for debugging. + void setCurrentMessageType( P2PMessageType messageType ); // Notify this base class the user is aborting the session. void setUserAborted( bool userAborted ); // Indicate which packet is expected next. @@ -358,13 +368,14 @@ class P2PApplicationBase : public Application struct UnAckedMessage { // Data for ACK message: - unsigned long dataSize; ///< The sent data size. - unsigned long messageID; ///< The sent message ID. - unsigned long totalSize; ///< The sent total size. - unsigned long sessionID; ///< The sent session ID. - unsigned long ackSessionID; ///< The sent unique ID field. + quint32 dataSize; ///< The sent data size. + quint32 messageID; ///< The sent message ID. + quint32 totalSize; ///< The sent total size. + quint32 sessionID; ///< The sent session ID. + quint32 ackSessionID; ///< The sent unique ID field. uint sentTime; ///< The time the message was sent. P2PMessageType messageType; ///< The meta type of the message. + unsigned int footerCode; ///< The message footer code. }; // Find the unacked message record associated with the received P2P message. @@ -384,7 +395,7 @@ class P2PApplicationBase : public Application // Send a P2P ACK message void sendP2PAckImpl(int ackType = P2PMessage::MSN_FLAG_ACK, UnAckedMessage *originalMessageData = 0); // Send a P2P message - bool sendP2PMessage(const QByteArray &messageData, int flagField = 0, uint footerCode = 0, P2PMessageType messageType = P2P_MSG_UNKNOWN, unsigned long messageID = 0); + bool sendP2PMessageImpl(const QByteArray &messageData, int flagField = 0, P2PDataType footerCode = P2P_TYPE_NEGOTIATION, P2PMessageType messageType = P2P_MSG_UNKNOWN, quint32 messageID = 0); // Test if there are still unacked messages. void testUnAckedMessages(bool sendError); @@ -406,17 +417,17 @@ class P2PApplicationBase : public Application // The type of data to send. P2PDataType dataType_; // Message ID, if we're sending "fragmented" content - unsigned long fragmentMessageID_; + quint32 fragmentMessageID_; // Message offset, if we're sending "fragmented" content - unsigned long fragmentOffset_; + quint32 fragmentOffset_; // Size of the message, if we're sending "fragmented" content - unsigned long fragmentTotalSize_; + quint32 fragmentTotalSize_; // Track the status of a fragmented message (incoming currently) P2PFragmentTracker fragmentTracker_; // The last incoming message. UnAckedMessage lastIncomingMessage_; // Message ID, updated each time a message has been sent - unsigned long nextMessageID_; + quint32 nextMessageID_; // The list of outgoing messages to be acked QList outgoingMessages_; // True if an ACK was not sent yet. diff --git a/src/network/applications/sipconnection.cpp b/src/network/applications/sipconnection.cpp index 1483102..ac344ab 100644 --- a/src/network/applications/sipconnection.cpp +++ b/src/network/applications/sipconnection.cpp @@ -51,7 +51,7 @@ UserAgent::UserAgent(QString localIP, unsigned sipListenPort, unsigned rtpListen Sip::setLocalAddress(localIP); - QString uristr = Sip::getLocalAddress(); + QString uristr( Sip::getLocalAddress() ); if(uristr.isEmpty()) return; @@ -87,7 +87,7 @@ bool UserAgent::audioCheck() #ifdef HAS_KPHONE int audio_fd; QSettings settings; - QString audioDevice = settings.readEntry( "/kphone/audio/oss-filename", "/dev/dsp"); + QString audioDevice( settings.readEntry( "/kphone/audio/oss-filename", "/dev/dsp") ); audio_fd = ::open(audioDevice.toLatin1(), O_WRONLY | O_NONBLOCK ); if(audio_fd) @@ -105,7 +105,7 @@ void UserAgent::outgoingCall(QString strRemoteUri) #ifdef HAS_KPHONE call = new SipCall(user, QString::null, SipCall::StandardCall ); - QString subject = user->getUri().uri(); + QString subject( user->getUri().uri() ); call->setSubject(subject); audio->setBodyMask(call->getSdpMessageMask()); @@ -125,7 +125,7 @@ void UserAgent::outgoingCall(QString strRemoteUri) member->requestInvite(audio->audioOut().message( audio->getRtpCodec(), codecUnknown, audio->getBodyMask()), MimeContentType("application/sdp")); audio->attachToCallMember(member); - + QTimer *socketEventTimer = new QTimer(this); QObject::connect(socketEventTimer, SIGNAL(timeout()), this, SLOT(socketEventHandler())); socketEventTimer->start(1); @@ -137,20 +137,20 @@ void UserAgent::outgoingCall(QString strRemoteUri) void UserAgent::incomingCall() { #ifdef HAS_KPHONE - + QObject::connect(client, SIGNAL(incomingCall(SipCall *, QString)), this, SLOT(incomingCall(SipCall *, QString ))); - + QTimer *socketEventTimer = new QTimer(this); connect(socketEventTimer, SIGNAL(timeout()), this, SLOT(socketEventHandler())); socketEventTimer->start(1); - + #endif } void UserAgent::socketEventHandler() { #ifdef HAS_KPHONE - if(client) + if( client ) client->doSelect(false); //None bolck #endif } @@ -182,7 +182,7 @@ void UserAgent::incomingCall(SipCall *_call, QString body ) { #ifdef HAS_KPHONE call = (SipCall *)_call; - if(call->getSubject() == QString::null) + if(call->getSubject().isEmpty()) { call->setSdpMessageMask(body); call->setSubject("Incoming call"); @@ -239,16 +239,16 @@ void UserAgent::releaseCallForce() void UserAgent::destructCall() { #ifdef HAS_KPHONE - + delete client; client = 0; delete call; call = 0; - + delete user; user = 0; - + delete audio; audio = 0; diff --git a/src/network/applications/voiceconversation.cpp b/src/network/applications/voiceconversation.cpp index 0d26146..1eb62bc 100644 --- a/src/network/applications/voiceconversation.cpp +++ b/src/network/applications/voiceconversation.cpp @@ -137,8 +137,8 @@ void VoiceConversation::contactStarted3_ContactConfirmsAccept(const MimeMessage& // QString ipPort = message.getValue("IP-Address"); // remoteUPnP_ = message.getValue("UPnP"); - QString base64IP = message.getValue("IP-Address-Enc64"); // SIP contact IP address - QString ipPort = QByteArray::fromBase64( base64IP.toLatin1() ); + QString base64IP( message.getValue( "IP-Address-Enc64" ) ); // SIP contact IP address + QString ipPort ( QByteArray::fromBase64( base64IP.toLatin1() ) ); int pos; @@ -177,7 +177,7 @@ void VoiceConversation::startConversation( bool connectToRemote ) kDebug(); #endif - QString localIP = getLocalIp(); + QString localIP ( getLocalIp() ); bool isDirectConnect = (getExternalIp() == remotePublicIp_); if(foundUPnPDevice_ && ! isDirectConnect) @@ -256,8 +256,8 @@ void VoiceConversation::userStarted1_UserInvitesContact() QString html; MimeMessage message; - QString contextData = "Requested:SIP_A,;Capabilities:SIP_A,;"; - QString connectionType = "Symmetric-NAT"; // Use Symmetric-NAT as default + QString contextData ( "Requested:SIP_A,;Capabilities:SIP_A,;" ); + QString connectionType( "Symmetric-NAT" ); // Use Symmetric-NAT as default /* if(foundUPnPDevice_) @@ -309,7 +309,7 @@ void VoiceConversation::userStarted2_ContactAccepts(const MimeMessage& message) // Confirm the accept-message MimeMessage response; - QString UPnPString = (foundUPnPDevice_ ? "TRUE" : "FALSE"); + QString UPnPString( (foundUPnPDevice_ ? "TRUE" : "FALSE") ); QString sipContactAddress; bool isDirectConnect = (getExternalIp() == remotePublicIp_); @@ -324,7 +324,7 @@ void VoiceConversation::userStarted2_ContactAccepts(const MimeMessage& message) sipContactAddress = getLocalIp() + ":" + QString::number( SIP_LISTEN_PORT ); } - QString sipContactEncoded = sipContactAddress.toLatin1().toBase64(); + QString sipContactEncoded( sipContactAddress.toLatin1().toBase64() ); response.addField( "Invitation-Command", "ACCEPT" ); response.addField( "Context-Data", "Requested:SIP_A,;" ); diff --git a/src/network/applications/webapplicationp2p.cpp b/src/network/applications/webapplicationp2p.cpp index 8b3d1e1..ba33e87 100644 --- a/src/network/applications/webapplicationp2p.cpp +++ b/src/network/applications/webapplicationp2p.cpp @@ -70,8 +70,8 @@ void WebApplicationP2P::contactStarted1_ContactInvitesUser(const MimeMessage &me #endif - QString appID = message.getValue("AppID"); - QString context = message.getValue("Context"); + QString appID ( message.getValue("AppID") ); + QString context( message.getValue("Context") ); #ifdef KMESSTEST KMESS_ASSERT( appID.length() == 8 ); @@ -82,15 +82,13 @@ void WebApplicationP2P::contactStarted1_ContactInvitesUser(const MimeMessage &me // int realAppID = appID.mid(4, 4).toInt(); // Parse the context - context += "===="; // Make sure the base64 encoded string is null padded to avoid problems with QString::fromUtf16(). - QByteArray decodedContext = QByteArray::fromBase64( context.toLatin1() ); - // Contents is something like '10331021;1;Tic Tac Toe' - QString contextString = QString::fromUtf16( reinterpret_cast( decodedContext.data() ), decodedContext.size() / 2 ); + QByteArray decodedContext = QByteArray::fromBase64( context.toLatin1() ); + QString contextString ( QString::fromUtf16( reinterpret_cast( decodedContext.data() ), decodedContext.size() / 2 ) ); // Get the fields - QString unknown = contextString.section(';', 1, 1); - QString appName = contextString.section(';', 2, 2); + QString unknown( contextString.section(';', 1, 1) ); + QString appName( contextString.section(';', 2, 2) ); #ifdef KMESSTEST // Not sure why, the AppID is included with the context again diff --git a/src/network/applications/webcamtransferp2p.cpp b/src/network/applications/webcamtransferp2p.cpp index e418178..f06ba5f 100644 --- a/src/network/applications/webcamtransferp2p.cpp +++ b/src/network/applications/webcamtransferp2p.cpp @@ -18,9 +18,30 @@ #include "webcamtransferp2p.h" #include "../../kmessdebug.h" +#include "../../utils/kmessshared.h" +#include "../../utils/xmlfunctions.h" +#include "../extra/directconnectionpool.h" +#include "../extra/msnwebcamconnection.h" #include "../mimemessage.h" #include +#include // rand() + +//solid specific includes +#include +#include +#include +#include + +#include + + +// +// I'd like to give a special thanks to the Kopete developers here, +// without them writing this code would have been a lot harder. +// Especially since all webcam online docs seam to be gone. +// + @@ -31,29 +52,37 @@ */ WebcamTransferP2P::WebcamTransferP2P(ApplicationList *applicationList) : P2PApplication(applicationList) +, isUserSender_(false) +, webcamConnection_(0) +, webcamConnectionPool_(0) { setApplicationType( ChatMessage::TYPE_APPLICATION_WEBCAM ); + buffer_.open( QBuffer::ReadWrite ); + + // Initialize webcam connection pool, configure it to wait for a connection to authorize first. + // This is needed because there are connection attempts at port 80. If both clients are at + // the same network, you'll likely connect to the home router administration page too. + webcamConnectionPool_ = new DirectConnectionPool( true ); + + connect(webcamConnectionPool_, SIGNAL( activeConnectionAuthorized() ), // The connection was authorized + this, SLOT( slotActiveConnectionAuthorized() )); + connect(webcamConnectionPool_, SIGNAL( activeConnectionClosed() ), // The active connection was closed + this, SLOT( slotActiveConnectionClosed() )); + connect(webcamConnectionPool_, SIGNAL( connectionEstablished() ), // The connection was established + this, SLOT( slotConnectionEstablished() )); + connect(webcamConnectionPool_, SIGNAL( allConnectionsFailed() ), // All connection attempts failed. + this, SLOT( slotAllConnectionsFailed() )); } -/* * - * Constructor - * - * @param applicationList The shared sources for the contact. - */ -/* -WebcamTransferP2P::WebcamTransferP2P(const QString &contactHandle, ...) -: P2PApplication(contactHandle) -{ -} -*/ - /** * Destructor */ WebcamTransferP2P::~WebcamTransferP2P() { + delete webcamConnectionPool_; + webcamConnection_ = 0; // will be deleted by the direct connection pool. } @@ -63,26 +92,55 @@ WebcamTransferP2P::~WebcamTransferP2P() * * @param message The invitation message */ -void WebcamTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage & /*message*/) +void WebcamTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage & message) { -#ifdef KMESSDEBUG_WEBAPPLICATION_P2P +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P kDebug(); #endif -#if 0 - QString appID = message.getValue("AppID"); - QString eufGuid = message.getValue("EUF-GUID"); - QString context = message.getValue("Context"); +#if ENABLE_WEBCAM - // Parse the context - context += "===="; // Make sure the base64 encoded string is null padded to avoid problems with QString::fromUtf16(). - QByteArray decodedContext; - KCodecs::base64Decode(context.utf8(), decodedContext); + // Read the values from the message + uint appID = message.getValue("AppID").toUInt(); + QString eufGuid( message.getValue("EUF-GUID") ); + QString context( message.getValue("Context") ); - // Contents is another GUID - QString contextString = QString::fromUtf16( reinterpret_cast(decodedContext.data()) ); + if(appID != 4) + { + kWarning() << "Received unexpected AppID: " << appID << "."; + + // Wouldn't know what to do if the AppID is not 2, so send an 500 Internal Error back. + showEventMessage( i18n("The webcam invitation was cancelled. Bad data was received."), ChatMessage::CONTENT_APP_CANCELED, true ); + sendCancelMessage( CANCEL_ABORT ); + return; + } + + // Contact can request a webcam from us, or share it's own webcam. + isUserSender_ = ( eufGuid == getPullAppId() ); + + // Parse the context, it contains another GUID + QByteArray decodedContext = QByteArray::fromBase64( context.toLatin1() ); + webcamGuid_ = P2PMessage::extractUtf16String( decodedContext.data(), 0, decodedContext.size() ); + + // Display the accept message. +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "Webcam invitation received, GUID=" << webcamGuid_ << endl; + kDebug() << "waiting for user to accept..." << endl; #endif + if( isUserSender_ ) + { + // FIXME: better message. + offerAcceptOrReject( i18n("You are asked to show your webcam.") ); + } + else + { + offerAcceptOrReject( i18n("You are invited to view this person's webcam.") ); + } + +#else + Q_UNUSED( message ); + // KMess does not support the webapplication invitations yet, // this class is currently a STUB to produce a proper error message showSystemMessage( i18n( "The contact is inviting you for '%1', but this is not implemented yet.", @@ -91,9 +149,155 @@ void WebcamTransferP2P::contactStarted1_ContactInvitesUser(const MimeMessage & / // Tell the contact we don't support this. sendCancelMessage(CANCEL_NOT_INSTALLED); +#endif +} -// // Everything seams OK, accept this message: -// contactStarted2_UserAccepts(); + + +/** + * Step two of a contact-started chat: the user accepts + */ +void WebcamTransferP2P::contactStarted2_UserAccepts() +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "sending accept message"; +#endif + + // Create the message + MimeMessage message; + message.addField( "SessionID", QString::number( getInvitationSessionID() ) ); + + // Send the message + sendSlpOkMessage(message); + setWaitingState( P2P_WAIT_FOR_WEBCAM_DATA, 120000 ); // 120 seconds +} + + + + +/** + * Step three of a contact-started chat: the contact confirms the accept + */ +void WebcamTransferP2P::contactStarted3_ContactConfirmsAccept(const MimeMessage& /*message*/) +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug(); +#endif + + if( isUserSender_ ) + { + // First syn message to send. + sendSipMessage( "syn", 0x06, 0x91, 0x7c, P2P_MSG_WEBCAM_SYN ); + } + else + { + + } + + // The invitation continues with the gotData() call. +} + + + +/** + * Create the producer or viewer XML tag. + */ +QString WebcamTransferP2P::createSipXml( uint recipientId, uint sessionId ) +{ + // Get the network info + const QString &externalIp = getExternalIp(); + const QString &localIp = getLocalIp(); + + // Get a reserved server port. + MsnWebcamConnection *webcamConnection = new MsnWebcamConnection( getContactHandle(), recipientId, sessionId ); + int tcpPort = webcamConnectionPool_->addServerConnection( webcamConnection ); + + // Get the CPU speed using Solid. + int cpuSpeed = 0; + QList cpuList = Solid::Device::listFromType( Solid::DeviceInterface::Processor, QString() ); + + // Take the first processor + if( ! cpuList.isEmpty() ) + { + Solid::Device device = cpuList[0]; + Solid::Processor *processor = device.as(); + if( processor != 0 ) + { + cpuSpeed = processor->maxSpeed(); + +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "Detected CPU speed is " << cpuSpeed; +#endif + } + } + + if( cpuSpeed == 0 ) + { +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "CPU speed not detected"; +#endif + cpuSpeed = 1000; + } + + + // Build XMl tags for the IP addresses + QStringList ipAddresses; + ipAddresses << externalIp; + ipAddresses << localIp; + + QString tcpIpTags; + + int i = 1; + foreach( const QString &ipAddress, ipAddresses ) + { + tcpIpTags += "" + ipAddress + ""; + i++; + } + + + // Determine the root node. + QString rootNode( ( isUserSender_ ? "producer" : "viewer" ) ); + + + // Build full XML + return "<" + rootNode + ">" + "2.0" + "" + QString::number( recipientId ) + "" +// "" + QString::number( recipientId + 1 ) + "" + "" + QString::number( sessionId ) + "" + "0" + "" + QString::number( cpuSpeed ) + "" + "" + "" + QString::number( tcpPort ) + "" // "\t\t\t\t\t\t\t\t " + "" + QString::number( tcpPort ) + "" // "\t\t\t\t\t\t\t\t " + "" + QString::number( tcpPort ) + "" + tcpIpTags + + "" +// "" +// "7786" +// "31863" +// "" + externalIp + "" +// "31859" +// "31860" +// "31861" +// "31862" +// "1" +// "1" +// "1" +// "" + internalIp + "" +// "" + "" + "1" + "\r\n\r\n"; +} + + + +/** + * Return the application's GUID for "video conference" invitations. + */ +QString WebcamTransferP2P::getConferenceAppId() +{ + return "{4BD96FC0-AB17-4425-A14A-439185962DC8}"; // FIXME: identical to getPushAppId() ?? } @@ -117,4 +321,434 @@ QString WebcamTransferP2P::getPullAppId() } + +/** + * Called when SIP data is received. + * This is the second stage of the webcam invitation. + * + * The webcam setup message can something like: + * - "syn" + * - "ack" + * - "...." + * - "...." + * + * @param message P2P message with the data. + */ +void WebcamTransferP2P::gotData(const P2PMessage &message) +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "Buffering received webcam data message..."; +#endif + + // Keep tracking messages. Most are just one packet, + // but the is split over multiple packets. + writeP2PDataToFile( message, &buffer_ ); +} + + + +/** + * Called when all data is received. + * + * This method overwrites the behavior of the P2PApplication class. + * After all data is received, a BYE won't be sent. + * Instead, another data message is sent back. + */ +void WebcamTransferP2P::gotDataComplete(const P2PMessage &lastMessage) +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "Received complete webcam data message."; +#endif + Q_UNUSED( lastMessage ); + + // NOTE: The ack is already sent, no need to handle that. + + // Get the complete message + buffer_.reset(); + QByteArray message = buffer_.readAll(); + QString payload( P2PMessage::extractUtf16String( message.data(), 10, message.size() - 10 ) ); + + //bool contactStarted = ( ! isUserStartedApp() ); + +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + // FIXME: display hex data, extract part from formatRawData() to kmessdebug.cpp + kDebug() << "received setup data:" << payload; +#endif + + // Find out what to do. + if( payload == "syn" ) + { + if( isUserSender_ ) + { + // Wait for last ack. + //sendSipMessage( "syn", 0x17, 0x2a, 0x01, P2P_MSG_WEBCAM_SYN ); + } + else + { + // Received first syn, send syn back. + sendSipMessage( "syn", 0x06, 0x91, 0x7c, P2P_MSG_WEBCAM_SYN ); + sendSipMessage( "ack", 0xfe, 0x13, 0x07, P2P_MSG_WEBCAM_ACK ); + // ...and wait for syn to be accepted, then send ack as well. + + //sendSipMessage( "ack", 0xea, 0x00, 0x00, P2P_MSG_WEBCAM_ACK ); + } + } + else if( payload == "ack" ) + { + if( isUserSender_ ) + { + // Got final ack, send the message + uint sessionId = rand() % 1000 + 5000; + uint recipientId = rand() % 100 + 50; + QString producerXml( createSipXml( recipientId, sessionId ) ); + sendSipMessage( producerXml, 0, 0, 0, P2P_MSG_WEBCAM_SETUP ); + } + else + { + // Ready to receive the xml tag! + } + } + else if( payload.startsWith("<") ) + { + QDomDocument xml; + if( ! xml.setContent(payload) ) + { + kWarning() << "Could not parse webcam negotiation status message (invalid XML, contact=" << getContactHandle() << ")!"; + kWarning() << "The invalid XML was:" << payload; + } + + // XML. + QDomElement rootNode = xml.documentElement(); + QString rootTagName( rootNode.tagName() ); + if( rootTagName == "producer" || rootTagName == "viewer" ) + { + // tag + // Example: + // + // + // 2.0 + // 101 + // 102 + // 7971 + // 0 + // 1830 + // + // 80 + // 80 + // 0 + // 192.168.1.82 + // 210.222.333.444 + // + // + // 34799 + // 51294 + // 210.222.333.444 + // 51290 + // 51291 + // 51292 + // 51293 + // 1 + // 1 + // 1 + // 192.168.1.82 + // + // + // 1 + // + + // Get the authentication data for the connection + uint recipientId = XmlFunctions::getNodeValue( rootNode, "rid" ).toUInt(); + uint sessionId = XmlFunctions::getNodeValue( rootNode, "session" ).toUInt(); + + // Get all ports we can attempt connect to. + QDomNode tcpNode = rootNode.namedItem("tcp"); + QList tcpPorts; + tcpPorts.append( XmlFunctions::getNodeValue( tcpNode, "tcpport" ).toUInt() ); + tcpPorts.append( XmlFunctions::getNodeValue( tcpNode, "tcplocalport" ).toUInt() ); + tcpPorts.append( XmlFunctions::getNodeValue( tcpNode, "tcpexternalport" ).toUInt() ); + + // Remove all invalid or duplicate ports. + tcpPorts.removeAll(0); + qSort( tcpPorts ); + for( int i = tcpPorts.size() - 1; i >= 1; i-- ) + { + if( tcpPorts[ i ] == tcpPorts[ i - 1 ] ) + { + tcpPorts.removeAt( i ); + } + } + + + // Get all possible IP addresses to connect to. + QStringList tcpIpAddresses; + for( int i = 1; i < 10; i++ ) + { + QDomNode tcpIpAddress = tcpNode.namedItem( "tcpipaddress" + QString::number( i ) ); + if( tcpIpAddress.isNull() ) + { + break; + } + + tcpIpAddresses << tcpIpAddress.toElement().text(); + } + + +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "Received the" << rootTagName << "tag, tcp ips=" << tcpIpAddresses << " tcp ports=" << tcpPorts; +#endif + + + // Create a connection attempt to the given IPs/ports + foreach( const QString &tcpIpAddress, tcpIpAddresses ) + { + foreach( uint tcpPort, tcpPorts ) + { + MsnWebcamConnection *webcamConnection = new MsnWebcamConnection( getContactHandle(), recipientId, sessionId ); + webcamConnectionPool_->addConnection( webcamConnection, tcpIpAddress, (quint16) tcpPort ); + } + } + + + // Send the tag back. + if( rootTagName == "producer" ) + { + QString viewerXml( createSipXml( recipientId, sessionId ) ); + sendSipMessage( viewerXml, 0, 0, 0, P2P_MSG_WEBCAM_SETUP ); + } + } + else if( rootTagName == "viewer" ) + { + // tag + } + else + { + sendP2PAbort(); + } + } + else if( payload.startsWith("ReflData:") ) + { + // no idea.. + } + else if( payload == "receivedViewerData" ) + { + // nothing to do + } + else + { + // FIXME: ack is already sent, can't revert that. (see what WLM does with invalid XML). + sendP2PAbort(); + } +} + + + +/** + * Called when an ACK message to an unknown message is received. + * This class uses this feature to respond to ACK messages of the 'syn' and 'ack' webcam negotiation messages. + */ +bool WebcamTransferP2P::gotUnhandledAck( const P2PMessage &ackMessage, P2PMessageType ackMessageType ) +{ + Q_UNUSED( ackMessage ); + + switch( ackMessageType ) + { + case P2P_MSG_WEBCAM_SYN: +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "Received P2P ACK for the webcam 'syn' message."; +#endif + + // Our syn was received. + if( isUserSender_ ) + { + // Wait for syn / ack. + } + else + { + // Finally send ack back. +// sendSipMessage( "ack", 0xfe, 0x13, 0x07, P2P_MSG_WEBCAM_ACK ); +// sendSipMessage( "ack", 0xfe, 0xc8, 0x05, P2P_MSG_WEBCAM_ACK ); + } + + return true; + + case P2P_MSG_WEBCAM_ACK: +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "Received P2P ACK for the webcam 'ack' message."; +#endif + + // Our ack was received. + if( isUserSender_ ) + { + } + else + { + } + + return true; + + default: + return false; + } +} + + + +/** + * Send a webcam negotiation message + */ +void WebcamTransferP2P::sendSipMessage( const QString &contents, quint8 flag1, quint8 flag2, quint8 flag3, P2PMessageType messageType ) +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + // FIXME: display hex data, add function + hexmap to kmessdebug.cpp + kDebug() << "sending setup data: " << contents; +#endif + + + QByteArray sipMessage( 10 + contents.length() * 2 + 2, '\0' ); + + // Observed: + // WLM syn: + // 80 06 91 7c 08 00 08 00 00 00 // binary flags + // 73 00 79 00 6e 00 00 00 // s.y.n... + // + // WLM ack: + // 80 fe b2 04 08 00 08 00 00 00 // binary flags + // 61 00 63 00 6b 00 00 00 // a.c.k... + // + // WLM producer: + // 80 06 91 7c 08 00 44 06 00 00 + // + // WLM viewer: + // 80 06 91 7c 08 00 12 06 00 00 + // + // + + + sipMessage[0] = '\x80'; + sipMessage[1] = flag1; + sipMessage[2] = flag2; + sipMessage[3] = flag3; + sipMessage[4] = '\x08'; + sipMessage[6] = '\x08'; + + P2PMessage::insertUtf16String( sipMessage, contents, 10 ); + + // Send message. + sendP2PMessage( sipMessage, 0, P2P_TYPE_WEBCAM, messageType ); +} + + + +/** + * The active webcam connection is authorized. + */ +void WebcamTransferP2P::slotActiveConnectionAuthorized() +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug(); +#endif +} + + + +/** + * The active webcam connection is closed + */ +void WebcamTransferP2P::slotActiveConnectionClosed() +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug(); +#endif + +} + + + +/** + * All connection attempts failed. + */ +void WebcamTransferP2P::slotAllConnectionsFailed() +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug(); +#endif + +} + + + +/** + * The active webcam connection is closed + */ +void WebcamTransferP2P::slotConnectionEstablished() +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug(); +#endif + +} + + + +/** + * Step one of a user-started chat: the user invites the contact + */ +void WebcamTransferP2P::userStarted1_UserInvitesContact() +{ +#ifdef KMESSDEBUG_WEBCAMTRANSFER_P2P + kDebug() << "starting webcam session"; +#endif + + // Generate context field + webcamGuid_ = "{11CF1BE9-3186-93A5-B38D-914DB1163BF7}"; + + // Write the string + int contextLength = webcamGuid_.size() * 2 + 2; + QByteArray context( contextLength, '\0' ); + P2PMessage::insertUtf16String( context, webcamGuid_, 0 ); + + // Encode to base64 + QString encodedContext( context.toBase64().replace( "AAAA", "AA==" ) ); // FIXME: find out why the null padding is wrong. + + // Test 1 + encodedContext = "ewAwADQAMgA1AEUANwA5ADcALQA0ADkARgAxAC0ANABEADMANwAtADkAMAA5AEEALQAwADMAMQAxADEANgAxADEAOQBEADkAQgB9AA=="; + + // Test 2: Kopete sending webcam to WLM + encodedContext = "ewBCADgAQgBFADcAMABEAEUALQBFADIAQwBBAC0ANAA0ADAAMAAtAEEARQAwADMALQA4ADgARgBGADgANQBCADkARgA0AEUAOAB9AA=="; + + // Send the invitation + sendSlpSessionInvitation( KMessShared::generateID(), getPushAppId(), 4, encodedContext ); +} + + + +/** + * Step two of a user-started chat: the contact accepts + */ +void WebcamTransferP2P::userStarted2_ContactAccepts(const MimeMessage &message) +{ + Q_UNUSED( message ); + // FIXME: start DC connection + + if( isUserSender_ ) + { + // First syn message to send. + sendSipMessage( "syn", 0x06, 0x91, 0x7c, P2P_MSG_WEBCAM_SYN ); // WLM + //sendSipMessage( "syn", 0x17, 0x2a, 0x01 ); // Kopete + } +} + + + +/** + * Step three of a user-started chat: the user prepares for the session + */ +void WebcamTransferP2P::userStarted3_UserPrepares() +{ + + +} + + + #include "webcamtransferp2p.moc" diff --git a/src/network/applications/webcamtransferp2p.h b/src/network/applications/webcamtransferp2p.h index 7962cf9..34c00cb 100644 --- a/src/network/applications/webcamtransferp2p.h +++ b/src/network/applications/webcamtransferp2p.h @@ -20,6 +20,11 @@ #include "p2papplication.h" +#include + +class MsnWebcamConnection; +class DirectConnectionPool; + /** @@ -44,6 +49,9 @@ class WebcamTransferP2P : public P2PApplication // The destructor virtual ~WebcamTransferP2P(); + // Return the application's GUID for "video conference" invitations. + static QString getConferenceAppId(); + // Return the application's GUID (for the "user push" invitation) static QString getPushAppId(); @@ -51,9 +59,52 @@ class WebcamTransferP2P : public P2PApplication static QString getPullAppId(); private: - // Step one of a contact-started chat: the contact invites the user void contactStarted1_ContactInvitesUser(const MimeMessage& message); + // Step two of a contact-started chat: the user accepts + void contactStarted2_UserAccepts(); + // Step three of a contact-started chat: the contact confirms the accept + void contactStarted3_ContactConfirmsAccept(const MimeMessage& message); + // Create the producer or viewer XML tag + QString createSipXml(uint recipientId, uint sessionId); + // Called when data is received + void gotData(const P2PMessage &message); + // Called when all data is received. + void gotDataComplete(const P2PMessage &lastMessage); + // Called when an ack is received, which is not handled by the normal class. + bool gotUnhandledAck( const P2PMessage &message, P2PMessageType ackedMessageType ); + // Send a webcam negotiation message. + void sendSipMessage( const QString &contents, quint8 flag1, quint8 flag2, quint8 flag3, P2PMessageType messageType ); + // Step one of a user-started chat: the user invites the contact + void userStarted1_UserInvitesContact(); + // Step two of a user-started chat: the contact accepts + void userStarted2_ContactAccepts(const MimeMessage &message); + // Step three of a user-started chat: the user prepares for the session + void userStarted3_UserPrepares(); + + private slots: + // The active webcam connection is authorized. + void slotActiveConnectionAuthorized(); + // The active webcam connection is closed + void slotActiveConnectionClosed(); + // All connection attempts failed. + void slotAllConnectionsFailed(); + // The active webcam connection is closed + void slotConnectionEstablished(); + + private: + // The authentication string for the webcam connection + QString authentication_; + // The negotiation message buffer + QBuffer buffer_; + // Whether the contact requests the webcam from us, or it wants to share it's webcam. + bool isUserSender_; + // The active connection to receive webcam frames. + MsnWebcamConnection *webcamConnection_; + // The pool of connection attempts to get a webcam connection. + DirectConnectionPool *webcamConnectionPool_; + // The GUID received in the invitation + QString webcamGuid_; }; #endif diff --git a/src/network/chatmessage.h b/src/network/chatmessage.h index e564b6f..5355601 100644 --- a/src/network/chatmessage.h +++ b/src/network/chatmessage.h @@ -58,7 +58,9 @@ class ChatMessage CONTENT_NOTIFICATION_NUDGE, // Nudge CONTENT_NOTIFICATION_WINK, // Wink - CONTENT_NOTIFICATION_PRESENCE, // A contact has joined or left the chat; or has disconnected or logged in + CONTENT_NOTIFICATION_JOINED, // A contact has joined the chat + CONTENT_NOTIFICATION_LEFT, // A contact has left the chat + CONTENT_NOTIFICATION_STATUS, // A contact has changed status CONTENT_SYSTEM_NOTICE, // KMess or protocol level message about a contact, like "contact is blocking you" or "contact is offline" CONTENT_SYSTEM_ERROR, // Protocol/application error message, like "unsupported feature" or "message cannot be sent" diff --git a/src/network/extra/directconnectionbase.cpp b/src/network/extra/directconnectionbase.cpp index 86f0f43..94533fb 100644 --- a/src/network/extra/directconnectionbase.cpp +++ b/src/network/extra/directconnectionbase.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -54,7 +55,7 @@ DirectConnectionBase::DirectConnectionBase( QObject *parent ) // Read the interval of ports which we'll use to try establishing a connection KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "General" ); lowestServerPortLimit_ = (quint16)group.readEntry( "lowestTransferPort", 6891 ); - highestServerPortLimit_ = (quint16)group.readEntry( "highestServerPort", 6900 ); + highestServerPortLimit_ = (quint16)group.readEntry( "highestTransferPort", 6900 ); #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL kDebug() << "Using port interval" << lowestServerPortLimit_ << "-" << highestServerPortLimit_; #endif @@ -67,10 +68,6 @@ DirectConnectionBase::DirectConnectionBase( QObject *parent ) // The destructor DirectConnectionBase::~DirectConnectionBase() { - bool connected = isConnected(); - bool server = isServer_; - bool authorized = authorized_; - // Close and clean up if(socket_ != 0 || server_ != 0) { @@ -78,7 +75,7 @@ DirectConnectionBase::~DirectConnectionBase() } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kDebug() << "DESTROYED. [connectTo=" << connectingTo_ << " wasConnected=" << connected << " wasServer=" << server << " wasAuthorized=" << authorized << "]"; + kDebug() << "DESTROYED. [connectTo=" << connectingTo_ << " wasConnected=" << isConnected() << " wasServer=" << isServer_ << " wasAuthorized=" << authorized_ << "]"; #endif } @@ -92,7 +89,7 @@ void DirectConnectionBase::closeConnection() #endif // Reset globals - // Also see slotSocketClosed() + // Also see slotSocketDisconnected() isServer_ = false; authorized_ = false; connectionTimer_.stop(); @@ -100,10 +97,6 @@ void DirectConnectionBase::closeConnection() // Check whether we should emit a signal: bool closed = closeClientSocket() || closeServerSocket(); -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_CLOSE(this); -#endif - // Signal (only once) that the connection was closed if(closed) { @@ -119,24 +112,27 @@ bool DirectConnectionBase::closeClientSocket() connectionTimer_.stop(); // Notify the socket was already closed. - if( socket_ == 0 ) - { - return false; - } + if( KMESS_NULL( socket_ ) ) return false; #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL kDebug() << "destroying client socket."; #endif +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_CLOSE(this); +#endif + // Close the socket and delete it. // Use deleteLater since it could be called from slotSocketError() + // block signals before disconnecting - otherwise we might find ourselves crashing. + socket_->blockSignals( true ); socket_->disconnectFromHost(); socket_->deleteLater(); socket_ = 0; writeHandlerCount_ = 0; -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_CLOSE(this); +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "destroyed client socket."; #endif return true; @@ -148,26 +144,36 @@ bool DirectConnectionBase::closeClientSocket() bool DirectConnectionBase::closeServerSocket() { #ifdef KMESSTEST - KMESS_ASSERT( socket_ == 0 || socket_ != 0 ); // nextPendingConnection() turns socket_ into a child of server_ + KMESS_ASSERT( socket_ == 0 || server_ != 0 ); // nextPendingConnection() turns socket_ into a child of server_ #endif connectionTimer_.stop(); // Notify the socket was already closed. - if(server_ == 0) - { - return false; - } + if( KMESS_NULL( server_ ) ) return false; #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kDebug() << "destroying server socket."; + if( socket_ == 0 ) + { + kDebug() << "destroying server socket."; + } + else + { + kDebug() << "closing server socket. Object will not be destroyed yet because a socket is connected."; + } #endif // Close the server - // Use deleteLater since it could be called from slotSocketError() server_->close(); - server_->deleteLater(); - server_ = 0; + + // Can't delete the object if there is still a socket_ + // because socket_ becomes a qobject child of server_. + if( socket_ == 0 ) + { + // Use deleteLater since it could be called from slotSocketError() + server_->deleteLater(); + server_ = 0; + } return true; } @@ -287,7 +293,7 @@ quint16 DirectConnectionBase::getRemotePort() const } else { - return socket_->localPort(); + return socket_->peerPort(); } } @@ -357,7 +363,7 @@ bool DirectConnectionBase::isAuthorized() const // Return true if a connection is active bool DirectConnectionBase::isConnected() const { - return ( socket_ != 0 && socket_->isValid() && socket_->state() == QAbstractSocket::ConnectedState ); + return ( socket_ != 0 && socket_->isValid() && socket_->state() == QAbstractSocket::ConnectedState ); } @@ -563,6 +569,23 @@ qint64 DirectConnectionBase::readBlock( QByteArray &buffer, const qint64 maxSize +// Read data from the socket (stored it in a QBuffer) +qint64 DirectConnectionBase::readBlock( QBuffer &buffer, const qint64 maxSize ) +{ + char charBuffer[1024]; + qint64 readSize = qMin( maxSize, (qint64) 1024 ); + qint64 noBytesRead = readBlock( charBuffer, readSize ); + + if( noBytesRead > 0 ) + { + buffer.write( charBuffer, noBytesRead ); + } + + return noBytesRead; +} + + + // Mark the remote host as authorized (usually after the handshake was successful) void DirectConnectionBase::setAuthorized(bool authorized) { @@ -592,6 +615,7 @@ void DirectConnectionBase::slotAcceptConnection() { #ifdef KMESSTEST KMESS_ASSERT( socket_ == 0 ); + KMESS_ASSERT( server_ != 0 ); #endif #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL kDebug() << "Accept a socket"; @@ -662,7 +686,7 @@ void DirectConnectionBase::slotConnectionFailed() // This method is added for derived classes to overload. // It pretends we're also listening to our own signals. - QString sysError = getSocketError(); // avoids poking sys_errlist[] manually + QString sysError( getSocketError() ); // avoids poking sys_errlist[] manually if( ! sysError.isNull() ) { @@ -742,10 +766,11 @@ void DirectConnectionBase::slotSocketConnected() // Signal that the connection was closed void DirectConnectionBase::slotSocketDisconnected() { - QAbstractSocket::SocketState state = socket_->state(); - +#ifdef KMESSTEST + KMESS_ASSERT( socket_ != 0 ); +#endif #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kDebug() << "Socket got closed, state=" << state << "."; + kDebug() << "Socket got closed, state=" << socket_->state() << "."; #endif // Reset the globals. @@ -753,16 +778,9 @@ void DirectConnectionBase::slotSocketDisconnected() authorized_ = false; connectionTimer_.stop(); - if( state != QAbstractSocket::ClosingState && state != QAbstractSocket::UnconnectedState ) - { - // Make sure the objects are cleaned up too. - closeClientSocket(); - closeServerSocket(); - } - -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_CLOSE(this); -#endif + // Make sure the objects are cleaned up too. + closeClientSocket(); + closeServerSocket(); } @@ -786,8 +804,6 @@ void DirectConnectionBase::slotSocketError( QAbstractSocket::SocketError error ) closeClientSocket(); closeServerSocket(); -#warning Test how to respond to the various socket error codes. - // Filter errors that happen when you've connected already. switch( error ) { @@ -824,6 +840,8 @@ void DirectConnectionBase::slotSocketReadyWrite( qint64 bytesWritten ) "(bytesWritten=" << bytesWritten << " bytesToWrite=" << socket_->bytesToWrite() << " additional_bytesToWrite=" << additionalWriteBuffer_.size() << ")."; +#else + Q_UNUSED( bytesWritten ); #endif // TODO: some notice in the network window that we'll be sending crap now (remaining parts of a p2p packet). diff --git a/src/network/extra/directconnectionbase.h b/src/network/extra/directconnectionbase.h index f7676aa..a501572 100644 --- a/src/network/extra/directconnectionbase.h +++ b/src/network/extra/directconnectionbase.h @@ -25,6 +25,7 @@ class QTcpSocket; class QTcpServer; +class QBuffer; @@ -114,6 +115,8 @@ class DirectConnectionBase : public QObject qint64 readBlock( char *buffer, const qint64 size ); // Read data from the socket (uses the QByteArray size() as block size) qint64 readBlock( QByteArray &buffer, const qint64 maxSize = 0, const qint64 offset = 0 ); + // Read data from the socket (stored it in a QBuffer) + qint64 readBlock( QBuffer &buffer, const qint64 maxSize = 0 ); // Mark the remote host as authorized (usually after the handshake was successful) void setAuthorized(bool authorized); // Write data to the socket diff --git a/src/network/extra/directconnectionpool.cpp b/src/network/extra/directconnectionpool.cpp index 55c2c18..51c5c59 100644 --- a/src/network/extra/directconnectionpool.cpp +++ b/src/network/extra/directconnectionpool.cpp @@ -28,11 +28,11 @@ // The constructor -DirectConnectionPool::DirectConnectionPool() +DirectConnectionPool::DirectConnectionPool( bool waitForAuthorized ) : QObject() , activeConnection_(0) + , waitForAuthorized_( waitForAuthorized ) { - } @@ -174,6 +174,12 @@ int DirectConnectionPool::addServerConnection(DirectConnectionBase *connection) */ void DirectConnectionPool::clearPending() { + // Avoid unwanted debug messages.. + if( pendingConnections_.isEmpty() && unauthorizedConnections_.isEmpty() ) + { + return; + } + #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL kDebug() << "Removing pending sockets."; #endif @@ -189,8 +195,20 @@ void DirectConnectionPool::clearPending() pendingConnection->deleteLater(); // delete should not be called from a slot. } + // Tell all other unauthorized connections to abort + foreach( DirectConnectionBase *unauthorizedConnection, unauthorizedConnections_ ) + { +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "Deleting unauthorized connection to peer " + << unauthorizedConnection->getRemoteIp() << ":" << unauthorizedConnection->getRemotePort() << endl; +#endif + + unauthorizedConnection->deleteLater(); // delete should not be called from a slot. + } + // Clear the list pendingConnections_.clear(); + unauthorizedConnections_.clear(); } @@ -220,7 +238,8 @@ bool DirectConnectionPool::hasActiveConnection() const */ bool DirectConnectionPool::hasPendingConnections() const { - return (pendingConnections_.count() > 0); + return ( ! pendingConnections_.isEmpty() + || ! unauthorizedConnections_.isEmpty() ); } @@ -243,6 +262,23 @@ void DirectConnectionPool::slotConnectionAuthorized() // Signal to ApplicationList DirectConnectionBase *connection = static_cast(const_cast(eventSender)); + + // If the pool had to wait for an authorized connection, it's done now! + if( waitForAuthorized_ ) + { +#ifdef KMESSTEST + KMESS_ASSERT( activeConnection_ == 0 ); +#endif + + // Make active now. + activeConnection_ = connection; + unauthorizedConnections_.removeAll( connection ); + clearPending(); + + // Signal the connection is established, allows to sent any handshake, etc.. + emit connectionEstablished(); + } + #ifdef KMESSTEST KMESS_ASSERT( connection == activeConnection_ ); #else @@ -268,6 +304,7 @@ void DirectConnectionPool::slotConnectionClosed() // Remove the connection DirectConnectionBase *connection = static_cast(const_cast(eventSender)); pendingConnections_.removeAll( connection ); + unauthorizedConnections_.removeAll( connection ); // Signal when the active connection closed if(connection == activeConnection_) @@ -286,7 +323,7 @@ void DirectConnectionPool::slotConnectionClosed() #endif // Check whethere there is still a chance to get a direct connection - if( activeConnection_ == 0 && pendingConnections_.isEmpty() ) + if( activeConnection_ == 0 && ! hasPendingConnections() ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL kDebug() << "No remaining direct connections left."; @@ -327,6 +364,11 @@ void DirectConnectionPool::slotConnectionEstablished() { if( pendingConnection->isConnected() ) { +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "Connected to peer " + << pendingConnection->getRemoteIp() << ":" << pendingConnection->getRemotePort() << endl; +#endif + // Established connection found, remove from list. pendingConnections_.removeAll( pendingConnection ); @@ -338,7 +380,7 @@ void DirectConnectionPool::slotConnectionEstablished() // try the next item in the list instead. #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL kDebug() << "could not initialize connection, " - << "trying next available connection." << endl; + "trying next available connection." << endl; #endif pendingConnection->deleteLater(); pendingConnection = 0; @@ -346,7 +388,18 @@ void DirectConnectionPool::slotConnectionEstablished() } else { - // Initialized, this is the active connection! + // For webcam connections at port 80: wait until connection is authorized too. + if( waitForAuthorized_ ) + { +#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL + kDebug() << "by request, waiting for the connection to authorize first..."; +#endif + + unauthorizedConnections_.append( pendingConnection ); + return; + } + + // Initiated, this is the active connection! activeConnection_ = pendingConnection; break; } @@ -356,15 +409,7 @@ void DirectConnectionPool::slotConnectionEstablished() // If there is an initialized connection, remove all other pending connections. if( activeConnection_ != 0 ) { -#ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kDebug() << "Connected to peer " - << activeConnection_->getRemoteIp() << ":" << activeConnection_->getRemotePort() << endl; -#endif - - if( pendingConnections_.count() > 0 ) - { - clearPending(); - } + clearPending(); // Signal the connection is established, allows to sent any handshake, etc.. emit connectionEstablished(); @@ -397,7 +442,7 @@ void DirectConnectionPool::slotConnectionFailed() if( activeConnection_ == 0 ) { // If there are no remaining pending connections - if( pendingConnections_.count() == 0 ) + if( ! hasPendingConnections() ) { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL kDebug() << "No remaining direct connections left."; @@ -409,7 +454,7 @@ void DirectConnectionPool::slotConnectionFailed() else { #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kDebug() << "There are " << pendingConnections_.count() << " remaining direct connections, waiting for one to succeed."; + kDebug() << "There are " << ( pendingConnections_.count() + unauthorizedConnections_.count() ) << " remaining direct connections, waiting for one to succeed."; #endif } } @@ -428,7 +473,7 @@ void DirectConnectionPool::slotConnectionFailed() } #ifdef KMESSDEBUG_DIRECTCONNECTION_GENERAL - kDebug() << "Deleting failed connection."; + kDebug() << "Deleting failed connection."; #endif // Delete the failed connection object. diff --git a/src/network/extra/directconnectionpool.h b/src/network/extra/directconnectionpool.h index 7d988c6..1e9f732 100644 --- a/src/network/extra/directconnectionpool.h +++ b/src/network/extra/directconnectionpool.h @@ -43,7 +43,7 @@ class DirectConnectionPool : public QObject public: // The constructor - DirectConnectionPool(); + DirectConnectionPool( bool waitForAuthorized = false ); // The destructor virtual ~DirectConnectionPool(); @@ -62,7 +62,6 @@ class DirectConnectionPool : public QObject // Verify whether the currently active connection is still connected bool verifyActiveConnection(); - public slots: // A connection was authorized void slotConnectionAuthorized(); @@ -75,9 +74,13 @@ class DirectConnectionPool : public QObject private: // private properties // The currently active connection - DirectConnectionBase *activeConnection_; + DirectConnectionBase *activeConnection_; // The list of pending connections QList pendingConnections_; + // The list of connected, but unauthorized connections + QList unauthorizedConnections_; + // Wait for a fully authorized connection (needed for webcam) + bool waitForAuthorized_; signals: // The active connection was authorized diff --git a/src/network/extra/msnftpconnection.cpp b/src/network/extra/msnftpconnection.cpp index a0c8031..765676f 100644 --- a/src/network/extra/msnftpconnection.cpp +++ b/src/network/extra/msnftpconnection.cpp @@ -25,8 +25,6 @@ #include #include -#include - #ifdef KMESSDEBUG_MSNFTP #define KMESSDEBUG_MSNFTP_GENERAL @@ -37,8 +35,10 @@ // The constructor -MsnFtpConnection::MsnFtpConnection() +MsnFtpConnection::MsnFtpConnection( const QString authHandle, const QString authCookie ) : DirectConnectionBase() + , authCookie_( authCookie ) + , authHandle_( authHandle ) , fileBytesRemaining_(0) , fileSize_(0) , inputStream_(0) @@ -47,6 +47,7 @@ MsnFtpConnection::MsnFtpConnection() , remainingBlockBytes_(0) , userCancelled_(false) { + setObjectName("MsnFtpConnection[" + authHandle + "]"); } @@ -116,20 +117,19 @@ void MsnFtpConnection::emitCancelStatusMessage(bool contactCancelled) if(userCancelled_) { // The user pressed the cancel button - emit statusMessage( i18n("The transfer of %1 was cancelled."), STATUS_CHAT_FAILED ); - emit statusMessage( i18n("Cancelled"), STATUS_DIALOG_FAILED ); + emit statusMessage( ki18n("You have cancelled the transfer of file "%1"."), STATUS_CHAT_FAILED ); + emit statusMessage( i18n("Cancelled"), STATUS_DIALOG_FAILED ); } else if(contactCancelled) { // The contact pressed the cancel button - // TODO: replace this with "The contact cancelled the filetransfer" with KMess 1.5 - emit statusMessage( i18n("The contact cancelled the session."), STATUS_CHAT_FAILED ); - emit statusMessage( i18n("The contact cancelled the session."), STATUS_DIALOG_FAILED ); + emit statusMessage( ki18n("The contact has cancelled the transfer of file "%1"."), STATUS_CHAT_FAILED ); + emit statusMessage( i18n("Cancelled"), STATUS_DIALOG_FAILED ); } else { // This class sent the "CCL" message in a response, because the contact sent bad data. - emit statusMessage( i18n("The file transfer invitation was cancelled. Bad data was received."), STATUS_CHAT_FAILED ); + emit statusMessage( i18n("The file transfer invitation was cancelled. Bad data was received."), STATUS_CHAT_FAILED ); emit statusMessage( i18n("Failed"), STATUS_DIALOG_FAILED ); } } @@ -201,7 +201,7 @@ void MsnFtpConnection::parseCommand(const QStringList &command) mode_ = SEND_DATA; // Update status - emit statusMessage( i18n("Sending file %1"), STATUS_DIALOG ); + emit statusMessage( ki18n("Sending file %1"), STATUS_DIALOG ); } else { @@ -214,8 +214,8 @@ void MsnFtpConnection::parseCommand(const QStringList &command) else if(command[0] == "BYE") { // Server: Got BYE from client - closeConnection(); emit transferComplete(); + closeConnection(); } else if(command[0] == "CCL") { @@ -326,9 +326,9 @@ void MsnFtpConnection::parseReceivedFileData() kWarning() << "read error (returned " << noBytesRead << " block size=" << blockSize << ")"; #endif // Socket error, exit - closeConnection(); emit transferFailed(); // cancelTransfer(false); + closeConnection(); return; } else @@ -336,7 +336,7 @@ void MsnFtpConnection::parseReceivedFileData() // Update the progress dialog fileBytesRemaining_ -= noBytesRead; remainingBlockBytes_ -= noBytesRead; - emit transferProgess(fileSize_ - fileBytesRemaining_); + emit transferProgess( (qint32)( fileSize_ - fileBytesRemaining_ ) ); // Add data to file outputStream_->write( rawBlock, noBytesRead ); @@ -364,15 +364,6 @@ void MsnFtpConnection::parseReceivedFileData() -// Set the authentication parameters -void MsnFtpConnection::setAuthInfo(const QString authHandle, const QString authCookie) -{ - authHandle_ = authHandle; - authCookie_ = authCookie; -} - - - // Send a file bool MsnFtpConnection::sendFile(QFile *inputFile) { @@ -394,7 +385,7 @@ bool MsnFtpConnection::sendFile(QFile *inputFile) if(listening) { // Success! - QString externIp = CurrentAccount::instance()->getExternalIp(); + QString externIp( CurrentAccount::instance()->getExternalIp() ); emit statusMessage( i18n( "Awaiting connection at %1, port %2", externIp, // display the external ip submitted to the contact, not our local lan ip. QString::number( getLocalServerPort() ) ), @@ -404,7 +395,7 @@ bool MsnFtpConnection::sendFile(QFile *inputFile) else { // Failed! - emit statusMessage( i18n("The transfer of %1 failed. Couldn't open a local port."), STATUS_CHAT_FAILED); + emit statusMessage( ki18n("The transfer of %1 failed. Couldn't open a local port."), STATUS_CHAT_FAILED); emit statusMessage( i18n("Couldn't open a local port."), STATUS_DIALOG_FAILED); emit transferFailed(); } @@ -475,7 +466,7 @@ void MsnFtpConnection::slotConnectionFailed() #endif // Failed! - emit statusMessage( i18n("The transfer of %1 failed. A connection could not be made"), STATUS_CHAT_FAILED ); + emit statusMessage( ki18n("The transfer of %1 failed. A connection could not be made."), STATUS_CHAT_FAILED ); emit statusMessage( i18n("Unable to make a connection."), STATUS_DIALOG_FAILED ); emit transferFailed(); } @@ -580,7 +571,7 @@ void MsnFtpConnection::slotWriteData() mode_ = RECEIVE_DATA; // Update the status - emit statusMessage( i18n("Receiving file %1"), STATUS_DIALOG ); + emit statusMessage( ki18n("Receiving file %1"), STATUS_DIALOG ); break; } @@ -726,7 +717,7 @@ void MsnFtpConnection::writeFileData() // Update the progress fileBytesRemaining_ -= noBytesRead; - emit transferProgess(fileSize_ - fileBytesRemaining_); + emit transferProgess( (qint32)( fileSize_ - fileBytesRemaining_ ) ); // Write the data to the socket_ writeBlock( rawBlock, noBytesRead + 3 ); diff --git a/src/network/extra/msnftpconnection.h b/src/network/extra/msnftpconnection.h index 772e71c..ef5f96e 100644 --- a/src/network/extra/msnftpconnection.h +++ b/src/network/extra/msnftpconnection.h @@ -24,6 +24,8 @@ #include +#include + class QIODevice; class QFile; @@ -46,7 +48,7 @@ class MsnFtpConnection : public DirectConnectionBase public: // The constructor - MsnFtpConnection(); + MsnFtpConnection( const QString authHandle, const QString authCookie ); // The destructor virtual ~MsnFtpConnection(); @@ -54,8 +56,6 @@ class MsnFtpConnection : public DirectConnectionBase void closeConnection(); // Cancel the transfer void cancelTransfer(bool userCancelled = true); - // Set the authentication parameters - void setAuthInfo(const QString authHandle, const QString authCookie); // Send a file bool sendFile(QFile *inputFile); // Retrieve a file @@ -124,9 +124,9 @@ class MsnFtpConnection : public DirectConnectionBase // The authorization user handle QString authHandle_; // The number of bytes received - unsigned long fileBytesRemaining_; + qint64 fileBytesRemaining_; // The remaining bytes of the file - unsigned long fileSize_; + qint64 fileSize_; // The stream to read file data from QIODevice *inputStream_; // The mode of the transfer. @@ -141,6 +141,8 @@ class MsnFtpConnection : public DirectConnectionBase signals: // Display a status message void statusMessage(QString message, int statusType); + // Display a status message (as a raw localization string) + void statusMessage( KLocalizedString message, int statusType ); // Signal when the transfer was succesful void transferComplete(); // Signal when the transfer failed diff --git a/src/network/extra/msnwebcamconnection.cpp b/src/network/extra/msnwebcamconnection.cpp new file mode 100644 index 0000000..36bb31d --- /dev/null +++ b/src/network/extra/msnwebcamconnection.cpp @@ -0,0 +1,236 @@ +/*************************************************************************** + msnwebcamconnection.cpp - description + ------------------- + begin : Sun 08 31 2008 + copyright : (C) 2008 by Diederik van der Boor + email : "vdboor" --at-- "codingdomain.com" + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "msnwebcamconnection.h" + +#include + +#include "../../kmessdebug.h" +#include "../p2pmessage.h" // only for P2PMessage::insertBytes() + + +#ifdef KMESSDEBUG_WEBCAMCONNECTION + #define KMESSDEBUG_WEBCAMCONNECTION_GENERAL + // note that enabling the KMESSDEBUG_WEBCAMCONNECTION_RECEIVING makes file transfer slow and inresponsive. + #define KMESSDEBUG_WEBCAMCONNECTION_RECEIVING +#endif + + + +/** + * The constructor + * + * @param contactHandle Email address of the contact. + * @param recipientId Negotiated ID of the recipient, used for authentication. + * @param sessionId Negotiated ID of the session, used for authentication. + */ +MsnWebcamConnection::MsnWebcamConnection(const QString &contactHandle, uint recipientId, uint sessionId) + : DirectConnectionBase(0) + , contactHandle_(contactHandle) + , firstMessage_(true) + , receiveMode_( MODE_AUTHENTICATION ) + , recipientId_(recipientId) + , remainingBlockBytes_(0) + , sessionId_(sessionId) +{ + setObjectName( "MsnWebcamConnection[" + contactHandle + "]" ); + + buffer_.open( QIODevice::ReadWrite ); +} + + + +/** + * The destructor + */ +MsnWebcamConnection::~MsnWebcamConnection() +{ +#ifdef KMESSDEBUG_WEBCAMCONNECTION_GENERAL + kDebug() << "DESTROYED. [handle=" << contactHandle_ << "]"; +#endif +} + + + +// Return the contact handle +const QString& MsnWebcamConnection::getContactHandle() const +{ + return contactHandle_; +} + + + +// Send the handshake packets +bool MsnWebcamConnection::initialize() +{ + // When this is the server, nothing needs to be sent. + if(isServer()) + { + return isConnected(); + } + +#ifdef KMESSDEBUG_WEBCAMCONNECTION_GENERAL + kDebug() << "sending preamble message"; +#endif +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_INIT(this, "CAM " + getRemoteIp()); +#endif + firstMessage_ = false; + + // Mark the time we received the message, to detect timeouts + lastActivity_.start(); + + // Send the authentication packet. + QString message( "recipientid=" + QString::number( recipientId_ ) + "&sessionid=" + QString::number( sessionId_ ) + "\r\n\r\n" ); + return writeBlock( message.toUtf8() ); +} + + + +// Send the message to the contact +bool MsnWebcamConnection::sendMessage(const QByteArray &message) +{ +#ifdef KMESSDEBUG_WEBCAMCONNECTION_GENERAL + kDebug() << "sending message block (size=" << message.size() << ", handle=" << contactHandle_ << ")"; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( message.size() <= 1352 ); // max message size for official client + KMESS_ASSERT( ! hasTemporaryWriteError() ); +#endif + + // KMESS_NET_SENT is called by the base class already. + + // Mark the time we received the message, to detect timeouts + lastActivity_.start(); + + // Send the message size in advance + QByteArray lengthField( 4, 0x00 ); + P2PMessage::insertBytes( lengthField, message.size(), 0 ); + if( ! writeBlock( lengthField ) && ! hasTemporaryWriteError() ) + { + kWarning() << "Unable to send the preamble block " + "(contact=" << contactHandle_ << ")." << endl; + return false; + } + + // Send the actual block + return writeBlock( message ); +} + + + +// This is called when data is received from the socket. +void MsnWebcamConnection::slotSocketDataReceived() +{ + // Same algorithm as MsnDirectConnection::slotSocketDataReceived() + QString command; + int newBlockSize = 0; + + while( true ) + { + // See what can be read from the socket. + qint64 noBytesRead = readBlock( buffer_ ); + if( noBytesRead == 0 ) + { +#ifdef KMESSDEBUG_WEBCAMCONNECTION_GENERAL + kDebug() << "Socket buffer is empty, will wait for new data (read=" << noBytesRead << ")."; +#endif + return; + } + else if( noBytesRead < 0 ) + { +#ifdef KMESSDEBUG_WEBCAMCONNECTION_GENERAL + kDebug() << "Socket read returned an error (read=" << noBytesRead << ")."; +#endif + return; + } + + switch( receiveMode_ ) + { + case MODE_AUTHENTICATION: + // See if a string with 2 newlines is received. + // Assume it will be received in 1 packet, since the connection is just starting and the size is very small. + newBlockSize = buffer_.buffer().indexOf("\r\n\r\n"); + if( newBlockSize == -1 ) + { + kWarning() << "Received corrupt authentication command for the webcam connection (contact=" << contactHandle_ << ")."; + closeConnection(); + return; + } + +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_RECEIVED( this, buffer_.buffer().left( newBlockSize + 4 ) ); +#endif + + // Convert to a string. + command = buffer_.read( newBlockSize + 4 ).left( newBlockSize ); +#ifdef KMESSDEBUG_WEBCAMCONNECTION_GENERAL + kDebug() << "Received authentication command: " << command; +#endif + + if( isServer() ) + { + // Server, we should receive the authentication now. + QString expectedAuthentication( "recipientid=" + QString::number( recipientId_ ) + "&sessionid=" + QString::number( sessionId_ ) ); + if( command != expectedAuthentication ) + { + kWarning() << "Received invalid authentication command for the webcam connection (received=" << command << " expected=" << expectedAuthentication << "contact=" << contactHandle_ << ")."; + closeConnection(); + return; + } + + // Authentication is correct, report to client. + writeBlock("connected\r\n\r\n"); + + // Switch mode, and notify calling class. + receiveMode_ = MODE_HEADER; + setAuthorized( true ); + } + else + { + // Client, we should get a "connected" response back. + if( command != "connected" ) + { + kWarning() << "Received invalid authentication response for the webcam connection (received=" << command << "expected=\"connected\" contact=" << contactHandle_ << ")."; + closeConnection(); + return; + } + + // Switch mode, and notify calling class. + receiveMode_ = MODE_HEADER; + setAuthorized( true ); + } + + break; + + + case MODE_HEADER: + + break; + + + case MODE_V_FRAME: + + break; + + } + } +} + + + +#include "msnwebcamconnection.moc" diff --git a/src/network/extra/msnwebcamconnection.h b/src/network/extra/msnwebcamconnection.h new file mode 100644 index 0000000..2348c0d --- /dev/null +++ b/src/network/extra/msnwebcamconnection.h @@ -0,0 +1,90 @@ +/*************************************************************************** + msnwebcamconnection.h - description + ------------------- + begin : Sun 08 31 2008 + copyright : (C) 2008 by Diederik van der Boor + email : "vdboor" --at-- "codingdomain.com" + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef MSNWEBCAMCONNECTION_H +#define MSNWEBCAMCONNECTION_H + +#include "directconnectionbase.h" + +#include +#include + + +class MimeMessage; + + + +/** + * A connection used to transfer webcam video frames between two end-hosts. + * This connection can be established during a P2PApplication invitation. + * + * @author Diederik van der Boor + * @ingroup NetworkExtra + */ +class MsnWebcamConnection : public DirectConnectionBase +{ + Q_OBJECT + + public: + // The constructor + MsnWebcamConnection(const QString &contactHandle, uint recipientId, uint sessionId); + // The destructor + virtual ~MsnWebcamConnection(); + + // Send the preamble packet preceeding all other packets + bool initialize(); + // Return the contact handle + const QString& getContactHandle() const; + // Send the message to the contact + bool sendMessage(const QByteArray &message); + // Mark the remote host as authorized (make it a public method) + using DirectConnectionBase::setAuthorized; + + private slots: // Protected slots + // This is called when data is received from the socket. + void slotSocketDataReceived(); + + private: // private properties + enum ReceiveMode + { + MODE_AUTHENTICATION + , MODE_HEADER + , MODE_V_FRAME + }; + + // The buffer for the incoming p2p messages. + QBuffer buffer_; + // The other contact we're connected with + QString contactHandle_; + // Whether the first message is received + bool firstMessage_; + // The current receive mode + ReceiveMode receiveMode_; + // The recipient ID to authenticate the connection. + uint recipientId_; + // Set when only partial data was received + quint64 remainingBlockBytes_; + // The session ID to authenticate the connection. + uint sessionId_; + + signals: + // Signal that a full message block was received. + void messageReceived(const QByteArray &message); +}; + + +#endif diff --git a/src/network/extra/p2pfragmenttracker.cpp b/src/network/extra/p2pfragmenttracker.cpp index e7cc781..e5f152c 100644 --- a/src/network/extra/p2pfragmenttracker.cpp +++ b/src/network/extra/p2pfragmenttracker.cpp @@ -50,9 +50,9 @@ P2PFragmentTracker::~P2PFragmentTracker() QString P2PFragmentTracker::getDebugMap() const { // Add header - QString result = "id=" + QString::number( messageID_ ) - + ", got " + QString::number( transferredBytes_ ) - + " bytes of " + QString::number( totalSize_ ); + QString result( "id=" + QString::number( messageID_ ) + + ", got " + QString::number( transferredBytes_ ) + + " bytes of " + QString::number( totalSize_ ) ); if( ! ranges_.isEmpty() ) { result += ", ranges:"; @@ -84,7 +84,7 @@ QString P2PFragmentTracker::getDebugMap() const * @brief Return the identifier of the tracked message. * @return The message identifier. */ -unsigned long P2PFragmentTracker::getMessageID() const +quint32 P2PFragmentTracker::getMessageID() const { return messageID_; } @@ -95,12 +95,12 @@ unsigned long P2PFragmentTracker::getMessageID() const * @brief Return the number of bytes transferred. * @returns Number of bytes transferred. */ -unsigned long P2PFragmentTracker::getTransferredBytes() const +quint32 P2PFragmentTracker::getTransferredBytes() const { // TODO: for KMess 1.6, remove this // Just soo close before release don't assume transferredBytes_ will always be correct - unsigned long realCount = 0; + quint32 realCount = 0; foreach( Range *range, ranges_ ) { realCount += ( range->end - range->start ); @@ -124,7 +124,7 @@ unsigned long P2PFragmentTracker::getTransferredBytes() const * * Resets the current state. */ -void P2PFragmentTracker::initialize( unsigned long messageID, unsigned long totalSize ) +void P2PFragmentTracker::initialize( quint32 messageID, quint32 totalSize ) { // Reset fields messageID_ = messageID; @@ -173,7 +173,7 @@ bool P2PFragmentTracker::isEmpty() const * @param messageID Message identifier to verify. * @return Returns true if the tracker is initialized to receive parts of the given message ID. */ -bool P2PFragmentTracker::isInitialized( unsigned long messageID ) const +bool P2PFragmentTracker::isInitialized( quint32 messageID ) const { return ( messageID_ == messageID ); } @@ -185,10 +185,10 @@ bool P2PFragmentTracker::isInitialized( unsigned long messageID ) const * @param offset The starting point of the fragment. * @param size The length of the fragment. */ -void P2PFragmentTracker::registerFragment( unsigned long offset, unsigned long size ) +void P2PFragmentTracker::registerFragment( quint32 offset, quint32 size ) { // Calculate end, check unsafe values. - unsigned long newEnd = offset + size; + quint32 newEnd = offset + size; if( newEnd > totalSize_ ) { newEnd = totalSize_; @@ -316,7 +316,7 @@ void P2PFragmentTracker::registerFragment( unsigned long offset, unsigned long s { while( nextRange != 0 && nextRange->start <= range->end ) { - unsigned long rangeSize = ( nextRange->end - nextRange->start ); + quint32 rangeSize = ( nextRange->end - nextRange->start ); transferredBytes_ -= rangeSize; if( nextRange->end > range->end ) // last item has highest range { diff --git a/src/network/extra/p2pfragmenttracker.h b/src/network/extra/p2pfragmenttracker.h index d30c161..600cd45 100644 --- a/src/network/extra/p2pfragmenttracker.h +++ b/src/network/extra/p2pfragmenttracker.h @@ -39,19 +39,19 @@ class P2PFragmentTracker // Output for debugging QString getDebugMap() const; // Return the message ID - unsigned long getMessageID() const; + quint32 getMessageID() const; // Return the number of received bytes - unsigned long getTransferredBytes() const; + quint32 getTransferredBytes() const; // Return whether the tracker is empty, no data added yet. bool isEmpty() const; // Return whether the tracker is initialized to receive a part for the given message ID. - bool isInitialized( unsigned long messageID ) const; + bool isInitialized( quint32 messageID ) const; // Initialize to receive a new message - void initialize( unsigned long messageID, unsigned long totalSize ); + void initialize( quint32 messageID, quint32 totalSize ); // Return whether the fragment tracker is complete. bool isComplete() const; // Register the arrival of a new fragment. - void registerFragment( unsigned long offset, unsigned long size ); + void registerFragment( quint32 offset, quint32 size ); private: /** @@ -59,16 +59,16 @@ class P2PFragmentTracker */ struct Range { - unsigned long start; - unsigned long end; + quint32 start; + quint32 end; }; /// The identifier of the message being transferred - unsigned long messageID_; + quint32 messageID_; /// The total size of the message. - unsigned long totalSize_; + quint32 totalSize_; /// The total number of bytes transferred. - unsigned long transferredBytes_; + quint32 transferredBytes_; /// The list of transferred ranges. QList ranges_; }; diff --git a/src/network/mimemessage.cpp b/src/network/mimemessage.cpp index ecc6dfc..cdbd53f 100644 --- a/src/network/mimemessage.cpp +++ b/src/network/mimemessage.cpp @@ -58,7 +58,7 @@ MimeMessage::MimeMessage(const QByteArray &message) { // we get the header without the binary data that comes after int nullPos = message.indexOf('\0'); - QString messageHeader = QString::fromUtf8(message.data(), (nullPos == -1) ? message.size() : nullPos ); + QString messageHeader( QString::fromUtf8(message.data(), (nullPos == -1) ? message.size() : nullPos ) ); // Regexps to parse the header QRegExp rx1("Content-Type: ([A-Za-z0-9$!*/\\-]*)"); @@ -94,7 +94,7 @@ MimeMessage::MimeMessage(const QByteArray &message) int bodySize = message.size() - bodyStart; // Extract the Mime fields from the message - QString mimeData = QString::fromUtf8( message.data(), bodyStart ); + QString mimeData( QString::fromUtf8( message.data(), bodyStart ) ); parseMessage( mimeData ); // Extract the binary data from the message. @@ -199,8 +199,8 @@ QString MimeMessage::decodeRFC2047String(const QByteArray &aStr) const if( ! aStr.contains("=?") ) { - //QString str = messageCodec->toUnicode(aStr); - QString str = QString::fromUtf8( aStr ); + //QString str( messageCodec->toUnicode(aStr) ); + QString str( QString::fromUtf8( aStr ) ); if (str.indexOf('\n') == -1) return str; QString str2((QChar*)0, str.length()); int i = 0; @@ -248,7 +248,7 @@ QString MimeMessage::decodeRFC2047String(const QByteArray &aStr) const valid = TRUE; // parse charset name charset = ""; - for (i=2,pos+=2; i=maxLen || !*pos) valid = FALSE; @@ -291,7 +291,7 @@ QString MimeMessage::decodeRFC2047String(const QByteArray &aStr) const else { // decode base64 text - cstr = KCodecs::base64Decode(str); + cstr = QByteArray::fromBase64( str ); } QTextCodec *codec = getCodecByName(charset); if (!codec) @@ -375,7 +375,7 @@ void MimeMessage::getFieldAndValue(QString& field, QString& value, const int ind // Return the message fields as a big string QString MimeMessage::getFields() const { - QString message = ""; + QString message( "" ); // Get the fields and values for( int i = 0; i < fields_.count(); i++ ) @@ -499,7 +499,7 @@ void MimeMessage::parseMessage(const QString& message) #ifdef KMESSTEST KMESS_ASSERT( fields_.last() == "Received" ); #endif - // Addition to parse e-mail headers, with Received: headers that continue at + // Addition to parse email headers, with Received: headers that continue at // the next line values_[ values_.count() - 1 ] += "\r\n" + lines[i].mid(2); } @@ -530,7 +530,7 @@ void MimeMessage::print() const { kDebug() << "Field: \"" << fields_[i] << "\" value: \"" << values_[i] << "\""; } - + if( binaryBody_.isEmpty() ) { kDebug() << "Body:" << endl << body_; diff --git a/src/network/msnchallengehandler.cpp b/src/network/msnchallengehandler.cpp index 4fe3c37..6c1d06d 100644 --- a/src/network/msnchallengehandler.cpp +++ b/src/network/msnchallengehandler.cpp @@ -30,151 +30,167 @@ #include "../kmessdebug.h" #include +#include #include -#include + +#define PRODUCT_KEY "ILTXC!4IXB5FB*PX" +#define PRODUCT_ID "PROD0119GSJUC$18" -MSNChallengeHandler::MSNChallengeHandler(const QString& productKey, const QString& productId) +MSNChallengeHandler::MSNChallengeHandler() { - m_productKey = productKey; - m_productId = productId; + productKey_ = PRODUCT_KEY; + productId_ = PRODUCT_ID; } + MSNChallengeHandler::~MSNChallengeHandler() { } -QString MSNChallengeHandler::computeHash(const QString& challengeString) + + +const QString MSNChallengeHandler::computeHash( const QString& challengeString ) { - // Step One: THe MD5 Hash. + // Step One: THe MD5 Hash. - // Combine the received challenge string with the product key. - KMD5 md5((challengeString + m_productKey).toUtf8()); - QByteArray digest = md5.hexDigest(); + // Combine the received challenge string with the product key. + const QByteArray digest( QCryptographicHash::hash( ( challengeString + productKey_ ).toUtf8(), + QCryptographicHash::Md5 ).toHex() ); #ifdef KMESSDEBUG_CHALLENGEHANDLER - kDebug() << "md5: " << digest; + kDebug() << "md5: " << digest; #endif - QVector md5Integers(4); - for(int i=0; i < md5Integers.count(); i++) - { - md5Integers[i] = hexSwap(digest.mid(i*8, 8)).toUInt(0, 16) & 0x7FFFFFFF; + QVector md5Integers(4); + for( int i = 0; i < md5Integers.count(); i++ ) + { + md5Integers[i] = hexSwap( digest.mid( i * 8, 8 ) ).toUInt( 0, 16 ) & 0x7FFFFFFF; #ifdef KMESSDEBUG_CHALLENGEHANDLER - kDebug() << "hex " << i << " 0x" + hexSwap(digest.mid(i*8, 8)) << " = " << md5Integers[i]; + kDebug() << "hex " << i << " 0x" + hexSwap( digest.mid( i * 8, 8 ) ) << " = " << md5Integers[i]; #endif - } + } // Step Two: Create the challenge string key - QString challengeKey = challengeString + m_productId; + QString challengeKey( challengeString + productId_ ); // Pad to multiple of 8. - challengeKey = challengeKey.leftJustified(challengeKey.length() + (8 - challengeKey.length() % 8), '0'); + challengeKey = challengeKey.leftJustified(challengeKey.length() + ( 8 - challengeKey.length() % 8 ), '0'); #ifdef KMESSDEBUG_CHALLENGEHANDLER kDebug() << "challenge key: " << challengeKey; #endif - QVector challengeIntegers(challengeKey.length() / 4); - for(int i=0; i < challengeIntegers.count(); i++) + QVector challengeIntegers( challengeKey.length() / 4 ); + for( int i = 0; i < challengeIntegers.count(); i++ ) { - QString sNum = challengeKey.mid(i*4, 4), sNumHex; + QString sNumHex; + const QString& sNum( challengeKey.mid( i * 4, 4 ) ); // Go through the number string, determining the hex equivalent of each value // and add that to our new hex string for this number. - for(int j=0; j < sNum.length(); j++) { - sNumHex += QString::number((int)sNum[j].toLatin1(), 16); + for( int j = 0; j < sNum.length(); j++ ) + { + sNumHex += QString::number( ( int ) sNum[j].toLatin1(), 16); } // swap because of the byte ordering issue. - sNumHex = hexSwap(sNumHex); + sNumHex = hexSwap( sNumHex ); // Assign the converted number. challengeIntegers[i] = sNumHex.toInt(0, 16); #ifdef KMESSDEBUG_CHALLENGEHANDLER - kDebug() << "challenge int " << sNum << (": 0x"+sNumHex) << " = " << challengeIntegers[i]; + kDebug() << "challenge int " << sNum << (": 0x" + sNumHex) << " = " << challengeIntegers[i]; #endif } // Step Three: Create the 64-bit hash key. // Get the hash key using the specified arrays. - qint64 key = createHashKey(md5Integers, challengeIntegers); - -// #ifdef KMESSDEBUG_CHALLENGEHANDLER -// kDebug() << "key: " << key; -// #endif + qint64 key = createHashKey( md5Integers, challengeIntegers ); // Step Four: Create the final hash key. - QString upper = QString::number(QString(digest.mid(0, 16)).toULongLong(0, 16)^key, 16); - if(upper.length() % 16 != 0) - upper = upper.rightJustified(upper.length() + (16 - upper.length() % 16), '0'); + QString upper( QString::number( QString( digest.mid( 0, 16 ) ).toULongLong( 0, 16 ) ^ key, 16 ) ); + if( upper.length() % 16 != 0 ) + { + upper = upper.rightJustified( upper.length() + (16 - upper.length() % 16), '0' ); + } - QString lower = QString::number(QString(digest.mid(16, 16)).toULongLong(0, 16)^key, 16); - if(lower.length() % 16 != 0) - lower = lower.rightJustified(lower.length() + (16 - lower.length() % 16), '0'); + QString lower( QString::number( QString( digest.mid( 16, 16 ) ).toULongLong( 0, 16 ) ^ key, 16 ) ); + if( lower.length() % 16 != 0 ) + { + lower = lower.rightJustified( lower.length() + (16 - lower.length() % 16), '0' ); + } - return (upper + lower); + return ( upper + lower ); } + + qint64 MSNChallengeHandler::createHashKey(const QVector& md5Integers, - const QVector& challengeIntegers) + const QVector& challengeIntegers) { #ifdef KMESSDEBUG_CHALLENGEHANDLER kDebug(14140) << "Creating 64-bit key."; #endif qint64 magicNumber = 0x0E79A9C1L, high = 0L, low = 0L; - - for(int i=0; i < challengeIntegers.count(); i += 2) - { - qint64 temp = ((challengeIntegers[i] * magicNumber) % 0x7FFFFFFF) + high; - temp = ((temp * md5Integers[0]) + md5Integers[1]) % 0x7FFFFFFF; - high = (challengeIntegers[i + 1] + temp) % 0x7FFFFFFF; - high = ((high * md5Integers[2]) + md5Integers[3]) % 0x7FFFFFFF; + for( int i = 0; i < challengeIntegers.count(); i += 2 ) + { + qint64 temp = ( (challengeIntegers[i] * magicNumber ) % 0x7FFFFFFF) + high; + temp = ( ( temp * md5Integers[0]) + md5Integers[1] ) % 0x7FFFFFFF; + + high = ( challengeIntegers[i + 1] + temp ) % 0x7FFFFFFF; + high = ( ( high * md5Integers[2] ) + md5Integers[3]) % 0x7FFFFFFF; low += high + temp; } - high = (high + md5Integers[1]) % 0x7FFFFFFF; - low = (low + md5Integers[3]) % 0x7FFFFFFF; + high = ( high + md5Integers[1] ) % 0x7FFFFFFF; + low = ( low + md5Integers[3] ) % 0x7FFFFFFF; + + QByteArray tempArray( 8, '0' ); - QByteArray tempArray; - tempArray.reserve(8); QDataStream buffer(&tempArray,QIODevice::ReadWrite); - //buffer.setVersion(QDataStream::Qt_3_1); + buffer.setByteOrder(QDataStream::LittleEndian); - buffer << (qint32)high; - buffer << (qint32)low; + buffer << (qint32) high; + buffer << (qint32) low; buffer.device()->reset(); - buffer.setByteOrder(QDataStream::BigEndian); + buffer.setByteOrder( QDataStream::BigEndian ); qint64 key; buffer >> key; - + return key; } -QString MSNChallengeHandler::hexSwap(const QString& in) + + +const QString MSNChallengeHandler::hexSwap( const QString& in ) { - QString sHex = in, swapped; + QString swapped; + QString sHex( in ); + while(sHex.length() > 0) { - swapped = swapped + sHex.mid(sHex.length() - 2, 2); - sHex = sHex.remove(sHex.length() - 2, 2); + swapped = swapped + sHex.mid( sHex.length() - 2, 2 ); + sHex = sHex.remove( sHex.length() - 2, 2 ); } return swapped; } -QString MSNChallengeHandler::productId() + + +const QString& MSNChallengeHandler::getProductId() const { - return m_productId; + return productId_; } diff --git a/src/network/msnchallengehandler.h b/src/network/msnchallengehandler.h index 2b0f32a..cf8d6ef 100644 --- a/src/network/msnchallengehandler.h +++ b/src/network/msnchallengehandler.h @@ -33,34 +33,37 @@ */ class MSNChallengeHandler { -public: - MSNChallengeHandler(const QString& productKey, const QString& productId); - ~MSNChallengeHandler(); + public: + MSNChallengeHandler(); + ~MSNChallengeHandler(); - /** - * Computes the response hash string for the specified challenge string. - */ - QString computeHash(const QString& challengeString); + /** + * Computes the response hash string for the specified challenge string. + */ - /** - * Returns the product id used by the challenge handler. - */ - QString productId(); - -private: + const QString computeHash( const QString& challengeString ); - /** - * Creates a 64-bit hash key. - */ - qint64 createHashKey(const QVector& md5Integers, const QVector& challengeIntegers); - - /** - * Swaps the bytes in a hex string. - */ - QString hexSwap(const QString& in); - - QString m_productKey; - QString m_productId; + /** + * Returns the product id used by the challenge handler. + */ + const QString& getProductId() const; + + private: // Private method + + /** + * Creates a 64-bit hash key. + */ + qint64 createHashKey( const QVector& md5Integers, const QVector& challengeIntegers ); + + /** + * Swaps the bytes in a hex string. + */ + const QString hexSwap( const QString& in ); + + private: // Private attributes + + QString productKey_; + QString productId_; }; #endif diff --git a/src/network/msnconnection.cpp b/src/network/msnconnection.cpp index 9abf07e..e1f5cc0 100644 --- a/src/network/msnconnection.cpp +++ b/src/network/msnconnection.cpp @@ -27,6 +27,9 @@ #include #include +#if KMESS_DEBUG == 1 + #include "msnsocketnull.h" +#endif #ifdef KMESSDEBUG_CONNECTION // Area-specific debug statements #define KMESSDEBUG_CONNECTION_GENERAL @@ -34,6 +37,9 @@ #endif +// Static members initialization +bool MsnConnection::useHttpSocket_( false ); + /** * @brief The constructor @@ -48,7 +54,18 @@ MsnConnection::MsnConnection( MsnSocketBase::ServerType serverType ) , initialized_(false) { // Create the socket needed for this connection: default to the TCP one - socket_ = new MsnSocketTcp( serverType ); +#if KMESS_DEBUG == 1 && KMESS_ENABLE_NULL_SOCKET == 1 + socket_ = new MsnSocketNull( serverType ); +#else + if( useHttpSocket_ ) + { + socket_ = new MsnSocketHttp( serverType ); + } + else + { + socket_ = new MsnSocketTcp( serverType ); + } +#endif #ifdef KMESSTEST KMESS_ASSERT( socket_ != 0 ); @@ -90,7 +107,7 @@ MsnConnection::~MsnConnection() /** * @brief Internal function to track SOAP clients. * - * This method connects the HttpSoapConnection::requestFailed() signal, + * This method connects the HttpSoapConnection::soapError() signal, * and appends the client to the internal list. * * @param client The SOAP client class. @@ -102,13 +119,11 @@ void MsnConnection::addSoapClient( HttpSoapConnection *client ) #endif // Connect signals - connect(client, SIGNAL( requestFailed(HttpSoapConnection*, const QString&) ), - this, SLOT ( slotSoapError(HttpSoapConnection*, const QString&) )); - connect(client, SIGNAL( requestFailed(HttpSoapConnection*, const QString&, const QString&, QDomElement) ), - this, SLOT ( slotSoapFault(HttpSoapConnection*, const QString&, const QString&, QDomElement) )); + connect( client, SIGNAL( soapError(QString,MsnSocketBase::ErrorType) ), + this, SLOT ( slotError(QString,MsnSocketBase::ErrorType) ) ); // Add to list so it cleans up when the connection closes - soapClients_.append(client); + soapClients_.append( client ); } @@ -211,7 +226,6 @@ void MsnConnection::deleteSoapClients() foreach( HttpSoapConnection *soapClient, soapClients_ ) { - soapClient->closeConnection(); soapClient->deleteLater(); } @@ -240,7 +254,7 @@ void MsnConnection::disconnectFromServer( bool isTransfer ) // Gracefully disconnect if( isConnected() ) { - sendCommand( "OUT", "\r\n" ); + sendCommand( "OUT" ); } // Stop pinging @@ -263,7 +277,7 @@ void MsnConnection::disconnectFromServer( bool isTransfer ) * * @returns The IP address the socket uses at the system. */ -QString MsnConnection::getLocalIp() const +const QString MsnConnection::getLocalIp() const { #ifdef KMESSDEBUG_SWITCHBOARD_FILETRANSFER kDebug() << objectName() << "- Local IP is " << socket_->getLocalIp(); @@ -311,6 +325,20 @@ bool MsnConnection::isConnected() const +/** + * @brief Return whether the given command is an error command. + * + * This method just passes the question to the socket class + * + * @returns True when it's an error command, false otherwise. + */ +bool MsnConnection::isErrorCommand( const QString &command ) const +{ + return socket_->isErrorCommand( command ); +} + + + /** * @brief Return whether the given command is a payload command. * @@ -325,6 +353,325 @@ bool MsnConnection::isPayloadCommand( const QString &command ) const +// Process a received error command +void MsnConnection::parseError( const QStringList &command, const QByteArray &payloadData ) +{ + if( command[0].toInt() == 0 ) + { + kWarning() << "Invalid error command received:" << command; + return; + } + + // Always print error codes, to ease a bit the error resolution + kWarning() << "Received error code" << command[0] << "from server."; + if( ! payloadData.isEmpty() ) + { + kWarning() << "The error also carries a payload:"; + kWarning() << payloadData; + } + + QString errorMessage; + bool isNotice = false; // Not really errors, will be displayed on the status bar + bool isWarning = false; // Will be displayed on a dialog box, but will not disconnect + MsnSocketBase::ErrorType errorType = MsnSocketBase::ERROR_USER; // By default, blame the user :) + + switch( command[0].toInt() ) + { + // Client side errors. + // These errors are usually generated by misbehavior on kmess' or the user's side. + + case 200: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Invalid command syntax"); + break; + case 201: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Invalid command parameter"); + break; + case 205: + errorMessage = i18n("The email you have tried to add is not a MSN Messenger account"); + isWarning = true; + break; + case 206: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Domain name missing"); + break; + case 207: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Already logged in"); + break; + case 208: + errorMessage = i18n("The given account name is invalid"); + isWarning = true; + break; + case 209: + errorMessage = i18n("That account name is invalid, or your Passport account has not been confirmed yet"); + break; + case 210: + errorMessage = i18n("Your contact list is full"); + isWarning = true; + break; + case 213: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Invalid SBP parameter"); + break; + case 215: + errorMessage = i18n("This contact is already on your list"); + isWarning = true; + break; + case 216: + errorMessage = i18n("This contact is not on your list"); + isWarning = true; + break; + case 217: + errorMessage = i18n("This contact is not online"); + isWarning = true; + break; + case 218: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Already in this mode"); + break; + case 219: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18nc("MSN error", "This contact cannot be added to both allow and block list."); + break; + case 222: + case 228: + errorMessage = i18n("The group name is already added to your Messenger or Hotmail contact list. Please use a different name."); + isWarning = true; + break; + case 223: + errorMessage = i18n("Your contact list has too many groups; you are allowed to only have at most 30."); + isWarning = true; + break; + case 224: + errorMessage = i18n("This group can't be changed"); + isWarning = true; + break; + case 225: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Contact is not added to this group"); + isWarning = true; + break; + case 227: + errorMessage = i18n("This group is not empty"); + isWarning = true; + break; + case 229: + errorMessage = i18n("The group name is too long; it cannot be longer than 61 bytes."); + isWarning = true; + break; + case 230: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("There was an internal error in KMess: %1", i18n("Attempted to change group \"0\"") ); + break; + case 231: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Invalid Group"); + break; + case 240: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Empty domain"); + break; + case 241: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Wrong ADL command format"); + break; + case 280: + errorMessage = i18n("Switchboard server failed"); + break; + case 281: + errorMessage = i18n("Transfer to switchboard server failed"); + break; + case 282: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Direct connection (MSNSLP) error, connection failed"); + break; + case 300: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Required field missing"); + break; + case 302: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Not logged in"); + break; + case 420: + errorMessage = i18nc( "MSN error, due to e.g. trying the beta service without an allowed account", + "This account was denied access to the MSN service." ); + break; + // For other 5xx errors, see below + case 502: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Command is disabled"); + break; + case 511: + errorMessage = i18n("Your account is banned."); + break; + case 540: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Challenge response failed"); + break; + // For other 6xx errors, see below + case 710: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Bad command data"); // bad CVR or URL command + break; + case 713: + // Too many CAL's + errorMessage = i18n("You are opening chat sessions too fast"); + isWarning = true; + break; + case 714: + errorMessage = i18n("You have too many open chat sessions"); + isWarning = true; + break; + case 715: + // Sent in response to a PRP setting an invalid phone type of three or less characters. + // Also sent in response to a change of display name (PRP) on an unverified Passport account. + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Unexpected command sequence"); + break; + case 717: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Bad friend name"); + isWarning = true; + break; + case 731: + // Sent in response to a badly formatted CVR + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Bad CVR data"); + break; + case 800: + // Happens when renaming too quickly, + // but also when sending too many MSNP2P packets over the switchboard without waiting for ACKs. + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("The server reports KMess is flooding it with too much data"); + isNotice = true; + break; + // For other 9xx errors, see below + case 911: + // User/pass was probably correct, TWN ticket was incorrect + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Authentication ticket was incorrect"); + break; + case 913: + errorMessage = i18n("You can't start a chat with someone while you are invisible."); + isWarning = true; + break; + case 920: + errorMessage = i18n("Not accepting new contacts"); + isWarning = true; + break; + case 923: + errorMessage = i18n("You have a Kids Passport account, you need parental consent to chat online."); + break; + case 924: + errorMessage = i18n("Your Passport account needs to be verified first."); + break; + case 928: + errorType = MsnSocketBase::ERROR_INTERNAL; + errorMessage = i18n("Bad USR ticket"); + break; + + + // Server side errors. + // These are generated without any intervention from us. + + case 402: + case 403: + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("Error accessing contact list, try again later"); + break; + case 500: // Generic server error + case 501: // Database server error + case 510: // File operation failed + case 520: // Memory allocation failed + case 603: // Database connection failed, in response to SYN + case 605: // server unavailable + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("The MSN service is temporarily unavailable, there was an internal server error."); + break; + case 600: + case 601: // server is unavailable, in response to USR + case 910: + case 912: + case 918: + case 919: + case 921: + case 922: + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("The MSN service is temporarily unavailable, the server is too busy"); + break; + case 602: + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("Peer notification server down"); + break; + case 604: + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("The server is going down"); + break; + case 640: + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("The server is going down soon"); + isWarning = true; + break; + case 711: + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("Write is blocking"); + break; + case 712: + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("Session is overloaded"); + isWarning = true; + break; + case 914: + case 915: + case 916: + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("The server is not available"); + break; + case 917: + errorType = MsnSocketBase::ERROR_SERVER; + errorMessage = i18n("Authentication failed"); + break; + + default: + // No need to bugger the users with strange error messages + kWarning() << "Unknown error" << command[0] << "received from the server! Full string:" << command.join( " " ); +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + slotError( i18n( "Unknown error code received from the server: %1
    Technical details: %2", + command[0], + payloadData ), + MsnSocketBase::ERROR_INTERNAL ); +#endif + return; + } + + // We've received a notice message: don't interrupt the user for it, show it on the Status Bar instead. + if( isNotice ) + { + emit statusMessage( errorMessage, false ); + return; + } + // We've received a warning message: show it in a dialog box, but do not disconnect + else if( isWarning ) + { + KMessageBox::error( 0, errorMessage, i18nc( "Error dialog box title", "MSN Error" ) ); + return; + } + + // On debug builds, also display the payload if there is one along with the error. +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + errorMessage += "
    " + Qt::escape( payloadData ) + ""; +#endif + + + // Call the unified error message display method + slotError( errorMessage, errorType ); +} + + + /** * Internal processing of multi-packet messages. * @param command The received command. @@ -337,7 +684,7 @@ void MsnConnection::parseMultiPacketMimeMessage( const QStringList &command, con #endif // Get associated multi-packet message buffer, create one if it doesn't exist yet. - QString messageId = mimeMessage.getValue("Message-ID"); + const QString& messageId( mimeMessage.getValue("Message-ID") ); MultiPacketMessage *multiPacketMessage; if( ! multiPacketBuffer_.contains( messageId ) ) { @@ -357,7 +704,7 @@ void MsnConnection::parseMultiPacketMimeMessage( const QStringList &command, con } // Parse message if complete multi-packet message is received. - const MimeMessage &fullMimeMessage = multiPacketMessage->getMessage(); + const MimeMessage &fullMimeMessage( multiPacketMessage->getMessage() ); parseMimeMessage( command, fullMimeMessage ); // Delete handler class @@ -377,20 +724,12 @@ void MsnConnection::parseMultiPacketMimeMessage( const QStringList &command, con * @param text The command arguments, joined with spaces. * @returns The ack-number used by the command. */ -int MsnConnection::sendCommand(const QString& prefix, const QString &text) +int MsnConnection::sendCommand( const QString& prefix, const QString &text ) { -#ifdef KMESSTEST - KMESS_ASSERT( prefix.length() == 3 ); - if ( ( prefix != "QRY" ) && ( prefix != "MSG" ) ) - { - KMESS_ASSERT( text.right( 2 ) == "\r\n" ); - } -#endif - int ack = ack_++; // Send the data to the server - QString command = prefix + " " + QString::number( ack ) + " " + text; + const QString command( prefix + " " + QString::number( ack ) + " " + text + "\r\n" ); writeData( command ); // Return the ack used @@ -403,7 +742,7 @@ int MsnConnection::sendCommand(const QString& prefix, const QString &text) * @brief Send a MIME message command to the server. * @returns, returning the ack */ -int MsnConnection::sendMimeMessage(AckType ackType, const MimeMessage &message) +int MsnConnection::sendMimeMessage( AckType ackType, const MimeMessage &message ) { // Determine which type to send. // Normally a char[4] lookup array would be sufficient, @@ -418,11 +757,12 @@ int MsnConnection::sendMimeMessage(AckType ackType, const MimeMessage &message) } // Create the "MSG id type length" header - QByteArray rawMessage = message.getMessage(); - QString command; + const QByteArray& rawMessage( message.getMessage() ); // Build the command int ack = ack_++; + + QString command; command.sprintf("MSG %u %s %u\r\n", ack, ackTypeStr, rawMessage.size()); // Write the data @@ -435,28 +775,28 @@ int MsnConnection::sendMimeMessage(AckType ackType, const MimeMessage &message) // Send a payload command to the server, convenience function -int MsnConnection::sendPayloadMessage(const QString &prefix, const QString &arguments, const QString &payload) +int MsnConnection::sendPayloadMessage( const QString &prefix, const QString &arguments, const QString &payload ) { // Send payload, as UTF-8 encoded raw string. - QByteArray binPayload = payload.toUtf8(); + const QByteArray& binPayload( payload.toUtf8() ); return sendPayloadMessage( prefix, arguments, binPayload ); } // Send a payload command to the server -int MsnConnection::sendPayloadMessage(const QString &prefix, const QString &arguments, const QByteArray &payload) +int MsnConnection::sendPayloadMessage( const QString &prefix, const QString &arguments, const QByteArray &payload ) { - QString command; int ack = ack_++; // Build the command - command = prefix + " " + QString::number(ack); + QString command( prefix + " " + QString::number( ack ) ); if( ! arguments.isEmpty() ) { command += " " + arguments; } - command += " " + QString::number(payload.size()) + "\r\n"; + + command += " " + QString::number( payload.size() ) + "\r\n"; // Write the data if( payload.size() > 0 ) @@ -503,12 +843,13 @@ void MsnConnection::setSendPings( bool sendPings ) */ void MsnConnection::slotDataReceived( const QStringList &commandLine, const QByteArray &payloadData ) { - // See if it's a payload command - bool gotPayloadCommand = ( isPayloadCommand( commandLine[0] ) ); - #ifdef KMESSDEBUG_SERVERMESSAGES - // Display the received command line - kDebug() << objectName() << "- <<< " << commandLine; + // Display the received command data + kDebug() << objectName() << "- <<< (C) " << commandLine; + if( ! payloadData.isEmpty() ) + { + kDebug() << objectName() << "- <<< (P) " << payloadData; + } #endif #ifdef KMESS_NETWORK_WINDOW @@ -520,8 +861,12 @@ void MsnConnection::slotDataReceived( const QStringList &commandLine, const QByt } #endif - // Parse the messages. - if( gotPayloadCommand ) + // See if it's a normal or payload command, or an error + if( isErrorCommand( commandLine[0] ) ) + { + parseError( commandLine, payloadData ); + } + else if( isPayloadCommand( commandLine[0] ) ) { // See if it's a Mime message. if( commandLine[0] != "MSG" ) @@ -572,54 +917,6 @@ void MsnConnection::slotDisconnected() -/** - * @brief A SOAP request failed with an error message. - * - * This method can be overwritten in the derived class to produce more specific error messages. - * This default implemetentation is a fallback, it simply calls slotError() with a generic error message. - * - * @param client The SOAP client object. - * @param reason The reported error by the SOAP client object. - */ -void MsnConnection::slotSoapError(HttpSoapConnection *client, const QString &reason) -{ - if(KMESS_NULL(client)) return; - - // Default implementation just gives a standard warning. - slotError( i18n( "KMess could not access the remote webservice.
    Details: %1", reason ), - MsnSocketBase::ERROR_INTERNAL ); -} - - - -/** - * @brief A SOAP request failed with an SOAP fault. - * - * A SOAP fault is reported by the server in response to the request. - * For MSN SOAP services, some SOAP errors need to be acted on. - * - * This method could not be named slotSoapFault() as it causes a gcc " was hidden" warning. - * if the other slotSoapError() method is overwritten only. - * - * @param client The SOAP client object. - * @param faultCode The SOAP fault code reported by the SOAP server. - * @param faultString The SOAP fault string reported by the SOAP server. - * @param faultNode The complete fault node, to parse any custom tags. - */ -void MsnConnection::slotSoapFault(HttpSoapConnection *client, const QString &faultCode, - const QString &faultString, QDomElement /*faultNode*/) -{ - if(KMESS_NULL(client)) return; - - // Most of the times, the SOAP class itself also handles some errors, - // and translates it into a specific signal. - // If an error still gets through it's likely some server issue and it should be reported. - - slotSoapError(client, faultCode + ": " + faultString); -} - - - /** * @brief If it is possible, switch to the HTTP connection * @@ -656,11 +953,15 @@ bool MsnConnection::switchToHttpSocket() socket_ = new MsnSocketHttp( serverType ); socket_->setAcceptedPayloadCommands( acceptedPayloadCommands ); + // Set the internal socket switch + useHttpSocket_ = true; + // Attach its signals to this class attachToSocketSignals(); // Start connecting connectToServer(); + emit statusMessage( i18n("Trying the HTTP fallback..."), false ); return true; } @@ -696,13 +997,21 @@ bool MsnConnection::switchToTcpSocket() // Close and disable the old server socket_->blockSignals( true ); + disconnect( socket_, 0 ); socket_->disconnectFromServer(); socket_->deleteLater(); // Replace it with the new one +#if KMESS_DEBUG == 1 && KMESS_ENABLE_NULL_SOCKET == 1 + socket_ = new MsnSocketNull( serverType ); +#else socket_ = new MsnSocketTcp( serverType ); +#endif socket_->setAcceptedPayloadCommands( acceptedPayloadCommands ); + // Set the internal socket switch + useHttpSocket_ = false; + // Attach its signals to this class attachToSocketSignals(); @@ -745,25 +1054,17 @@ void MsnConnection::writeBinaryData( const QByteArray& data ) // Write data to the socket void MsnConnection::writeData( const QString& data ) { -#ifdef KMESSTEST - if ( ( data.left(3) != "QRY" ) && ( data.left(3) != "MSG" ) ) - { - KMESS_ASSERT( ( data.right( 2 ) ) == "\r\n" ); - } -#endif - if( ! isConnected() ) { kWarning() << objectName() << "- Attempting to write data while disconnected, aborting."; return; } - #ifdef KMESSDEBUG_SERVERMESSAGES kDebug() << objectName() << "- >>> " << data.trimmed(); #endif - QByteArray binData = data.toUtf8(); + const QByteArray& binData( data.toUtf8() ); qint64 noBytesWritten = socket_->writeData( binData ); if( noBytesWritten != binData.length() ) // Note that the previous code used data.length instead of unicode.length(), but I diff --git a/src/network/msnconnection.h b/src/network/msnconnection.h index 5db8045..d24842d 100644 --- a/src/network/msnconnection.h +++ b/src/network/msnconnection.h @@ -35,6 +35,17 @@ class MultiPacketMessage; class QStringList; +/** + * Offline socket switch + * + * Set this define to 1 to switch KMess to an offline connection mode: + * the MSN server is emulated locally, to allow verification of the user interface and + * the protocol code behavior. The other sockets are not used when the offline socket + * is in use. + * Set this to 0 for normal operation. + */ +#define KMESS_ENABLE_NULL_SOCKET 0 + /** @@ -112,9 +123,11 @@ class MsnConnection : public QObject // Disconnect from the server, if connected void disconnectFromServer( bool isTransfer = false ); // Get the IP address of this machine. - QString getLocalIp() const; + const QString getLocalIp() const; // Initialize the object bool initialize(); + // Return whether the given command is an error command. + bool isErrorCommand( const QString &command ) const; // Test whether the given command is a payload command virtual bool isPayloadCommand(const QString &command) const; // Specify which accepted commands carry payload data for this connection @@ -156,6 +169,37 @@ ADC 27 AL N=someone@kmessdemo.org */ virtual void parseCommand(const QStringList& command) = 0; + /** + * @brief Process a received error command + * + * An incoming error command may look like: + * @code +205 12 65 +@endcode + * @code + +@endcode + * + * or like: + * @code +207 12 +@endcode + * + * The first kind has a payload, the second does not. The additional command + * parameter reveals that there's a payload. + * We need to be able to parse both kinds, and report the additional data to + * the user if any is present. + * + * The meaning of error codes can be looked up on MSNPiki: + * http://msnpiki.msnfanatic.com/index.php/Reference:Error_List + * but please note that at the moment of writing, it's outdated: it is not + * mentioned there that even errors may contain payload data. + * + * @param command The received error and it's arguments. + * @param payloadData The message payload which followed the command, if any. + */ + virtual void parseError( const QStringList &command, const QByteArray &payloadData ); + /** * @brief Process a received MIME message. * @@ -175,7 +219,7 @@ no prob. How is development doing? * The Content-Type header indicates the message type, * for example: text/plain (a chat message) * text/x-mms-emoticon (custom emoticon definition) - * or text/x-msmsgsemailnotification (new e-mail notification). + * or text/x-msmsgsemailnotification (new email notification). * * All MIME messages are preceeded by the MSG command. * This command is not delivered to parseCommand(). @@ -189,7 +233,7 @@ no prob. How is development doing? * @param command The MSG command and it's arguments * @param message The MIME message which followed the command. */ - virtual void parseMimeMessage(const QStringList& command, const MimeMessage &message) = 0; + virtual void parseMimeMessage( const QStringList& command, const MimeMessage &message ) = 0; // Internal processing of multi-packet messages. void parseMultiPacketMimeMessage( const QStringList &command, const MimeMessage &mimeMessage ); @@ -218,15 +262,15 @@ UBX someuser@kmessdemo.org 67 * @param command The received command and it's arguments. * @param messageData The message payload which followed the command. */ - virtual void parsePayloadMessage(const QStringList &command, const QByteArray &messageData) = 0; + virtual void parsePayloadMessage( const QStringList &command, const QByteArray &messageData ) = 0; // Send a command to the server, returning the ack - int sendCommand(const QString& prefix, const QString &text = "\r\n"); + int sendCommand( const QString& prefix, const QString &text = "\r\n" ); // Send a command to the server, returning the ack - int sendMimeMessage(AckType ackType, const MimeMessage &message); + int sendMimeMessage( AckType ackType, const MimeMessage &message ); // Send a payload command to the server, convenience function - int sendPayloadMessage(const QString &prefix, const QString &arguments, const QString &payload); + int sendPayloadMessage( const QString &prefix, const QString &arguments, const QString &payload ); // Send a payload command to the server - int sendPayloadMessage(const QString &prefix, const QString &arguments, const QByteArray &payload); + int sendPayloadMessage( const QString &prefix, const QString &arguments, const QByteArray &payload ); // Set whether we're sending pings or not void setSendPings( bool sendPings ); // If it is possible, switch to the HTTP connection @@ -259,12 +303,6 @@ UBX someuser@kmessdemo.org 67 */ virtual void slotError( QString error, MsnSocketBase::ErrorType type ) = 0; - // A SOAP request failed with an error message - virtual void slotSoapError(HttpSoapConnection *client, const QString &reason); - // A SOAP request failed with an SOAP fault. - virtual void slotSoapFault(HttpSoapConnection *client, const QString &faultCode, - const QString &faultString, QDomElement faultNode); - private: // private methods // Connect a new socket's signals to our slots void attachToSocketSignals(); @@ -280,12 +318,16 @@ UBX someuser@kmessdemo.org 67 int ack_; // Whether or not the object was initialized bool initialized_; + // A buffer for multi-packet messages + QHash multiPacketBuffer_; // The persistent soap clients. QList soapClients_; // The socket MsnSocketBase *socket_; - // A buffer for multi-packet messages - QHash multiPacketBuffer_; + + private: // Private static attributes + // Whether or not the fallback HTTP socket is in use + static bool useHttpSocket_; signals: diff --git a/src/network/msnnotificationconnection.cpp b/src/network/msnnotificationconnection.cpp index ba50570..39c3828 100644 --- a/src/network/msnnotificationconnection.cpp +++ b/src/network/msnnotificationconnection.cpp @@ -18,16 +18,17 @@ #include "msnnotificationconnection.h" #include "../contact/contact.h" -#include "../contact/contactlist.h" -#include "../network/specialgroups.h" +#include "../model/contactlist.h" #include "../utils/kmessshared.h" #include "../currentaccount.h" #include "../kmess.h" #include "../kmessapplication.h" #include "../kmessdebug.h" #include "../kmessinterface.h" +#include "soap/addressbookservice.h" #include "soap/passportloginservice.h" #include "soap/offlineimservice.h" +#include "soap/roamingservice.h" #include "utils/kmessconfig.h" #include "chatmessage.h" #include "mimemessage.h" @@ -36,6 +37,7 @@ #include // for Qt::escape() #include +#include #include #include @@ -52,7 +54,14 @@ // Settings for debugging. #define NOTIFICATION_HIDE_P2P_SUPPORT 0 - +/** + * Maximum allowed time between unique server responses + * + * KMess will wait at most this number of milliseconds after receiving a server command + * (any command, in fact). If nothing arrives and this timeout expires, the login process + * or the connection will be aborted. + */ +#define NOTIFICATION_COMMAND_INTERVAL_TIMEOUT 30000 /** * @brief The constructor @@ -61,13 +70,14 @@ */ MsnNotificationConnection::MsnNotificationConnection() : MsnConnection( MsnSocketBase::SERVER_NOTIFICATION ), + addressBookService_(0), + connected_(false), currentAccount_(0), enableNotifications_(false), initialized_(false), - noContacts_(0), + isInitiatingConnection_(false), offlineImService_(0), - passportLoginService_(0), - totalNoContacts_(0) + passportLoginService_(0) { setObjectName( "MsnNotificationConnection" ); @@ -134,7 +144,14 @@ void MsnNotificationConnection::addContactToGroup(QString handle, QString groupI kDebug() << "adding '" << handle << " to '" << groupId << "'."; #endif - putAdc( handle, "FL", groupId ); + AddressBookService *addressBook = createAddressBookService(); + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact == 0 ) + { + return; + } + + addressBook->addContactToGroup( contact->getGuid(), groupId ); } @@ -146,26 +163,20 @@ void MsnNotificationConnection::addContactToGroup(QString handle, QString groupI * or "removed contacts" group, but appear at the friends list again. * The contact should exist already at some list * before (e.g. the block list or friends list). - * - * Internally, this method runs the required putAdc() and putRem() - * calls to change the contact lists: - * - the contact is added the the friends list (FL). - * - the contact is removed from the block list (BL). - * - the contact is added to the allow list (AL). * - * @param handle E-mail address of the contact. + * + * @param handle Email address of the contact. + * @param groupsId Groups where to add the contact. */ -void MsnNotificationConnection::addExistingContact(QString handle) +void MsnNotificationConnection::addExistingContact( QString handle, const QStringList& groupsId ) { #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "Re-adding contact " << handle; #endif - // Add a contact by unblocking it then adding it to the allowed list and the friends list - // (at group 0 by default - the user can move it later) - putAdc( handle, "FL" ); - putRem( handle, "BL" ); - putAdc( handle, "AL" ); + // Request the re-adding of contact to AB + AddressBookService *addressBook = createAddressBookService(); + addressBook->addContact( handle, groupsId , true ); } @@ -175,34 +186,18 @@ void MsnNotificationConnection::addExistingContact(QString handle) * * This is the standard method to add a contact. Optionally, it can also add it to a specific group. * - * This method is used only when a new contact appears: - * - to add the contact to the friends list, call this method. - * - to allow the contact only, call allowContact() - * - to block the contact, call blockContact() - * - * Internally, this method runs the required putAdc() calls to change the contact lists: - * - the contact is added to the allow list (AL). - * - the contact is added to the friends list (FL). - * - * @param handle E-mail address of the contact. + * @param handle Email address of the contact. * @param groupId groupId of the group where to place the new contact. */ -void MsnNotificationConnection::addNewContact( QString handle, QString groupId ) +void MsnNotificationConnection::addNewContact( QString handle, const QStringList& groupsId ) { #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "Adding contact " << handle; #endif - // Ask the server to add the contact to the friends list and allow list. - // TODO: Official client adds contact to friend-list first, and allow-list later, reason/effect unknown. - putAdc( handle, "AL" ); - putAdc( handle, "FL" ); - - // Also add it to a specific group if available and if it exists - if( ! groupId.isEmpty() && contactList_->getGroupById( groupId ) ) - { - initialContactAddedGroup_ = groupId; - } + // Request the adding of contact to AB + AddressBookService *addressBook = createAddressBookService(); + addressBook->addContact( handle, groupsId ); } @@ -227,7 +222,7 @@ void MsnNotificationConnection::addNewContact( QString handle, QString groupId ) * Internally, this method runs the required putAdc() calls to change the contact lists: * - the contact is added to the allow list (AL). * - * @param handle E-mail address of the contact. + * @param handle Email address of the contact. */ void MsnNotificationConnection::allowContact(QString handle) { @@ -235,7 +230,10 @@ void MsnNotificationConnection::allowContact(QString handle) kDebug() << "Allowing contact " << handle; #endif - putAdc( handle, "AL" ); + putAdl( handle, Contact::MSN_LIST_ALLOWED ); + + AddressBookService *addressBook = createAddressBookService(); + addressBook->unblockContact( handle ); } @@ -250,8 +248,8 @@ void MsnNotificationConnection::allowContact(QString handle) */ void MsnNotificationConnection::addGroup(QString name) { - name = QUrl::toPercentEncoding( name ); - sendCommand( "ADG", name + "\r\n" ); + AddressBookService *addressBook = createAddressBookService(); + addressBook->addGroup( name ); } @@ -272,7 +270,7 @@ void MsnNotificationConnection::addGroup(QString name) * Internally, this method runs the required putAdc() calls to change the contact lists: * - the contact is added to the block list (BL). * - * @param handle E-mail address of the contact. + * @param handle Email address of the contact. */ void MsnNotificationConnection::blockContact(QString handle) { @@ -280,10 +278,11 @@ void MsnNotificationConnection::blockContact(QString handle) kDebug() << "Blocking contact " << handle; #endif - // Block a contact by removing it from the allowed list - // and adding it to the blocked list - putRem( handle, "AL" ); - putAdc( handle, "BL" ); + putRml( handle, Contact::MSN_LIST_ALLOWED ); + putAdl( handle, Contact::MSN_LIST_BLOCKED ); + + AddressBookService *addressBook = createAddressBookService(); + addressBook->blockContact( handle ); } @@ -307,9 +306,9 @@ void MsnNotificationConnection::changeCurrentMedia( const QString &application, const QStringList arguments ) { // Update current media string - QString media = application + "\\0" + mediaType + "\\0" + (enabled ? "1" : "0") + "\\0" - + formatString + "\\0" + arguments.join("\\0"); - lastCurrentMedia_ = Qt::escape(media); + QString media( application + "\\0" + mediaType + "\\0" + ( enabled ? "1" : "0" ) + "\\0" + + formatString + "\\0" + arguments.join( "\\0" ) ); + lastCurrentMedia_ = Qt::escape( media ); // Send personal status and current media putUux(); @@ -322,9 +321,9 @@ void MsnNotificationConnection::changeCurrentMedia( const QString &application, * * When this method is called, contacts will be informed the user has a new display picture. * Some clients automatically initiate a background chat to retrieve the new display picture. - * Other clients wait until a real chat is initiated, to request the display picture at that moment. + * Other clients wait until a real chat is initiated, to request the display picture at that moment. * - * Internally, this method calls changeStatus() because + * Internally, this method calls changeStatus( Status ) because * that same command is used to notify about MsnObject changes. * The MsnObject is extracted from the CurrentAccount class. */ @@ -343,32 +342,46 @@ void MsnNotificationConnection::changedMsnObject() * @brief Change the friendly name of the user. * * Internally, this method uses changeProperty() to set the MFN property. + * In MSNP15 the command PRP must be send with SOAP request to avoid nickname will disappear + * the next time we sign in. * * @param newName The new friendly name. */ void MsnNotificationConnection::changeFriendlyName( QString newName ) { + if( ! currentAccount_->isVerified() ) + { + return; + } + + currentAccount_->setFriendlyName( newName ); + changeProperty("MFN", newName); + + AddressBookService *addressBook = createAddressBookService(); + addressBook->contactUpdate( AddressBookService::PROPERTY_FRIENDLYNAME, newName ); } -/** - * @brief Change the friendly name of another contact. - * - * Internally, this method uses changeProperty() to set the MFN property. - * - * This method is also called when a new name is received by gotNln(). - * The MSN Messenger servers don't enforce contact names, - * they have to be set manually in the contact list (like a personal addressbook). - * - * @param handle E-mail address of the contact. - * @param newName The new friendly name. - */ -void MsnNotificationConnection::changeFriendlyName( QString handle, QString newName ) +// Change the personal properties +void MsnNotificationConnection::changePersonalProperties( const QString& friendlyname, const QString& cid, int blp ) { - // Change msn-friendly-name property. - changeProperty(handle, "MFN", newName); + // Send BLP command for privacy settings, please refer to: + // http://msnpiki.msnfanatic.com/index.php/Command:BLP + const QString& blpToSend( ( blp == 0 ) ? "BL" : "AL" ); + sendCommand( "BLP", blpToSend ); + + changeFriendlyName( friendlyname ); + + // Check if necessary to retrieve information ( like pm, picture ) from msn storage + // using roaming service + // TODO complete the support + Q_UNUSED( cid ); + /* + RoamingService *roamingService = new RoamingService( this ); + roamingService->getProfile( cid ); + */ } @@ -411,7 +424,7 @@ void MsnNotificationConnection::changePersonalMessage( QString newMessage ) * - HSB: Has blog: 1 or 0 * * This function is also used internally by other methods like changeFriendlyName() - * + * * @param type The property type. * @param value The new property value, can also be empty. */ @@ -419,7 +432,7 @@ void MsnNotificationConnection::changeProperty( QString type, QString value ) { if( value.isEmpty() ) { - sendCommand( "PRP", type + "\r\n" ); + sendCommand( "PRP", type ); } else { @@ -428,7 +441,7 @@ void MsnNotificationConnection::changeProperty( QString type, QString value ) // To avoid problem with a very long nick value.truncate( 387 ); - sendCommand( "PRP", type + " " + value + "\r\n" ); + sendCommand( "PRP", type + " " + value ); } } @@ -439,7 +452,7 @@ void MsnNotificationConnection::changeProperty( QString type, QString value ) * * It sends the SBP (likely short for set-buddy-property) command to the server. * - * @param handle E-mail address of the contact. + * @param handle Email address of the contact. * @param type The property type, e.g. MFN, see the other changeProperty() method. * @param value The new property value, can also be empty. */ @@ -460,7 +473,7 @@ void MsnNotificationConnection::changeProperty( QString handle, QString type, QS // First guess is that "SBP" means set-buddy-property if( value.isEmpty() ) { - sendCommand( "SBP", contact->getGuid() + " " + type + "\r\n" ); + sendCommand( "SBP", contact->getGuid() + " " + type ); } else { @@ -469,7 +482,7 @@ void MsnNotificationConnection::changeProperty( QString handle, QString type, QS // To avoid problem with a very long nick value.truncate( 387 ); - sendCommand( "SBP", contact->getGuid() + " " + type + " " + value + "\r\n" ); + sendCommand( "SBP", contact->getGuid() + " " + type + " " + value ); } } @@ -495,26 +508,31 @@ void MsnNotificationConnection::changeStatus( const Status newStatus ) #else // NOTE: When changing this property, all MSNP2P code need to be retested again!! // The capabilities are like a contract. The other client assumes everything works that's promised here. +#if ENABLE_WEBCAM + // FIXME: only show webcam capability if the user has a webcam. + const uint capabilities = ( Contact::MSN_CAP_MSN75 | Contact::MSN_CAP_WINKS | Contact::MSN_CAP_MULTI_PACKET | Contact::MSN_CAP_INK_GIF | Contact::MSN_CAP_VIDEO_CHAT ); +#else const uint capabilities = ( Contact::MSN_CAP_MSN75 | Contact::MSN_CAP_WINKS | Contact::MSN_CAP_MULTI_PACKET | Contact::MSN_CAP_INK_GIF ); +#endif #endif - QString statusCode = MsnStatus::getCode( newStatus ); - QString objStr = QUrl::toPercentEncoding( currentAccount_->getMsnObjectString() ); + const QString& statusCode( MsnStatus::getCode( newStatus ) ); + const QString objStr( QUrl::toPercentEncoding( currentAccount_->getMsnObjectString() ) ); /* // To test the old file transfer: - sendCommand( "CHG", newStatus + " 0\r\n"); + sendCommand( "CHG", newStatus + " 0"); return; */ - if(objStr.isEmpty()) + if( objStr.isEmpty() ) { // Just don't send it if we don't have it. - sendCommand( "CHG", statusCode + " " + QString::number(capabilities) + "\r\n" ); + sendCommand( "CHG", statusCode + " " + QString::number(capabilities) ); } else { - sendCommand( "CHG", statusCode + " " + QString::number(capabilities) + " " + objStr + "\r\n" ); + sendCommand( "CHG", statusCode + " " + QString::number(capabilities) + " " + objStr ); } } @@ -533,7 +551,7 @@ void MsnNotificationConnection::checkSwitchboardsTimeout() kDebug() << "Removing expired switchboard requests."; #endif - // Delete any pending switchboard + // Delete any pending switchboard uint now = QDateTime::currentDateTime().toTime_t(); foreach( ChatInformation *switchboardInfo, openRequests_ ) { @@ -571,10 +589,9 @@ void MsnNotificationConnection::closeConnection() // Delete all SOAP clients, and unset local references here. deleteSoapClients(); - offlineImService_ = 0; - passportLoginService_ = 0; - noContacts_ = 0; - totalNoContacts_ = 0; + offlineImService_ = 0; + passportLoginService_ = 0; + isInitiatingConnection_ = false; // Remove contacts and non-special groups from the contact list @@ -613,6 +630,62 @@ void MsnNotificationConnection::closeConnection() +/** + * @brief Create and return one pointer to address book service. + * + */ +AddressBookService* MsnNotificationConnection::createAddressBookService() +{ + if( addressBookService_ == 0 ) + { + addressBookService_ = new AddressBookService( this ); + addSoapClient( addressBookService_ ); + + // Contact actions signals/slots + connect( addressBookService_, SIGNAL( contactAdded( const QString&, const QString&, const QStringList& ) ), + this, SLOT( slotContactAdded( const QString&, const QString&, const QStringList& ) ) ); + + connect( addressBookService_, SIGNAL( contactDeleted( const QString& ) ), + this, SLOT( slotContactDeleted( const QString& ) ) ); + + connect( addressBookService_, SIGNAL( contactBlocked( const QString& ) ), + this, SLOT( slotContactBlocked( const QString& ) ) ); + connect( addressBookService_, SIGNAL( contactUnblocked( const QString& ) ), + this, SLOT( slotContactUnblocked( const QString& ) ) ); + + // Contact added/remove to/from group signals/slots + connect( addressBookService_, SIGNAL( contactAddedToGroup( const QString&, const QString& ) ), + this, SLOT( slotContactAddedToGroup( const QString&, const QString& ) ) ); + connect( addressBookService_, SIGNAL( contactDeletedFromGroup( const QString&, const QString& ) ), + this, SLOT( slotContactDeletedFromGroup( const QString&, const QString& ) ) ); + + // Group actions signals/slots + connect( addressBookService_, SIGNAL( groupAdded( QString, QString ) ), + contactList_, SLOT( addGroup( QString, QString ) ) ); + connect( addressBookService_, SIGNAL( groupDeleted( QString ) ), + contactList_, SLOT( removeGroup( QString ) ) ); + connect( addressBookService_, SIGNAL( groupRenamed( QString, QString ) ), + contactList_, SLOT( renameGroup( QString, QString ) ) ); + + // Membership and AddressBook signals/slots + connect( addressBookService_, SIGNAL( gotMembershipLists(const QString&,const QHash&) ), + this, SLOT( slotGotMembershipLists(const QString&,const QHash&) ) ); + connect( addressBookService_, SIGNAL( gotAddressBookList( const QList< QHash >& ) ), this, SLOT( slotGotAddressBookList( const QList< QHash >& ))); + + connect( addressBookService_, SIGNAL( gotGroup( const QString&, const QString& ) ), + this, SLOT( slotGotGroup( const QString&, const QString& ) ) ); + + connect( addressBookService_, SIGNAL( gotPersonalInformation(const QString&,const QString&,int) ), + this, SLOT( changePersonalProperties(const QString&,const QString&,int) ) ); + connect( addressBookService_, SIGNAL( soapWarning(const QString&,bool) ), + this, SLOT ( slotWarning(const QString&,bool) ) ); + } + + return addressBookService_; +} + + + /** * @brief Internal function to create the Offline-IM service * @@ -625,9 +698,10 @@ OfflineImService* MsnNotificationConnection::createOfflineImService() { // Extract the 't' and 'p' values from the current authentication ticket string // This is done beacuse sendMessage() could has requested one new ticket + const QStringList& fields( currentAccount_->getToken( "Messenger" ).split("&") ); QString authT, authP; - QStringList fields = currentAccount_->getAuthenticationTicket().split("&"); - foreach( QString field, fields ) + + foreach( const QString &field, fields ) { if( field.startsWith("t=") ) { @@ -640,12 +714,13 @@ OfflineImService* MsnNotificationConnection::createOfflineImService() #ifdef KMESSDEBUG_NOTIFICATION else { - kWarning() << "Could not parse authentication string!"; + kWarning() << "Could not parse authentication field:" << field; } #endif } // Request the first offline-im message + // TODO reuse the pointer, and set the token like addressbook OfflineImService *oimService = new OfflineImService( authT, authP, this ); // Add the soap client. @@ -653,9 +728,9 @@ OfflineImService* MsnNotificationConnection::createOfflineImService() // Register signals connect( oimService, SIGNAL( messageReceived( const QString&, const QString&, const QString&, - const QDateTime&, const QString&, const QString&, int ) ), + const QDateTime&, const QString&, const QString&, int ) ), this, SLOT ( receivedOfflineIm( const QString&, const QString&, const QString&, - const QDateTime&, const QString&, const QString&, int ) )); + const QDateTime&, const QString&, const QString&, int ) )); connect( oimService, SIGNAL( metaDataReceived( QDomElement ) ), this, SLOT ( receivedMailData( QDomElement ) )); @@ -673,23 +748,72 @@ OfflineImService* MsnNotificationConnection::createOfflineImService() */ PassportLoginService* MsnNotificationConnection::createPassportLoginService() { + // TODO reuse the pointer // Create the login handler. PassportLoginService *loginService = new PassportLoginService(); // Add the soap client. addSoapClient( loginService ); - // Connect all login notifications - connect( loginService, SIGNAL( loginIncorrect() ), - this, SLOT ( loginIncorrect() ) ); - connect( loginService, SIGNAL( loginSucceeded( QString, QString, QString ) ), - this, SLOT ( loginSucceeded( QString, QString, QString ) ) ); + // Connect all login notifications + connect( loginService, SIGNAL( loginIncorrect() ), + this, SLOT ( loginIncorrect() ) ); + connect( loginService, SIGNAL( loginSucceeded() ), + this, SLOT ( loginSucceeded() ) ); return loginService; } +/** + * @brief Compute a triple des encryption. + * + * Used to compute the value of string to send to server for SSO. + * + * @param key The key for compute the encryption + * @param secret The secret data to encryption + * @param iv The initial vector for cbc mode + */ +QByteArray MsnNotificationConnection::createTripleDes ( const QByteArray key, const QByteArray secret, + const QCA::InitializationVector& iv ) +{ + // check for Triple Des with CBC support. + if ( ! QCA::isSupported( "tripledes-cbc" ) ) + { + kWarning() << "Triple DES encryption not supported, please install qca2 packages"; + return ""; + } + + // Create the key using the key parameter and secret data + QCA::SymmetricKey desKey( key ); + QCA::SecureArray data( secret ); + + // Create the TripleDes object. + QCA::Cipher des3( QString ( "tripledes" ), QCA::Cipher::CBC, QCA::Cipher::NoPadding, QCA::Encode, desKey, iv ); + + // Chiper the data and check for the errors + QCA::SecureArray temp = des3.update ( data ); + if ( ! des3.ok() ) + { + kWarning() << "Triple DES computation failed on update step"; + return ""; + } + + // Finish the compute and check for errors + des3.final(); + if ( ! des3.ok() ) + { + kWarning() << "Triple DES computation failed on final step"; + return ""; + } + + // Return the encrypted data + return temp.toByteArray(); +} + + + /** * @brief Return the contact list model * @@ -710,7 +834,7 @@ QAbstractItemModel* MsnNotificationConnection::getContactListModel() * It changes some final things before the user goes online: * - set the initial user status, e.g. "online" or "invisible". * - ses the initial personal message. - * - requests other server data, like Hotmail e-mail URL's. + * - requests other server data, like Hotmail email URL's. * Finally, the connected() signal is fired. */ void MsnNotificationConnection::goOnline() @@ -719,9 +843,12 @@ void MsnNotificationConnection::goOnline() if(KMESS_NULL(currentAccount_)) return; - // Stop the authentication timer, we're done + // Stop the authentication timer, we're done with that part loginTimer_.stop(); + // Start the ping timer: from now on, it's its duty to verify that the connection is still active + setSendPings( true ); + // Load the contact list settings readProperties(); @@ -736,27 +863,32 @@ void MsnNotificationConnection::goOnline() lastPsm_ = QString::null; // Start with default personal message (may be empty) - changePersonalMessage( currentAccount_->getPersonalMessage() ); + changePersonalMessage( currentAccount_->getPersonalMessage( STRING_ORIGINAL ) ); - // When the account supports e-mail (e.g. Hotmail), request the URL's. + // When the account supports email (e.g. Hotmail), request the URL's. // This didn't give problems with non-email accounts, // but restricted accounts return a "710" error for this command. if( currentAccount_->getEmailSupported() ) { // The ACK is temporary stored as inbox-command, // so the response can be mapped back to the requested folder. - + QHash& hash = currentAccount_->getUrlInformation(); // Ask for inbox URL - ack = sendCommand("URL", "INBOX\r\n"); - currentAccount_->setInboxInformation( QString::number(ack), "", "" ); + ack = sendCommand("URL", "INBOX"); + hash.insert( QString::number(ack), "INBOX" ); // Ask for compose URL - ack = sendCommand("URL", "COMPOSE\r\n"); - currentAccount_->setComposeInformation( QString::number(ack), "", "" ); - } + ack = sendCommand("URL", "COMPOSE"); + hash.insert( QString::number(ack), "COMPOSE" ); - // Start ping timer - setSendPings( true ); + // Ask the personal profile URL + ack = sendCommand("URL", "PROFILE"); + hash.insert( QString::number(ack), "PROFILE" ); + + // Ask the URL for change account info + ack = sendCommand("URL", "PERSON"); + hash.insert( QString::number(ack), "PERSON" ); + } // Notify observers that the server is connected emit connected(); @@ -768,237 +900,72 @@ void MsnNotificationConnection::goOnline() -/** - * @brief Handle the ADC command; addition of a contact to a list or group. - * - * This command is sent by putAdc(). The server confirms the command by - * sending an identical response back, sometimes with additional information. - * - * The following protocol commands are exchanged to add a contact: - * @code ->>> ADC 18 AL N=test@test.com ->>> ADC 19 FL N=test@test.com F=test@test.com -@endcode - * @code -<<< ADC 18 AL N=test@test.com -<<< ADC 19 FL N=test@test.com F=test@test.com C=4d9898ff-43bc-48e5-a97f-0886779fca3f -@endcode - * - * Note the server returns the contact GUID in the response. - * This value is used instead of the handle for all commands that alter the FL list. - * - * The following protocol commands are exchanged when a contact is added to another group: - * @code ->>> ADC 15 FL C=390bd80e-f2e1-48eb-b51f-ead5547b48f1 83db17d0-518f-404b-92c9-cb3d3bd4551c -@endcode - * @code -<<< ADC 15 FL C=390bd80e-f2e1-48eb-b51f-ead5547b48f1 83db17d0-518f-404b-92c9-cb3d3bd4551c -@endcode - * - * @param command The command arguments. - * - command[1] is the ack id. - * - command[2] is the list. - * - the remaining commands depend on the prefix (F= for friently name, C= for a contact guid, or N= for the contact handle). - * - for the FL list, a group id may be added after all arguments. - */ -void MsnNotificationConnection::gotAdc(const QStringList& command) +// Received response to adl command +void MsnNotificationConnection::gotAdl( const QStringList& command, const QString& payload ) { - if(KMESS_NULL(contactList_)) return; - - Contact *contact; - int listNumber; - - // Extract the handle, friendlyName, and list from the message - QString listType; - QString handle; - QString friendlyName; - QString guid; - QString groupId; - - listType = command[2]; - - // command looks something like: - // ADC 16 FL N=passport@hotmail.com F=Display%20Name C=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - - // Process optional parameters - for( int i = 3; i < command.size(); i++) + // The server responds to a successful ADL command + if( command[2] == "OK" ) { - QString arg = command[ i ]; - if( arg.startsWith("N=") ) + // Check if already connect + if( ! connected_ ) { - handle = arg.mid(2).toLower(); + // Go online + goOnline(); + emit connected(); + connected_ = true; } - else if( arg.startsWith("F=") ) - { - friendlyName = QUrl::fromPercentEncoding( arg.mid(2).toUtf8() ); - } - else if( arg.startsWith("C=") ) - { - guid = arg.mid(2); - } - else if( listType == "FL" && arg.at(1) != '=' ) - { - groupId = arg; - } - else if( listType == "RL" && arg.length() == 1 && arg[0] >= '0' && arg[0] <= '9' ) - { - // unknown, number at end of command list. - } - else - { - kWarning() << "Unknown argument encountered: '" << arg << "' in the command: " << command; - } - } - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Added " << friendlyName << " (" << handle << ")" - " to " << listType << " " << groupId << "." << endl; -#endif - - - // Check whether the contact exists. - if( ! handle.isNull() ) - { - contact = contactList_->getContactByHandle(handle); - } - else if( ! guid.isNull() ) - { - contact = contactList_->getContactByGuid(guid); - } - else - { - kWarning() << "Contact identification not found in ADC response!"; return; } - - if(contact == 0) + if( ! payload.isEmpty() ) { - // Add the contact if he/she does not exist. - if (listType == "FL") listNumber = Contact::MSN_LIST_FRIEND; - else if(listType == "AL") listNumber = Contact::MSN_LIST_ALLOWED; - else if(listType == "BL") listNumber = Contact::MSN_LIST_BLOCKED; - else if(listType == "RL") listNumber = Contact::MSN_LIST_REVERSE; - else if(listType == "PL") listNumber = Contact::MSN_LIST_PENDING; - else listNumber = 0; + QRegExp regexp( ".*n=\"([^\"]+)\".*n=\"([^\"]+)\".*l=\"([^\"]+)\"" ); - // The sent ADC command may not have a friendly name, causing the server to respond none as well. - // Use the handle so at least something is displayed. - if( friendlyName.isNull() ) + int pos = regexp.indexIn( payload ); + int lists = -1; + QString handle; + + if( pos != -1 ) { - friendlyName = handle; + handle = regexp.cap(2) + "@" + regexp.cap(1); + lists = QVariant( regexp.cap(3) ).toInt(); } - contact = contactList_->addContact(handle, friendlyName, listNumber, QStringList( groupId ), guid); - } - else - { - // Contact was added to a certain group, activate it - contact->setList(listType, true); - - // Also update the groupId for the FL list - if(listType == "FL") + if( lists == -1 || handle.isEmpty() ) { - // Update the friendly name. - if( ! friendlyName.isEmpty() ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - if( contact->getFriendlyName() != friendlyName ) - { - kDebug() << "received new friendlyname, " - << "updating contact '" << handle << "'." << endl; - } -#endif - contact->setFriendlyName( friendlyName ); - } + return; + } - // Update the GUID - if( ! guid.isEmpty() ) - { - if( contact->getGuid().isEmpty() ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "received GUID for contact, updating contact '" << handle << "'."; -#endif - } - else if( guid != contact->getGuid() ) - { - // This shouldn't happen, but debugging it helps to solve weird problems. - kWarning() << "received new GUID for contact, " - << "updating contact (contact=" << handle << ")" << endl; - } - - contact->setGuid(guid); - } - - - // Update the groups. - if( ! groupId.isEmpty() ) - { - // NOTE: If we like to add a contact to multiple groups at once, this needs updating. - // Currently it is not required, because KMess doesn't send such commands to the server. - contact->addGroupId(groupId); - } - else if( ! initialContactAddedGroup_.isEmpty() ) - { - // If the contact has just been added, add it to its initial group (see - // MsnNotificationConnection::putAdc() for more details) - - putAdc( handle, "FL", initialContactAddedGroup_ ); - - // Reset the initial group to avoid problems if adding more contacts - initialContactAddedGroup_ = QString(); - } - - // If this contact was added from moveContact(), remove from source group. - QString sourceGroup = contact->getPrepareMove(); - if( ! sourceGroup.isEmpty() ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Detected moving operation, removing contact from old group."; -#endif - putRem( contact->getHandle(), "FL", sourceGroup ); - contact->setPrepareMove(); - } + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact != 0 ) + { + if( lists & Contact::MSN_LIST_FRIEND ) contact->setFriend ( true ); + if( lists & Contact::MSN_LIST_ALLOWED ) contact->setAllowed( true ); + if( lists & Contact::MSN_LIST_BLOCKED ) contact->setBlocked( true ); + if( lists & Contact::MSN_LIST_REVERSE ) contact->setReverse( true ); + if( lists & Contact::MSN_LIST_PENDING ) contact->setPending( true ); + } + else + { + // Else if the contact isn't present, ask to user what he want to do. + kDebug() << "The contact: " << handle << " not present in contact list added user"; + emit contactAddedUser( handle ); } } - - // Check whether the contact added you - if(contact->checkIfContactAddedUser()) - { - emit contactAddedUser(contact); - } -} - - - -// Received the addition of a group -void MsnNotificationConnection::gotAdg(const QStringList& command) -{ - if(KMESS_NULL(contactList_)) return; - - QString name = QUrl::fromPercentEncoding( command[2].toUtf8() ); - QString id = command[3]; - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Added group " << name << " (" << command[1] << ")."; -#endif - - // Pass the information to the group list. - contactList_->addGroup( id, name ); } // Received confirmation of the user's status change -void MsnNotificationConnection::gotChg(const QStringList& command) +void MsnNotificationConnection::gotChg( const QStringList& command ) { if(KMESS_NULL(currentAccount_)) return; #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "User's status changed to " << command[2] << "."; #endif + // Change the user's status currentAccount_->setStatus( MsnStatus::codeToStatus( command[2] ) ); } @@ -1006,31 +973,35 @@ void MsnNotificationConnection::gotChg(const QStringList& command) // Received a challenge from the server -void MsnNotificationConnection::gotChl(const QStringList& command) +void MsnNotificationConnection::gotChl( const QStringList& command ) { // Handle challenge query - MSNChallengeHandler handler("YMM8C_H7KCQ2S_KL", "PROD0090YUAUV{2B"); - QString response = handler.computeHash(command[2]); + MSNChallengeHandler handler; + const QString& response( handler.computeHash( command[2] ) ); // Send response - sendPayloadMessage( "QRY", handler.productId(), response ); + sendPayloadMessage( "QRY", handler.getProductId(), response ); } // Received a version update from the server -void MsnNotificationConnection::gotCvr(const QStringList& /*command*/) +void MsnNotificationConnection::gotCvr( const QStringList& command ) { + Q_UNUSED( command ); if(KMESS_NULL(currentAccount_)) return; + // Set the connected status to false + connected_ = false; + // Send the USR command - sendCommand( "USR", "TWN I " + currentAccount_->getHandle() + "\r\n" ); + sendCommand( "USR", "SSO I " + currentAccount_->getHandle() ); } // Received notice that a contact went offline -void MsnNotificationConnection::gotFln(const QStringList& command) +void MsnNotificationConnection::gotFln( const QStringList& command ) { if(KMESS_NULL(contactList_)) return; @@ -1044,15 +1015,17 @@ void MsnNotificationConnection::gotFln(const QStringList& command) // Received notice that a contact is already online -void MsnNotificationConnection::gotIln(const QStringList& command) +void MsnNotificationConnection::gotIln( const QStringList& command ) { if(KMESS_NULL(contactList_)) return; // Get the contact info from the message - QString handle = command[3].toLower(); - QString friendlyName = QUrl::fromPercentEncoding( command[4].toUtf8() ); - uint capabilities = command[5].toUInt(); - QString msnObject = QUrl::fromPercentEncoding( command[6].toUtf8() ); + const QString& handle ( command[3].toLower() ); + const QString& friendlyName ( QUrl::fromPercentEncoding( command[5].toUtf8() ) ); + QString msnObject ( QUrl::fromPercentEncoding( command[7].toUtf8() ) ); + + uint capabilities = command[6].toUInt(); + Status status = MsnStatus::codeToStatus( command[2] ); #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << handle << " is initially " << command[2] << "."; @@ -1071,175 +1044,11 @@ void MsnNotificationConnection::gotIln(const QStringList& command) } #endif - // If the contact's name has changed, we need to update our server-side list manually. - // Note that getTrueFriendlyName() is used, we don't want the aliases from the ContactExtension - // since we would no longer be able to see both true-name and alias names. - // Happens both in the ILN and NLN commands. - const Contact *contact = contactList_->getContactByHandle(handle); - if( contact != 0 && friendlyName != contact->getTrueFriendlyName( STRING_ORIGINAL ) && friendlyName != handle ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Contact " << contact->getHandle() << " - Current friendly name '" << contact->getTrueFriendlyName() << "'" - << " doesn't match ours: '" << friendlyName << "'." - << " Updating server-side friendlyname." << endl; -#endif - changeFriendlyName( handle, friendlyName ); - } - - Status status = MsnStatus::codeToStatus( command[2] ); contactList_->changeContactStatus( handle, status, friendlyName, capabilities, msnObject, false ); } -/** - * @brief Handle the LSG command; receive group information of the contact list. - * - * This command is after a client invoked the SYN command to download the contact list. - * An example of this command: - * @code -<<< LSG testing 83db17d0-518f-404b-92c9-cb3d3bd4551c -@endcode - * - * @param command The command arguments. - * - command[1] is the list title, url-encoded. - * - command[2] is the group id. - */ -void MsnNotificationConnection::gotLsg(const QStringList& command) -{ - if(KMESS_NULL(contactList_)) return; - - QString name = QUrl::fromPercentEncoding( command[1].toUtf8() ); - QString groupId = command[2]; - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Got group " << name << "(" << groupId << ")"; -#endif - - contactList_->addGroup( groupId, name ); -} - - - -/** - * @brief Handle the LST command; receive contact information of the contact list. - * - * @code -<<< LST N=test@test.xx F=test@test.xx C=dfd5d659-fec9-4b43-9055-5cd1e6f33e45 3 1 -@endcode - * - * @param command The command arguments. - * - the first arguments are variable, and depend on the prefix (F= for friently name, C= for a contact guid, or N= for the contact handle). - * - the next argument is a bitwise flag of the list id's. See Contact::MsnContactLists. - * - the final argument is unknown, but always 1. - */ -void MsnNotificationConnection::gotLst(const QStringList& command) -{ - if(KMESS_NULL(contactList_)) return; - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Got LST : " << command.join( " " ); -#endif - - - QString handle; - QString friendlyName; - QString guid; - - int i = 1; - for(; i < command.size(); i++) - { - QString arg = command[ i ]; - if( arg.startsWith("N=") ) - { - handle = arg.mid(2).toLower(); - } - else if( arg.startsWith("F=") ) - { - friendlyName = KUrl::fromPercentEncoding( arg.mid(2).toUtf8() ); - } - else if( arg.startsWith("C=") ) - { - guid = arg.mid(2); - } - else if( arg.length() < 2 || arg.at(1) != '=' ) - { - // End of parameters. - break; - } - else - { - kWarning() << "Unknown argument encountered: '" << arg << "' in the command: " << command; - } - } - - int list = command[ i ].toInt(); -// int unknown = command[ i + 1 ]; - - // Get optional group ids, making sure it's not an int or some other invalid parameter (should be - // a comma-separated list of GUIDs) - QStringList groupIds; - if( command.size() > ( i + 2 ) ) - { - QString groupIdsList = command[i + 2]; - if( ! groupIdsList.isEmpty() && groupIdsList.length() > 8 ) - { - groupIds = groupIdsList.split( "," ); - } - } - - // Friendlyname is not set when contact is in the AL only (never seen online). - if( friendlyName.isEmpty() ) - { - friendlyName = handle; - } - - friendlyName = QUrl::fromPercentEncoding( friendlyName.toUtf8() ); - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - QString listName = QString(list & Contact::MSN_LIST_FRIEND ? "FL " : "") - + QString(list & Contact::MSN_LIST_ALLOWED ? "AL " : "") - + QString(list & Contact::MSN_LIST_BLOCKED ? "BL " : "") - + QString(list & Contact::MSN_LIST_REVERSE ? "RL " : "") - + QString(list & Contact::MSN_LIST_PENDING ? "PL " : ""); - kDebug() << "Got contact " << friendlyName << "(" << handle << ") list=" << listName << "groups=" << groupIds << "."; -#endif - - // Add the contact - Contact *contact = contactList_->addContact( handle, friendlyName, list, groupIds, guid ); - if(KMESS_NULL(contact)) return; - - // Check whether the contact added you - if(contact->checkIfContactAddedUser()) - { - emit contactAddedUser(contact); - } - - // Handle pending list automatically. - // see: http://msnpiki.msnfanatic.com/index.php/MSNP11:Changes#Reverse_List_Additions - if( contact->isPending() ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Contact is found in pending list, adding to reverse-list."; -#endif - - putAdc( handle, "RL"); // possibly only allowed since contact is on Pending list. - putRem( handle, "PL"); - } - - // Check if this is the last LST - noContacts_++; - if ( noContacts_ == totalNoContacts_ ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "All" << totalNoContacts_ << "contacts were received. Go online."; -#endif - goOnline(); - } -} - - - /** * @brief Handle the NLN command; a contact changed it's status. * @@ -1262,20 +1071,22 @@ void MsnNotificationConnection::gotLst(const QStringList& command) * @param command The command arguments. * - command[1] is the status code, see changeStatus() * - command[2] is the contact handle. - * - command[3] is the contact name, url encoded. - * - command[4] is the client-capabilities flag. - * - command[5] is the url-encoded MsnObject XML code. + * - command[3] networkid. + * - command[4] is the contact name, url encoded. + * - command[5] is the client-capabilities flag. + * - command[6] is the url-encoded MsnObject XML code. */ -void MsnNotificationConnection::gotNln(const QStringList& command) +void MsnNotificationConnection::gotNln( const QStringList& command ) { if(KMESS_NULL(contactList_)) return; // Get the contact info from the message - Status status = MsnStatus::codeToStatus( command[1] ); - QString handle = command[2].toLower(); - QString friendlyName = QUrl::fromPercentEncoding( command[3].toUtf8() ); - uint capabilities = command[4].toUInt(); - QString msnObject = QUrl::fromPercentEncoding( command[5].toUtf8() ); + const QString& handle ( command[2].toLower() ); + const QString& friendlyName ( QUrl::fromPercentEncoding( command[4].toUtf8() ) ); + QString msnObject ( QUrl::fromPercentEncoding( command[6].toUtf8() ) ); + + Status status = MsnStatus::codeToStatus( command[1] ); + uint capabilities = command[5].toUInt(); // For some reason an empty MSNObject is sent as "0" with MSNP12 if( msnObject == "0" ) @@ -1287,46 +1098,39 @@ void MsnNotificationConnection::gotNln(const QStringList& command) kDebug() << handle << " is now " << MsnStatus::getCode( status ) << "."; #endif - // If the contact's name has changed, we need to update our server-side list manually. - // Note that getTrueFriendlyName() is used, we don't want the aliases from the ContactExtension - // since we would no longer be able to see both true-name and alias names. - // Happens both in the ILN and NLN commands. - const Contact *contact = contactList_->getContactByHandle(handle); - if( contact != 0 && friendlyName != contact->getTrueFriendlyName( STRING_ORIGINAL ) && friendlyName != handle ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Contact " << contact->getHandle() << " - Current friendly name '" << contact->getTrueFriendlyName() << "'" - << " doesn't match ours: '" << friendlyName << "'." - << " Updating server-side friendlyname." << endl; -#endif - changeFriendlyName( handle, friendlyName ); - } - // Update contact status. contactList_->changeContactStatus( handle, status, friendlyName, capabilities, msnObject, enableNotifications_ ); } -// Received notice of disconnetion from the server -void MsnNotificationConnection::gotOut(const QStringList& command) +// Received notice of disconnection from the server +void MsnNotificationConnection::gotOut( const QStringList& command ) { - // If the first word is "OTH", it means that this user connected from elsewhere. - if ( command[1] == "OTH" ) + // If the first command parameter is "OTH", it means that this account has connected from elsewhere. + if( command[1] == "OTH" ) { - KMessageBox::error( 0, i18n("

    You have been disconnected!

    You connected with this account from another Messenger client, or from another location.

    ") ); - } + slotError( "Connected from another location", + MsnSocketBase::ERROR_CONNECTION_OTHER ); - closeConnection(); + // Don't try reconnecting when connected from elsewhere. + } + else + { + closeConnection(); + + // Try connecting again + emit reconnect( currentAccount_->getHandle() ); + } } -// Received a propertu change (friendly name, phone number, etc..) -void MsnNotificationConnection::gotPrp(const QStringList& command) +// Received a property change (friendly name, phone number, etc..) +void MsnNotificationConnection::gotPrp( const QStringList& command ) { - QString propertyName = command[1]; - QString propertyValue = QUrl::fromPercentEncoding( command[2].toUtf8() ); + const QString& propertyName ( command[1] ); + const QString& propertyValue( QUrl::fromPercentEncoding( command[2].toUtf8() ) ); if( propertyName == "MFN" ) { @@ -1350,206 +1154,53 @@ void MsnNotificationConnection::gotPrp(const QStringList& command) -// Received confirmation of change in a group's name -void MsnNotificationConnection::gotReg(const QStringList& command) +void MsnNotificationConnection::gotRml( const QStringList &command ) { - if(KMESS_NULL(contactList_)) return; - - QString groupId = command[2]; - QString name = QUrl::fromPercentEncoding( command[3].toUtf8() ); - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Group " << groupId << " renamed to " << name << "."; -#endif - // Pass the info to the group list - contactList_->renameGroup( groupId, name ); + // The server responds to a successful RML command + if( command[2] == "OK" ) + { + } } /** - * @brief Handle the REM command; confirmation of a contacts's removal from list or group. + * @brief Received a connection request from a contact * - * @code ->>> REM 11 AL test@test.xx -@endcode - * @code -<<< REM 11 AL test@test.xx -@endcode - * - * @param command The arguments, - * - command[1] is the ack id. - * - command[2] is the contact list. - * - command[3] is the contact handle. With the FL list, this is a GUID. - * - command[4] is included when the list is FL. It's the the group the contact was removed from. - */ -void MsnNotificationConnection::gotRem(const QStringList& command) -{ - /* - * Note, if this method is called, it doesn't mean the contact is entirely removed. - * It only indicated the contact was removed from a certain group or list. - */ - - if(KMESS_NULL(contactList_)) return; - - Contact *contact; - - // Extract the handle, friendlyName, and list from the message - QString listType = command[2]; - QString handle; - QString guid; - QString groupId; - - if( listType == "FL" ) - { - // FL has a different syntax. - guid = command[3]; - contact = contactList_->getContactByGuid( guid ); - - // If contact list removed from the FL without specifying groups, - // it will appear again in these groups when the contact is re-added. - // see: http://msnpiki.msnfanatic.com/index.php/MSNP11:Changes#REM - if( command.size() > 4 ) - { - groupId = command[4]; // an optional parameter! - } - } - else - { - handle = command[3].toLower(); - contact = contactList_->getContactByHandle( handle ); - } - - // Check whether contact is null. - if(contact == 0) - { - kDebug() << "Couldn't find contact " << handle << guid << " in the contact list."; - return; - } - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Contact " << contact->getHandle() << " removed from " << listType << " " << groupId << "."; -#endif - - // Remove the contact from the given list - if(listType == "FL") - { - if( groupId.isEmpty() ) - { - // A contact is only removed from the FL if no groupId is given - contact->setList("FL", false); - } - else - { - // Otherwise, only remove from the given group, - // the contact defaults to "no group" automatically. - contact->removeGroupId(groupId); - } - } - else - { - // Contact was removed from the given list. - contact->setList(listType, false); - - // Even if the contact is removed from all lists, they are not removed entirely. - // You might want to add them again, with the history/ContactExtension settings preserved. - // TODO perhaps change the contact-remove "policy" in the future - } -} - - - -// Received confirmation of a group's removal -void MsnNotificationConnection::gotRmg(const QStringList& command) -{ - if(KMESS_NULL(contactList_)) return; - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Remove group " << command[2] << "."; -#endif - - // Pass the info to the group list - contactList_->removeGroup( command[2] ); -} - - - -// Received a connection request from a contact -void MsnNotificationConnection::gotRng(const QStringList& command) + * Format at MSNP15: + * RNG 1295917726 65.54.228.15:1863 CKI 104194101.9520122 email@domain.com Friendly%20Name U messenger.msn.com 1\r\n +*/ +void MsnNotificationConnection::gotRng( const QStringList& command ) { // Pull the data from the message - QString chatId = command[1]; - QString serverAndPort = command[2]; - // command[3] = authType == "CKI" - QString auth = command[4]; - QString handle = command[5].toLower(); -// QString friendlyName = QUrl::fromPercentEncoding( command[6].toUtf8() ); + const QString& chatId ( command[1] ); + const QString& serverAndPort( command[2] ); + const QString& auth ( command[4] ); + const QString& handle ( command[5].toLower() ); + + const QString& server ( serverAndPort.section(':', 0, 0) ); + const QString& portString( serverAndPort.section(':', 1, 1) ); - QString server = serverAndPort.section(':', 0, 0); - QString portString = serverAndPort.section(':', 1, 1); bool goodPort; quint16 port = (quint16) portString.toUInt( &goodPort ); - if ( !goodPort ) + if( ! goodPort ) { kWarning() << "Couldn't get port from string " << portString; return; } #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << handle << " is requesting a chat at: " - << server << ":" << port << " id=" << chatId << " auth=" << auth << "." << endl; + << server << ":" << port << " id=" << chatId << " auth=" << auth; #endif // Send connection information object - emit startSwitchboard( ChatInformation(this, handle, server, port, auth, chatId, ChatInformation::CONNECTION_BACKGROUND ) ); -} - - - -/** - * @brief Handle the SYN response; synchronization information. - * - * After the client logged in with the USR command (see gotUsr()), - * it requests the contact list from the server with the SYN command. - * This initiates the flood of commands from the server (e.g. LSG and LST). - * - * When a timestamp is specified in the SYN command, - * the server only sends the incremental updates of the contact list. - * This however, is currently not used in KMess. It requires absolute confidence - * the contact list commands are handled correctly. This is a bit difficult to - * guarantee after a protocol version upgrade. - * - * @code ->>> SYN 7 0 0 -@endcode - * @code -<<< SYN 7 2007-05-02T13:00:41.25-07:00 2007-05-05T08:39:41.277-07:00 16 2 -@endcode - * - * @param command The command arguments. - */ -void MsnNotificationConnection::gotSyn(const QStringList& command) -{ - emit ( i18n("Got synchronization") ); - totalNoContacts_ = command[4].toInt(); - - // Allow the contactlist to be downloaded within 2 minutes, should be more then enough. - loginTimer_.start( 120000 ); - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Got SYN. # of contacts is " << totalNoContacts_; -#endif - - // Go online if contactlist is empty (new account) - if(totalNoContacts_ == 0) - { - goOnline(); - } + emit startSwitchboard( ChatInformation( this, handle, server, port, auth, chatId, ChatInformation::CONNECTION_BACKGROUND ) ); } // Received information about a contact's personal message -void MsnNotificationConnection::gotUbx(const QStringList &command, const QByteArray &payload) +void MsnNotificationConnection::gotUbx( const QStringList &command, const QByteArray &payload ) { #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "Got UBX information."; @@ -1558,7 +1209,7 @@ void MsnNotificationConnection::gotUbx(const QStringList &command, const QByteAr Contact *contact = contactList_->getContactByHandle( command[1].toLower() ); if(KMESS_NULL(contact)) return; - if(command[2].toInt() == 0) + if( command[3].toInt() == 0 ) { // Size is 0, no personal message contact->setPersonalStatus( QString::null ); @@ -1574,9 +1225,9 @@ void MsnNotificationConnection::gotUbx(const QStringList &command, const QByteAr } // Parse payload - QDomElement root = xml.namedItem("Data").toElement(); - QString psm = root.namedItem("PSM").toElement().text(); - QString currentMedia = root.namedItem("CurrentMedia").toElement().text(); + const QDomElement& root( xml.namedItem("Data").toElement() ); + const QString& psm( root.namedItem("PSM").toElement().text() ); + QString currentMedia( root.namedItem("CurrentMedia").toElement().text() ); QString mediaType; // Append current media if set. @@ -1593,7 +1244,7 @@ void MsnNotificationConnection::gotUbx(const QStringList &command, const QByteAr // Fields are: application, mediatype, enabled, formatstring, arg1, arg2, arg3 // Split media string - QStringList media = currentMedia.split( "\\0" ); + const QStringList media( currentMedia.split( "\\0" ) ); mediaType = media[1]; // Check if media is enabled, to find out what this means. @@ -1623,48 +1274,60 @@ void MsnNotificationConnection::gotUbx(const QStringList &command, const QByteAr // Received the folder and command info for Hotmail's inbox or compose -void MsnNotificationConnection::gotUrl(const QStringList& command) +// The response from ns is like to: +// URL 68 /cgi-bin/compose https://login.live.com/ppsecure/md5auth.srf?lc=1040 2 +// 68 is an ack number, /cgi-bin/compose is the ru ( url command ) for the specify service +// and the last url is the site to send the query. Note: KMess use sha1auth instead md5 +// so the store of this last url is useless! +void MsnNotificationConnection::gotUrl( const QStringList& command ) { #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "Got URL information."; #endif if(KMESS_NULL(currentAccount_)) return; - // TODO: Try and see if this obscure method can be made more readable. + // Grep the hash where store the informations + QHash& hash( currentAccount_->getUrlInformation() ); - // Check the inbox and compose URLs to see if they're storing this ack - if ( currentAccount_->getInboxCommand() == command[1] ) + // Check if in the hash there is already the ack request + // Remove the item with the key "ack" and value "SERVICE" and switch the element + // so the key will be the "SERVICE" and the value will be the URL. + const QString& service( hash.take( command[1] ) ); + + if( ! service.isEmpty() ) { - // This is the inbox url - currentAccount_->setInboxInformation( command[4], command[2], command[3] ); - } - else if ( currentAccount_->getComposeCommand() == command[1] ) - { - // This is the compose url - currentAccount_->setComposeInformation( command[4], command[2], command[3] ); + hash.insert( service, command[2] ); } } -// Received user authentication information -void MsnNotificationConnection::gotUsr(const QStringList& command) +/** + * @brief Received a USR command from the server. + * + * USR command for the login. At first we must send the handle with wich we want to log on. + * When the server response to first USR, we take the nonce value used for compute the return value. + * The key used for encrypt the data ( 3DES ) must be taken from Passport SOAP request. + * The computed value ( encryption of nonce with secret key taken by SOAP ) must be sended to server. + * + */ +void MsnNotificationConnection::gotUsr( const QStringList& command ) { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Got USR information."; -#endif if(KMESS_NULL(currentAccount_)) return; - QString step = command[2]; + const QString& step( command[2] ); // This is either asking for authentication or confirming it - if( step == "TWN" ) + if( step == "SSO" ) { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "USR authentication."; -#endif + // The initial connection process (network connection establish and version exchange) is over. + // The MSN servers sometimes fail to warn the clients that something's wrong by their side and + // they close the connection before the USR. This is a nice workaround: if the connection gets + // closed before this point, we just try again with HTTP, which usually works. + isInitiatingConnection_ = false; - QString parameters = QUrl::fromPercentEncoding( command[4].toUtf8() ); + const QString& policy ( command[4] ); // Policy + nonceBase64_ = command[5]; // Base64 nonce // Change statusbar emit statusMessage( i18n("Authenticating..."), false ); @@ -1684,15 +1347,12 @@ void MsnNotificationConnection::gotUsr(const QStringList& command) // Start the passport based login passportLoginService_ = createPassportLoginService(); - passportLoginService_->login( parameters, currentAccount_->getHandle(), password ); + passportLoginService_->login( policy, currentAccount_->getHandle(), password ); } else if( step == "OK" ) { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "USR confirmation."; -#endif // This is a confirmation message. Get the user's friendly name from the message. - bool isVerified = (command[4].toInt() == 1); + bool isVerified = ( command[4].toInt() == 1 ); currentAccount_->setVerified( isVerified ); #ifdef KMESSDEBUG_NOTIFICATION_GENERAL @@ -1707,22 +1367,12 @@ void MsnNotificationConnection::gotUsr(const QStringList& command) // The password may be overwritten now, because the login was succesful. currentAccount_->saveTemporaryPassword(); - // Synchronize with the server. - // This will cause it to send the account data and contact lists) - sendCommand("SYN", "0 0\r\n"); - sendCommand("GCF", "Shields.xml\r\n"); // TODO: error if omitted? + emit statusMessage( i18n( "Authenticated" ), false ); -// QDateTime time_ = QDateTime::currentDateTime(); -// QString currentTime_ = time_.toString(Qt::ISODate) + ".0000000-07:00"; -// sendCommand( "SYN", currentTime_ + " " + currentTime_ + "\r\n"); - - emit statusMessage( i18n("Waiting for contact list..."), false ); - - // Reset the connection timer now, to give some more time - // to the MSN contact list server to send us our contacts. - // Technically, we're waiting for the SYN command response. - loginTimer_.stop(); - loginTimer_.start( 60000 ); // 60 seconds + // Retrieve from with one SOAP request the membership list ( where there are the lists for + // FL AL BL contacts ) + AddressBookService *addressBook = createAddressBookService(); + addressBook->retrieveMembershipLists(); } else { @@ -1733,36 +1383,35 @@ void MsnNotificationConnection::gotUsr(const QStringList& command) // Received version information -void MsnNotificationConnection::gotVer(const QStringList& command) +void MsnNotificationConnection::gotVer( const QStringList& command ) { -#ifdef KMESSTEST - KMESS_ASSERT( command[2] == "MSNP12" ); -#else Q_UNUSED( command ); // Avoid compiler warning -#endif + if(KMESS_NULL(currentAccount_)) return; // Send some fake info about the current version // First parameter is the locale-id (0x0409 is U.S. English). - sendCommand( "CVR", "0x0409 winnt 5.1 i386 MSNMSGR 7.5.0324 msmsgs " + currentAccount_->getHandle() + "\r\n" ); + sendCommand( "CVR", "0x0409 winnt 5.1 i386 MSNMSGR 7.5.0324 msmsgs " + currentAccount_->getHandle() ); } -// Received server transfer information +/** + * @brief Received server transfer information + * + * Format at MSNP15: + * XFR 32 SB 65.54.171.31:1863 CKI 1743299383.52212212.219110167 U messenger.msn.com 1\r\n + */ void MsnNotificationConnection::gotXfr(const QStringList& command) { - // Get parameters + // Get id of transaction int transactionId = command[1].toInt(); - QString serverType = command[2]; // Server Type (NS or SB) - QString serverAndPort = command[3]; // server:port part -#ifdef KMESSTEST - KMESS_ASSERT( serverAndPort.contains(":") ); -#endif - // Get the server from that - QString server = serverAndPort.left( serverAndPort.indexOf(":") ); - QString portString = serverAndPort.right( serverAndPort.length() - serverAndPort.lastIndexOf(":") - 1 ); + // Get informations about the server from that + const QString& serverType ( command[2] ); + const QString& serverAndPort ( command[3] ); + const QString& server ( serverAndPort.section( ':', 0, 0 ) ); + const QString& portString( serverAndPort.section( ':', 1, 1 ) ); // Convert the port to an integer bool goodPort; @@ -1776,7 +1425,6 @@ void MsnNotificationConnection::gotXfr(const QStringList& command) return; } - if( serverType == "NS" ) { #ifdef KMESSDEBUG_NOTIFICATION_GENERAL @@ -1784,6 +1432,7 @@ void MsnNotificationConnection::gotXfr(const QStringList& command) #endif // Disconnect from the existing server. disconnectFromServer( true ); + #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "Connecting to new server."; #endif @@ -1791,9 +1440,16 @@ void MsnNotificationConnection::gotXfr(const QStringList& command) emit statusMessage( i18n("Switching to another server..."), false ); #ifdef KMESS_NETWORK_WINDOW - KMESS_NET_INIT(this, "NS " + server); + KMESS_NET_INIT( this, "NS " + server ); #endif + // Stop the login timer: it'll be restarted while connecting to the new server + loginTimer_.stop(); + + // Set the connection as initiating, connectToServer() is from the parent class + // and can't do it itself + isInitiatingConnection_ = true; + // Connect to the new server. connectToServer( server, port ); } @@ -1806,7 +1462,6 @@ void MsnNotificationConnection::gotXfr(const QStringList& command) // This is a switchboard server. This message should be in response to // a user-requested chat. Look for the pending chat information. - ChatInformation *switchboardInfo = 0; foreach( ChatInformation *chatInformation, openRequests_ ) { @@ -1844,6 +1499,137 @@ void MsnNotificationConnection::gotXfr(const QStringList& command) +/** + * @brief Send the ADL command. + * + * ADL: 'Add List' command, uses XML to identify each contact, and works as a payload message. + * Each ADL command may contain up to 150 contacts (a payload of roughly 7500 bytes). + * + */ +void MsnNotificationConnection::putAdl( const QString &handle, int list ) +{ + // If handle is present then the adl isn't initial ADL command, so use command for add someone into one list + if( ! handle.isEmpty() ) + { + const QStringList& splittedHandle( handle.split( "@" ) ); + + const QString payload( "" + "" + "" + "" + "" ); + + sendPayloadMessage( "ADL", QString::null, payload.arg( QString::number( list ) ) ); + return; + } + + // Use the current contact list to make the string to send with initial ADL command + const QHash< QString, Contact* >& contactList( contactList_->getContactList() ); + + // If the list is empty, send an empty ADL + if( contactList.isEmpty() ) + { + sendPayloadMessage( "ADL", QString(), QByteArray( "" ) ); + return; + } + + QHashIterator< QString,Contact* > i( contactList ); + const Contact *currentContact = 0; + + QString adlList; + QString currentAdl; + bool send = false; + int userType = 1; + + while( i.hasNext() ) + { + i.next(); + + currentContact = i.value(); + if( currentContact == 0 ) + { + continue; + } + + list = 0; + if( currentContact->isFriend() ) + { + list |= Contact::MSN_LIST_FRIEND; + } + + // The contact may be or blocked or allowed, if it is both the ADL command fails + if( currentContact->isBlocked() ) + { + list |= Contact::MSN_LIST_BLOCKED; + } + else if( currentContact->isAllowed() ) + { + list |= Contact::MSN_LIST_ALLOWED; + } + + // Add to ADL command only user in at least one list + if( list != 0 ) + { + // Split the domain from handle + const QStringList& splittedHandle( currentContact->getHandle().split( "@" ) ); + + // Set the user type + userType = 1; + if( currentContact->getInformation( "isMessenger3" ).toBool() ) + { + userType = 2; + } + + currentAdl = ""; + + // Check if the buffer is too large ( 7500 bytes maximum ) + if( currentAdl.toLatin1().size() + adlList.toLatin1().size() >= 7450 ) + { + // Switch to true the send variable and go back to previous element + send = true; + i.previous(); + } + else + { + adlList += currentAdl; + } + } + else + { + // The user should decide in which list add it + emit contactAddedUser( currentContact->getHandle() ); + } + + + // Send the buffer if the send variable is true or the current contact is the last of the list + if( send || ! i.hasNext() ) + { + sendPayloadMessage( "ADL", QString::null, "" + adlList + "" ); + adlList = ""; + send = false; + } + } +} + + + +// Send the RML command +void MsnNotificationConnection::putRml( const QString &handle, int list ) +{ + const QStringList& splittedHandle( handle.split( "@" ) ); + + const QString payload( "" + "" + "" + "" + "" ); + + sendPayloadMessage( "RML", QString::null, payload.arg( QString::number( list ) ) ); +} + + + // Initialize the object bool MsnNotificationConnection::initialize() { @@ -1861,11 +1647,13 @@ bool MsnNotificationConnection::initialize() // Determine which payload commands can be received by the Notification Connection QStringList payloadCommands; payloadCommands << "MSG" // Server message - << "UBX" // contact personal status message - << "GCF" // server config file - << "NOT" // msn alerts, msn calendar - << "IPG" // contact page - ; + << "UBX" // contact personal status message + << "UBN" + << "GCF" // server config file + << "NOT" // msn alerts, msn calendar + << "IPG" // contact page + << "ADL" + ; setAcceptedPayloadCommands( payloadCommands ); @@ -1874,12 +1662,81 @@ bool MsnNotificationConnection::initialize() currentAccount_ = CurrentAccount::instance(); currentAccount_->setContactList( contactList_ ); + // Connect the activation signal to send notification events + connect( NotificationManager::instance(), SIGNAL( eventActivated(NotificationManager::EventSettings,NotificationManager::Buttons) ), + this, SLOT ( slotErrorEventActivated(NotificationManager::EventSettings,NotificationManager::Buttons) ) ); + initialized_ = true; return initialized_; } +/** + * @brief The passport login succeeded. + * + * When this method gets called, CurrentAccount will contain all + * the needed passport security tokens. + */ +void MsnNotificationConnection::loginSucceeded() +{ + // Delete the login handler + // Delay deletion so it can complete the method. + deleteSoapClient( passportLoginService_ ); + passportLoginService_ = 0; + + // Initialize the QCA and create the IV key for triple des encryption + QCA::Initializer init; + QCA::InitializationVector iv(8); + + // Create the keys and hashes needed + QByteArray key1, key2, key3; + QByteArray hash, des3hash; + + // Use the nonce received from last USR commands and the proof key for authentication + QByteArray nonce = nonceBase64_.toLatin1(); + + // Compute the value to send with USR SSO command + QString magic1( "WS-SecureConversationSESSION KEY HASH" ); + QString magic2( "WS-SecureConversationSESSION KEY ENCRYPTION" ); + + key1 = QByteArray::fromBase64( currentAccount_->getToken( "MessengerClearProof" ).toLatin1() ); + key2 = KMessShared::deriveKey( key1, magic1.toLatin1() ); + key3 = KMessShared::deriveKey( key1, magic2.toLatin1() ); + hash = KMessShared::createHMACSha1( key2, nonce ); + + // The windows api always pads using \x08 so we pad 8 bytes. + nonce += QByteArray ( 8, '\x08' ); + + // Compute the 3des encryption + des3hash = createTripleDes ( key3, nonce, iv ); + if( des3hash.isEmpty() ) + { + return; + } + + // Create the required 128 byte padded struct + MSNPMSNG blob; + blob.headerSize = 28; + blob.cryptMode = 1; // CRYPT_MODE_CBC + blob.cipherType = 0x6603; // Triple DES + blob.hashType = 0x8004; // SHA-1 + blob.ivLength = 8; + blob.hashLength = 20; // Length of the HMAC hash + blob.cipherLength = 72; + + // Copy the IV Bytes, the hash and chiper value in blob struct + memcpy( reinterpret_cast (blob.ivBytes), iv.toByteArray () , des3hash.size() ); + memcpy( reinterpret_cast (blob.hashBytes), hash, hash.size() ); + memcpy( reinterpret_cast (blob.cipherBytes), des3hash, des3hash.size() ); + + // Create the byte arrays and send for login + QByteArray blobs ( reinterpret_cast ( &blob ), 128 ); + + sendCommand( "USR", "SSO S " + currentAccount_->getToken( "MessengerClear" ) + " " + blobs.toBase64() ); +} + + // The passport login failed, username/password was incorrect void MsnNotificationConnection::loginIncorrect() { @@ -1890,35 +1747,7 @@ void MsnNotificationConnection::loginIncorrect() // NOTE: a similar thing also happens in soapRequestFailed(), // but for fatal SOAP errors. - // Show a message to the user, before deleting the object! - KMessageBox::error( 0, i18n("Authentication failed, please verify your account name and password.") ); - - // Close the connection attempt. - closeConnection(); -} - - - -// The passport login succeeded -void MsnNotificationConnection::loginSucceeded( QString authentication, QString passportToken, - QString proofToken ) -{ -#ifdef KMESSDEBUG_NOTIFICATION_AUTH - kDebug() << "Authentication is " << authentication; -#endif - - // Store the passport tickets - currentAccount_->setAuthenticationTicket( authentication ); - currentAccount_->setPassportToken ( passportToken ); - currentAccount_->setProofToken ( proofToken ); - - // Delete the login handler - // Delay deletion so it can complete the method. - deleteSoapClient( passportLoginService_ ); - passportLoginService_ = 0; - - // Send login command. - sendCommand( "USR", "TWN S " + authentication + "\r\n" ); + slotError( "Authentication failed. Wrong login credentials.", MsnSocketBase::ERROR_AUTH_LOGIN ); } @@ -1930,40 +1759,22 @@ void MsnNotificationConnection::moveContact(QString handle, QString fromGroupId, kDebug() << "Moving '" << handle << "' from '" << fromGroupId << "' to '" << toGroupId << "'."; #endif - Contact *contact = contactList_->getContactByHandle(handle); - if(contact == 0) + AddressBookService *addressBook = createAddressBookService(); + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact == 0 ) { - kDebug() << "Couldn't find the contact."; return; } - if(fromGroupId == toGroupId) + addressBook->addContactToGroup( contact->getGuid(), toGroupId ); + + // Check if the "from group" is empty or not exists. + if( fromGroupId == "0" || fromGroupId.isEmpty() ) { - // Would remove the contact otherwise. (re-added to original group, removed from original group afterwards) - kDebug() << "Attempted to move contact to same group."; return; } - - // Move the contact - if(fromGroupId == "0" || fromGroupId.isEmpty()) - { - // Move from implicit "individuals" group to something else requires a single ADC. - putAdc( handle, "FL", toGroupId ); - } - else - { - // Add to new group, remove from old. - // Only execute the "REM" command when the "ADC" was successful. -// movingSourceGroup_ = fromGroupId; -// movingAck_ = - contact->setPrepareMove( fromGroupId ); - putAdc( handle, "FL", toGroupId ); - -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "waiting for ack " << /*movingAck_ <<*/ " to remove contact from group."; -#endif - } + addressBook->deleteContactFromGroup( contact->getGuid(), fromGroupId ); } @@ -1992,6 +1803,9 @@ bool MsnNotificationConnection::openConnection() emit statusMessage( i18n( "Connecting..." ), false ); + // Set the flag to avoid an MSN server problem. See gotUsr() + isInitiatingConnection_ = true; + // Attempt to connect to the default MSN server connectToServer(); @@ -2005,480 +1819,178 @@ bool MsnNotificationConnection::openConnection() // Parse a regular command -void MsnNotificationConnection::parseCommand(const QStringList& command) +void MsnNotificationConnection::parseCommand( const QStringList& command ) { #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "Parsing command '" << command[0] << "'."; #endif - if(command[0].toInt() != 0) + // Allow some time until the next message is received + if( loginTimer_.isActive() ) { - // I've decided to always print these messages, should make "error-resolving" easier. - kWarning() << "Received error code " << command[0] << " from server."; - - // See if the error was from an open switchboard request. - // TODO: It would be nicer to implement a generic error handling in the base class for all commands! - if( ! openRequests_.isEmpty() ) - { - int transactionId = command[1].toInt(); - foreach( ChatInformation *chatInvite, openRequests_ ) - { - if( chatInvite->getTransactionId() == transactionId ) - { -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "Removing chat invitation from list."; -#endif - - openRequests_.removeAll( chatInvite ); - delete chatInvite; - break; - } - } - } + loginTimer_.start( NOTIFICATION_COMMAND_INTERVAL_TIMEOUT ); } // Find out what kind of command we've received. Numbers are errors, the others server commands. bool isNumber = false; command[0].toInt( &isNumber ); - // It's a command - if( ! isNumber ) + // If it's not a command, something has went wrong. + if( isNumber ) { - if ( command[0] == "ADC" ) - { - gotAdc( command ); // Contact adding - } - else if ( command[0] == "ADG" ) - { - gotAdg( command ); // Group adding - } - else if ( command[0] == "BLP" ) - { - // Unimplemented. This is a privacy setting. (buddy-list-policy?) - } - else if ( command[0] == "BPR" ) - { - // Unimplemented. This contains buddy properties. - } - else if ( command[0] == "CHG" ) - { - gotChg( command ); // Status change - } - else if ( command[0] == "CHL" ) - { - gotChl( command ); // Server-side ping, aka 'challenge' - } - else if ( command[0] == "CVR" ) - { - gotCvr( command ); // Client version info - } - else if ( command[0] == "FLN" ) - { - gotFln( command ); // Contact offline - } - else if ( command[0] == "GTC" ) - { - // Unimplemented. This is a policy setting, tells how to handle chats with contacts not in your list. - } - else if ( command[0] == "ILN" ) - { - gotIln( command ); // Contact initially online - } - else if ( command[0] == "LSG" ) - { - gotLsg( command ); // Group information - } - else if ( command[0] == "LST" ) - { - gotLst( command ); // Contact information - } - else if ( command[0] == "NLN" ) - { - gotNln( command ); // Contact now online - } - else if ( command[0] == "OUT" ) - { - gotOut( command ); // Disconnection from server - } - else if ( command[0] == "PRP" ) - { - gotPrp( command ); // Contact property change - } - else if ( command[0] == "QRY" ) - { - // Ignored. Indicates the challenge was succesful, contains no parameters. - } - else if ( command[0] == "REG" ) - { - gotReg( command ); // Group name change - } - else if ( command[0] == "REM" ) - { - gotRem( command ); // Contact removal from lists/groups - } - else if ( command[0] == "RMG" ) - { - gotRmg( command ); // Group removal - } - else if ( command[0] == "RNG" ) - { - gotRng( command ); // Chat or connection requests - } - else if ( command[0] == "SBP" ) - { - // Unimplemented. - } - else if ( command[0] == "SBS" ) - { - // Ignored. The meaning of this command is unknown, but it's related to the - // user's mobile credits (MSN Mobile). - // See: http://msnpiki.msnfanatic.com/index.php/MSNP11:Changes#SBS for details - } - else if ( command[0] == "SYN" ) - { - gotSyn( command ); // Initial synchronization information - } - else if ( command[0] == "URL" ) - { - gotUrl( command ); // Hotmail folder info - } - else if ( command[0] == "USR" ) - { - gotUsr( command ); // User authentication information - } - else if ( command[0] == "UUX" ) - { - // Ignored. It's an echo back from our UUX command. Unlike other commands, - // the UI is updated for this command already before the server confirms. - } - else if ( command[0] == "VER" ) - { - gotVer( command ); // Version information - } - else if ( command[0] == "XFR" ) - { - gotXfr( command ); // Server transfer data - } - else - { - // No need to bugger the normal users with strange error messages - kWarning() << "Unknown command" << command[0] << "received from the server! Full string:" << command.join( " " ); -#ifdef KMESSDEBUG_NOTIFICATION_GENERAL - slotError( i18n( "Unknown command received from the server: %1", command[0] ), MsnSocketBase::ERROR_INTERNAL ); -#endif - } - + kWarning() << "Invalid command received:" << command; return; } - - // All possible commands have been trapped. At this point we can have only - // received an error code. - // See: http://msnpiki.msnfanatic.com/index.php/Reference:Error_List for details - - // By default, blame the user :) - MsnSocketBase::ErrorType errorType = MsnSocketBase::ERROR_USER; - QString errorMessage; - bool isNotice = false; // Not really errors, will be displayed on the status bar - bool isWarning = false; // Will be displayed on a dialog box, but will not disconnect - - switch( command[0].toInt() ) + // Identify and handle the command + if( command[0] == "ADL" ) { - // Client side errors. - // These errors are usually generated by misbehavior on kmess' or the user's side. - - case 200: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Invalid command syntax"); - break; - case 201: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Invalid command parameter"); - break; - case 205: - errorMessage = i18n("The email you have tried to add is not a MSN Messenger account"); - isWarning = true; - break; - case 206: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Domain name missing"); - break; - case 207: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Already logged in"); - break; - case 208: - errorMessage = i18n("The account name given is invalid"); - isWarning = true; - break; - case 209: - errorMessage = i18n("That account name is invalid, or your passport has not been confirmed yet"); - break; - case 210: - errorMessage = i18n("Your contact list is full"); - isWarning = true; - break; - case 213: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Invalid SBP parameter"); - break; - case 215: - errorMessage = i18n("This contact is already on your list"); - isWarning = true; - break; - case 216: - errorMessage = i18n("This contact is not on your list"); - isWarning = true; - break; - case 217: - errorMessage = i18n("This contact is not online"); - isWarning = true; - break; - case 218: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Already in this mode"); - break; - case 219: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Contact is in the opposite list"); - break; - case 222: - case 228: - errorMessage = i18n("The group name is already added to your Messenger or Hotmail contact list. Please use a different name."); - isWarning = true; - break; - case 223: - errorMessage = i18n("Your contact list has too many groups"); - isWarning = true; - break; - case 224: - errorMessage = i18n("This group can't be changed"); - isWarning = true; - break; - case 225: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Contact is not added to this group"); - isWarning = true; - break; - case 227: - errorMessage = i18n("This group is not empty"); - isWarning = true; - break; - case 229: - errorMessage = i18n("The group name is too long"); - isWarning = true; - break; - case 230: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("There was an internal error in KMess: %1", i18n("Attempted to change group \"0\"") ); - break; - case 231: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Invalid Group"); - break; - case 240: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Empty domain"); - break; - case 280: - errorMessage = i18n("Switchboard server failed"); - break; - case 281: - errorMessage = i18n("Transfer to switchboard server failed"); - break; - case 282: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Direct connection (MSNSLP) error, connection failed"); - break; - case 300: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Required field missing"); - break; - case 302: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Not logged in"); - break; - case 420: - errorMessage = i18n("No permissions given for this account"); // e.g. trying the beta service. - break; - // For other 5xx errors, see below - case 502: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Command is disabled"); - break; - case 511: - errorMessage = i18n("Your account is banned."); - break; - case 540: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Challenge response failed"); - break; - // For other 6xx errors, see below - case 710: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Bad command data"); // bad CVR or URL command - break; - case 713: - // Too many CAL's - errorMessage = i18n("You are opening chat sessions too fast"); - isWarning = true; - break; - case 714: - errorMessage = i18n("You have too many open chat sessions"); - isWarning = true; - break; - case 715: - // Sent in response to a PRP setting an invalid phone type of three or less characters. - // Also sent in response to a change of display name (PRP) on an unverified Passport account. - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Unexpected command sequence"); - break; - case 717: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Bad friend name"); - isWarning = true; - break; - case 731: - // Sent in response to a badly formatted CVR - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Bad CVR data"); - break; - case 800: - // Happens when renaming too quickly, - // but also when sending too many MSNP2P packets over the switchboard without waiting for ACKs. - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("The server reports KMess is flooding it with too many data"); - isNotice = true; - break; - // For other 9xx errors, see below - case 911: - // User/pass was probably correct, TWN ticket was incorrect - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Authentication ticket was incorrect"); - break; - case 913: - errorMessage = i18n("You can't start a chat with someone while you are invisible."); - isWarning = true; - break; - case 920: - errorMessage = i18n("Not accepting new contacts"); - isWarning = true; - break; - case 923: - errorMessage = i18n("You have a kids passport account, you need parental consent to chat online."); - break; - case 924: - errorMessage = i18n("Your passport account needs to be verified first."); - break; - case 928: - errorType = MsnSocketBase::ERROR_INTERNAL; - errorMessage = i18n("Bad USR ticket"); - break; + gotAdl( command ); + } + else if ( command[0] == "BLP" ) + { + // Unimplemented. This is a privacy setting. (buddy-list-policy?) + } + else if ( command[0] == "BPR" ) + { + // Unimplemented. This contains buddy properties. + } + else if ( command[0] == "CHG" ) + { + gotChg( command ); // Status change + } + else if ( command[0] == "CHL" ) + { + gotChl( command ); // Server-side ping, aka 'challenge' + } + else if ( command[0] == "CVR" ) + { + gotCvr( command ); // Client version info + } + else if ( command[0] == "FLN" ) + { + gotFln( command ); // Contact offline + } + else if ( command[0] == "ILN" ) + { + gotIln( command ); // Contact initially online + } + else if ( command[0] == "NLN" ) + { + gotNln( command ); // Contact now online + } + else if ( command[0] == "OUT" ) + { + gotOut( command ); // Disconnection from server + } + else if ( command[0] == "PRP" ) + { + gotPrp( command ); // Contact property change + } + else if ( command[0] == "QRY" ) + { + // Ignored. Indicates the challenge was succesful, contains no parameters. + } + else if ( command[0] == "RNG" ) + { + gotRng( command ); // Chat or connection requests + } + else if( command[0] == "RML" ) + { + gotRml( command ); + } + else if( command[0] == "RFS" ) + { + // Receveid the request for refresh list + // so the client reply with adl command + putAdl(); + } + else if( command[0] == "UBN" ) + { + // For the moment is useless + // Require more investigate + } + else if ( command[0] == "SBP" ) + { + // Unimplemented. + } + else if ( command[0] == "SBS" ) + { + // Ignored. The meaning of this command is unknown, but it's related to the + // user's mobile credits (MSN Mobile). + // See: http://msnpiki.msnfanatic.com/index.php/MSNP11:Changes#SBS for details + } + else if ( command[0] == "URL" ) + { + gotUrl( command ); // Hotmail folder info + } + else if ( command[0] == "USR" ) + { + gotUsr( command ); // User authentication information + } + else if ( command[0] == "UUX" ) + { + // Ignored. It's an echo back from our UUX command. Unlike other commands, + // the UI is updated for this command already before the server confirms. + } + else if ( command[0] == "VER" ) + { + gotVer( command ); // Version information + } + else if ( command[0] == "XFR" ) + { + gotXfr( command ); // Server transfer data + } + else + { + // No need to bugger the common user with strange error messages + kWarning() << "Unknown command" << command[0] << "received from the server! Full string:" << command.join( " " ); +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + slotError( i18n( "Unknown command received from the server: %1", command[0] ), MsnSocketBase::ERROR_INTERNAL ); +#endif + } +} - // Server side errors. - // These are generated without any intervention from us. - case 402: - case 403: - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("Error accessing contact list, try again later"); - // If we're still logging in, the presence would be incomplete, so disconnect - if( ! loginTimer_.isActive() ) +// Parse an error command +void MsnNotificationConnection::parseError( const QStringList& command, const QByteArray &payloadData ) +{ + // See if the error was from an open switchboard request. + if( ! openRequests_.isEmpty() ) + { + int transactionId = command[1].toInt(); + foreach( ChatInformation *chatInvite, openRequests_ ) + { + if( chatInvite->getTransactionId() == transactionId ) { - isWarning = true; - } - break; - case 500: // Generic server error - case 501: // Database server error - case 510: // File operation failed - case 520: // Memory allocation failed - case 603: // Database connection failed, in response to SYN - case 605: // server unavailable - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("The MSN service is temporarily unavailable, there was an internal server error."); - break; - case 600: - case 601: // server is unavailable, in response to USR - case 910: - case 912: - case 918: - case 919: - case 921: - case 922: - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("The MSN service is temporarily unavailable, the server is too busy"); - break; - case 602: - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("Peer notification server down"); - break; - case 604: - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("The server is going down"); - break; - case 640: - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("The server is going down soon"); - isWarning = true; - break; - case 711: - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("Write is blocking"); - break; - case 712: - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("Session is overloaded"); - isWarning = true; - break; - case 914: - case 915: - case 916: - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("The server is not available"); - break; - case 917: - errorType = MsnSocketBase::ERROR_SERVER; - errorMessage = i18n("Authentication failed"); - break; - - default: - // No need to bugger the users with strange error messages - kWarning() << "Unknown error" << command[0] << "received from the server! Full string:" << command.join( " " ); #ifdef KMESSDEBUG_NOTIFICATION_GENERAL - slotError( i18n( "Unknown error code received from the server: %1", command[0] ), MsnSocketBase::ERROR_INTERNAL ); + kDebug() << "Removing chat invitation from list."; #endif - return; + + openRequests_.removeAll( chatInvite ); + delete chatInvite; + break; + } + } } - // We've received a notice message: don't interrupt the user for it, show it on the Status Bar instead. - if( isNotice ) - { - emit statusMessage( errorMessage, false ); - return; - } - // We've received a warning message: show it in a dialog box, but do not disconnect - else if( isWarning ) - { - KMessageBox::error( 0, errorMessage, i18nc( "Error dialog box title", "MSN error" ) ); - return; - } - - // Call the unified error message display method - slotError( errorMessage, errorType ); + // Relay the error detection to the base class + MsnConnection::parseError( command, payloadData ); } // Parse a message command -void MsnNotificationConnection::parseMimeMessage(const QStringList& /*command*/, const MimeMessage &mainMessage) +void MsnNotificationConnection::parseMimeMessage( const QStringList& command, const MimeMessage &mainMessage ) { + Q_UNUSED( command ); #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "Got " << mainMessage.getSubValue("Content-Type") << "."; #endif - QString contentType = mainMessage.getSubValue("Content-Type"); - MimeMessage message( mainMessage.getBody() ); + const QString& contentType( mainMessage.getSubValue("Content-Type") ); + const MimeMessage& message( mainMessage.getBody() ); #ifdef KMESSDEBUG_NOTIFICATION_MESSAGES mainMessage.print(); @@ -2519,7 +2031,7 @@ void MsnNotificationConnection::parseMimeMessage(const QStringList& /*command*/, } // Parse the Mail-Data field. - QString mailDataSrc = message.getValue("Mail-Data"); + const QString& mailDataSrc( message.getValue("Mail-Data") ); if( mailDataSrc == "too-large" ) { // After a certain ammount of messages, the XML is replaced with "too-large". @@ -2593,7 +2105,8 @@ void MsnNotificationConnection::parseMimeMessage(const QStringList& /*command*/, if( message.getValue("Type") == "1" ) { int timeLeft = message.getValue("Arg1").toInt(); - QString textTimeLeft = i18ncp( "Time left before server maintenance", "1 minute", "%1 minutes", timeLeft ); + const QString& textTimeLeft( i18ncp( "Time left before server maintenance", + "%1 minute", "%1 minutes", timeLeft ) ); if( timeLeft > 2 ) { emit statusMessage( i18n("Server closes for maintenance in %1!", textTimeLeft ), false ); @@ -2615,11 +2128,11 @@ void MsnNotificationConnection::parseMimeMessage(const QStringList& /*command*/, // Parse a payload command -void MsnNotificationConnection::parsePayloadMessage(const QStringList &command, const QByteArray &payload) +void MsnNotificationConnection::parsePayloadMessage( const QStringList &command, const QByteArray &payload ) { if( command[0] == "UBX" ) { - gotUbx(command, payload); + gotUbx( command, payload ); } else if( command[0] == "GCF" ) { @@ -2638,6 +2151,10 @@ void MsnNotificationConnection::parsePayloadMessage(const QStringList &command, kDebug() << "Ignoring text event notification, message dump follows." << endl << QString::fromUtf8( payload.data(), payload.size() ); #endif } + else if( command[0] == "ADL" ) + { + gotAdl( command, payload ); + } else { kWarning() << "Unhandled payload command: " << command[0] << "!" @@ -2648,144 +2165,45 @@ void MsnNotificationConnection::parsePayloadMessage(const QStringList &command, /** - * @brief Internal function to add a contact to a list or group. + * @brief Send the personal status and current media fields. * - * This function is used internally by the high-level contact list methods: - * - addContactToGroup() - * - addExistingContact() - * - addNewContact() - * - allowContact() - * - blockContact() - * - moveContact() - * - removeContact() - * - unblockContact() + * MSNP13 uses an extra field on the UUX command * - * This sends an ADC command to the server. - * It adds the contact to the given list. - * See the Contact class for a description of these fields. - * - * The groupId parameter only applies to contacts added to the FL. - * This can be used to add a contact to group within the friends list. - * When this value is not provided, the contact has no - * groups set (appearing at the top in the contact list window). - * - * The list parameter can be one of the following values: - * - FL: friends list - * - AL: allow list - * - BL: block list - * - RL: reverse list - * - * This method only sends the ADC command. - * When gotAdc() receives the server response, the ContactList object is updated. - * - * @param handle E-mail address of the contact. - * @param list The main list. - * @param groupId The group of the contact, only applicable when the contact is added to the FL list. - * @returns The ack-number used by the command. */ -int MsnNotificationConnection::putAdc(QString handle, QString list, QString groupId) -{ -#ifdef KMESSTEST - KMESS_ASSERT( list == "FL" || list == "AL" || list == "BL" || list == "RL" ); -#endif - QString arguments; - - // Check for old features from previous MSNP9 support - if( groupId == "0" ) - { - kWarning() << "got implicit group 0!"; - groupId = QString::null; - } - - // Determine the command arguments - if( list == "FL" ) - { - // Adds to the friends list. - if( groupId.isEmpty() ) - { - // Initial add to friends list. - arguments = " N=" + handle + " F=" + handle; - } - else - { - // Another add to specific group of the friends list. - // In this case, the handle may not be used, the GUID should be used instead. - Contact* contact = contactList_->getContactByHandle(handle); - if(KMESS_NULL(contact)) return 0; - arguments = " C=" + contact->getGuid() + " " + groupId; - } - } - else - { - // Adds to another list. - arguments = " N=" + handle; - } - - // Send the command - return sendCommand( "ADC", list + arguments + "\r\n" ); -} - - - -// Remove a contact from the given list or, if applicable, group -int MsnNotificationConnection::putRem(QString handle, QString list, QString groupId) -{ -#ifdef KMESSTEST - KMESS_ASSERT( list == "FL" || list == "AL" || list == "BL" || list == "PL" ); -#endif - QString command; - command = list + " "; - - if( list == "FL" ) - { - // FL has different syntax, need to specify the GUID instead. - Contact *contact = contactList_->getContactByHandle(handle); - if(KMESS_NULL(contact)) return 0; - command += contact->getGuid(); - - // Group is optional, allows to remove contact from a group only. - // Otherwise, contact is removed from entire FL, but group data is still remembered. - // When contact is re-added, it appears again in all groups (unless removed from those before). - if( ! groupId.isEmpty() ) - { - command += " " + groupId; - } - } - else - { - command += handle; - } - - return sendCommand( "REM", command + "\r\n" ); -} - - - -// Send the personal status and current media fields. void MsnNotificationConnection::putUux() { - // Send simple payload message. - if( lastPsm_.isEmpty() && lastCurrentMedia_.isEmpty() ) - { - sendPayloadMessage( "UUX", QString::null, QByteArray()); - } - else - { - QString xml = "" + lastPsm_ + "" + lastCurrentMedia_ + ""; - sendPayloadMessage( "UUX", QString::null, xml ); - } + // TODO Calculate a GUID for the specific machine, or (if possible) find out how + // WLM obtains the GUID and replicate the algorithm (to have GUIDs compatible with + // WLM). If that's not needed, add the machine name (WLM knows it). + + const QString xml( "" + "" + lastPsm_ + "" + "" + lastCurrentMedia_ + "" + "{F26D1F07-95E2-403C-BC18-D4BFED493428}" + "" ); + + sendPayloadMessage( "UUX", QString::null, xml ); } -// Send the version command +/** + * @brief Send the version command. + * + * Send versions of protocol supported by the client + * + */ void MsnNotificationConnection::putVer() { // Indicate which protocol version we support. // Most of the time it seems that: // - even versions are for minor changes. // - odd version is are for new revisions. - sendCommand( "VER", "MSNP12 MSNP11 MSNP10 CVR0\r\n" ); + sendCommand( "VER", "MSNP15 MSNP14 MSNP13 CVR0" ); + + // Reset the addressBookService_ because when the connection is closed the + // function deleteSoap in MsnConnection delete the soap class. + addressBookService_ = 0; } @@ -2801,11 +2219,11 @@ void MsnNotificationConnection::receivedMailData( QDomElement mailData ) for( int i = 0; i < childNodes.count(); i++ ) { QDomElement childNode = childNodes.item(i).toElement(); - QString childName = childNode.nodeName(); + QString childName( childNode.nodeName() ); if( childName == "E" ) { - // Found an initial e-mail status notification. + // Found an initial email status notification. #ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "Load initial email information."; #endif @@ -2815,7 +2233,7 @@ void MsnNotificationConnection::receivedMailData( QDomElement mailData ) if( inboxUnread.isNull() || othersUnread.isNull() ) { - kWarning() << "Reveived e-mail notification, but 'IU' and 'OU' elements are missing!"; + kWarning() << "Reveived email notification, but 'IU' and 'OU' elements are missing!"; } #ifdef KMESSTEST @@ -2831,7 +2249,7 @@ void MsnNotificationConnection::receivedMailData( QDomElement mailData ) // Using this for-loop, multiple 'M' elements are supported. // Extract the message ID. - QString messageId = childNode.namedItem("I").toElement().text(); + QString messageId( childNode.namedItem("I").toElement().text() ); if( messageId.isEmpty() ) { kWarning() << "Unable to parse Mail-Data payload, offline-im message-id not found."; @@ -2897,8 +2315,8 @@ void MsnNotificationConnection::receivedOfflineIm( const QString &messageId, con // Find the SOAP client to send the next request if( KMESS_NULL(offlineImService_) ) { - slotError( i18n( "KMess could not process Offline-IM messages.
    Details: %1", - i18n("Lost reference to SOAP client") ), + slotError( i18n( "KMess could not process Offline-IM messages.
    Details: %1", + i18n("SOAP client is no longer valid.") ), MsnSocketBase::ERROR_INTERNAL ); qDeleteAll( offlineImMessages_ ); @@ -2976,10 +2394,12 @@ void MsnNotificationConnection::receivedOfflineIm( const QString &messageId, con // Re-use previous results if message is from the same contact if( contact == 0 || contact->getHandle() != offlineIm->from ) { - contact = CurrentAccount::instance()->getContactByHandle(from); + contact = CurrentAccount::instance()->getContactByHandle( offlineIm->from ); if( contact != 0 ) { - name = contact->getFriendlyName(); + // Display the name in a simple way, to make it clearer to + // see the CSS style for Offline IM + name = contact->getFriendlyName( STRING_CLEANED ); picture = contact->getContactPicturePath(); } else @@ -3016,36 +2436,25 @@ void MsnNotificationConnection::receivedOfflineIm( const QString &messageId, con // Remove a contact from the contact list completely void MsnNotificationConnection::removeContact(QString handle, bool block) { - Contact *contact = contactList_->getContactByHandle(handle); + Contact *contact = contactList_->getContactByHandle( handle ); if(KMESS_NULL(contact)) return; - if(block) + QString contactId( contact->getGuid() ); + if( contactId.isEmpty() ) { - // Block the contact - putRem( handle, "AL" ); - putAdc( handle, "BL" ); - } - else - { - if(! contact->isReverse()) - { - // Remove from list, but only if we're not on the list of that contact (reverse-list). - // Otherwise a "contact has added you" message will appear at kmess startup. - putRem( handle, "AL" ); - putRem( handle, "BL" ); - } + return; } - if(contact->isFriend()) + // If the user checks the block option then put the contact in Block Membership list ( if not already present ) + if( block && ! contact->isBlocked() ) { - // If contact was on the friends list, remove it there. To do this, first remove it from all the groups it is in. - const QStringList groups( contact->getGroupIds() ); - foreach( QString groupId, groups ) - { - sendCommand("REM", "FL " + contact->getGuid() + " " + groupId + "\r\n"); - } - putRem( handle, "FL" ); + // Block the contact + blockContact( handle ); } + + // Remove the contact from AB + AddressBookService *addressBook = createAddressBookService();; + addressBook->deleteContact( contactId ); } @@ -3053,7 +2462,14 @@ void MsnNotificationConnection::removeContact(QString handle, bool block) //remove a contact from a single group void MsnNotificationConnection::removeContactFromGroup(QString handle, QString groupId) { - putRem( handle, "FL", groupId ); + AddressBookService *addressBook = createAddressBookService(); + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact == 0 ) + { + return; + } + + addressBook->deleteContactFromGroup( contact->getGuid(), groupId ); } @@ -3070,7 +2486,8 @@ void MsnNotificationConnection::removeCurrentMedia() // Remove a group void MsnNotificationConnection::removeGroup(QString id) { - sendCommand( "RMG", id + "\r\n" ); + AddressBookService *addressBook = createAddressBookService();; + addressBook->deleteGroup( id ); } @@ -3078,8 +2495,8 @@ void MsnNotificationConnection::removeGroup(QString id) // Rename a group void MsnNotificationConnection::renameGroup(QString id, QString newName) { - newName = QUrl::toPercentEncoding( newName ); - sendCommand( "REG", id + " " + newName + " 0\r\n"); + AddressBookService *addressBook = createAddressBookService();; + addressBook->renameGroup( id, newName ); } @@ -3116,7 +2533,7 @@ void MsnNotificationConnection::requestSwitchboard( QString handle, ChatInformat } // Send the command - int transactionId = sendCommand( "XFR", "SB\r\n" ); + int transactionId = sendCommand( "XFR", "SB" ); // Store the pending request information so the return value can be handled. openRequests_.append( new ChatInformation( this, handle, transactionId, type ) ); @@ -3164,7 +2581,7 @@ void MsnNotificationConnection::saveProperties() */ void MsnNotificationConnection::slotAuthenticationFailed() { -#ifdef KMESSDEBUG_CONNECTION_SOCKET_TCP +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL kDebug() << "Connection not successful within time limit."; #endif @@ -3174,6 +2591,248 @@ void MsnNotificationConnection::slotAuthenticationFailed() +// Contact added, notify it to contactlist +void MsnNotificationConnection::slotContactAdded( const QString &handle, const QString &contactId, const QStringList &groupsId ) +{ + int lists = Contact::MSN_LIST_ALLOWED | Contact::MSN_LIST_FRIEND; + + // If the contact already exists, the user requested re-adding to FL list. + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact != 0 ) + { + contact->setGuid( contactId ); + contact->setFriend( true ); + + // Ensure to block the contact if "already blocked" + if( contact->isBlocked() ) + { + lists ^= Contact::MSN_LIST_ALLOWED; + } + } + else + { + contactList_->addContact( handle, handle, lists, QStringList(), contactId ); + } + + // Check if the user has requested that contact is putted into groups + if( ! groupsId.isEmpty() ) + { + foreach( const QString &groupId, groupsId ) + { + if( ! contactList_->getGroupById( groupId ) ) + { + continue; + } + + addContactToGroup( handle, groupId ); + } + } + + // Ask the server to add the contact to FL and Allow/Block list. + putAdl( handle, lists ); +} + + + +// Contact added to group +void MsnNotificationConnection::slotContactAddedToGroup( const QString &contactId, const QString &groupId ) +{ + Contact *contact = contactList_->getContactByGuid( contactId ); + if( contact == 0 ) + { + return; + } + + contact->addGroupId( groupId ); +} + + + +// Contact blocked +void MsnNotificationConnection::slotContactBlocked( const QString &handle ) +{ + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact != 0 ) + { + contact->setBlocked( true ); + contact->setAllowed( false ); + } +} + + + +// Contact deleted +void MsnNotificationConnection::slotContactDeleted( const QString& contactId ) +{ + Contact *contact = contactList_->getContactByGuid( contactId ); + if( contact == 0 ) + { + return; + } + + QString handle( contact->getHandle() ); + contact->setFriend( false ); + + // Remove it from our FL. + putRml( handle, Contact::MSN_LIST_FRIEND ); +} + + + +// Contact removed from group +void MsnNotificationConnection::slotContactDeletedFromGroup( const QString &contactId, const QString &groupId ) +{ + Contact *contact = contactList_->getContactByGuid( contactId ); + if( contact == 0 ) + { + return; + } + + contact->removeGroupId( groupId ); +} + + + +void MsnNotificationConnection::slotGotAddressBookList( const QList< QHash > &contacts ) +{ + QListIterator > contact( contacts ); + int lists; + + // Cycle for each contact + while( contact.hasNext() ) + { + // Grep the main informations + QHash contactInfo( contact.next() ); + + const QString& handle( contactInfo.take( "handle" ).toString() ); + const QString& friendlyName( contactInfo.take( "friendlyName" ).toString() ); + const QString& contactId( contactInfo.take( "contactId" ).toString() ); + const QStringList& guidList( contactInfo.take( "guidList" ).toStringList() ); + + // Add each contact in our AB to contactlist ( FL ) + lists = contactsRole_.take( handle ) | Contact::MSN_LIST_FRIEND; + + Contact *contact = contactList_->addContact( handle, friendlyName, lists , guidList , contactId ); + // Set the remaining informations + if( contact != 0 ) + { + contact->setInformations( contactInfo ); + } + } + + // If there are contacts not present in AB, but present in Membership List + // add them to contactlist + if( contactsRole_.count() > 0 ) + { + QHashIterator< QString, int > i( contactsRole_ ); + while( i.hasNext() ) + { + i.next(); + const QString& handle( i.key() ); + contactList_->addContact( handle , handle , i.value(), QStringList(), "" ); + } + + contactsRole_.clear(); + } + + putAdl(); +} + + + +/** + * @brief Called when address book services retrieved membership lists. + * + * In this list there are informations about FL, AL, BL lists. + * + */ +void MsnNotificationConnection::slotGotMembershipLists( const QString &serviceType, const QHash &contactsRole ) +{ + if( serviceType != "Messenger" ) + { + kWarning() << "Unable to parse membership list:" << serviceType; + return; + } + + contactsRole_ = contactsRole; + + emit statusMessage( i18n("Waiting for contact list..."), false ); + + // Allow some time until the next message is received + if( loginTimer_.isActive() ) + { + loginTimer_.start( NOTIFICATION_COMMAND_INTERVAL_TIMEOUT ); + } + + AddressBookService *addressBook = createAddressBookService();; + addressBook->retrieveAddressBook(); +} + + + +/** + * @brief Called when address book services parsed a group. + * + * @param id the id of the group + * @param name the name of the group + */ +void MsnNotificationConnection::slotGotGroup( const QString &id, const QString &name ) +{ + contactList_->addGroup( id, name ); +} + + + +void MsnNotificationConnection::slotContactUnblocked( const QString &handle ) +{ + Contact *contact = contactList_->getContactByHandle( handle ); + if( contact != 0 ) + { + contact->setBlocked( false ); + contact->setAllowed( true ); + } +} + + + +// Show warning notifications +void MsnNotificationConnection::slotWarning( const QString &warning, bool isImportant ) +{ + if( isImportant ) + { + KMessageBox::sorry( 0, + i18nc( "Connection warning: dialog box with message", + "

    Warning: %1

    ", warning ), + i18nc( "Error dialog box title", "MSN Warning" ) ); + } + else + { + // Save the error details in the event settings + + NotificationManager::EventSettings settings; + settings.sender = this; + settings.contact = 0; + settings.widget = 0; + settings.buttons = NotificationManager::BUTTON_HIDE; + + // Notify the user about the network error + NotificationManager::instance()->notify( "status", warning, settings ); + } +} + + + +// Unblock the given contact +void MsnNotificationConnection::unblockContact( QString handle ) +{ + putRml( handle, Contact::MSN_LIST_BLOCKED ); + putAdl( handle, Contact::MSN_LIST_ALLOWED ); + + AddressBookService *addressBook = createAddressBookService(); + addressBook->unblockContact( handle ); +} + + /** * @brief Called when the connection has been established. * @@ -3185,9 +2844,9 @@ void MsnNotificationConnection::slotConnected() kDebug() << "Connected to server, sending VER."; #endif - // Restart the login timer for the MSN sign in - loginTimer_.stop(); - loginTimer_.start( 45000 ); // 45 seconds to authenticate and get the list + // Start the login timer, allowing the defined maximum time between each + // received command + loginTimer_.start( NOTIFICATION_COMMAND_INTERVAL_TIMEOUT ); putVer(); } @@ -3209,21 +2868,38 @@ void MsnNotificationConnection::slotError( QString error, MsnSocketBase::ErrorTy // Always report errors to console kWarning() << "KMess Error ( type" << type << "):" << error << "!"; - int result; + QString message; QString additionalInfo; - QString dialogTitle = i18nc( "Error dialog box title", "MSN error" ); + QString detailedMessage; + bool tryReconnecting = true; + bool useNotification = true; #ifdef KMESSDEBUG_NOTIFICATION_GENERAL // Add more details about the error in developer builds. additionalInfo = i18n( "
    Internal error reason: %1", error ); #endif +#if KMESS_ENABLE_NULL_SOCKET == 0 // If the server can't be contacted, try again with HTTP before giving up - if( ( type == MsnSocketBase::ERROR_CONNECTING - || type == MsnSocketBase::ERROR_CONNECTION_TIME_LIMIT ) - && switchToHttpSocket() ) + if( ( isInitiatingConnection_ && type == MsnSocketBase::ERROR_DROP ) + || type == MsnSocketBase::ERROR_CONNECTING + || type == MsnSocketBase::ERROR_CONNECTION_TIME_LIMIT ) { - return; + if( switchToHttpSocket() ) + { + // Note how the first error is silently discarded. If it's something important, like + // the "server is too busy" error, it'll be received when connecting via HTTP anyways. + return; + } + } +#endif + + // Clean up the mess left by the SOAP classes + if( qobject_cast( sender() ) != 0 ) + { + // No need to request more, it just failed. + qDeleteAll( offlineImMessages_ ); + offlineImMessages_.clear(); } // First disconnect @@ -3232,95 +2908,206 @@ void MsnNotificationConnection::slotError( QString error, MsnSocketBase::ErrorTy // Then decide what kind of message to show switch( type ) { + // Notify that connecting has failed due to a wrong handle or password + case MsnSocketBase::ERROR_AUTH_LOGIN: + // This is an immediate error, a dialog box is needed + KMessageBox::error( 0, + i18nc( "Connection error: dialog box", + "

    Authentication has failed, please verify " + "your account email and password.

    " ), + i18nc( "Error dialog box title", "MSN Error" ) ); + // Do not attempt to reconnect + tryReconnecting = false; + // Don't send a passive notification + useNotification = false; + break; + + + // The user has connected this account from another location + case MsnSocketBase::ERROR_CONNECTION_OTHER: + message = i18nc( "Connection error: passive notification message", + "

    The account %1 has been connected from another location.

    ", + currentAccount_->getHandle() ); + detailedMessage = i18nc( "Connection error: detailed message", + "

    You have been disconnected: you have connected " + "with the account %1 from another Messenger client, " + "or from another location.

    ", + currentAccount_->getHandle() ); + // Do not attempt to reconnect + tryReconnecting = false; + break; + + + // The HTTP connection failed: there's a redirection page + case MsnSocketBase::ERROR_CONNECTING_GATEWAY: + message = i18nc( "Connection error: passive notification message", + "

    Unable to connect to the Live Messenger service.
    " + "Maybe you need to authenticate before you can access the network?

    " ); + detailedMessage = i18nc( "Connection error: detailed message", + "

    KMess could not connect to the Live Messenger servers.
    " + "There may be a problem with your Internet connection, " + "or the Live Messenger servers may be temporarily unavailable.
    " + "It is also possible that an authentication to a web page or proxy " + "may be required to access the network.

    " + "

    Click here to visit the Messenger service " + "status page.

    ", + "http://status.messenger.msn.com/Status.aspx" ); + // Do not attempt to reconnect + tryReconnecting = false; + break; + + + // Continue as for authentication errors if the switch to HTTP had failed case MsnSocketBase::ERROR_CONNECTION_TIME_LIMIT: case MsnSocketBase::ERROR_CONNECTING: - // Continue as for authentication errors if the switch to HTTP had failed case MsnSocketBase::ERROR_AUTH_TIME_LIMIT: - - // Show a message to the user if the connection has failed - result = KMessageBox::questionYesNo( 0, i18nc( "Login error message, with more details for developer versions", - "

    KMess could not connect the the MSN Messenger servers.
    There is a problem with your Internet connection, or the MSN Messenger servers may be temporarily unavailable.%1

    Show the MSN Messenger Service status page?

    ", additionalInfo ), dialogTitle ); - if ( result == KMessageBox::Yes ) - { - // Launch the browser for the given URL - KMessShared::openBrowser( KUrl( "http://status.messenger.msn.com/Status.aspx" ) ); - } + case MsnSocketBase::ERROR_SOAP_TIME_LIMIT: + message = i18nc( "Connection error: passive notification message", + "

    Unable to connect to the Live Messenger service.

    " ); + detailedMessage = i18nc( "Connection error: detailed message", + "

    KMess could not connect to the Live Messenger servers.
    " + "There may be a problem with your Internet connection, " + "or the Live Messenger servers may be temporarily unavailable.

    " + "

    Click here to visit the Messenger service " + "status page.

    ", + "http://status.messenger.msn.com/Status.aspx" ); break; // Report errors caused by the user case MsnSocketBase::ERROR_USER: - KMessageBox::error( 0, i18nc( "Server-reported user error dialog box", "

    MSN message

    %1

    ", error ), dialogTitle ); + message = i18nc( "Connection error (Server-reported user error): passive notification message", + "

    Error: %1

    ", error ); + detailedMessage = i18nc( "Connection error (Server-reported user error): detailed message", + "

    The Live Messenger server has reported an error:

    " + "

    %1

    ", + error ); break; // Report internal server errors case MsnSocketBase::ERROR_SERVER: - KMessageBox::error( 0, i18nc( "Server error dialog box", "

    MSN server message

    %1

    ", error ), dialogTitle ); + case MsnSocketBase::ERROR_SOAP_TOOMANYREDIRECTS: + case MsnSocketBase::ERROR_SOAP_RESPONSE: + case MsnSocketBase::ERROR_SOAP_AUTHENTICATION: + message = i18nc( "Connection error (Server-reported server error): passive notification message", + "

    Messenger Service Error: %1

    ", error ); + detailedMessage = i18nc( "Connection error (Server-reported server error): detailed message", + "

    The Live Messenger server has reported an error:

    " + "

    %1

    ", + error ); break; // Report internal KMess errors, usually after receiving an error by the MSN server case MsnSocketBase::ERROR_INTERNAL: - KMessageBox::error( 0, i18nc( "Server-reported client error dialog box", "

    Internal error in KMess

    %1

    ", error ), dialogTitle ); + message = i18nc( "Connection error (Server-reported client error): passive notification message", + "

    KMess Error: %1

    ", error ); + detailedMessage = i18nc( "Connection error (Server-reported client error): detailed message", + "

    KMess has encountered an internal error:

    " + "

    %1

    ", + error ); break; case MsnSocketBase::ERROR_DROP: case MsnSocketBase::ERROR_DATA: case MsnSocketBase::ERROR_UNKNOWN: + case MsnSocketBase::ERROR_SOAP_UNKNOWN: default: - KMessageBox::error(0, i18nc( "Connection error message, with more details for developer versions", - "

    Connection to the MSN server has been lost.%1

    ", additionalInfo ), dialogTitle ); + message = i18nc( "Connection error: passive notification message", + "

    Network connection lost.

    " ); + detailedMessage = i18nc( "Connection error: detailed message", + "

    Connection to the Live Messenger server has been lost.

    " ); break; } + + + if( useNotification ) + { + // Save the error details in the event settings + QMap details; + details[ "errorType" ] = (int) type; + details[ "errorString" ] = error; + details[ "detailedMessage" ] = detailedMessage; + + NotificationManager::EventSettings settings; + settings.sender = this; + settings.contact = 0; + settings.widget = 0; + settings.buttons = NotificationManager::BUTTON_HIDE | NotificationManager::BUTTON_MORE_DETAILS; + settings.data = details; + + // Notify the user about the network error + NotificationManager::instance()->notify( "status", message, settings ); + } + + // Try connecting again + if( tryReconnecting ) + { + emit reconnect( currentAccount_->getHandle() ); + } } -// A SOAP request failed with an error message -void MsnNotificationConnection::slotSoapError(HttpSoapConnection *client, const QString &reason) +// Displays additional info about network errors +void MsnNotificationConnection::slotErrorEventActivated( NotificationManager::EventSettings settings, NotificationManager::Buttons button ) { + // The signal wasn't meant for us + if( settings.sender != this ) + { + return; + } + + KDialog *dialog; + QString developerInfo; + const QMap &info = settings.data.toMap(); + + switch( button ) + { + case NotificationManager::BUTTON_MORE_DETAILS: #ifdef KMESSDEBUG_NOTIFICATION_GENERAL - kDebug() << "SOAP request failed: " << reason; + kDebug() << "Showing error details"; #endif - if(KMESS_NULL(client)) return; - // Display an error message - //const QString &lastAction = client->getSoapAction(); +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + // Add more details about the error in developer builds. + developerInfo = i18nc( "Developer details placed on the network error dialog box", + "

    Developer info:
    " + "Error number: %1
    " + "Error string: %2" + "

    ", + info["errorType" ].toString(), + info["errorString"].toString() ); +#endif - if( qobject_cast( client ) != 0 ) - { - // No need to request more, it just failed. - qDeleteAll( offlineImMessages_ ); - offlineImMessages_.clear(); + // We need to create a non-modal informative message box: a modal one would block + // execution here, and if the user dismisses the box after the notification has + // already been deleted by KDE, kmess would crash. + dialog = new KDialog( 0 ); + dialog->setAttribute( Qt::WA_DeleteOnClose ); + dialog->setButtons( KDialog::Ok ); + KMessageBox::createKMessageBox( dialog, + QMessageBox::Information, + info["detailedMessage"].toString() + developerInfo, + QStringList(), + QString(), + 0, + KMessageBox::Notify | KMessageBox::AllowLink | KMessageBox::NoExec, + QString() ); + dialog->show(); + break; - slotError( i18n( "KMess could not process Offline-IM messages.
    Details: %1", reason ), - MsnSocketBase::ERROR_INTERNAL ); + case NotificationManager::BUTTON_HIDE: +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Hiding status notification"; +#endif + // Do nothing + break; + + default: +#ifdef KMESSDEBUG_NOTIFICATION_GENERAL + kDebug() << "Invalid button" << button; +#endif + return; } - else if( qobject_cast( client ) != 0 ) - { - // NOTE: a similar thing also happens in loginIncorrect() - - // Show a message to the user, before deleting the object! - slotError( i18n( "Authentication failed, KMess could not process the passport login.
    Details: %1", reason ), - MsnSocketBase::ERROR_INTERNAL ); - - // Close the connection attempt. - closeConnection(); - } - else - { - // Fall back to a generic error message. - MsnConnection::slotSoapError( client, reason ); - } -} - - - -// Unblock the given contact -void MsnNotificationConnection::unblockContact(QString handle) -{ - // Unblock a contact by removing it from the blocked list - // and adding to the allowed list - putRem( handle, "BL" ); - putAdc( handle, "AL" ); } diff --git a/src/network/msnnotificationconnection.h b/src/network/msnnotificationconnection.h index 24b75d6..a8a6cb0 100644 --- a/src/network/msnnotificationconnection.h +++ b/src/network/msnnotificationconnection.h @@ -19,12 +19,15 @@ #define MSNNOTIFICATIONCONNECTION_H #include "../contact/msnstatus.h" +#include "../notification/notificationmanager.h" #include "chatinformation.h" #include "msnconnection.h" #include #include #include +#include + @@ -38,6 +41,7 @@ class MimeMessage; class PassportLoginService; class QAbstractItemModel; class OfflineImService; +class AddressBookService; @@ -53,7 +57,7 @@ class OfflineImService; * - receive invitations for a chat session * - receive status updates about contacts, e.g.: * - online/offline changes - * - new e-mail + * - new email * - personal status messages * - now playing information * - new offline-im messages @@ -91,7 +95,7 @@ class OfflineImService; * Note that each connection starts with a version exchange. * Clients inform the server about the versions of the protocol it supports. * The commands documented here may differ from other clients using a different protocol version. - * Currently KMess uses MSNP12 for all the notification connection. + * Currently KMess uses MSNP15 for all the notification connection. * New features are added to new protocol versions only. * Therefore, something as simple as a 'personal status message' required * an upgrade to a complete new protocol version. The UBX @@ -106,6 +110,8 @@ class OfflineImService; * The list of known flags can be found in the ContactBase::MsnClientCapabilities enum. * * @author Mike K. Bennett + * @author Valerio Pilo + * @author Antonio Nastasi * @ingroup NetworkCore */ class MsnNotificationConnection : public MsnConnection @@ -119,11 +125,11 @@ class MsnNotificationConnection : public MsnConnection // The constructor MsnNotificationConnection(); // The destructor - virtual ~MsnNotificationConnection(); + ~MsnNotificationConnection(); // Request a change in the user's status void changeStatus( const Status newStatus ); // Close the connection with the server - virtual void closeConnection(); + void closeConnection(); // Return the contact list model QAbstractItemModel* getContactListModel(); // Initialize the object @@ -137,16 +143,16 @@ class MsnNotificationConnection : public MsnConnection public slots: + // Adds the given contact to the allow list. + void allowContact(QString handle); // Copy contact to another group. void addContactToGroup(QString handle, QString groupId); // Add an existing contact to the friends list - void addExistingContact(QString handle); - // Add a new contact to the list - void addNewContact( QString handle, QString groupId = QString() ); - // Adds the given contact to the allow list. - void allowContact(QString handle); - // Add a new group + void addExistingContact( QString handle, const QStringList& groupsId = QStringList() ); + // Add a new group void addGroup(QString name); + // Add a new contact to the list + void addNewContact( QString handle, const QStringList& groupsId = QStringList() ); // Block the given contact void blockContact(QString handle); // Change the current media of the user. @@ -156,10 +162,10 @@ class MsnNotificationConnection : public MsnConnection void changedMsnObject(); // Change the friendly name of the user. void changeFriendlyName( QString newName ); - // Change the friendly name of another contact. - void changeFriendlyName( QString handle, QString newName ); // Change the personal message of the user. void changePersonalMessage( QString newMessage ); + // Change the personal properties + void changePersonalProperties( const QString& friendlyname, const QString& cid, int blp ); // Change a user property void changeProperty( QString type, QString value ); // Change a contact property @@ -181,80 +187,76 @@ class MsnNotificationConnection : public MsnConnection // Unblock the given contact void unblockContact(QString handle); - protected slots: + private slots: // The socket connected, so send the version command. void slotConnected(); - // Shows error dialog boxes + // Show warning notifications + void slotWarning( const QString &warning, bool isImportant ); + // Shows error notifications void slotError( QString error, MsnSocketBase::ErrorType type ); - // A SOAP request failed with an error message - virtual void slotSoapError(HttpSoapConnection *client, const QString &reason); + // Displays additional info about network errors + void slotErrorEventActivated( NotificationManager::EventSettings settings, NotificationManager::Buttons button ); private: // Private methods + // Create and return one pointer to address book service + AddressBookService *createAddressBookService(); // Create the Offline-IM service - OfflineImService *createOfflineImService(); + OfflineImService *createOfflineImService(); // Create the passport login handler PassportLoginService *createPassportLoginService(); + // Create triple des encryption + QByteArray createTripleDes ( const QByteArray key, const QByteArray secret, + const QCA::InitializationVector& iv ); // Go online void goOnline(); - // Received the addition of a contact to a list or list and group - void gotAdc(const QStringList& command); - // Received the addition of a group - void gotAdg(const QStringList& command); + // Received response to adl command + void gotAdl( const QStringList& command, const QString &payload = "" ); // Received confirmation of the user's status change - void gotChg(const QStringList& command); + void gotChg( const QStringList& command ); // Received a challenge from the server - void gotChl(const QStringList& command); + void gotChl( const QStringList& command ); // Received a version update from the server - void gotCvr(const QStringList& command); + void gotCvr( const QStringList& command ); // Received notice that a contact went offline - void gotFln(const QStringList& command); + void gotFln( const QStringList& command ); // Received notice that a contact is already online - void gotIln(const QStringList& command); - // Received group information - void gotLsg(const QStringList& command); - // Received contact information - void gotLst(const QStringList& command); + void gotIln( const QStringList& command ); // Received notice that a contact has changed status - void gotNln(const QStringList& command); + void gotNln( const QStringList& command ); // Received notice of disconnetion from the server - void gotOut(const QStringList& command); - // Received a propertu change (friendly name, phone number, etc..) + void gotOut( const QStringList& command ); + // Received a property change (friendly name, phone number, etc..) void gotPrp(const QStringList& command); - // Received confirmation of change in a group's name - void gotReg(const QStringList& command); - // Received confirmation of a conact's removal from list or list and group - void gotRem(const QStringList& command); - // Received confirmation of a group's removal - void gotRmg(const QStringList& command); + void gotRml( const QStringList &command ); // Received a chat request from a contact - void gotRng(const QStringList& command); - // Received synchronization information - void gotSyn(const QStringList& command); + void gotRng( const QStringList& command ); // Received details of a contact's personal message - void gotUbx(const QStringList &command, const QByteArray &payload); + void gotUbx( const QStringList &command, const QByteArray &payload ); // Received the folder and command info for Hotmail's inbox or compose - void gotUrl(const QStringList& command); + void gotUrl( const QStringList& command ); // Received user authentication information - void gotUsr(const QStringList& command); + void gotUsr( const QStringList& command ); // Received version information - void gotVer(const QStringList& command); + void gotVer( const QStringList& command ); // Received server transfer information - void gotXfr(const QStringList& command); - // Add a contact to the given list or, if applicable, group - int putAdc(QString handle, QString list, QString groupId = QString::null); - // Remove a contact from the given list or, if applicable, group - int putRem(QString handle, QString list, QString groupId = QString::null); + void gotXfr( const QStringList& command ); + // Send the ADL command + void putAdl( const QString &handle = "", int list = 0 ); + // Send the RML command + void putRml( const QString &handle, int list ); // Send the personal status and current media fields. void putUux(); // Send the version command void putVer(); // Parse a regular command - void parseCommand(const QStringList& command); + void parseCommand( const QStringList& command ); + // Parse an error command + void parseError( const QStringList& command, const QByteArray &payloadData ); // Parse a message command - void parseMimeMessage(const QStringList& command, const MimeMessage &message); + void parseMimeMessage( const QStringList& command, const MimeMessage &message ); // Parse a payload command - virtual void parsePayloadMessage(const QStringList &command, const QByteArray &payload); + void parsePayloadMessage( const QStringList &command, const QByteArray &payload ); private slots: @@ -263,7 +265,7 @@ class MsnNotificationConnection : public MsnConnection // The passport login failed, username/password was incorrect void loginIncorrect(); // The passport login succeeded - void loginSucceeded( QString authentication, QString passportToken, QString proofToken ); + void loginSucceeded(); // Received the Mail-Data field over SOAP or at the notification connection. void receivedMailData( QDomElement mailData ); // An Offline-IM message was downloaded @@ -275,9 +277,51 @@ class MsnNotificationConnection : public MsnConnection // Unlock notifications after the first seconds of connections void unlockNotifications(); + // Contact added, notify it to contactlist + void slotContactAdded( const QString &handle, const QString &contactId, + const QStringList &groupsId ); + // Contact added to group + void slotContactAddedToGroup( const QString &contactId, const QString &groupId ); + // Contact blocked + void slotContactBlocked( const QString &handle ); + // Contact deleted + void slotContactDeleted( const QString &contactId ); + // Contact removed from group + void slotContactDeletedFromGroup( const QString &contactId, const QString &groupId ); + // Called when address book services retrieved address book list + void slotGotAddressBookList( const QList< QHash > &contacts ); + // Called when address book services retrieved membership lists + void slotGotMembershipLists( const QString &serviceType, const QHash &contactsRole ); + // Called when address book services parsed a group + void slotGotGroup( const QString &id, const QString &name ); + // Contact unblocked + void slotContactUnblocked( const QString &handle ); + private: // Private attributes + // The address book service + AddressBookService *addressBookService_; + bool connected_; + // Nonce received by the server on first SSO command + QString nonceBase64_; + // The list of contacts' role + QHash contactsRole_; + + struct MSNPMSNG { + quint32 headerSize; + quint32 cryptMode; + quint32 cipherType; + quint32 hashType; + quint32 ivLength; + quint32 hashLength; + quint32 cipherLength; + + unsigned char ivBytes[8]; + unsigned char hashBytes[20]; + unsigned char cipherBytes[72]; + }; + struct OfflineImMessage { QString messageId; @@ -289,35 +333,33 @@ class MsnNotificationConnection : public MsnConnection }; // A pointer to the list of contacts - ContactList *contactList_; + ContactList *contactList_; // A pointer to the shared current account singleton. - CurrentAccount *currentAccount_; + CurrentAccount *currentAccount_; // Whether or not to enable presence notifications bool enableNotifications_; // Group where to initially place a newly added contact QString initialContactAddedGroup_; // Whether or not the object was initialized bool initialized_; + // Whether or not the connection has just been established + bool isInitiatingConnection_; // The last current media set. QString lastCurrentMedia_; // The last Personal Status Message set. QString lastPsm_; // A timer to watch over the login process QTimer loginTimer_; - // The number of contact read in - int noContacts_; // The received offline messages. - QList offlineImMessages_; + QList offlineImMessages_; // The Offline-IM SOAP client - OfflineImService *offlineImService_; + OfflineImService *offlineImService_; // A list of switchboard requests which haven't yet been given servers - QList openRequests_; + QList openRequests_; // The object than handles the passport login - PassportLoginService *passportLoginService_; + PassportLoginService *passportLoginService_; // The pending offline-im messages - QStringList pendingOfflineImMessages_; - // The total number of contacts in the contact list - int totalNoContacts_; + QStringList pendingOfflineImMessages_; signals: @@ -326,9 +368,11 @@ class MsnNotificationConnection : public MsnConnection // Signal that the connection has been made sucessfully void connected(); // Signal that a contact added you - void contactAddedUser(const Contact *contact); + void contactAddedUser( const QString handle ); // Signal that a new email has been received void newEmail(QString sender, QString subject, bool inInbox, QString command, QString folder, QString url); + // Signal that the connection should be established again after a disconnection + void reconnect( QString handle ); // A new switchboard with a contact has been opened void startSwitchboard( const ChatInformation &chatInfo ); diff --git a/src/network/msnsocketbase.cpp b/src/network/msnsocketbase.cpp index 0493672..c5a2a06 100644 --- a/src/network/msnsocketbase.cpp +++ b/src/network/msnsocketbase.cpp @@ -17,6 +17,12 @@ #include "msnsocketbase.h" +#include +#include + +#include +#include +#include /** @@ -78,6 +84,20 @@ bool MsnSocketBase::isConnected() const +/** + * @brief Test whether the given command is an error. + * + * @param command Command to verify + * @returns True when it's an error command, false otherwise. + */ +bool MsnSocketBase::isErrorCommand( const QString &command ) const +{ + bool isNumeric = false; + return ( command.toInt( &isNumeric ) != 0 ) && ( isNumeric == true ); +} + + + /** * @brief Test whether the given command is a payload command. * @@ -91,6 +111,41 @@ bool MsnSocketBase::isPayloadCommand( const QString &command ) const +// Ask the user to authenticate on a proxy +void MsnSocketBase::proxyAuthenticate( const QNetworkProxy &proxy, QAuthenticator *authenticator ) +{ +#ifdef KMESSDEBUG_SHARED_PROXY_AUTH + kDebug() << "Authentication to proxy" << proxy.hostName() << "required."; + kDebug() << "Realm:" << authenticator->realm() << "Username:" << authenticator->user(); +#else + Q_UNUSED( proxy ); +#endif + + KPasswordDialog::KPasswordDialogFlags flags = + KPasswordDialog::ShowUsernameLine +#if KDE_IS_VERSION( 4, 1, 0 ) + | KPasswordDialog::ShowDomainLine + | KPasswordDialog::DomainReadOnly + | KPasswordDialog::ShowAnonymousLoginCheckBox +#endif + | KPasswordDialog::ShowKeepPassword; + + KPasswordDialog loginDialog( 0, flags ); + loginDialog.setPrompt( i18nc( "Dialog box message", + "Enter your username and password to access the network proxy." ) ); + + // The user canceled + if( ! loginDialog.exec() ) + { + return; + } + + authenticator->setUser( loginDialog.username() ); + authenticator->setPassword( loginDialog.password() ); +} + + + /** * @brief Specify which accepted commands carry payload data for this connection. * diff --git a/src/network/msnsocketbase.h b/src/network/msnsocketbase.h index 0e9a83f..4dbf62e 100644 --- a/src/network/msnsocketbase.h +++ b/src/network/msnsocketbase.h @@ -22,6 +22,8 @@ // Forward declarations class CurrentAccount; +class QAuthenticator; +class QNetworkProxy; @@ -53,14 +55,22 @@ class MsnSocketBase : public QObject /// These are generic socket and connection errors ERROR_UNKNOWN = 0 /// An unspecified error has occurred , ERROR_CONNECTING /// There was an error while establishing the connection + , ERROR_CONNECTING_GATEWAY /// There was an error while establishing the HTTP connection , ERROR_DROP /// The connection was dropped , ERROR_DATA /// An error within the data was received , ERROR_CONNECTION_TIME_LIMIT /// The connection was not successful within the time limit + , ERROR_CONNECTION_OTHER /// The current account has connected from elsewhere, disconnecting us , ERROR_AUTH_TIME_LIMIT /// The authentication/login was not successful within the time limit + , ERROR_AUTH_LOGIN /// The authentication/login failed due to wrong username or password /// The next are server-reported errors , ERROR_USER /// An error caused by the user , ERROR_SERVER /// Server error , ERROR_INTERNAL /// Internal KMess error (we did something the server didn't like) + , ERROR_SOAP_UNKNOWN /// SOAP error: unknown error - failed reimplementation of parseSoapFault()? + , ERROR_SOAP_RESPONSE /// SOAP error: the webservice response was not valid + , ERROR_SOAP_TIME_LIMIT /// SOAP error: the webservice request was not successful within the time limit + , ERROR_SOAP_AUTHENTICATION /// SOAP error: the webservice had required an authentication (usually shouldn't) + , ERROR_SOAP_TOOMANYREDIRECTS /// SOAP error: the webservice is redirecting us too many times }; @@ -81,6 +91,8 @@ class MsnSocketBase : public QObject virtual ServerType getServerType() const; // Whether or not the connection is active virtual bool isConnected() const; + // Test whether the given command is an error. + bool isErrorCommand( const QString &command ) const; // Test whether the given command is a payload command virtual bool isPayloadCommand( const QString &command ) const; // Specify which accepted commands carry payload data for this connection @@ -101,6 +113,10 @@ class MsnSocketBase : public QObject // The type of server which we will connect to (notification,switchboard,...) ServerType serverType_; + protected slots: + // Ask the user to authenticate on a proxy + virtual void proxyAuthenticate( const QNetworkProxy &proxy, QAuthenticator *authenticator ); + signals: // Public signals // Signal that the server has connected void connected(); diff --git a/src/network/msnsockethttp.cpp b/src/network/msnsockethttp.cpp index b015b1d..60fd31a 100644 --- a/src/network/msnsockethttp.cpp +++ b/src/network/msnsockethttp.cpp @@ -20,11 +20,12 @@ #include #include "../kmessdebug.h" -#include +#include #include #include #include +#include #ifdef KMESSDEBUG_CONNECTION // Area-specific debug statements @@ -58,27 +59,28 @@ MsnSocketHttp::MsnSocketHttp( ServerType serverType ) setObjectName( "MsnSocketHttp" ); // Create the http interface - http_ = new QHttp( this ); + http_ = new QNetworkAccessManager( this ); // Connect the socket's signals for parsing - connect( http_, SIGNAL( requestFinished(int,bool) ), - this, SLOT ( slotDataReceived(int,bool) ) ); - connect( http_, SIGNAL( sslErrors(const QList&) ), - this, SLOT ( slotError(const QList&) ) ); + connect( http_, SIGNAL( finished(QNetworkReply*) ), + this, SLOT ( slotReplyReceived(QNetworkReply*) ) ); + connect( http_, SIGNAL( proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*) ), + this, SLOT ( proxyAuthenticate(const QNetworkProxy&,QAuthenticator*) ) ); // Connect the server request timer - connect( &pollingTimer_, SIGNAL( timeout() ), - this, SLOT ( slotQueryServer() ) ); + connect( &pollingTimer_, SIGNAL( timeout() ), + this, SLOT ( slotQueryServer() ) ); - // We need the timer to only fire once + // We need the timer to only fire once to trigger a single update; + // the next one will be determined dynamically pollingTimer_.setSingleShot( true ); - // Set the default header values - requestHeader_.setValue ( "Accept", "*" "/" "*" ); - requestHeader_.setValue ( "User-Agent", "KMess/" KMESS_VERSION ); - requestHeader_.setValue ( "Connection", "Keep-Alive" ); - requestHeader_.setValue ( "Cache-Control", "no-cache" ); - requestHeader_.setContentType( "text/xml; charset=utf-8" ); - baseServerPath_ = QString ( "/gateway/gateway.dll?" ); + // Set the default request values + baseServerPath_ = QString ( "/gateway/gateway.dll?" ); + requestHeader_.setHeader ( QNetworkRequest::ContentTypeHeader, "text/xml; charset=utf-8" ); + requestHeader_.setRawHeader( "Accept", "*" "/" "*" ); + requestHeader_.setRawHeader( "User-Agent", "KMess/" KMESS_VERSION ); + requestHeader_.setRawHeader( "Connection", "Keep-Alive" ); + requestHeader_.setRawHeader( "Cache-Control", "no-cache" ); #ifdef KMESSTEST KMESS_ASSERT( http_ != 0 ); @@ -123,16 +125,7 @@ MsnSocketHttp::~MsnSocketHttp() void MsnSocketHttp::cleanUp() { // Clear the request queues - qDeleteAll( queuedRequests_ ); - qDeleteAll( unansweredRequests_ ); queuedRequests_ .clear(); - unansweredRequests_.clear(); - - // Abort any pending requests - if( connected_ ) - { - http_->abort(); - } } @@ -140,7 +133,7 @@ void MsnSocketHttp::cleanUp() /** * @brief Connect to the given server * - * The initial connection is always made through the main Gateway. + * The initial connection should always be made through the main Gateway. * The first server response usually carries the new gateway IP * which will be used for the rest of the connection. * @@ -157,7 +150,7 @@ void MsnSocketHttp::connectToServer( const QString& server, const quint16 port ) QString desiredAddress; if( server.isEmpty() ) { - desiredAddress = "messenger.hotmail.com"; + desiredAddress = DEFAULT_GATEWAY_ADDRESS; } else { @@ -169,7 +162,7 @@ void MsnSocketHttp::connectToServer( const QString& server, const quint16 port ) #endif // Set up the gateway where to send our messages - setGateway( DEFAULT_GATEWAY_ADDRESS ); + setGateway( desiredAddress ); // Translate the server type to a 2-letter string to send in our requests QString serverType; @@ -178,7 +171,7 @@ void MsnSocketHttp::connectToServer( const QString& server, const quint16 port ) case SERVER_NOTIFICATION: serverType = "NS"; break; case SERVER_SWITCHBOARD: serverType = "SB"; break; default: - kFatal() << "Unknown type of server" << serverType_ << "!"; + kWarning() << "Unknown type of server" << serverType_ << "!"; return; } @@ -201,7 +194,7 @@ void MsnSocketHttp::connectToServer( const QString& server, const quint16 port ) /** * @brief Disconnect from the server - * + * * This method closes the connection to the server and does some cleaning up. * It empties all buffers, and resets the internal state. * To avoid losing data, all pending requests are merged into a single huge @@ -235,38 +228,48 @@ void MsnSocketHttp::disconnectFromServer( bool isTransfer ) kDebug() << "Sending" << queuedRequests_.count() << "remaining requests before closing."; #endif + QNetworkRequest request( requestHeader_ ); + QByteArray data; + // Get the oldest message - Request *request = queuedRequests_.takeFirst(); - QByteArray data( request->data ); + RequestInfo info = queuedRequests_.takeFirst(); + data = info.data; - // Fill up the header details - QHttpRequestHeader header( requestHeader_ ); - header.setRequest( "POST", baseServerPath_ + request->requestParameters ); - - // Force merging all remaining messages into one (not deleting anything, that will - // be done automatically below) - foreach( Request *req, queuedRequests_ ) +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + int mergedRequests = 0; +#endif + // Merge together all the queued data to save bandwidth + while( ! queuedRequests_.isEmpty() ) { - // Avoid sending polling and special requests, which are not useful at this time - if( req->isPollingRequest || req->isSpecialRequest ) - { - continue; - } + const RequestInfo &queuedRequest = queuedRequests_.first(); + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + mergedRequests++; +#endif // Merge the data - data.append( req->data ); - } + data.append( queuedRequest.data ); - // Set up the size of the data in the header - header.setContentLength( data.size() ); + // Remove the request from the queue, since it is going to be sent now + queuedRequests_.takeFirst(); + } +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Merged" << mergedRequests << "requests out from the queue."; +#endif + + // Set up the header + request.setHeader( QNetworkRequest::ContentLengthHeader, data.size() ); + request.setUrl( QUrl( gatewayAddress_ + baseServerPath_ + "SessionID=" + nextRequestId_ ) ); + + // There should be no content-type header if there is no data if( data.size() == 0 ) { - header.removeValue( "Content-Type" ); + request.setHeader( QNetworkRequest::ContentTypeHeader, QVariant() ); } // Send it - http_->request( header, data ); - + http_->post( request, data ); +/* // Wait until this request has been sent, using a local loop. QEventLoop loop( this ); @@ -293,11 +296,9 @@ void MsnSocketHttp::disconnectFromServer( bool isTransfer ) #endif } #endif +*/ } - // Close the connection - http_->close(); - // Clear the queues, so pending messages will be ignored cleanUp(); @@ -316,6 +317,49 @@ void MsnSocketHttp::disconnectFromServer( bool isTransfer ) +// Dump the content of requests and replies +void MsnSocketHttp::dump( void *obj, QByteArray data, bool isRequest ) +{ +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS + if( isRequest ) + { + QNetworkRequest *request = (QNetworkRequest *)obj; + kDebug() << "-- Request dump below --" << endl + << "URL:" << request->url() << endl + << "Contents:" << QString::fromUtf8( data ); + + int i = 1; + kDebug() << request->rawHeaderList().size() << "header items present:"; + foreach( const QByteArray &headerName, request->rawHeaderList() ) + { + kDebug() << "(" << i++ << ")" << headerName << ": " << request->rawHeader( headerName ); + } + kDebug() << "-- Request dump above --"; + } + else + { + QNetworkReply *reply = (QNetworkReply *)obj; + kDebug() << "-- Reply dump below --" << endl + << "URL:" << reply->url() << endl + << "Contents:" << QString::fromUtf8( data ); + + int i = 1; + kDebug() << reply->rawHeaderList().size() << "header items present:"; + foreach( const QByteArray &headerName, reply->rawHeaderList() ) + { + kDebug() << "(" << i++ << ")" << headerName << ": " << reply->rawHeader( headerName ); + } + kDebug() << "-- Reply dump above --"; + } +#else + Q_UNUSED( obj ); + Q_UNUSED( data ); + Q_UNUSED( isRequest ); +#endif +} + + + /** * @brief Return the local IP address * @@ -343,7 +387,7 @@ QString MsnSocketHttp::getLocalIp() const void MsnSocketHttp::sendNextRequest() { // Verify if we can send another message, if there is any - if( ! connected_ || ! canSendRequests_ || queuedRequests_.isEmpty() ) + if( ! connected_ || ! canSendRequests_ ) { return; } @@ -363,42 +407,38 @@ void MsnSocketHttp::sendNextRequest() return; } - // Lock the sending process: only one message at most can be 'on air' in any given moment + // Lock the sending process: only one message at most can be 'on the wire' in any given moment canSendRequests_ = false; - // Get the oldest message - Request *request = queuedRequests_.takeFirst(); - QByteArray data( request->data ); + bool sendingPollingRequest = false; + QNetworkRequest request( requestHeader_ ); + QByteArray data; + QString url( gatewayAddress_ + baseServerPath_ ); - // Fill up the header details - QHttpRequestHeader header( requestHeader_ ); - header.setRequest( "POST", baseServerPath_ + request->requestParameters ); - - // Polling requests are small and are sent all by theirselves - if( request->isPollingRequest ) + // When the queue is empty, send polling requests + if( queuedRequests_.isEmpty() ) { - header.setRequest( "POST", baseServerPath_ + "Action=poll&SessionID=" + nextRequestId_ ); - header.setContentLength( 0 ); - header.removeValue( "Content-Type" ); + sendingPollingRequest = true; + url += "Action=poll&SessionID=" + nextRequestId_; + request.setHeader( QNetworkRequest::ContentLengthHeader, 0 ); + request.setHeader( QNetworkRequest::ContentTypeHeader, QVariant() ); // There should be no content-type header. } - else // Normal requests can be packed up with multiple messages + else { + // Get the oldest message + RequestInfo info = queuedRequests_.takeFirst(); + data = info.data; + #ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP int mergedRequests = 0; #endif // Merge together all the queued data to save bandwidth - foreach( Request *queuedRequest, queuedRequests_ ) + while( ! queuedRequests_.isEmpty() ) { - // Delete polling requests eventually in the list - if( queuedRequest->isPollingRequest ) - { - queuedRequests_.removeAll( queuedRequest ); - delete queuedRequest; - continue; - } + const RequestInfo &queuedRequest = queuedRequests_.first(); // Stop merging requests if we get a special one - if( queuedRequest->isSpecialRequest ) + if( ! queuedRequest.requestQueryString.isEmpty() ) { break; } @@ -408,41 +448,49 @@ void MsnSocketHttp::sendNextRequest() #endif // Merge the data - data.append( queuedRequest->data ); + data.append( queuedRequest.data ); // Remove the request from the queue, since it is going to be sent now - queuedRequests_.removeAll( queuedRequest ); - delete queuedRequest; + queuedRequests_.takeFirst(); } #ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP kDebug() << "Merged" << mergedRequests << "requests out from the queue."; #endif - // Set up the size of the data in the header - header.setContentLength( data.size() ); + // Set up the header + request.setHeader( QNetworkRequest::ContentLengthHeader, data.size() ); + + if( info.requestQueryString.isEmpty() ) + { + url += "SessionID=" + nextRequestId_; + } + else + { + url += info.requestQueryString; + } + + + // There should be no content-type header if there is no data if( data.size() == 0 ) { - header.removeValue( "Content-Type" ); + request.setHeader( QNetworkRequest::ContentTypeHeader, QVariant() ); } } // Send it - int requestId = http_->request( header, data ); + request.setUrl( QUrl( url ) ); + http_->post( request, data ); #ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP - kDebug() << "Sent request" << requestId << "."; + kDebug() << "Sent a request. Queue size now:" << queuedRequests_.size(); #endif #ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS - kDebug() << "Full dump:" << endl - << header.toString() - << QString::fromUtf8( request->data ); + dump( &request, data, true ); #endif - // Add the message to the list of messages without response - unansweredRequests_[ requestId ] = request; // Set the last request type - lastRequestWasPolling_ = request->isPollingRequest; + lastRequestWasPolling_ = sendingPollingRequest; // Stop polling, the response to this message will carry new messages along pollingTimer_.stop(); @@ -465,17 +513,10 @@ void MsnSocketHttp::setGateway( QString host ) kDebug() << "Using server at" << host << ":" << DEFAULT_GATEWAY_PORT << "as gateway."; #endif - // Set the host - http_->setHost( host ); + // Save the server address to use in our requests + requestHeader_.setRawHeader( QByteArray( "Host" ), host.toUtf8() ); - // Save the server address in our requests' fields - requestHeader_.setValue( "Host", host ); - - // The setHost() call starts establishing the connection with a request, so - // while it's on air we can't send any other message - canSendRequests_ = false; - - gatewayAddress_ = host; + gatewayAddress_ = "http://" + host; } @@ -527,24 +568,13 @@ void MsnSocketHttp::slotQueryServer() return; } - // Prepare the new request - Request *newRequest = new Request(); - newRequest->data = QByteArray(); - newRequest->isPollingRequest = true; - - // Queue it - queuedRequests_.append( newRequest ); - -#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP - kDebug() << "Queued a new polling request"; -#endif - // The last response had data; maybe there's more so keep checking - if( ! lastResponseWasEmpty_ ) - { +// if( ! lastResponseWasEmpty_ ) +// { sendNextRequest(); - } - else +// } +// else + if( lastResponseWasEmpty_ ) { // Send a poll five seconds after the last command and ten after the last polling request pollingTimer_.start( lastRequestWasPolling_ ? 10000 : 5000 ); @@ -562,64 +592,123 @@ void MsnSocketHttp::slotQueryServer() * Incoming messages contain all new messages from the server, so we need to bounce * them back individually to MsnConnection. * - * @param requestId ID of the request for which we've received a response - * @param isError True if it's an error response - */ -void MsnSocketHttp::slotDataReceived( int requestId, bool isError ) -{ - // Get the message header and contents - QByteArray rawResponseData = http_->readAll(); - QHttpResponseHeader rawResponseHeader = http_->lastResponse(); - bool hasMsnHeader = rawResponseHeader.hasKey( "X-MSN-Messenger" ); + * Example response message: + * @code +HTTP/1.0 200 OK +Content-Length: 0 +Content-Type: application/x-msn-messenger +X-MSN-Messenger: SessionID=1848331483.1171767614; GW-IP=207.46.108.49 +X-MSN-Host: BY1MSG4176117.gateway.edge.messenger.live.com +X-MSNSERVER: BY1MSG4176117 +Date: Thu, 14 Aug 2008 10:12:14 GMT +X-Cache: MISS from fw.akademy.lan +X-Cache-Lookup: MISS from fw.akademy.lan:3128 +Via: 1.0 fw.akademy.lan:3128 (squid/2.6.STABLE18) +Connection: keep-alive - // Discard unwanted messages (after you disconnect, all pending messages become unwanted) - // Also ignore the first response, which is not valid and just used to establish the connection. - if( ! unansweredRequests_.contains( requestId ) || ! rawResponseHeader.isValid() ) +@endcode + * + * @param reply The response contents + */ +void MsnSocketHttp::slotReplyReceived( QNetworkReply *reply ) +{ + if( ! connected_ ) { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP + kDebug() << "Disconnected, ignoring reply."; +#endif +#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS + dump( reply, reply->readAll(), false ); +#endif + + // We're supposed to clean up + delete reply; + return; } + // Get the message header and contents + QNetworkRequest request = reply->request(); + QByteArray responseData = reply->readAll(); + bool hasMsnHeader = reply->hasRawHeader( "X-MSN-Messenger" ); + // Catch errors. Also, catch responses without the "X-MSN-Messenger" header: // responses without it aren't coming from an MSN server, so maybe there is - // some HTTP redirection happening, like an authentication web page - if( isError || rawResponseHeader.statusCode() != 200 || ! hasMsnHeader ) + // some HTTP redirection happening, like an authentication web page (e.g. web-based login proxy) + if( reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).toInt() != 200 || ! hasMsnHeader ) { - kWarning() << "Received a type" << rawResponseHeader.statusCode() << "response for request" << requestId << ":" << http_->errorString(); - kWarning() << "Error number:" << http_->error() << "is error?" << isError; + kWarning() << "Received a type" << reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).toInt() + << "response."; #ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS - kDebug() << "Full dump:" << endl - << rawResponseHeader.toString() - << QString::fromUtf8( rawResponseData ); + dump( reply, responseData, false ); #endif // Report the right type of error + QString errorMsg( reply->errorString() ); ErrorType errorType; - switch( http_->error() ) + switch( reply->error() ) { - case QHttp::NoError: + case QNetworkReply::NoError: // Invalid MSN responses (web authentication redirects often replace the // original response contents). Treat like a connection error. - case QHttp::HostNotFound: - case QHttp::ConnectionRefused: + case QNetworkReply::HostNotFoundError: + case QNetworkReply::ConnectionRefusedError: + case QNetworkReply::TimeoutError: errorType = ERROR_CONNECTING; break; - case QHttp::UnexpectedClose: + case QNetworkReply::RemoteHostClosedError: + case QNetworkReply::UnknownNetworkError: errorType = ERROR_DROP; break; - default: + case QNetworkReply::UnknownContentError: errorType = ERROR_DATA; break; + + case QNetworkReply::ContentAccessDenied: + case QNetworkReply::ContentNotFoundError: + case QNetworkReply::ContentOperationNotPermittedError: + case QNetworkReply::ProtocolUnknownError: + case QNetworkReply::ProtocolInvalidOperationError: + case QNetworkReply::ProtocolFailure: + errorType = ERROR_INTERNAL; + break; + + default: + errorType = ERROR_UNKNOWN; + errorMsg = i18nc( "Error message shown with HTTP connection", + "%1 (Internal error code: %2)", errorMsg, reply->error() ); + break; + } + + // We may be on a network where you need to auth via a webpage + if( errorType == ERROR_CONNECTING + && ( ! hasMsnHeader || reply->attribute( QNetworkRequest::RedirectionTargetAttribute ) != QVariant().toUrl() ) ) + { + errorType = ERROR_CONNECTING_GATEWAY; + errorMsg = i18nc( "Error message shown with HTTP connection", + "%1 (Internal error code: %2)
    " + "Response: %3 %4
    " + "Redirection target: %5", + errorMsg, + reply->error(), + reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).toString(), + reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString(), + reply->attribute( QNetworkRequest::RedirectionTargetAttribute ).toString() + ); } // Ignore errors when disconnected: avoids duplicate error dialogs when two // following requests are answered with an error. if( connected_ ) { - emit error( http_->errorString(), errorType ); + emit error( errorMsg, errorType ); } + // We're supposed to clean up + delete reply; + // Allow the connection to continue working: if the error is fatal, the // connection will be disconnected so no more messages will be sent canSendRequests_ = true; @@ -627,28 +716,20 @@ void MsnSocketHttp::slotDataReceived( int requestId, bool isError ) return; } - // Extract the MSN informative header from the response - QStringList msnInfo = rawResponseHeader.value( "X-MSN-Messenger" ).split( ";" ); - - // Delete the responded request from the list - Request *doneRequest = unansweredRequests_.take( requestId ); -#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP - kDebug() << "Received response to request" << requestId << "(" << doneRequest->data.simplified() << ")"; -#endif #ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP_DUMPS - kDebug() << "Full dump:" << endl - << rawResponseHeader.toString() - << QString::fromUtf8( rawResponseData ); + dump( reply, responseData, false ); #endif - delete doneRequest; + + // Extract the MSN informative header from the response + QList msnInfo = reply->rawHeader( "X-MSN-Messenger" ).split( ';' ); // Extract the MSN session information from the headers foreach( QString item, msnInfo ) { item = item.trimmed(); - int keyEnd = item.indexOf( '=' ); - QString key = item.left( keyEnd ); - QString value = item.mid ( keyEnd + 1 ); + int keyEnd = item.indexOf( '=' ); + QString key ( item.left( keyEnd ) ); + QString value( item.mid ( keyEnd + 1 ) ); if( key == "SessionID" ) { @@ -659,10 +740,10 @@ void MsnSocketHttp::slotDataReceived( int requestId, bool isError ) else if( key == "GW-IP" ) { // Change the gateway, if we didn't do it already - if( value != gatewayAddress_ ) + if( ! gatewayAddress_.contains( value ) ) { #ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP - kDebug() << "Received gateway change command"; + kDebug() << "Switching gateways:" << gatewayAddress_ << "->" << value; #endif setGateway( value ); } @@ -693,10 +774,11 @@ void MsnSocketHttp::slotDataReceived( int requestId, bool isError ) lastResponseWasEmpty_ = true; // Extract all new messages from the response data - if( ! rawResponseData.isEmpty() ) + if( ! responseData.isEmpty() ) { int startingPos = 0; QStringList command; + bool hasPayload = false; QString commandLine; int commandLineSize; QByteArray payloadData; @@ -704,14 +786,14 @@ void MsnSocketHttp::slotDataReceived( int requestId, bool isError ) // Loop until the entire response has been parsed while( true ) { - if( startingPos >= rawResponseData.size() ) + if( startingPos >= responseData.size() ) { break; } // Retrieve the first available command from the response body - commandLineSize = rawResponseData.indexOf( "\r\n", startingPos ) - startingPos + 2; // Add the newline characters to the command size - commandLine = QString::fromUtf8( rawResponseData.mid( startingPos, commandLineSize ) ); + commandLineSize = responseData.indexOf( "\r\n", startingPos ) - startingPos + 2; // Add the newline characters to the command size + commandLine = QString::fromUtf8( responseData.mid( startingPos, commandLineSize ) ); command = commandLine.trimmed().split(" "); // Stop if there's nothing more to parse (unlikely, most times the first @@ -722,10 +804,22 @@ void MsnSocketHttp::slotDataReceived( int requestId, bool isError ) } // See if it's a payload command, and extract the payload from the response data - if( isPayloadCommand( command[0] ) ) + + // See if it's a payload command or an error + if( isErrorCommand( command[0] ) ) + { + // If the command contains a payload length parameter, also parse it + hasPayload = ( command.size() > 2 ); + } + else + { + hasPayload = isPayloadCommand( command[0] ); + } + + if( hasPayload ) { int payloadSize = command[ command.count() - 1 ].toInt(); // Last arg is payload length. - payloadData = rawResponseData.mid( startingPos + commandLineSize, payloadSize ); + payloadData = responseData.mid( startingPos + commandLineSize, payloadSize ); startingPos += commandLineSize + payloadSize; } @@ -745,28 +839,15 @@ void MsnSocketHttp::slotDataReceived( int requestId, bool isError ) // Allow sending new messages, now that this has been done canSendRequests_ = true; + // We're supposed to clean up + delete reply; + // Keep querying for more slotQueryServer(); } -/** - * @brief Called when an SSL error happens - * - * Reports the error to MsnConnection. - * - * @param errorList List of SSL errors received. - */ -void MsnSocketHttp::slotError( const QList &errorList ) -{ - kWarning() << "Received SSL errors:" << errorList; - - emit error( i18n( "SSL Error" ), ERROR_DATA ); -} - - - /** * @brief Write data to the gateway without any conversion * @@ -784,44 +865,19 @@ qint64 MsnSocketHttp::writeBinaryData( const QByteArray &data ) return -1; } - // Remove any polling messages from the queue, because the response to this - // new message will carry new messages too. -#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP - int deletedPollingRequests = 0; -#endif - foreach( Request *req, queuedRequests_ ) - { - if( req->isPollingRequest ) - { - queuedRequests_.removeAll( req ); - delete req; - -#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP - deletedPollingRequests++; -#endif - } - } -#ifdef KMESSDEBUG_CONNECTION_SOCKET_HTTP - kDebug() << "Deleted" << deletedPollingRequests << "polling requests from the queue."; -#endif - // Create the new request with the data - Request *newRequest = new Request(); - newRequest->data = data; - newRequest->isPollingRequest = false; + RequestInfo newRequest; + newRequest.data = data; - // If there's some special parameters to be sent, override the default ones + // Special query strings override the default one if( ! nextRequestParameters_.isEmpty() ) { - newRequest->isSpecialRequest = true; - newRequest->requestParameters = nextRequestParameters_; - // Clear up the special parameters for the next request + newRequest.requestQueryString = nextRequestParameters_; nextRequestParameters_ = QString(); } - else // Send the default parameters + else { - newRequest->isSpecialRequest = false; - newRequest->requestParameters = "SessionID=" + nextRequestId_; + newRequest.requestQueryString = QString(); } // Queue the new request diff --git a/src/network/msnsockethttp.h b/src/network/msnsockethttp.h index 3099cee..f776704 100644 --- a/src/network/msnsockethttp.h +++ b/src/network/msnsockethttp.h @@ -21,13 +21,15 @@ #include "msnsocketbase.h" #include -#include +#include +#include #include #include #include // Forward declarations class CurrentAccount; +class QNetworkReply; class QSslError; @@ -95,8 +97,10 @@ class MsnSocketHttp : public MsnSocketBase private: // Private methods -// // Clean up the connection + // Clean up the connection void cleanUp(); + // Dump the content of requests and replies + void dump( void *obj, QByteArray data, bool isRequest ); // Sends the next queued request void sendNextRequest(); // Change the server connection gateway @@ -107,57 +111,51 @@ class MsnSocketHttp : public MsnSocketBase // Send a polling message to the server, to retrieve pending commands void slotQueryServer(); // Read received data and pass along the contained commands - void slotDataReceived( int requestId, bool isError ); - // Called when an SSL error happens - void slotError( const QList &errorList ); + void slotReplyReceived( QNetworkReply *reply ); private: // Private structures // Structure to hold all the useful data about an HTTP request - struct Request + struct RequestInfo { - // Request parameters to be sent along with the data - QString requestParameters; + // Special request parameters to be sent along with the data + QString requestQueryString; // The actual contents of the request QByteArray data; - // Whether or not this is a polling request - bool isPollingRequest; - // Whether or not this is a special request (if it has special request parameters) - bool isSpecialRequest; }; private: // Private attributes // URL to specify in the queries - QString baseServerPath_; + QString baseServerPath_; // State variable to detect whether it's possible or not to send another request - bool canSendRequests_; + bool canSendRequests_; // Time at which the last request has been sent - QTime lastRequestTime_; + QTime lastRequestTime_; // Saved gateway address - QString gatewayAddress_; + QString gatewayAddress_; // The HTTP interface - QHttp *http_; + QNetworkAccessManager *http_; // true if the last sent request was a polling message - bool lastRequestWasPolling_; + bool lastRequestWasPolling_; // true if the last received response didn't carry any new commands - bool lastResponseWasEmpty_; + bool lastResponseWasEmpty_; // Time counter to regularly report pings to the application - QDateTime lastPing_; + QDateTime lastPing_; // Next request's ID - QString nextRequestId_; + QString nextRequestId_; // Next request's parameters - QString nextRequestParameters_; + QString nextRequestParameters_; // A timer to regularly query the server for new commands - QTimer pollingTimer_; + QTimer pollingTimer_; // List of requests waiting to be sent - QList queuedRequests_; + QList queuedRequests_; // Container for never-changing request information - QHttpRequestHeader requestHeader_; + QNetworkRequest requestHeader_; // Are we sending pings? - bool sendPings_; + bool sendPings_; // Hashmap of non answered requests - QHash unansweredRequests_; + QList unansweredRequests_; }; diff --git a/src/network/msnsocketnull.cpp b/src/network/msnsocketnull.cpp new file mode 100644 index 0000000..d0da5ee --- /dev/null +++ b/src/network/msnsocketnull.cpp @@ -0,0 +1,856 @@ +/*************************************************************************** + msnsocketnull.cpp - description + ------------------- + begin : Sat May 10 2008 + copyright : (C) 2008 by Valerio Pilo + email : valerio@kmess.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "msnsocketnull.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include "../kmessdebug.h" +#include "../contact/contact.h" +#include "../currentaccount.h" + + +// Initialize static class members +QMap MsnSocketNull::contactList_; +QMap MsnSocketNull::groupList_; +QMap MsnSocketNull::onlineList_; + + +#ifdef KMESSDEBUG_CONNECTION // Area-specific debug statements + #define KMESSDEBUG_CONNECTION_SOCKET_NULL +#endif + + +// Change this to the position where you want KMess to search for a debug log +// to replicate :) +#define DEBUG_LOG_FILE QDir::homePath() + "/kmessdebug.log" + + + +/** + * @brief The constructor + * + * Does nothing. + */ +MsnSocketNull::MsnSocketNull( ServerType serverType ) +: MsnSocketBase( serverType ) +, sendPings_( false ) +{ + setObjectName( "MsnSocketNull" ); + + // Connect the server request timer + connect( &responseTimer_, SIGNAL( timeout() ), + this, SLOT ( sendResponse() ) ); + + // If the lists are already filled, we're done + if( ! contactList_.isEmpty() || ! groupList_.isEmpty() ) + { + return; + } + + // If that file exists, parse it + kDebug() << "File" << DEBUG_LOG_FILE << "file exists?" << QFile::exists( DEBUG_LOG_FILE ); + if( QFile::exists( DEBUG_LOG_FILE ) ) + { + QFile file( DEBUG_LOG_FILE ); + file.open( QIODevice::ReadOnly ); + QStringList fileContents( QString( file.readAll() ).split( QString( "\n" ) ) ); + file.close(); + + int index; + QList connections; + QStringList fileCommands; + QRegExp commandRegexp( "\"\\s+-\\s+<<<\\s+\\((.+)\\)$" ); + + foreach( const QString &row, fileContents ) + { + index = commandRegexp.indexIn( row ); + if( index == -1 ) + continue; + + QString command( commandRegexp.cap( 1 ) ); + + // Every connection starts with a good SYN + if( command.startsWith( "\"SYN\"" ) ) + { + connections.append( fileCommands.size() ); + continue; + } + + // The only messages we care of are the list retrieval ones + if( ! command.startsWith( "\"LSG\"" ) && + ! command.startsWith( "\"LST\"" ) && + ! command.startsWith( "\"ILN\"" ) ) + { + continue; + } + + // Extract the QStringList of commands from the row + fileCommands.append( command ); + } + +/* + kDebug() << "###########################################################################"; + kDebug() << connections; + kDebug() << "###########################################################################"; + for( int i = 0; i < fileCommands.size(); i++ ) + { + if( connections.contains( i ) ) + { + kDebug() << "###########################################################################"; + kDebug() << "Connection" << connections.indexOf( i ); + kDebug() << "**************"; + } + + kDebug() << fileCommands[ i ]; + } + + kDebug() << "###########################################################################"; +*/ + + int number = 0; + if( connections.size() > 1 ) + { + bool ok; + number = KInputDialog::getInteger( "KMess log mimicker", "Choose a connection from the log file \"" + + DEBUG_LOG_FILE + "\" to replicate:", + 1, 1, + connections.size(), + 1, 10, + &ok ); + if( ! ok ) + { + number = 0; + } + else + { + number--; // reindex from 0 + } + } + + int end = ( number == connections.size() - 1 ) ? fileCommands.size() - 1 : connections[ number ]; + + for( int idx = connections[ number ]; idx < end; idx++ ) + { + if( fileCommands[idx].isEmpty() ) + continue; + + QStringList parts( fileCommands[idx].split( ", " ) ); + for( int i=0; i < parts.size(); i++ ) + { + parts[ i ] = parts[ i ].mid( 1, parts[i].size() - 2 ); + } + + if( parts[0] == "LSG" ) + { + //("LSG", "KMess", "b07456fe-a6fd-4746-b63a-62f363a923ef") + groupList_[ parts[2] ] = QUrl::fromPercentEncoding( parts[1].toUtf8() ); + } + else if( parts[0] == "LST" ) + { + // ("LST", "N=friend@site.dom", "F=[a=1][c=4][b]-%20Emet%20-[/b][/c][/a]", "C=aef50adb-434d-4e85-bcfd-0d14c3baf529", "11", "1", "7ed2567a-71f0-4bf1-8ab6-9549f616c093") +// ("LST", "N=non-friend@site.dom", "10", "1") + FakeContact newContact; + + if( parts.size() == 4 ) + { + newContact.handle = parts[1].mid(2); + newContact.friendlyName = parts[1].mid(2); + newContact.guId = parts[1].mid(2); + newContact.lists = parts[2].toInt(); + newContact.groupIds = QStringList(); + } + else + { + newContact.handle = parts[1].mid(2); + newContact.friendlyName = QUrl::fromPercentEncoding( parts[2].mid(2).toUtf8() ); + newContact.guId = parts[3].mid(2); + newContact.lists = parts[4].toInt(); + newContact.groupIds = ( parts.size() > 6 ) ? parts[6].split( "," ) : QStringList(); + } + + contactList_[ newContact.handle ] = newContact; + } + else if( parts[0] == "ILN" ) + { + // ("ILN", "10", "BSY", "contact@site.com", "Nickname%20encoded", "1342210100", "%3Cmsnobj%20Creator%3D%22contact%40site.com%22%20Size%3D%229333%22%20Type%3D%223%22%20Location%3D%22KMess.tmp%22%20Friendly%3D%22AA%3D%3D%22%20SHA1D%3D%22ysV4cHpd04lOhjHYB%2BTnggTwjdA%3D%22%20SHA1C%3D%226jkVICIHHIgJvSZAzgJ6FlNK10c%3D%22%2F%3E") + contactList_[ parts[3] ].friendlyName = QUrl::fromPercentEncoding( parts[4].toUtf8() ); + + OnlineDetails details; + details.msnObject = parts[6]; + details.capabilities = parts[5].toUInt(); + details.status = parts[2]; + onlineList_[ parts[3] ] = details; + } + } + } + else // Generate a standard contact list + { + groupList_[ "0000-family" ] = "Family"; + groupList_[ "000-friends" ] = "Friends"; + groupList_[ "0-workmates" ] = "Workmates"; + groupList_[ "00000-empty" ] = "Empty Group"; + + // lists 'templates' + int isFriend = Contact::MSN_LIST_ALLOWED | Contact::MSN_LIST_FRIEND | Contact::MSN_LIST_REVERSE; + // NOTE: Add some invalid characters to the email addresses, so they will never resolve to possibly valid mailboxes. + contactList_.insert( "mum@kmess.orgX", createFakeContact + ( "mum@kmess.orgX", "Mom", "c1mum", QStringList() << "0000-family", isFriend ) ); + contactList_.insert( "sister@kmess.orgX", createFakeContact + ( "sister@kmess.orgX", "Sis", "c2sister", QStringList() << "0000-family", isFriend ) ); + contactList_.insert( "frank@kmess.com" , createFakeContact + ( "frank@kmess.comX", "[u]Frankie[/u]", "c3frank", QStringList() << "000-friends", isFriend ) ); + contactList_.insert( "elaine@kmess.comX", createFakeContact + ( "elaine@kmess.com", "[c=orange]Ely[/c=yellow]", "c4elaine", QStringList() << "0-workmates", isFriend ) ); + contactList_.insert( "badguy@bothering.comX", createFakeContact + ( "badguy@bothering.comX", "[b]Bad Guy[/b]", "c5badguy", QStringList(), Contact::MSN_LIST_BLOCKED ) ); + contactList_.insert( "idiot@friend.comX", createFakeContact + ( "jack@idiotry.comX", "Jackie - OLOLOLO", "c6jack", QStringList() << "000-friends", isFriend | Contact::MSN_LIST_BLOCKED ) ); + contactList_.insert( "sylvie@hotmail.comX", createFakeContact + ( "sylvie@hotmail.comX", "(*)Sylvie(*) I'm working! (l)", "c7sylvie", QStringList() << "0-workmates", isFriend ) ); + contactList_.insert( "evan123@hotmail.usX", createFakeContact + ( "evan123@hotmail.usX", "€v1³", "c8evan", QStringList() << "0-workmates", isFriend ) ); + contactList_.insert( "richard@multinational.comX", createFakeContact + ( "richard@multinational.comX", "Richard ~ next week: vacation! :D", "c9richard", QStringList() << "0-workmates", isFriend ) ); + contactList_.insert( "awesome_girl222@hotmail.comX", createFakeContact + ( "awesome_girl222@hotmail.comX", "[b][c=12]Katie (L)[/c=21] [c=21]I love you...[/c=12][/b]", "c10katie", QStringList() << "0000-family", isFriend ) ); + contactList_.insert( "unknown@unknown.wtfX", createFakeContact + ( "unknown@unknown.wtfX", "Unknown Faceless Guy", "c11unknown", QStringList(), Contact::MSN_LIST_ALLOWED | Contact::MSN_LIST_REVERSE ) ); + + // Same seed everytime, so we get the same results when starting multiple times KMess + srand( 5 ); + + QMap::ConstIterator cIt; + for( cIt = contactList_.constBegin(); cIt != contactList_.constEnd(); ++cIt ) + { + // Don't change to online all contacts + if( ( rand() % 4 ) == 0 || ( rand() % 3 ) == 0 ) + continue; + + OnlineDetails details; + details.msnObject = ""; // no pic atm + details.capabilities = 1985855532; + details.status = MsnStatus::getCode( (Status)(rand() % 8) ); + onlineList_[ cIt.key() ] = details; + } + } +} + + + +/** + * @brief The destructor + * + * Does nothing. + */ +MsnSocketNull::~MsnSocketNull() +{ + // Disconnect from the server on exit + if( connected_ ) + { + disconnectFromServer(); + } + + // Stop the timer + responseTimer_.stop(); + + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + kDebug() << "DESTROYED"; +#endif +} + + +MsnSocketNull::FakeContact MsnSocketNull::createFakeContact( const QString &handle, const QString &friendlyName, const QString &guId, const QStringList &groupIds, int lists ) const +{ + MsnSocketNull::FakeContact c; + c.handle = handle; + c.friendlyName = friendlyName; + c.guId = guId; + c.groupIds = groupIds; + c.lists = lists; + return c; +} + + +/** + * @brief Connect to the given server + * + * The initial connection is always made through the main Gateway. + * The first server response usually carries the new gateway IP + * which will be used for the rest of the connection. + * + * @param server The server hostname or IP address. + * @param port The port to connect to. Not used - all of our + * traffic goes through the default port. + */ +void MsnSocketNull::connectToServer( const QString& server, const quint16 port ) +{ +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + if( server.isEmpty() && port == 0 ) + { + kDebug() << "Faking connection to the default server."; + } + else + { + kDebug() << "Faking connection to server at " << server << ":" << port << "."; + } +#endif + + // Set our internal state variables + connected_ = true; + setSendPings( true ); + responseTime_.start(); + + // Start answering to the queued messages + scheduleNext(); + + // Signal we're ready + emit connected(); + emit statusMessage( i18n( "Connected" ), false ); +} + + + +/** + * @brief Send to the client the fake contact list + * + * This method sends the entire groups and contacts list back to KMess. + */ +void MsnSocketNull::deliverContactList() +{ + QMap::ConstIterator gIt; + for( gIt = groupList_.constBegin(); gIt != groupList_.constEnd(); ++gIt ) + { + emit dataReceived( QStringList() << "LSG" + << QUrl::toPercentEncoding( gIt.value() ) + << gIt.key(), QByteArray() ); + } + + QMap::ConstIterator cIt; + for( cIt = contactList_.constBegin(); cIt != contactList_.constEnd(); ++cIt ) + { + const FakeContact contact = cIt.value(); + emit dataReceived( QStringList() << "LST" + << "N=" + contact.handle + << "F=" + QUrl::toPercentEncoding( contact.friendlyName ) + << "C=" + contact.guId + << QString::number( contact.lists ) + << "1" // Meaning unknown + << contact.groupIds.join(","), + QByteArray() ); + } + + // Same seed everytime, so we get the same results when starting multiple times KMess + srand( 5 ); + + QMap::ConstIterator oIt; + for( oIt = onlineList_.constBegin(); oIt != onlineList_.constEnd(); ++oIt ) + { + const OnlineDetails details = oIt.value(); + emit dataReceived( QStringList() << "ILN" + << "999" // TODO: what is this? the ack number of the initial CHG? We don't use it. + << details.status + << contactList_[ oIt.key() ].handle + << contactList_[ oIt.key() ].friendlyName + << QString::number( details.capabilities ) + << details.msnObject + , QByteArray() ); + } +} + + + +/** + * @brief Disconnect from the server + * + * This method closes the connection to the server and does some cleaning up. + * It empties all buffers, and resets the internal state. + * To avoid losing data, all pending requests are merged into a single huge + * request and sent altogether, before closing the connection. We won't + * receive responses for them; but at least we lose no outgoing data. + * + * @param isTransfer When set, a disconnected() signal won't be fired. + * This is used to handle transfers to another server + * without noticing a disconnect. + */ +void MsnSocketNull::disconnectFromServer( bool isTransfer ) +{ + // Stop pinging + setSendPings( false ); + + // Just clean up if we are disconnected already + if( ! connected_ ) + { + return; + } + + connected_ = false; + messageQueue_.clear(); + responseTimer_.stop(); + +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_CLOSE( this ); +#endif + + // Do not signal a disconnection when we are transferring to another "server" + if( isTransfer ) + { + return; + } + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + kDebug() << "Emitting disconnection signal."; +#endif + + emit disconnected(); +} + + + +/** + * @brief Return the local IP address + * + * Just returns "127.0.0.1". We're not going anywhere. + * + * @returns The IP address the socket uses at the system. + */ +QString MsnSocketNull::getLocalIp() const +{ + // We don't care about our own IP, return a generic one + return QHostAddress( QHostAddress::LocalHost ).toString(); +} + +/** + * @brief Schedule the next response + * + * Restarts the internal timer to determine when the next command + * will be sent back to KMess + */ +void MsnSocketNull::scheduleNext() +{ + // Also send the ping if needed + if( sendPings_ && responseTime_.restart() > 30000 ) + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + kDebug() << "Emitting ping signal."; +#endif + + emit pingSent(); + } + + int nextResponseInterval = SOCKET_NULL_LAGGINESS_MIN + ( rand() % ( SOCKET_NULL_LAGGINESS_MAX + 1 ) ); +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + kDebug() << "Next response will happen in" << nextResponseInterval << "milliseconds."; +#endif + + responseTimer_.start( nextResponseInterval ); +} + + + +/** + * @brief Answer a queued command + * + * This slot sends a response to a command sent by kmess + */ +void MsnSocketNull::sendResponse() +{ + // When the queue is empty, just try again every now and then + if( messageQueue_.isEmpty() ) + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + kDebug() << "Queue is empty, idling."; +#endif + scheduleNext(); + return; + } + + // Extract the oldest message from the queue + bool success; + QByteArray lastMessage( messageQueue_.takeFirst() ); + QString commandLine( QString::fromUtf8( lastMessage.data(), lastMessage.size() ) ); + QStringList command( commandLine.trimmed().split(" ") ); + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + kDebug() << "Parsing oldest queue message:" << command; +#endif + + // Each server type has a different message set with different responses; so we implement them separately + if( serverType_ == MsnSocketBase::SERVER_NOTIFICATION ) + { + success = sendNotificationServerResponse( command ); + } + else + { + success = sendSwitchboardServerResponse( command ); + } + + // Answer the next message + if( success && ! messageQueue_.isEmpty() ) + { + scheduleNext(); + } + else + { + // Stop parsing stuff if there's an error or there's no messages to parse + responseTimer_.stop(); + } +} + + + +// Respond to a command when acting as a Notification Server +bool MsnSocketNull::sendNotificationServerResponse( const QStringList& command ) +{ + QStringList replyCommand; + QByteArray payloadData; + + // Set the command for the reply to the name and ack id, so we can fill it with some other stuff + for( int i = 0; i < 2; i++ ) + { + if( command.size() <= i ) + { + break; + } + replyCommand.append( command[ i ] ); + } + + // Reply to the message, if it contains a known command + + if( command[0] == "VER" ) + { + // Initial version info + + // Only reply with "VER " + + emit dataReceived( replyCommand << command[2], payloadData ); + } + else if( command[0] == "CVR" ) + { + emit dataReceived( replyCommand << KMESS_VERSION << KMESS_VERSION << KMESS_VERSION + << "http://www.kmess.org/download/" << "http://www.kmess.org/", + payloadData ); + } + else if( command[0] == "USR" ) + { + // Test once the server redirection capabilities of KMess + if( ! isTransferDone_ ) + { + isTransferDone_ = true; + + // TODO: WTF are the other two arguments? We don't use them.. + messageQueue_ << QString( "XFR %1 NS fakeServerRedirection::1234 0 fakeServerRedirection2::4321" ) + .arg( command[1] ).toUtf8(); + } + else + { + // We can't easily proceed with faking authentication, since it involves HTTP requests external to + // the scope of this class. Therefore, we just 'confirm' authentication + emit dataReceived( replyCommand << "OK" + << CurrentAccount::instance()->getHandle() + << SOCKET_NULL_IS_ACCOUNT_VERIFIED + << "0", + payloadData ); + } + } + else if( command[0] == "XFR" ) + { + // Redirection request: we emit it as is + emit dataReceived( command, payloadData ); + } + else if( command[0] == "OUT" ) + { + // Quit/disconnection request + + // If needed, fake having been disconnected from this server due to connection from another place/client + if( SOCKET_NULL_FAKE_OTH ) + { + emit dataReceived( replyCommand << "OTH", payloadData ); + } + + disconnectFromServer(); + } + else if( command[0] == "SYN" ) + { + // Contact list synchronization + QDateTime now( QDateTime::currentDateTime() ); + + // TODO: When we'll start caching contact list contents, this could need to be updated + // to avoid sync issues with old data + QString listDate( now.toString( Qt::ISODate ) + ".00-00:00" ); + + emit dataReceived( replyCommand << listDate << listDate + << QString::number( contactList_.count() ) + << QString::number( groupList_.count() ), + payloadData ); + + // Then start sending out to the client our Original Fake(tm) of the contact list + deliverContactList(); + } + else if( command[0] == "GCF" ) + { + // Do nothing. + // TODO: It should send something back so check what and replicate here + } + else if( command[0] == "CHG" ) + { + // Status change. Reply as is. + emit dataReceived( command, payloadData ); + } + else if( command[0] == "UUX" ) + { + // Response to an UUX command: reply without the original payload (if any) + replyCommand << "0"; + emit dataReceived( replyCommand, payloadData ); + } + else if( command[0] == "URL" ) + { + if( command[2] == "INBOX" ) + { + replyCommand << "inbox"; // TODO: Fix URL + replyCommand << "http://mail.live.com/"; // TODO: Fix URL + replyCommand << "wtf"; // TODO: Fix URL + } + else if( command[2] == "COMPOSE" ) + { + replyCommand << "compose"; // TODO: Fix URL + replyCommand << "http://mail.live.com/"; // TODO: Fix URL + replyCommand << "wtf"; // TODO: Fix URL + } + else + { + replyCommand << "http://www.kmess.org/"; + } + + emit dataReceived( replyCommand, payloadData ); + } + else if( command[0] == "ADC" ) + { + QString arg( command[3] ); + QString str, handle; + + if( arg.startsWith("N=") ) + { + handle = arg.mid(2).toLower(); + } + else if( arg.startsWith("F=") ) + { + str = QUrl::fromPercentEncoding( arg.mid(2).toUtf8() ); + foreach( const FakeContact &contact, contactList_ ) + { + if( contact.friendlyName == str ) + { + handle = contact.handle; + break; + } + } + } + else if( arg.startsWith("C=") ) + { + str = arg.mid(2); + foreach( const FakeContact &contact, contactList_ ) + { + if( contact.guId == str ) + { + handle = contact.handle; + break; + } + } + } + + if( ! handle.isEmpty() && ! contactList_.contains( handle ) ) + { + FakeContact item; + item.handle = handle; + item.guId = handle + "-guid"; + item.friendlyName = handle + "'s Friendly Name"; + item.groupIds = QStringList(); + item.lists = 3; // Allowed + Friend + + contactList_[ handle ] = item; + } + + // Contact adding or list change, reply as is + emit dataReceived( command, payloadData ); + } + else if( command[0] == "REM" ) + { + // Contact removal + + emit dataReceived( command, payloadData ); + } + else if( command[0] == "ADG" ) + { + // Group adding, append the group ID + + QString id( replyCommand.last().toLower() ); + id.replace( QRegExp( "[^a-z0-9]" ), "-" ); + id.append( "-" + QString::number( rand() ) ); + + groupList_[ id ] = QUrl::fromPercentEncoding( replyCommand.last().toUtf8() ); + + replyCommand = command; + replyCommand << id; + emit dataReceived( replyCommand, payloadData ); + } + else if( command[0] == "REG" ) + { + // Group rename + groupList_[ command[2] ] = QUrl::fromPercentEncoding( command[3].toUtf8() ); + + emit dataReceived( command, payloadData ); + } + else if( command[0] == "RMG" ) + { + // Group rename + groupList_.remove( command[2] ); + emit dataReceived( command, payloadData ); + } + + + else if( command[0] == "WTF" ) + { + // Template for other commands :) + replyCommand << QString(); + emit dataReceived( replyCommand, payloadData ); + } + else + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + kDebug() << "Unknown notification message:" << command; +#endif + + disconnectFromServer(); + emit error( "Connection closed by peer", ERROR_DROP ); + return false; + } + + return true; +} + + + +// Respond to a command when acting as a Switchboard Server +bool MsnSocketNull::sendSwitchboardServerResponse( const QStringList& command ) +{ + QStringList replyCommand; + QByteArray payloadData; + + // Set the command for the reply to the name and ack id, so we can fill it with some other stuff + for( int i = 0; i < 2; i++ ) + { + if( command.size() <= i ) + { + break; + } + replyCommand.append( command[ i ] ); + } + + // Reply to the message, if it contains a known command + + // TODO: Everything here + if( true ) + { +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + kDebug() << "Unknown switchboard message:" << command; +#endif + + disconnectFromServer(); + emit error( "Connection closed by peer", ERROR_DROP ); + return false; + } + + return true; +} + + + +/** + * @brief Set whether to send pings or not + * + * When sending pings, the application receives a periodic signal + * which is used to perform timed updates (like receiving display pics). + * + * @param sendPings True to send pings. + */ +void MsnSocketNull::setSendPings( bool sendPings ) +{ + sendPings_ = sendPings; +} + + + +/** + * @brief Write data to the gateway without any conversion + * + * This method creates a new request and queues it to be sent when possible. + * See sendNextRequest() for more info on sending. + * + * @param data Contents of the message which will be sent + * @return -1 on error, or else always the exact size of the sent data. + */ +qint64 MsnSocketNull::writeBinaryData( const QByteArray &data ) +{ + if( ! connected_ ) + { + kWarning() << "Attempted to write data to a disconnected interface, aborting."; + return -1; + } + +#ifdef KMESSDEBUG_CONNECTION_SOCKET_NULL + kDebug() << "Appending message:" << data; + kDebug() << "To current list:" << messageQueue_; +#endif + + // Reactivate the timer if it's been stopped due to an empty queue + if( ! responseTimer_.isActive() ) + { + scheduleNext(); + } + + messageQueue_.append( data.trimmed() ); + + return data.size(); +} + + + +/** + * @brief Write a string to the gateway + * + * This is a convenience method for writeBinaryData, which can be used to directly send a QString. + * + * @param data The message which will be sent + * @return -1 on error, or else always the exact size of the sent data. + */ +qint64 MsnSocketNull::writeData( const QString &data ) +{ + return writeBinaryData( data.toUtf8() ); +} + + + +#include "msnsocketnull.moc" diff --git a/src/network/msnsocketnull.h b/src/network/msnsocketnull.h new file mode 100644 index 0000000..823b386 --- /dev/null +++ b/src/network/msnsocketnull.h @@ -0,0 +1,167 @@ +/*************************************************************************** + msnsocketnull.h - description + ------------------- + begin : Sat May 10 2008 + copyright : (C) 2008 by Valerio Pilo + email : valerio@kmess.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef MSNSOCKETNULL_H +#define MSNSOCKETNULL_H + +#include "msnsocketbase.h" +#include "../contact/msnstatus.h" + +#include +#include +#include + + +/** + * Define the fake server lagginess. + * + * Setting these minimum and maximum values changes how fast the fake server + * will answer to KMess' requests and how often will send those of its own (like + * pings). The speed is expressed in milliseconds. + */ +#define SOCKET_NULL_LAGGINESS_MIN 20 +#define SOCKET_NULL_LAGGINESS_MAX 40 + +/** + * Set the account's verified status + * + * Switch this define to either "1" or "0" (_including_ the quotes). + */ +#define SOCKET_NULL_IS_ACCOUNT_VERIFIED "1" + +/** + * Set whether to fake client switching + * + * When using this, being disconnected (or disconnecting) will result in KMess + * believing it was disconnected because the connected account had connected somewhere else. + * Switch this define to either true or false. + */ +#define SOCKET_NULL_FAKE_OTH true + + + +/** + * @brief Basic I/O functionality for a fake MSN server connection. + * + * This is a low-level class used used by MsnConnection. + * The class is a simple and fast way to test the application while being offline; due to its nature, + * it is useful for testing purposes only and is not available within user builds. + * It can also be used to quickly test new features without the hassle of having to reconnect at every + * change: the server lagginess can be set to zero for a lightning fast connection. + * It will simulate a connection to a MSN server. + * + * @author Valerio Pilo + * @ingroup NetworkCore + */ +class MsnSocketNull : public MsnSocketBase +{ + Q_OBJECT + + + public: // Public methods + + // The constructor + MsnSocketNull( ServerType serverType ); + // The destructor + ~MsnSocketNull(); + // Connect to the given server + void connectToServer( const QString& server = QString(), const quint16 port = 0 ); + // Disconnect from the server + void disconnectFromServer( bool isTransfer = false ); + // Return the local IP address + QString getLocalIp() const; + // Set whether to send pings or not + void setSendPings( bool sendPings ); + // Write data to the socket without conversions + qint64 writeBinaryData( const QByteArray& data ); + // Write data to the socket + qint64 writeData( const QString& data ); + + + private: // Private methods + + // Schedule the next response + void scheduleNext(); + // Respond to a command when acting as a Notification Server + bool sendNotificationServerResponse( const QStringList& command ); + // Respond to a command when acting as a Switchboard Server + bool sendSwitchboardServerResponse( const QStringList& command ); + + + private slots: // Private slots + + // Answer a queued command + void sendResponse(); + // Send to the client the fake contact list + void deliverContactList(); + + + private: // Private structures + + // A structure to hold the fake contact list's contacts + struct FakeContact + { + // The email address of the contact + QString handle; + // The friendly name of the contact + QString friendlyName; + // The contact's GUID + QString guId; + // List of groups IDs the contact belongs to + QStringList groupIds; + // The lists the contact belongs to (see Contact::MsnContactLists) + int lists; + }; + MsnSocketNull::FakeContact createFakeContact( const QString &handle, const QString &friendlyName, const QString &guId, const QStringList &groupIds, int lists ) const; + // A structure to hold details about initially online contacts + struct OnlineDetails + { + QString msnObject; + ulong capabilities; + QString status; + }; + + + private: // Private attributes + + // The time since last response was processed + QTime responseTime_; + // A timer to anwser the queries after some time + QTimer responseTimer_; + // The list of queued messages + QList messageQueue_; + // Are we sending pings? + bool sendPings_; + // Whether the Notification Server transfer test has been done or not + bool isTransferDone_; + + + private: // Private static attributes + + // The list of fake contacts + static QMap contactList_; + // The list of fake groups in the contacts list + static QMap groupList_; + // The list of contacts to set as initially online + static QMap onlineList_; + + +}; + + + +#endif diff --git a/src/network/msnsockettcp.cpp b/src/network/msnsockettcp.cpp index e954b51..5e387ee 100644 --- a/src/network/msnsockettcp.cpp +++ b/src/network/msnsockettcp.cpp @@ -22,8 +22,8 @@ #include #include -#include +#include "../utils/kmessshared.h" #include "../currentaccount.h" #include "../kmessdebug.h" @@ -37,6 +37,7 @@ * In milliseconds, the time to wait for the msn server name resolution to complete. */ #define LOGIN_TIMER_DNS_RESOLVE 10000 + /** * @brief Login timer for actual server connection * @@ -45,6 +46,10 @@ #define LOGIN_TIMER_CONNECTION 5000 +#define MSN_TCP_HOST "messenger.hotmail.com" +#define MSN_TCP_PORT 1863 + + /** * @brief The constructor @@ -76,6 +81,8 @@ MsnSocketTcp::MsnSocketTcp( ServerType serverType ) this, SLOT ( slotSocketDataReceived() ) ); connect( socket_, SIGNAL( error(QAbstractSocket::SocketError) ), this, SLOT ( slotSocketError(QAbstractSocket::SocketError) ) ); + connect( socket_, SIGNAL( proxyAuthenticationRequired(const QNetworkProxy&,QAuthenticator*) ), + this, SLOT ( proxyAuthenticate(const QNetworkProxy&,QAuthenticator*) ) ); // Connect the ping timer to the sendPing slot pingTimer_.stop(); @@ -136,8 +143,8 @@ void MsnSocketTcp::connectToServer( const QString& server, const quint16 port ) if( server.isEmpty() && port == 0 ) { - desiredServer = "messenger.hotmail.com"; - desiredPort = 1863; + desiredServer = MSN_TCP_HOST; + desiredPort = MSN_TCP_PORT; } else { @@ -384,8 +391,8 @@ void MsnSocketTcp::slotSendPing() // Assume the connection was lost when 3 pings are missed. if ( missedPings_ == 3 ) { - KMessageBox::error( 0, i18n("The connection to the server was lost.") ); - disconnectFromServer( false ); + // Bounce back to the unified error handler to disconnect and give the user a message + emit error( i18n( "The connection to the server was lost" ), MsnSocketBase::ERROR_DROP ); } writeData( "PNG\r\n" ); @@ -431,8 +438,17 @@ void MsnSocketTcp::slotSocketDataReceived() commandLine = QString::fromUtf8( rawCommandLine.data(), rawCommandLine.size() ); command = commandLine.trimmed().split(" "); - // See if it's a payload command - gotPayloadCommand = ( isPayloadCommand( command[0] ) ); + // See if it's a payload command or an error + if( isErrorCommand( command[0] ) ) + { + // If the command contains a payload length parameter, also parse it + gotPayloadCommand = ( command.size() > 2 ); + } + else + { + gotPayloadCommand = isPayloadCommand( command[0] ); + } + if( gotPayloadCommand ) { nextPayloadSize_ = command[ command.count() - 1 ].toInt(); // Last arg is payload length. @@ -465,6 +481,10 @@ void MsnSocketTcp::slotSocketDataReceived() // Reset state for next loop. nextPayloadSize_ = 0; } + else + { + payloadData.clear(); + } // Response from the internal ping timer. diff --git a/src/network/msnswitchboardconnection.cpp b/src/network/msnswitchboardconnection.cpp index 935eaf0..ac359b9 100644 --- a/src/network/msnswitchboardconnection.cpp +++ b/src/network/msnswitchboardconnection.cpp @@ -18,7 +18,6 @@ #include "msnswitchboardconnection.h" #include "../contact/contact.h" -#include "../contact/contactlist.h" #include "../contact/invitedcontact.h" // for cast #include "../contact/msnobject.h" #include "../currentaccount.h" @@ -144,16 +143,9 @@ void MsnSwitchboardConnection::activity() keepAliveTimer_->setObjectName( "keepalive-msgs" ); keepAliveTimer_->setSingleShot( false ); - // Disable keepalives for background switchboard connections. Instead, use the timer as a disconnection - // timeout. It's also made server-side, but here it will save memory. - if( backgroundConnection_ ) - { - connect( keepAliveTimer_, SIGNAL( timeout() ), SLOT( timeoutConnection() ) ); - } - else - { - connect( keepAliveTimer_, SIGNAL( timeout() ), SLOT( sendKeepAlive() ) ); - } + // Keepalives are disabled for background switchboard connections. Instead, use the timer + // as a disconnection timeout. It's also made server-side, but here it will save memory. + connect( keepAliveTimer_, SIGNAL( timeout() ), SLOT( sendKeepAlive() ) ); } // Reset the number of remaining keep alives. @@ -174,7 +166,7 @@ void MsnSwitchboardConnection::activity() #ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE kDebug() << ( backgroundConnection_ ? "Background" : "Chatting" ) - << " keepalive session restarted." << endl; + << "keepalive session restarted." << endl; #endif } @@ -198,7 +190,7 @@ void MsnSwitchboardConnection::cleanUnackedMessages() // Find find the entries, then delete. QList removeAcks; - QMapIterator it( unAckedMessages_ ); + QHashIterator it( unAckedMessages_ ); while( it.hasNext() ) { it.next(); @@ -259,6 +251,9 @@ void MsnSwitchboardConnection::closeConnection() { contact->removeSwitchboardConnection(this, true); // could cause applications to abort. } + + // Also signal they're not in chat anymore + emit contactLeftChat( contact, false ); } contactsInChat_.clear(); @@ -293,7 +288,7 @@ void MsnSwitchboardConnection::closeConnection() // Clean up, close the connection, destroy this object -void MsnSwitchboardConnection::closeConnectionLater(bool autoDelete) +void MsnSwitchboardConnection::closeConnectionLater( bool autoDelete ) { #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL kDebug() << "aborting applications nicely and closing connection."; @@ -365,7 +360,7 @@ void MsnSwitchboardConnection::closeConnectionLater(bool autoDelete) // Do what's required when a contact joined -void MsnSwitchboardConnection::contactJoined(const QString& handle, const QString& friendlyName, const uint capabilities) +void MsnSwitchboardConnection::contactJoined( const QString& handle, const QString& friendlyName, const uint capabilities ) { #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL kDebug() << "Contact " << handle << " has joined."; @@ -393,15 +388,15 @@ void MsnSwitchboardConnection::contactJoined(const QString& handle, const QStrin // Indicate the contact is active in this session. ContactBase *contact = currentAccount_->getContactByHandle(handle); - if( contact == 0 ) + if( contact == 0 ) // We don't have this contact in our list { - contact = currentAccount_->addInvitedContact(handle, friendlyName, capabilities); + contact = currentAccount_->addInvitedContact( handle, friendlyName, capabilities ); } // Add switchboard connection to the contact. if( ! KMESS_NULL(contact) ) { - contact->addSwitchboardConnection(this); + contact->addSwitchboardConnection( this ); } // Inform the contact about our version @@ -412,7 +407,7 @@ void MsnSwitchboardConnection::contactJoined(const QString& handle, const QStrin sendPendingMessages(); // Notify the join to the Chat Master. - emit contactJoinedChat( handle, friendlyName ); + emit contactJoinedChat( contact ); } @@ -442,7 +437,7 @@ void MsnSwitchboardConnection::contactLeft(const QString& handle) // Indicate the contact is not active anymore in this session. ContactBase *contact = currentAccount_->getContactByHandle(handle); - if(! KMESS_NULL(contact)) + if( ! KMESS_NULL(contact) ) { contact->removeSwitchboardConnection(this, false); } @@ -450,10 +445,12 @@ void MsnSwitchboardConnection::contactLeft(const QString& handle) // Emit the signal to the Chat Window. if( ! backgroundConnection_ ) { - // If we're using the keepalive mechanism, and there are no keepalives left, then the session has expired: - // the conversation went idle - bool isKeepAliveEnabled = ( keepAliveTimer_ != 0 && keepAliveTimer_->isActive() ); - emit contactLeftChat( handle, isKeepAliveEnabled && keepAlivesRemaining_ < 1 ); + + if( ! KMESS_NULL(contact) ) + { + // The conversation went idle if isExpired() returns true + emit contactLeftChat( contact, isExpired() ); + } } #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL else @@ -489,16 +486,16 @@ void MsnSwitchboardConnection::contactLeft(const QString& handle) // Convert an html format (#RRGGBB) color to an msn format (BBGGRR) color -QString MsnSwitchboardConnection::convertHtmlColorToMsnColor(const QString &color) const +const QString MsnSwitchboardConnection::convertHtmlColorToMsnColor( const QString &color ) const { #ifdef KMESSTEST KMESS_ASSERT( color.length() == 7 ); #endif // Get the color components - QString red = color.mid(1, 2); - QString green = color.mid(3, 2); - QString blue = color.mid(5, 2); + const QString& red ( color.mid(1, 2) ); + const QString& green( color.mid(3, 2) ); + const QString& blue ( color.mid(5, 2) ); // Reassemble the color if ( blue != "00" ) @@ -522,7 +519,7 @@ QString MsnSwitchboardConnection::convertHtmlColorToMsnColor(const QString &colo // Convert and msn format color (BBGGRR) to an html format (#RRGGBB) color -QString MsnSwitchboardConnection::convertMsnColorToHtmlColor(QString color) const +const QString MsnSwitchboardConnection::convertMsnColorToHtmlColor( QString& color ) const { // If the color isn't present, use black if( color == "0" ) @@ -542,9 +539,9 @@ QString MsnSwitchboardConnection::convertMsnColorToHtmlColor(QString color) cons } // Get the color components - QString blue = color.mid( 0, 2 ); - QString green = color.mid( 2, 2 ); - QString red = color.mid( 4, 2 ); + const QString& blue ( color.mid( 0, 2 ) ); + const QString& green( color.mid( 2, 2 ) ); + const QString& red ( color.mid( 4, 2 ) ); // Reassemble the components return "#" + red + green + blue; @@ -553,7 +550,7 @@ QString MsnSwitchboardConnection::convertMsnColorToHtmlColor(QString color) cons // Make a list of the contacts in the chat -QStringList MsnSwitchboardConnection::getContactsInChat() const +const QStringList MsnSwitchboardConnection::getContactsInChat() const { if( contactsInChat_.isEmpty() ) { @@ -631,11 +628,11 @@ void MsnSwitchboardConnection::gotBye(const QStringList& command) // Received the initial roster information for new contacts joining a session. void MsnSwitchboardConnection::gotIro(const QStringList& command) { - QString handle = command[4].toLower(); - QString friendlyName = QUrl::fromPercentEncoding( command[5].toUtf8() ); - uint capabilities = command[6].toUInt(); + const QString& handle ( command[4].toLower() ); + QString friendlyName( QUrl::fromPercentEncoding( command[5].toUtf8() ) ); + uint capabilities = command[6].toUInt(); - QString altFriendlyName = currentAccount_->getContactFriendlyNameByHandle( handle, STRING_ORIGINAL ); + const QString& altFriendlyName( currentAccount_->getContactFriendlyNameByHandle( handle, STRING_CLEANED ) ); if( ! altFriendlyName.isEmpty() ) { friendlyName = altFriendlyName; @@ -649,11 +646,11 @@ void MsnSwitchboardConnection::gotIro(const QStringList& command) // Received notification of a new client in the session. void MsnSwitchboardConnection::gotJoi(const QStringList& command) { - QString handle = command[1].toLower(); - QString friendlyName = QUrl::fromPercentEncoding( command[2].toUtf8() ); - uint capabilities = command[3].toUInt(); + const QString& handle ( command[1].toLower() ); + QString friendlyName( QUrl::fromPercentEncoding( command[2].toUtf8() ) ); + uint capabilities = command[3].toUInt(); - QString altFriendlyName = currentAccount_->getContactFriendlyNameByHandle( handle, STRING_ORIGINAL ); + const QString& altFriendlyName( currentAccount_->getContactFriendlyNameByHandle( handle, STRING_CLEANED ) ); if( ! altFriendlyName.isEmpty() ) { friendlyName = altFriendlyName; @@ -705,31 +702,65 @@ void MsnSwitchboardConnection::gotNak(const QStringList& command) return; } - QString sender = unAcked.message.getValue( "To" ); - if( sender.isNull() ) + QString sender; + if( unAcked.message.hasField( "To" ) ) + { + sender = unAcked.message.getValue( "To" ); + } + else if( unAcked.message.hasField( "P2P-Dest" ) ) { sender = unAcked.message.getValue( "P2P-Dest" ); - if( sender.isNull() ) - { - return; - } } - - ContactBase *contact = CurrentAccount::instance()->getContactByHandle( sender ); - if( contact == 0 ) +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + else { + kDebug() << "Received notice of undelivered message for all contacts."; + } +#endif + + // Don't display failure notices for P2P or other kinds of MIME messages + const QString& contentType( unAcked.message.getValue( "Content-Type" ) ); + if( ! contentType.startsWith( "text/plain" ) + && ! contentType.startsWith( "text/x-msnmsgr-datacast" ) + && ! contentType.startsWith( "image/gif" ) ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + kDebug() << "Not displaying undelivered message for a service message of type" << contentType; +#endif return; } - QString friendlyName = contact->getFriendlyName(); - // Just be sure the switchboard is linked to a chat window. // For example, the user closes the chat and receives a NAK before the switchboard is closed. emit requestChatWindow( this ); - emit contactJoinedChat( sender, friendlyName ); - // Let the user know that a message wasn't delivered - emit sendingFailed( unAcked.message.getBody() ); + // The message could not be delivered to a specific recipient + if( ! sender.isEmpty() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + kDebug() << "Signaling sending failure for contact" << sender; +#endif + ContactBase *contact = CurrentAccount::instance()->getContactByHandle( sender ); + if( KMESS_NULL(contact) ) + { + return; + } + + emit contactJoinedChat( contact ); + + // Let the user know that the message wasn't delivered + emit sendingFailed( sender, unAcked.message ); + } + else + { +#ifdef KMESSDEBUG_SWITCHBOARD_ACKS + kDebug() << "Signaling sending failure for all participants"; +#endif + // The message couldn't be delivered to any of the recipients: + // let the user know that the message wasn't delivered, + // but give a wildcard sender + emit sendingFailed( "*", unAcked.message ); + } } @@ -768,7 +799,7 @@ void MsnSwitchboardConnection::gotUsr(const QStringList& command) connectionState_ = SB_INVITING_CONTACTS; // Now call the other user to the conversation. - sendCommand( "CAL", firstContact_ + "\r\n" ); + sendCommand( "CAL", firstContact_ ); // If there are other pending invites, send them now if( pendingInvitations_.count() > 0 ) @@ -800,9 +831,8 @@ bool MsnSwitchboardConnection::initialize( QString handle ) currentAccount_ = CurrentAccount::instance(); // Determine which payload commands can be received by the Switchboard Connection - QStringList payloadCommands; - payloadCommands << "MSG" // Chat message - ; + const QStringList payloadCommands( "MSG" ); + setAcceptedPayloadCommands( payloadCommands ); firstContact_ = lastContact_ = handle; @@ -814,7 +844,7 @@ bool MsnSwitchboardConnection::initialize( QString handle ) // Invite a contact into the chat -void MsnSwitchboardConnection::inviteContact( QString handle ) +void MsnSwitchboardConnection::inviteContact( const QString& handle ) { if( handle.isEmpty() ) { @@ -835,7 +865,7 @@ void MsnSwitchboardConnection::inviteContact( QString handle ) return; } - sendCommand("CAL", handle + "\r\n"); + sendCommand( "CAL", handle ); #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL kDebug() << "Invited contact " << handle; @@ -886,8 +916,9 @@ bool MsnSwitchboardConnection::isExclusiveChatWithContact(const QString& handle) // Also check for last contact, contact can be re-invited to resume the session. // Previously, one contact was always left in the contactsInChat_ list. - bool result = (contactsInChat_.count() == 1 && contactsInChat_[0] == handle) - || (contactsInChat_.count() == 0 && lastContact_ == handle); + int count = contactsInChat_.count(); + bool result = ( count == 1 && contactsInChat_[0] == handle) + || ( count == 0 && lastContact_ == handle); #ifdef KMESSDEBUG_SWITCHBOARD_CONTACTS kDebug() << "returning " << ( result ? "true" : "false" ); @@ -898,6 +929,15 @@ bool MsnSwitchboardConnection::isExclusiveChatWithContact(const QString& handle) +// Check whether the connection is idle +bool MsnSwitchboardConnection::isExpired() const +{ + // If we're using the keepalive mechanism, and there are no keepalives left, then the session has expired. + return ( ! isConnected() || ( keepAliveTimer_ != 0 && keepAlivesRemaining_ < 1 ) ); +} + + + // Check whether the switchboard is currently not connected, nor trying to connect. bool MsnSwitchboardConnection::isInactive() const { @@ -945,40 +985,6 @@ void MsnSwitchboardConnection::parseCommand(const QStringList& command) { gotUsr( command ); } - else if ( command[0] == "216" || command[0] == "217" ) - { - // Only send the message when we're linked to a ChatWindow. - // There's no way of knowing from which contact call this error came from. - if( backgroundConnection_ ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "ignoring message 'the person is offline or invisible' in background chats."; -#endif - return; - } - - emit chatMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_NOTICE, - true, - i18n("This person is offline or invisible."), - QString::null ) ); - - // CAL invite failed. - // Make sure sendMimeMessageWhenReady() does not hang on this state. - if( connectionState_ == SB_INVITING_CONTACTS && contactsInChat_.isEmpty() ) - { - connectionState_ = SB_CONTACTS_LEFT; - } - } - else if ( command[0] == "282" ) - { - // Got it once when I sent a bad P2P message or something. - kWarning() << "got the mysterious 282 error response (contacts=" << contactsInChat_ << ")."; - } - else if ( command[0] == "911" ) - { - kDebug() << "authentication failed."; - } else { kDebug() << "got unhandled command " << command[0] << " (contacts=" << contactsInChat_ << ")."; @@ -992,10 +998,10 @@ void MsnSwitchboardConnection::parseChatMessage( const QString &contactHandle, c { // The P4-Context field can override the default contact name. // It's typically used by plugins of the official client (e.g. Xiaoi's Qun). - QString messageFriendlyName = friendlyName; + QString messageFriendlyName( friendlyName ); if( message.hasField( "P4-Context" ) ) { - QString friendlyNameP4 = message.getValue( "P4-Context" ); + const QString& friendlyNameP4( message.getValue( "P4-Context" ) ); if( ! friendlyNameP4.isEmpty() ) { messageFriendlyName = friendlyNameP4; @@ -1007,9 +1013,9 @@ void MsnSwitchboardConnection::parseChatMessage( const QString &contactHandle, c #endif // Get the font and color from the format string - QString family = message.getSubValue( "X-MMS-IM-Format", "FN" ); - QString effects = message.getSubValue( "X-MMS-IM-Format", "EF" ); - QString color = message.getSubValue( "X-MMS-IM-Format", "CO" ); + QString family( message.getSubValue( "X-MMS-IM-Format", "FN" ) ); + const QString& effects( message.getSubValue( "X-MMS-IM-Format", "EF" ) ); + QString color( message.getSubValue( "X-MMS-IM-Format", "CO" ) ); family = QUrl::fromPercentEncoding( family.toUtf8() ); color = convertMsnColorToHtmlColor( color ); @@ -1052,32 +1058,30 @@ void MsnSwitchboardConnection::parseClientCapsMessage( const QString &contactHan // N: not logging // Retrieve client identifier from the message - MimeMessage subMessage( message.getBody() ); - QString clientName = subMessage.getValue("Client-Name"); + const MimeMessage& subMessage( message.getBody() ); + const QString& clientName( subMessage.getValue("Client-Name") ); // store in contact extension, except if contact is an InvitedContact ContactBase *contact = currentAccount_->getContactByHandle( contactHandle ); if( KMESS_NULL(contact) ) return; // should always be a InvitedContact here if not in the list. - + contact->setClientName( clientName ); } // Parse a datacast message (e.g. nudge or voice clip) -void MsnSwitchboardConnection::parseDatacastMessage(const QString &contactHandle, const MimeMessage &message) +void MsnSwitchboardConnection::parseDatacastMessage( const QString &contactHandle, const MimeMessage &message ) { - int dataType = message.getValue("ID").toInt(); - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Parsing datacast message (ID=" << dataType << ")"; -#endif - // Get the contact ContactBase *contact = CurrentAccount::instance()->getContactByHandle( contactHandle ); if( KMESS_NULL(contact) ) return; - QString contactFriendlyName = contact->getFriendlyName(); + int dataType = message.getValue( "ID" ).toInt(); + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Parsing datacast message (ID=" << dataType << ")"; +#endif // Request a chat window when the chat is still in the background. if( backgroundConnection_ ) @@ -1087,55 +1091,62 @@ void MsnSwitchboardConnection::parseDatacastMessage(const QString &contactHandle #endif backgroundConnection_ = false; emit requestChatWindow( this ); - emit contactJoinedChat( contactHandle, contactFriendlyName ); + emit contactJoinedChat( contact ); } // Each ID has a different meaning. - if(dataType == 1) - { - // A nudge - emit receivedNudge(contactHandle); - } - else if(dataType == 2) + switch( dataType ) { + case 1: // A nudge + emit receivedNudge( contact ); + break; + + case 2: // A wink #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Datacast message contains an msn object (wink), signalling ChatMaster to download it."; + kDebug() << "Datacast message contains an msn object (wink), signalling ChatMaster to download it."; #endif - // A wink from a contact - emit gotMsnObject(message.getValue("Data"), contactHandle); - } - else - { - // ID 3 is used for voice clips - // ID 4 is used for action messages (MSNC6) - // Not supported yet - kDebug() << "got unhandled datacast message type (ID=" << dataType << " contact=" << contactHandle << ")."; - emit chatMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_ERROR, - true, - i18n("The contact initiated a MSN7 feature KMess can't handle yet."), - contactHandle, - contactFriendlyName ) ); + // A wink from a contact + emit gotMsnObject( message.getValue( "Data" ), contactHandle ); + break; + + case 4: // An action message + // Not supported yet + kDebug() << "Received unhandled action message from contact" << contactHandle; + + emit showWarning( WARNING_UNSUPPORTED_ACTIONMESSAGE, contact ); + break; + + case 3: // A voice clip + // Not supported yet + kDebug() << "Received unhandled voice clip from contact" << contactHandle; + + emit showWarning( WARNING_UNSUPPORTED_VOICECLIP, contact ); + break; + + default: // Completely unknown message type + // Not supported yet + kDebug() << "Received unhandled datacast message (ID" << dataType << ") from contact" << contactHandle << ":"; + message.print(); // So that we may discover what it is + + emit showWarning( WARNING_UNSUPPORTED_UNKNOWN, contact ); + break; } } // Parse an emoticon message -void MsnSwitchboardConnection::parseEmoticonMessage(const QString &contactHandle, const QString &messageBody) +void MsnSwitchboardConnection::parseEmoticonMessage( const QString &contactHandle, const QString &messageBody ) { + // Get the contact + ContactBase *contact = currentAccount_->getContactByHandle( contactHandle ); + if( KMESS_NULL(contact) ) return; + #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL kDebug() << "Received custom emoticon list for " << contactHandle << "."; #endif - QString emoticonCode; - QString msnObjectData; - - // Get the contact - ContactBase *contact = currentAccount_->getContactByHandle(contactHandle); - if( KMESS_NULL(contact) ) return; - // Request a chat window when the chat is still in the background. if( backgroundConnection_ ) { @@ -1144,15 +1155,17 @@ void MsnSwitchboardConnection::parseEmoticonMessage(const QString &contactHandle #endif backgroundConnection_ = false; emit requestChatWindow( this ); - emit contactJoinedChat( contact->getHandle(), contact->getFriendlyName() ); + emit contactJoinedChat( contact ); } // Emoticon data consists of a tab-separated list of pairs, each formed by an emoticon definition and the related msn object: // [Shortcut] TAB [MSN Object] TAB [Shortcut] TAB [MSN Object] TAB ... // |___first emoticon________| |____second emoticon______| + QString emoticonCode; + QString msnObjectData; // Extract emoticon definitions and msn objects - QStringList msnObjects = messageBody.trimmed().split("\t"); + QStringList msnObjects( messageBody.trimmed().split("\t") ); for( QStringList::Iterator it = msnObjects.begin(); it != msnObjects.end(); ++it ) { emoticonCode = *it; @@ -1182,7 +1195,7 @@ void MsnSwitchboardConnection::parseEmoticonMessage(const QString &contactHandle #endif // Store the emoticon code for the contact. - MsnObject msnObject(msnObjectData); + const MsnObject& msnObject(msnObjectData); contact->addEmoticonDefinition(emoticonCode, msnObject.getDataHash()); // Ask the ChatMaster to download emoticons. @@ -1192,17 +1205,67 @@ void MsnSwitchboardConnection::parseEmoticonMessage(const QString &contactHandle +// Parse an error command +void MsnSwitchboardConnection::parseError( const QStringList& command, const QByteArray &payloadData ) +{ + // TODO: Check if any payload is delivered for these errors: it may contain + // info about the error. For 215 it may specify which contact was invited + // twice. + if ( command[0] == "215" ) + { + kWarning() << "A contact was invited twice!"; + } + else if ( command[0] == "712" ) + { + kWarning() << "The SB session is overloaded."; + } + else if( command[0] == "216" || command[0] == "217" ) + { + // The contact is invisible now, send Offline IMs + if( backgroundConnection_ ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Ignoring a 'contact is offline/invisible' error in background chats."; +#endif + return; + } + + // CAL invite failed. + // Make sure sendMimeMessageWhenReady() does not hang on this state. + if( connectionState_ == SB_INVITING_CONTACTS && contactsInChat_.isEmpty() ) + { + connectionState_ = SB_CONTACTS_LEFT; + } + } + else if ( command[0] == "282" ) + { + // Got it once when I sent a bad P2P message or something. + kWarning() << "got the mysterious 282 error response (contacts=" << contactsInChat_ << ")."; + } + else if ( command[0] == "911" ) + { + kDebug() << "authentication failed."; + } + else + { + // Relay the error detection to the base class + MsnConnection::parseError( command, payloadData ); + } +} + + + // Parse a message command void MsnSwitchboardConnection::parseMimeMessage(const QStringList& command, const MimeMessage &message) { // Get the message type from the head - QString contentType = message.getSubValue( "Content-Type" ); + const QString& contentType( message.getSubValue( "Content-Type" ) ); #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL kDebug() << "Received mime message of type '" << contentType << "'."; #endif // Get the sender's handle and friendly name - QString contactHandle = command[1]; + const QString& contactHandle( command[1] ); QString friendlyName; QString contactPicture; @@ -1225,9 +1288,6 @@ void MsnSwitchboardConnection::parseMimeMessage(const QStringList& command, cons if( backgroundConnection_ ) { if( contentType == "text/plain" - || contentType == "text/x-msmsgsinvite" - || contentType == "text/x-mms-emoticon" - || contentType == "text/x-mms-animemoticon" || contentType == "text/x-msnmsgr-datacast" || contentType == "image/gif" ) { @@ -1236,7 +1296,7 @@ void MsnSwitchboardConnection::parseMimeMessage(const QStringList& command, cons #endif backgroundConnection_ = false; emit requestChatWindow( this ); - emit contactJoinedChat( contactHandle, friendlyName ); + emit contactJoinedChat( contact ); } } @@ -1255,7 +1315,7 @@ void MsnSwitchboardConnection::parseMimeMessage(const QStringList& command, cons { // This is a mime application message, the old format for invitations. // Extract the actual MIME message from the body of the Mime container, pass it to the ChatMaster/ApplicationList. - MimeMessage subMessage( message.getBody() ); + const MimeMessage& subMessage( message.getBody() ); emit gotMessage( subMessage, contactHandle ); } else if( contentType == "application/x-msnmsgrp2p" ) @@ -1271,7 +1331,7 @@ void MsnSwitchboardConnection::parseMimeMessage(const QStringList& command, cons else if( contentType == "text/x-msnmsgr-datacast" ) { // This is a datacast message, contact wants to send a nudge or voice clip - MimeMessage subMessage( message.getBody() ); + const MimeMessage& subMessage( message.getBody() ); parseDatacastMessage( contactHandle, subMessage ); } else if( contentType == "image/gif" ) @@ -1297,7 +1357,7 @@ void MsnSwitchboardConnection::parseMimeMessage(const QStringList& command, cons } // Messages which are part of the switchboard session management, will not be considered "activity" - if( contentType != "text/x-clientcaps" ) + if( contentType != "text/x-clientcaps" && contentType != "text/x-keepalive" ) { // Signal presence of activity activity(); @@ -1321,7 +1381,7 @@ void MsnSwitchboardConnection::parseP2PMessage( const QString &contactHandle, co { // The switchboad is a "broadcast" channel for all messages, // so in a multi-chat the message could be for an other contact. - QString p2pDest = message.getValue("P2P-Dest"); + const QString& p2pDest( message.getValue("P2P-Dest") ); if( p2pDest.isEmpty() ) { // P2P dest is empty if we produce an error when a session is not initiated yet (MSNSLP header also has To: set) @@ -1341,7 +1401,7 @@ void MsnSwitchboardConnection::parseP2PMessage( const QString &contactHandle, co // Extract the actual P2P message from the body of the Mime container. // Dispatch the message to the central ApplicationList of the Contact (maintained by ChatMaster). - P2PMessage subMessage( message.getBinaryBody() ); + const P2PMessage& subMessage( message.getBinaryBody() ); emit gotMessage( subMessage, contactHandle ); } @@ -1360,16 +1420,16 @@ void MsnSwitchboardConnection::parseTypingMessage( const QString &/*contactHandl } // The contact informs it's typing a normal message - QString typingUser = message.getValue( "TypingUser" ); + const QString& typingUser( message.getValue( "TypingUser" ) ); - // Check the contact list for a more current friendly name - QString typingName = currentAccount_->getContactFriendlyNameByHandle( typingUser ); - if( typingName.isEmpty() ) + ContactBase *contact = currentAccount_->getContactByHandle( typingUser ); + + if( KMESS_NULL(contact) ) { - typingName = typingUser; + return; } - emit contactTyping( typingUser, typingName ); + emit contactTyping( contact ); } @@ -1382,7 +1442,7 @@ void MsnSwitchboardConnection::sendApplicationMessage( const MimeMessage &messag #endif // Check which type of message is sent - QString contentType = message.getValue("Content-Type"); + const QString& contentType( message.getValue("Content-Type") ); if( contentType == "application/x-msnmsgrp2p" ) { // Message contains binary P2P message data @@ -1415,7 +1475,7 @@ void MsnSwitchboardConnection::sendApplicationMessage( const MimeMessage &messag * If there is at least one custom emoticon in our message, also send a message to tell our contact's clients * that they have to download from us the corresponding pictures. */ -void MsnSwitchboardConnection::sendChatMessage(QString text) +void MsnSwitchboardConnection::sendChatMessage( const QString& text ) { int maxSendableSingleMessageLength = 1400; @@ -1430,12 +1490,13 @@ void MsnSwitchboardConnection::sendChatMessage(QString text) // there will be custom emoticons in the next message. QString code, pictureFile; QString emoticonObjects; - int lastPos = 0; - int matchStart = 0; - EmoticonManager *manager = EmoticonManager::instance(); - const QRegExp &emoticonRegExp = manager->getPattern( true ); - QMap emoticonPictures = manager->getFileNames( true ); - QString emoticonThemePath = manager->getThemePath( true ); + QStringList addedEmoticons; + int lastPos = 0; + int matchStart = 0; + EmoticonManager *manager = EmoticonManager::instance(); + const QRegExp& emoticonRegExp( manager->getPattern( true ) ); + const QHash& emoticonPictures( manager->getFileNames( true ) ); + const QString& emoticonThemePath( manager->getThemePath( true ) ); // We'll loop until we reach the end of the string or there are no more emoticons to parse if( ! emoticonRegExp.isEmpty() ) @@ -1451,22 +1512,29 @@ void MsnSwitchboardConnection::sendChatMessage(QString text) // Find out what emoticon has matched code = text.mid( matchStart, emoticonRegExp.matchedLength() ); + // Find where the emoticon code ends and the image corresponding to that code lastPos = matchStart + emoticonRegExp.matchedLength(); pictureFile = emoticonPictures[ code ]; - /* - // NOTE: Behavior changed since WLM 8+, emoticon data must be sent every time. - // If we've already sent this emoticon in a previous message, don't send it again - if( sentEmoticons_.contains( code ) ) + // Do not add emoticons to the list more than once + if( addedEmoticons.contains( code ) ) { continue; } - else + + // We cannot send more than 7 different custom emoticons in each message: skip the other ones. + // TODO add some visual confirmation or message about this. + if( addedEmoticons.count() >= 7 ) { - sentEmoticons_.append( code ); + emit showWarning( WARNING_TOO_MANY_EMOTICONS, 0 ); + break; } - */ + + addedEmoticons.append( code ); + + // NOTE: Behavior changed since WLM 8+, emoticon data must be sent every time. + // Before, we could send any emoticon's msnobject just once per session. // No match? Strange.. but go on anyways if( pictureFile.isEmpty() ) @@ -1494,7 +1562,7 @@ void MsnSwitchboardConnection::sendChatMessage(QString text) } // Read the file and create an MSNObject of the emoticon - QByteArray data = iFile.readAll(); + const QByteArray& data( iFile.readAll() ); iFile.close(); MsnObject test( currentAccount_->getHandle(), pictureFile, QString::null, MsnObject::EMOTICON, data ); @@ -1522,18 +1590,18 @@ void MsnSwitchboardConnection::sendChatMessage(QString text) // Then send the real text message // Get the formatting properties and convert them to MSN's IM format - QFont font = currentAccount_->getFont(); - QString fontFamily = QUrl::toPercentEncoding( font.family() ); - QString color = convertHtmlColorToMsnColor( currentAccount_->getFontColor() ); + const QFont& font( currentAccount_->getFont() ); + const QString& fontFamily( QUrl::toPercentEncoding( font.family() ) ); + const QString& color ( convertHtmlColorToMsnColor( currentAccount_->getFontColor() ) ); // Determine effects - QString effects = ""; - if ( font.bold() ) effects += "B"; - if ( font.italic() ) effects += "I"; - if ( font.underline() ) effects += "U"; + QString effects; + if( font.bold() ) effects += "B"; + if( font.italic() ) effects += "I"; + if( font.underline() ) effects += "U"; // Determine text direction - QString rtl = text.isRightToLeft() ? "; RL=1" : ""; + const QString& rtl( text.isRightToLeft() ? "; RL=1" : "" ); // Create the message MimeMessage message; @@ -1548,9 +1616,8 @@ void MsnSwitchboardConnection::sendChatMessage(QString text) { // Check if the remote clients support the recieving of huge messages. ContactBase *contact; - QString handle; bool capable = true; - foreach( handle, contactsInChat_ ) + foreach( const QString &handle, contactsInChat_ ) { contact = currentAccount_->getContactByHandle( handle ); if( ! contact->hasCapability( ContactBase::MSN_CAP_MULTI_PACKET ) ) @@ -1572,7 +1639,7 @@ void MsnSwitchboardConnection::sendChatMessage(QString text) int pos = 0; int prevPos = 0; QString messagePart; - QString body = message.getBody(); + const QString& body( message.getBody() ); int parts = (int) ceil( ( (float) bodyLength / (float) maxSendableSingleMessageLength ) ); @@ -1617,10 +1684,9 @@ void MsnSwitchboardConnection::sendChatMessage(QString text) void MsnSwitchboardConnection::sendInk( const QByteArray& ink ) { bool capable = true; - QString handle; ContactBase *contact; - foreach( handle, contactsInChat_ ) + foreach( const QString &handle, contactsInChat_ ) { contact = currentAccount_->getContactByHandle( handle ); @@ -1679,6 +1745,12 @@ void MsnSwitchboardConnection::sendKeepAlive() keepAliveTimer_->stop(); } + // Close background connections immediately when the timer expires + if( backgroundConnection_ ) + { + closeConnectionLater( true ); + } + return; } else @@ -1686,6 +1758,15 @@ void MsnSwitchboardConnection::sendKeepAlive() keepAlivesRemaining_--; } + // Do not send keepalives for background connections, there's no need for it + if( backgroundConnection_ ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE + kDebug() << "Not sending keep alives for background connections."; +#endif + return; + } + // Sending messages to keep a connection open makes no sense if there's no connection, isn't it if( ! isConnected() ) { @@ -1707,7 +1788,7 @@ void MsnSwitchboardConnection::sendKeepAlive() } #ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE - kDebug() << "Sending a keep alive message (" << keepAlivesRemaining_ << " left before close)."; + kDebug() << "Sending a keep alive message," << keepAlivesRemaining_ << "left before expiration."; #endif // Build the keepalive message @@ -1749,140 +1830,53 @@ void MsnSwitchboardConnection::sendMimeMessageWhenReady(AckType ackType, const M // Clean cache of old entries, it does not need to run with every storeMessage..() call. cleanUnackedMessages(); + + return; } - else + + // There's no active connection, store as pending message +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Chat is not active, queueing message to send later."; + kDebug() << "Status info -- Connected:" << isConnected() + << "Contacts in chat:" << contactsInChat_ + << "Status code:" << connectionState_; +#endif + + // Store the message + pendingMessages_.append( new QPair(ackType, message) ); + + + // See what needs to be done to restore the chat. + if( isConnected() ) { - // otherwise, store as pending message -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Chat is not active, queueing message to send later."; -#endif - - // Store the message - pendingMessages_.append( new QPair(ackType, message) ); - - - // See what needs to be done to restore the chat. - // HACK: Added here the SB_CONNECTING test: when we're connected but the USR has not been sent yet, - // isConnected() returns true, so (for example) the CAL is sent before the USR, causing a disconnect. - // TODO Implement these checks as a switch, makes the method more readable - if( ! isConnected() || connectionState_ == SB_CONNECTING ) + switch( connectionState_ ) { - // The connection was closed, request a new one from the notification server. - // It's not possible to simply re-open it, because we need a new authcookie for the USR command. - if( connectionState_ == SB_REQUESTING_CHAT ) - { + case SB_AUTHORIZING: + // Connected but contacts are not in the chat yet. + // See if we need to invite the contacts + #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Already waiting for MsnNotificationConnection to request a new chat."; + kDebug() << "Already waiting for the connection to be authorized..."; #endif - } - else if( connectionState_ == SB_CONNECTING ) - { + return; + + case SB_CONNECTING: + // Still waiting for a connection to the switchboard server. + // This condition verifies when we're connected but the USR has not been sent yet: + // without it, isConnected() returns true, so any unsent message gets sent before USR, causing a disconnection. + #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL kDebug() << "Already waiting for connection to establish..."; #endif - } - else if( connectionState_ == SB_CHAT_STARTED ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Contact disconnected while joining, delivering error message."; -#endif - // Do not notify errors for background connections - if( backgroundConnection_ ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_ACKS - kDebug() << "Not displaying undelivered message for background chats."; -#endif - } - else if( ! message.getValue( "To" ).isNull() ) - { - // Tell the user that this message was not received - emit chatMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_ERROR, - false, - i18n( "The message \"%1\" was not received!", message.getBody() ), - message.getValue( "To" ) ) ); - } - } - else - { - // Send offline messages if the contact is not online (and the switchboard isn't open) - if( connectionState_ == SB_DISCONNECTED && ! lastContact_.isEmpty() ) - { - bool isPlainText = message.getValue( "Content-Type" ).startsWith( "text/plain" ); - ContactBase *contact = currentAccount_->getContactByHandle( lastContact_ ); + return; - // If the message contains text, and the user's status is invisible OR the contact is not connected, send an - // offline message. - if( ( contact && contact->isOffline() ) || currentAccount_->getStatus() == STATUS_INVISIBLE ) - { - // This is required to avoid trying to send notification messages (nudges) or other non-text messages - if( ! isPlainText ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Ignoring message of type" << message.getValue( "Content-Type" ) << "within OIM chat."; -#endif - return; - } - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Sending offline message..."; -#endif - // Only load the OIM service on demand - if( offlineImService_ == 0 ) - { - offlineImService_ = new OfflineImService( this ); - - connect( offlineImService_, SIGNAL( sendMessageFailed( QString, QString ) ), - this , SLOT ( slotSendOfflineImFailed( QString, QString ))); - } - - // Send the message (only the text contained in the body) - offlineImService_->sendMessage( lastContact_, message.getBody() ); - return; - } - } - - // Return to avoid problems with requesting of one new switchboard - // and connection state change - if( currentAccount_->getStatus() == STATUS_INVISIBLE ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Don't request new switchboard"; -#endif - return; - } - -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Connection is closed, requesting a new chat from the notification server..."; -#endif -#ifdef KMESSTEST - KMESS_ASSERT( connectionState_ == SB_DISCONNECTED ); -#endif - - connectionState_ = SB_REQUESTING_CHAT; - - // Request a new switchboard session - emit requestNewSwitchboard( lastContact_ ); - } - } - else - { - // Connected but contacts are not in the chat yet. - // See if we need to invite the contacts - if( connectionState_ == SB_AUTHORIZING ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL - kDebug() << "Already waiting for the connection to authorize..."; -#endif - } - else if( connectionState_ == SB_INVITING_CONTACTS ) - { + case SB_INVITING_CONTACTS: #ifdef KMESSDEBUG_SWITCHBOARD_GENERAL kDebug() << "Already waiting for contacts to join the chat..."; #endif - } - else - { + return; + + default: #ifdef KMESSTEST KMESS_ASSERT( connectionState_ == SB_CONTACTS_LEFT ); #endif @@ -1898,7 +1892,7 @@ void MsnSwitchboardConnection::sendMimeMessageWhenReady(AckType ackType, const M kDebug() << "All contacts left the chat, calling the contact from the P2P-Dest field."; #endif connectionState_ = SB_INVITING_CONTACTS; - sendCommand( "CAL", message.getValue("P2P-Dest") + "\r\n"); + sendCommand( "CAL", message.getValue("P2P-Dest") ); } else { @@ -1913,23 +1907,109 @@ void MsnSwitchboardConnection::sendMimeMessageWhenReady(AckType ackType, const M } connectionState_ = SB_INVITING_CONTACTS; - sendCommand( "CAL", lastContact_ + "\r\n"); + sendCommand( "CAL", lastContact_ ); } - } + + break; } - } -} + + return; + } // if( isConnected() ) + // There is no active connection. + switch( connectionState_ ) + { + case SB_REQUESTING_CHAT: + // The connection was closed, request a new one from the notification server. + // It's not possible to simply re-open it, because we need a new authcookie for the USR command. -// There was a problem with sending of oims -void MsnSwitchboardConnection::slotSendOfflineImFailed( QString to, QString message ) -{ - emit chatMessage( ChatMessage( ChatMessage::TYPE_SYSTEM, - ChatMessage::CONTENT_SYSTEM_ERROR, - false, - i18n( "The message \"%1\" was not received!", message ), - to ) ); +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Already waiting for MsnNotificationConnection to request a new chat..."; +#endif + return; + + case SB_CHAT_STARTED: + // Chat was open but the connection has been closed: + // this condition verifies in case of a network disconnect, when we've received a BYE or all contacts + // have left but the connection state has not been changed yet, and other similar improbable events. + // Simply restore it. + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Connection was closed unexpectedly."; +#endif + + // Reset the connection's status + connectionState_ = SB_DISCONNECTED; + break; // Will run the connection reestablishment code below + + case SB_DISCONNECTED: + { + // Send offline messages if the contact is not online + + // Should never happen, but you never know. + if( lastContact_.isEmpty() ) + { + kWarning() << "Cannot find a contact to send offline messages to."; + return; + } + + // Only send chat messages + const QString& contentType( message.getValue( "Content-Type" ) ); + if( ! contentType.startsWith( "text/plain" ) ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Ignoring message of type" << contentType << "in an offline messaging session."; +#endif + return; + } + + const ContactBase *contact = currentAccount_->getContactByHandle( lastContact_ ); + + // Only send the offline message if the contact definitely appears to be offline. + // If it's online, we'll just reestablish a switchboard connection to it. + if( ! contact || ! contact->isOffline() ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Not sending offline message to an" << (contact?"online":"unknown") << "contact."; +#endif + break; + } + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Sending offline message..."; +#endif + // Only load the OIM service on demand + if( offlineImService_ == 0 ) + { + offlineImService_ = new OfflineImService( this ); + + connect( offlineImService_, SIGNAL( sendMessageFailed(const QString&,const QString&) ), + this, SIGNAL( sendingFailed(const QString&,const QString&) ) ); + } + + // Send the message (only the text contained in the body) + offlineImService_->sendMessage( lastContact_, message.getBody() ); + return; + } + + default: + // For other states, just try reestablishing a connection. + + break; + } // Switch for connectionState_ ends here + +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Connection is closed, requesting a new chat from the notification server..."; +#endif +#ifdef KMESSTEST + KMESS_ASSERT( connectionState_ == SB_DISCONNECTED ); +#endif + + connectionState_ = SB_REQUESTING_CHAT; + + // Request a new switchboard session + emit requestNewSwitchboard( lastContact_ ); } @@ -1937,10 +2017,14 @@ void MsnSwitchboardConnection::slotSendOfflineImFailed( QString to, QString mess // Send messages that weren't sent because a contact had to be re-called void MsnSwitchboardConnection::sendPendingMessages() { -#ifdef KMESSTEST - KMESS_ASSERT( connectionState_ == SB_CHAT_STARTED ); + // Do nothing if we are not connected. + if( ! isConnected() || connectionState_ != SB_CHAT_STARTED ) + { +#ifdef KMESSDEBUG_SWITCHBOARD_GENERAL + kDebug() << "Skipping message sending, the connection is not ready."; #endif - + return; + } // A contact should be connected already, but check to make sure // The switchboard should still be (re-)initializing @@ -2019,6 +2103,28 @@ void MsnSwitchboardConnection::sendTypingMessage() +// Send wink +void MsnSwitchboardConnection::sendWink( const QString& msnobject ) +{ + MimeMessage message; + message.addField("MIME-Version", "1.0"); + message.addField("Content-Type", "text/x-msnmsgr-datacast"); + message.setBody( "ID: 2\r\nData: " + msnobject + "\r\n" ); + + MultiPacketMessage multiMessage( message ); + sendMimeMessageWhenReady( ACK_NAK_ONLY, multiMessage ); +} + + + +// Set true if the user request the starting of the chat +void MsnSwitchboardConnection::setUserStartedChat( bool startedByUser ) +{ + userStartedChat_ = startedByUser; +} + + + // An ApplicationList object indicated it aborted all it's applications. void MsnSwitchboardConnection::slotApplicationsAborted(const QString &handle) { @@ -2088,12 +2194,12 @@ void MsnSwitchboardConnection::slotConnected() if( userStartedChat_ ) { // This is a user-initiated chat // Set the usr information to the server. - sendCommand( "USR", currentAccount_->getHandle() + " " + authorization_ + "\r\n" ); + sendCommand( "USR", currentAccount_->getHandle() + " " + authorization_ ); } else { // This is a contact-initiated chat // Answer the chat with the authorization - sendCommand( "ANS", currentAccount_->getHandle() + " " + authorization_ + " " + chatId_ + "\r\n" ); + sendCommand( "ANS", currentAccount_->getHandle() + " " + authorization_ + " " + chatId_ ); } } @@ -2102,18 +2208,35 @@ void MsnSwitchboardConnection::slotConnected() /** * @brief Shows error dialog boxes * - * All switchboard errors are annoying and mostly useless. So we ignore them. All of them. + * All switchboard errors are annoying and mostly useless. So we ignore most of them. * - * @param error The error reason or explanation. Ignored. - * @param type The type of error. Ignored. + * @param error The error reason or explanation. + * @param type The type of error. */ void MsnSwitchboardConnection::slotError( QString error, MsnSocketBase::ErrorType type ) { - Q_UNUSED( error ); - Q_UNUSED( type ); - // Always report errors to console kWarning() << "KMess Error (type=" << type << " contacts=" << contactsInChat_ << "):" << error << "!"; + + // Decide what kind of message to show + switch( type ) + { + case MsnSocketBase::ERROR_DROP: + // Only warn the user if the chat had recent activity. Cannot use isExpired() here + // because it also checks if we're connected, but here we're not. + if( keepAliveTimer_ == 0 || keepAlivesRemaining_ > 0 ) + { + emit showWarning( WARNING_CONNECTION_DROP, 0 ); + } + + // Then disconnect + closeConnection(); + break; + + default: + // Other errors are simply ignored :> + break; + } } @@ -2199,6 +2322,7 @@ void MsnSwitchboardConnection::start( const ChatInformation &chatInfo ) userStartedChat_ = chatInfo.getUserStartedChat(); backgroundConnection_ = false; + // Ask for a chat window; if one already exists, it will be raised. emit requestChatWindow( this ); return; } @@ -2253,7 +2377,7 @@ void MsnSwitchboardConnection::storeMessageForAcknowledgement(int ack, AckType a unAcked.time = QDateTime::currentDateTime().toTime_t(); unAcked.message = message; // no problem with data size, uses shared reference. - // Add to QMap + // Add to QHash unAckedMessages_.insert( ack, unAcked ); #ifdef KMESSDEBUG_SWITCHBOARD_ACKS @@ -2265,30 +2389,4 @@ void MsnSwitchboardConnection::storeMessageForAcknowledgement(int ack, AckType a -// The connection has gone inactive, close it -void MsnSwitchboardConnection::timeoutConnection() -{ - // Stop the keepalive sending if it's passed too much time - if( keepAlivesRemaining_ < 1 ) - { -#ifdef KMESSDEBUG_SWITCHBOARD_KEEPALIVE - kDebug() << "Session has expired, closing it."; -#endif - - if( keepAliveTimer_ != 0 ) - { - keepAliveTimer_->stop(); - } - - closeConnectionLater( true ); - return; - } - else - { - keepAlivesRemaining_--; - } -} - - - #include "msnswitchboardconnection.moc" diff --git a/src/network/msnswitchboardconnection.h b/src/network/msnswitchboardconnection.h index f65ae61..b0d411c 100644 --- a/src/network/msnswitchboardconnection.h +++ b/src/network/msnswitchboardconnection.h @@ -54,9 +54,26 @@ class MsnSwitchboardConnection : public MsnConnection friend class KMessTest; - public: + public: // Public enumerations // The supported applications - enum ApplicationType { GNOMEMEETING, FILETRANSFER, MSNREMOTEDESKTOP, VOICECONVERSATION }; + enum ApplicationType + { + GNOMEMEETING + , FILETRANSFER + , MSNREMOTEDESKTOP + , VOICECONVERSATION + }; + + /// Types of emittable warnings + enum WarningType + { + WARNING_UNSUPPORTED_VOICECLIP /// A voice clip has been received + , WARNING_UNSUPPORTED_ACTIONMESSAGE /// An action message has been received + , WARNING_UNSUPPORTED_UNKNOWN /// An unknown message type has been received + , WARNING_CONNECTION_DROP /// The connection has been dropped + , WARNING_TOO_MANY_EMOTICONS /// There were too many emoticons in the last message + }; + // The constructor MsnSwitchboardConnection(); // The copy constructor @@ -68,7 +85,7 @@ class MsnSwitchboardConnection : public MsnConnection // Clean up, close the connection, destroy this object void closeConnectionLater(bool autoDelete = false); // Make a list of the contacts in the chat - QStringList getContactsInChat() const; + const QStringList getContactsInChat() const; // Return the first contact the chat started with. const QString& getFirstContact() const; // Return the last contact who left the chat. @@ -78,7 +95,7 @@ class MsnSwitchboardConnection : public MsnConnection // Initialize the object, optionally presetting a contact to reinvite bool initialize( QString handle = QString() ); // Invite a contact into the chat - void inviteContact(QString handle); + void inviteContact( const QString& handle ); // Check whether the switchboard is buzy (has too many pending messages) bool isBusy() const; // Check if a certain contact is in the chat @@ -87,30 +104,36 @@ class MsnSwitchboardConnection : public MsnConnection bool isEmpty() const; // Check if only the given contact is in the chat bool isExclusiveChatWithContact(const QString& handle) const; + // Check whether the connection is idle + bool isExpired() const; // Check whether the switchboard is currently not connected, nor trying to connect bool isInactive() const; + // Send a message to the contact(s) + void sendChatMessage( const QString& text ); + // Send a ink to the contact(s) + void sendInk( const QByteArray& ink ); // Send a nudge to a contact void sendNudge(); + // The user is typing so send a typing message + void sendTypingMessage(); + // Send wink + void sendWink( const QString& msnobject ); // Start a switchboard connection void start( const ChatInformation &chatInfo ); // Deliver a message for an Application object. void sendApplicationMessage( const MimeMessage &message ); + // Set true if the user request the starting of the chat + void setUserStartedChat( bool startedByUser ); public slots: - // Send a message to the contact(s) - void sendChatMessage(QString text); - // Send a ink to the contact(s) - void sendInk( const QByteArray& ink ); // Send a "ping" to avoid MSN closing the connection void sendKeepAlive(); - // The user is typing so send a typing message - void sendTypingMessage(); protected slots: // The socket connected, so send the version command. - virtual void slotConnected(); + virtual void slotConnected(); // Shows error dialog boxes void slotError( QString error, MsnSocketBase::ErrorType type ); @@ -118,10 +141,6 @@ class MsnSwitchboardConnection : public MsnConnection private slots: // An ApplicationList object indicated it aborted all it's applications. void slotApplicationsAborted(const QString &contact); - // The connection has gone inactive, close it - void timeoutConnection(); - // There was a problem with sending of oims - void slotSendOfflineImFailed( QString to, QString message ); private: // private structs @@ -143,9 +162,9 @@ class MsnSwitchboardConnection : public MsnConnection // Remove a contact from the list of contacts in the chat void contactLeft(const QString& handle); // Convert an html format (#RRGGBB) color to an msn format (BBGGRR) color - QString convertHtmlColorToMsnColor(const QString &color) const; + const QString convertHtmlColorToMsnColor( const QString &color ) const; // Convert and msn format color (BBGGRR) to an html format (#RRGGBB) color - QString convertMsnColorToHtmlColor(QString color) const; + const QString convertMsnColorToHtmlColor( QString& color) const; // Received a positive delivery message. void gotAck(const QStringList& command); // Received notification that a contact is no longer in session. @@ -170,6 +189,8 @@ class MsnSwitchboardConnection : public MsnConnection void parseDatacastMessage(const QString &contactHandle, const MimeMessage &message); // Parse an emoticon message void parseEmoticonMessage(const QString &contactHandle, const QString &messageBody); + // Parse an error command + void parseError( const QStringList& command, const QByteArray &payloadData ); // Parse a message command void parseMimeMessage(const QStringList& command, const MimeMessage &message); // Parse a payload command @@ -237,7 +258,7 @@ class MsnSwitchboardConnection : public MsnConnection // A list of messages that should be sent to the contact when connection is reestablished QList< QPair* > pendingMessages_; // Queue of sent messages waiting ACK or NAK - QMap< int, UnAckedMessage > unAckedMessages_; + QHash< int, UnAckedMessage > unAckedMessages_; // Whether the user (true) or the contact (false) started the chat bool userStartedChat_; // Timer to keep track of the last activity, to manage keep alive messages. @@ -250,11 +271,11 @@ class MsnSwitchboardConnection : public MsnConnection signals: // Signal that a contact joined (or was already in) the chat - void contactJoinedChat( QString handle, QString friendlyName ); + void contactJoinedChat( ContactBase *contact ); // Signal that a contact left the chat - void contactLeftChat( QString handle, bool isChatIdle ); + void contactLeftChat ( ContactBase *contact, bool isChatIdle ); // Signal that a contact is typing - void contactTyping( QString handle, QString friendlyName ); + void contactTyping ( ContactBase *contact ); // Signal a chat message void chatMessage( const ChatMessage &message ); // The switchboard received a ink message, requesting processing by the ChatMaster @@ -266,7 +287,7 @@ class MsnSwitchboardConnection : public MsnConnection // The switchboard received a msn object (wink, voice clip) void gotMsnObject( const QString &msnObjectData, const QString &handle ); // The switchboard received a nudge (buzzer) - void receivedNudge( const QString &handle ); + void receivedNudge( ContactBase *contact ); // The switchboard is ready to send more application messages void readySend(); // Request the Chat Master to link this switchboard to a chat window @@ -274,7 +295,9 @@ class MsnSwitchboardConnection : public MsnConnection // Signal that this class needs a new chat connection void requestNewSwitchboard( QString contactHandle ); // Signal that the delivery of a message has failed - void sendingFailed( QString handle ); + void sendingFailed( const QString &handle, const MimeMessage &message ); + // Signal that a warning message needs to be displayed in chat + void showWarning( MsnSwitchboardConnection::WarningType type, ContactBase *contact ); // The switchboard is closing, remove it from the Chat Master references void deleteMe( MsnSwitchboardConnection *object ); diff --git a/src/network/p2pmessage.cpp b/src/network/p2pmessage.cpp index 786dd3f..ad32b54 100644 --- a/src/network/p2pmessage.cpp +++ b/src/network/p2pmessage.cpp @@ -50,59 +50,60 @@ P2PMessage::P2PMessage(const QByteArray &message) // Retreives the current session ID. -unsigned long P2PMessage::getSessionID() const +quint32 P2PMessage::getSessionID() const { return sessionID_; } // Retreives the current message ID. */ -unsigned long P2PMessage::getMessageID() const +quint32 P2PMessage::getMessageID() const { return messageID_; } // Retreives the current message offset. -unsigned long P2PMessage::getDataOffset() const +quint32 P2PMessage::getDataOffset() const { return dataOffset_; } // Retreives the current message size. -unsigned long P2PMessage::getDataSize() const +quint32 P2PMessage::getDataSize() const { return dataSize_; } // Retreives the total message size. -unsigned long P2PMessage::getTotalSize() const +quint32 P2PMessage::getTotalSize() const { return totalSize_; } // Retreives the current message size. -unsigned long P2PMessage::getFlags() const +quint32 P2PMessage::getFlags() const { return flags_; } // Retrieves the ack session ID field. -unsigned long P2PMessage::getAckSessionID() const +quint32 P2PMessage::getAckSessionID() const { return ackSessionID_; } // Retreives the ack unique ID field. -unsigned long P2PMessage::getAckUniqueID() const +quint32 P2PMessage::getAckUniqueID() const { return ackUniqueID_; } // Retreives the ack data size field. -unsigned long P2PMessage::getAckDataSize() const +quint32 P2PMessage::getAckDataSize() const { return ackDataSize_; } + // Retreives the nonce field (for direct connection handshake. QString P2PMessage::getNonce() const { @@ -160,15 +161,29 @@ bool P2PMessage::isError() const } -// Return true if this is MsnObject data (e.g. pictures) (0x20) -bool P2PMessage::isMsnObjectData() const + +// Return true if this is MsnObject data (e.g. pictures) or file data. +bool P2PMessage::isData() const { - // Used the MSN_FLAG_FILE_DATA mask here on purpose, - // I want to be sure only the object data flag is set here. - return (flags_ & MSN_FLAG_FILE_DATA) == MSN_FLAG_OBJECT_DATA; + // Possible values: + // - 0x20 picture data till WLM 2009. + // - 0x1000020 picture data in WLM 2009. + // - 0x1000030 file data in WLM 2009. + // They all have 0x20 in common. + return ( ( flags_ & 0x20 ) == 0x20 ); } +// Return true if the message is the data preparation message. +bool P2PMessage::isDataPreparation() const +{ + return sessionID_ != 0 + && ( flags_ == 0 || flags_ == MSN_FLAG_DATA_2009 ) + && dataSize_ == 4 + && totalSize_ == 4; + +} + // Returns true if the sender aborted it's own data transfer (0x40) bool P2PMessage::isAbortedSendingAck() const @@ -194,10 +209,12 @@ bool P2PMessage::isConnectionHandshake() const -// Set if the message contains file data (0x1000030) -bool P2PMessage::isFileData() const +// Return true if this is part of an SLP message. +bool P2PMessage::isSlpData() const { - return (flags_ & MSN_FLAG_FILE_DATA) == MSN_FLAG_FILE_DATA; + return ( sessionID_ == 0 ) + && ( flags_ == 0 || flags_ == MSN_FLAG_DATA_2009 ) + && ( dataSize_ > 0 ); // HACK: added size constraint for Bot2k3 4.1 (sends an empty message with a zero flag) } @@ -258,6 +275,16 @@ void P2PMessage::parseP2PHeader() ackSessionID_ = extractBytes ( messageData, 32); ackUniqueID_ = extractBytes ( messageData, 36); ackDataSize_ = extractLongBytes ( messageData, 40); + + // Verify data size! + if( (uint) message_.size() < ( 48 + dataSize_ ) ) // message size could also contain the footer code. + { + kWarning().nospace() << "corrupt data size header detected " + "(header=48" + " datasize=" << dataSize_ << + " total=" << message_.size() << ")"; + dataSize_ = message_.size() - 48; + } } @@ -267,6 +294,8 @@ void P2PMessage::parseP2PHeader() // ------------------------------------------------------ // A utility to fill the byte data block + + void P2PMessage::insertBytes(QByteArray &buffer, const unsigned int value, const int offset) { // Also based on Kopete code. I started with a nice struct, @@ -294,17 +323,13 @@ void P2PMessage::insertBytes(QByteArray &buffer, const unsigned int value, const // However, note the bytes are placed in network order. (big endian) } -void P2PMessage::insertShortBytes(QByteArray &buffer, const unsigned short value, const int offset) -{ - buffer[offset + 0] = (char) ( value & 0xFF); - buffer[offset + 1] = (char) ((value >> 8) & 0xFF); -} + void P2PMessage::insertNonce(QByteArray &buffer, const QString &nonce, const int offset) { // Remove the separators // The QString(..) call makes a copy because QString::remove isn't const. - QString fixedNonce = QString(nonce).remove('-').remove('{').remove('}'); + QString fixedNonce( QString(nonce).remove('-').remove('{').remove('}') ); #ifdef KMESSTEST KMESS_ASSERT( fixedNonce.length() == 32 ); // 32 hex codes will be saved as 16 bytes. @@ -327,6 +352,24 @@ void P2PMessage::insertNonce(QByteArray &buffer, const QString &nonce, const int } } + + +// Copy sort integers into the binary header. +void P2PMessage::insertUtf16String(QByteArray &buffer, const QString &value, int offset) +{ + const unsigned short *utf16Value = value.utf16(); + uint valueLength = value.length(); + for(uint i = 0; i < valueLength; ++i) + { + const short utf16Char = utf16Value[i]; + buffer[offset + 0] = (char) ( utf16Char & 0xFF); + buffer[offset + 1] = (char) ((utf16Char >> 8) & 0xFF); + offset += 2; + } +} + + + unsigned int P2PMessage::extractBytes(const char *data, const int offset) { // Convert the bytes from network order to a normal int. @@ -336,7 +379,9 @@ unsigned int P2PMessage::extractBytes(const char *data, const int offset) | ((unsigned char) data[offset + 3] << 24)); } -unsigned long P2PMessage::extractLongBytes(const char *data, const int offset) + + +quint32 P2PMessage::extractLongBytes(const char *data, const int offset) { // Convert the bytes from network order to a long int. return (((unsigned char) data[offset + 0] ) @@ -354,6 +399,7 @@ unsigned long P2PMessage::extractLongBytes(const char *data, const int offset) } + QString P2PMessage::extractNonce(const char *data, const int offset) { const int noncePos[] = { 3,2,1,0 // Field 1 reversed @@ -380,3 +426,20 @@ QString P2PMessage::extractNonce(const char *data, const int offset) return "{" + hex + "}"; } + + +QString P2PMessage::extractUtf16String( const char *data, const int offset, int size ) +{ + // Avoid copying the null char + if( data[ offset + size - 1 ] == '\0' + && data[ offset + size - 2 ] == '\0' ) + { +#ifdef KMESSDEBUG_P2PMESSAGE + kDebug() << "avoid copying null character to utf16 string"; +#endif + size--; + } + + return QString::fromUtf16( reinterpret_cast( data + offset ), size / 2 ); +} + diff --git a/src/network/p2pmessage.h b/src/network/p2pmessage.h index 2c81913..21a0f15 100644 --- a/src/network/p2pmessage.h +++ b/src/network/p2pmessage.h @@ -26,16 +26,17 @@ class P2PMessage enum MsnP2PFlags { - MSN_FLAG_NEGATIVE_ACK = 0x01, /// NAK. P2P Message size and offset fields are invalid or out of order. - MSN_FLAG_ACK = 0x02, /// ACK. P2P Message is an ACK - MSN_FLAG_WAITING = 0x04, // Other client is waiting for a reply - MSN_FLAG_WAITING_FOR_ACK = 0x06, // Other client is waiting for an ack reply / requesting ack response (we guess) - MSN_FLAG_ERROR = 0x08, /// RST. Error (possibly at binary level) - MSN_FLAG_OBJECT_DATA = 0x20, /// MsnObject data (picture data, etc..) - MSN_FLAG_ABORTED_SENDING = 0x40, /// Sender prematurely data transfer initiated by itself. Also received when sender aborts in response to a 0x08 or BYE at unexpected moment. - MSN_FLAG_ABORTED_RECEIVING = 0x80, /// TLP_ERR. Receiver premature aborted the data trasnfer. Also received when the receiver doesn't receive any data from the sender's "transport layer proxy??". - MSN_FLAG_DC_HANDSHAKE = 0x100, // Direct connection handshake - MSN_FLAG_FILE_DATA = 0x1000030 // File transfer (is: 0x10 | 0x20 | 0x1000000) + MSN_FLAG_NEGATIVE_ACK = 0x01, /// NAK. P2P Message size and offset fields are invalid or out of order. + MSN_FLAG_ACK = 0x02, /// ACK. P2P Message is an ACK + MSN_FLAG_WAITING = 0x04, // Other client is waiting for a reply + MSN_FLAG_WAITING_FOR_ACK = 0x06, // Other client is waiting for an ack reply / requesting ack response (we guess) + MSN_FLAG_ERROR = 0x08, /// RST. Error (possibly at binary level) + MSN_FLAG_OBJECT_DATA = 0x20, /// MsnObject data (picture data, etc..) + MSN_FLAG_ABORTED_SENDING = 0x40, /// Sender prematurely data transfer initiated by itself. Also received when sender aborts in response to a 0x08 or BYE at unexpected moment. + MSN_FLAG_ABORTED_RECEIVING = 0x80, /// TLP_ERR. Receiver premature aborted the data trasnfer. Also received when the receiver doesn't receive any data from the sender's "transport layer proxy??". + MSN_FLAG_DC_HANDSHAKE = 0x100, // Direct connection handshake + MSN_FLAG_DATA_2009 = 0x1000000, // Used instead of 0x00 in WLM 2009 + MSN_FLAG_FILE_DATA = 0x1000030 // File transfer (is: 0x10 | 0x20 | 0x1000000) }; public: // Constructors @@ -45,103 +46,109 @@ public: // Constructors // P2PMessage(); // Build a P2P message based on the received binary data. - P2PMessage(const char *data, uint size); + P2PMessage(const char *data, uint size); // Build a P2P message based on the received binary data. - P2PMessage(const QByteArray &message); + P2PMessage(const QByteArray &message); public: // Accessors // Retreives the current session ID. - unsigned long getSessionID() const; + quint32 getSessionID() const; // Retreives the current message ID. - unsigned long getMessageID() const; + quint32 getMessageID() const; // Retreives the current data message offset. - unsigned long getDataOffset() const; + quint32 getDataOffset() const; // Retreives the current data message size. - unsigned long getDataSize() const; + quint32 getDataSize() const; // Retreives the message flags. */ - unsigned long getFlags() const; + quint32 getFlags() const; // Retreives the total message size. - unsigned long getTotalSize() const; + quint32 getTotalSize() const; // Retrieves the ack message ID field. - unsigned long getAckSessionID() const; + quint32 getAckSessionID() const; // Retreives the ack unique ID field. - unsigned long getAckUniqueID() const; + quint32 getAckUniqueID() const; // Retreives the ack data size field. - unsigned long getAckDataSize() const; + quint32 getAckDataSize() const; // Retreives the nonce field (for direct connection handshake. - QString getNonce() const; + QString getNonce() const; // Retreives the actual data. - const char *getData() const; + const char *getData() const; // Returns true if the contact aborted the data transfer by the other client. - bool isAbortedReceivingAck() const; + bool isAbortedReceivingAck() const; // Returns true if the contact aborted it's own data transfer. - bool isAbortedSendingAck() const; + bool isAbortedSendingAck() const; // Returns true if the ACK flag is set - bool isAck() const; + bool isAck() const; // Returns true if the message is a direct-connection handshake message. - bool isConnectionHandshake() const; + bool isConnectionHandshake() const; // Returns true if the binary-error flag is set. - bool isError() const; + bool isError() const; // Return true if the file-data flag is set. - bool isFileData() const; - // Return true if this is an fragment (splitted message packet. - bool isFragment() const; + bool isData() const; + // Return true if the message is the data preparation message. + bool isDataPreparation() const; + // Return true if this is an fragment (splitted message packet). + bool isFragment() const; // Return true if this is the last part of a message. - bool isLastFragment() const; + bool isLastFragment() const; // Returns true of the nak flag is set - bool isNegativeAck() const; - // Return true if the msnobject-data flag is set (picture data) - bool isMsnObjectData() const; + bool isNegativeAck() const; + // Return true if this is part of an SLP message. + bool isSlpData() const; // Returns true of the waiting-for-ack flag is set - bool isWaitingForAck() const; + bool isWaitingForAck() const; // Returns true of the waiting-for-reply flag is set - bool isWaitingForReply() const; + bool isWaitingForReply() const; // Copy integers into the binary header. - static void insertBytes(QByteArray& buffer, const unsigned int value, const int offset); - // Copy sort integers into the binary header. - static void insertShortBytes(QByteArray &buffer, const unsigned short value, const int offset); + static void insertBytes(QByteArray& buffer, const unsigned int value, const int offset); + // Copy short integers into the binary header. + static void insertShortBytes(QByteArray &buffer, const unsigned short value, const int offset); // Copy a nonce string into the binary header. - static void insertNonce(QByteArray& buffer, const QString &nonce, const int offset = 32); + static void insertNonce(QByteArray& buffer, const QString &nonce, const int offset = 32); + // Copy short integers into the binary header. + static void insertUtf16String(QByteArray &buffer, const QString &value, int offset); // Extracts the bytes from the data block. static unsigned int extractBytes(const char *data, const int offset); // Extracts the bytes from the data block. - static unsigned long extractLongBytes(const char *data, const int offset); + static quint32 extractLongBytes(const char *data, const int offset); // Extracts the nonce string from the data header. static QString extractNonce(const char *data, const int offset = 32); + // Extracts an utf16 string from the data header. + static QString extractUtf16String(const char *data, const int offset, int size); private: // Helper functions // Extract the fields from the P2P binary header. - void parseP2PHeader(); + void parseP2PHeader(); private: // Data - QByteArray message_; + QByteArray message_; // Session ID identifying which (MSN-)SLP we're dealing with. - unsigned long sessionID_; + quint32 sessionID_; // Message ID identifying which message packet we're dealing with. - unsigned long messageID_; + quint32 messageID_; // Message offset.. (message packets can be split) - unsigned long dataOffset_; + quint32 dataOffset_; // Message size.. - unsigned long dataSize_; + quint32 dataSize_; // Message flags. - unsigned long flags_; + quint32 flags_; // Total message size - unsigned long totalSize_; + quint32 totalSize_; // Ack session id. - unsigned long ackSessionID_; + quint32 ackSessionID_; // Ack Unique id. - unsigned long ackUniqueID_; + quint32 ackUniqueID_; // Ack data size. - unsigned long ackDataSize_; + quint32 ackDataSize_; }; diff --git a/src/network/soap/addressbookservice.cpp b/src/network/soap/addressbookservice.cpp new file mode 100644 index 0000000..1ee63a2 --- /dev/null +++ b/src/network/soap/addressbookservice.cpp @@ -0,0 +1,1039 @@ +/*************************************************************************** + addressbookservice.cpp + ------------------- + begin : Fri July 25 2008 + copyright : (C) 2008 by Antonio Nastasi + email : sifcenter(at)gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "addressbookservice.h" + +#include "../../contact/contact.h" +#include "../../utils/kmessshared.h" +#include "../../utils/xmlfunctions.h" +#include "../../currentaccount.h" +#include "../../kmessdebug.h" +#include "soapmessage.h" + +#include + + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION + #define KMESSDEBUG_ADDRESSBOOKSERVICE +#endif + + +/** + * @brief URL of the Address Book Service + */ +#define SERVICE_URL_ADDRESSBOOK "https://omega.contacts.msn.com/abservice/abservice.asmx" + +/** + * @brief URL of the Address Book Sharing Service + */ +#define SERVICE_URL_ADDRESSBOOK_SHARING "https://omega.contacts.msn.com/abservice/SharingService.asmx" + + + +/** + * @brief The constructor + */ +AddressBookService::AddressBookService( QObject *parent ) +: PassportLoginService( parent ) +{ +} + + + +/** + * @brief The destructor + */ +AddressBookService::~AddressBookService() +{ +} + + +/** + * @brief Add a new or already known contact to the Address Book. + * + * To add support for Yahoo contacts it may be needed to use the FQY NS command, + * as it is used to determine the real type (or types!) of an address. + */ +void AddressBookService::addContact( const QString &handle, const QStringList& groupsId, bool alreadyExists ) +{ + // TODO Add support to yahoo contacts + + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " \n" + " \n" + " \n" ); + if( ! alreadyExists ) + { + body += " LivePending\n"; + } + + body += " " + handle + "\n" + " true\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n"; + if( ! alreadyExists ) + { + body += " \n" + " true\n" + " \n"; + } + + body += ""; + + MessageData data; + data.type = "ContactAdd"; + data.value = QStringList() << handle << groupsId; + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABContactAdd", + createCommonHeader( "ContactSave" ), + body, + data ), + "Contacts" ); +} + + + +void AddressBookService::addContactToGroup( const QString &contactId, const QString &groupId ) +{ + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " \n" + " \n" + " " + groupId + "\n" + " \n" + " \n" + " \n" + " \n" + " " + contactId + "\n" + " \n" + " \n" + "" ); + + MessageData data; + data.type = "ContactAddToGroup"; + data.value = groupId; + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABGroupContactAdd", + createCommonHeader( "GroupSave" ), + body, + data ), + "Contacts" ); +} + + + +void AddressBookService::addGroup( const QString &name ) +{ + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " \n" + " false\n" + " \n" + " \n" + " \n" + " " + KMessShared::htmlEscape( name ) + "\n" + " C8529CE2-6EAD-434d-881F-341E17DB3FF8\n" + " false\n" + " \n" + " \n" + " MSN.IM.Display\n" + " 1\n" + " \n" + " \n" + " \n" + " \n" + "" ); + + MessageData data; + data.type = "GroupAdd"; + data.value = name; + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABGroupAdd", + createCommonHeader( "GroupSave" ), + body, + data ), + "Contacts" ); +} + + + +// Block contact +void AddressBookService::blockContact( const QString &handle ) +{ + SoapMessage *message = getMembershipListUpdate( handle, "Block", true ); + + MessageData data; + data.type = "ContactBlock"; + data.value = QStringList() << handle << "BL"; + + message->setData( data ); + + sendSecureRequest( message, "Contacts" ); +} + + + +/** + * @brief Request creation of a new address book. + * + * Newly created accounts have no address book. This method + * requests the creation of a new one. + */ +void AddressBookService::createAddressBook() +{ + QString body( "\n" + " \n" + " \n" + " 0\n" + " " + CurrentAccount::instance()->getHandle() + "\n" + " true\n" + " \n" + "" ); + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABAdd", + createCommonHeader(), + body ), + "Contacts" ); +} + + + +/** + * @brief Create the common header for the soap requests. + * + * @param partnerScenario the field for the PartnerScenario tag + */ +QString AddressBookService::createCommonHeader( const QString partnerScenario ) +{ + return "\n" + " \n" + " 996CDE1E-AA53-4477-B943-2BE802EA6166\n" + " \n" + " false\n" + " \n" + + partnerScenario + + " \n" + "\n" + "\n" + " false\n" + " \n" // Gets filled in by the base class + ""; +} + + + +/** + * @brief Put the Soap action to update the information about contact. + * + * @param token the token for authenticate on the address book services + * @param friendlyName the nick for contact + */ +void AddressBookService::contactUpdate( ContactProperty property, const QString &newValue ) +{ + QString propertyString; + QString propertiesChanged; + + switch( property ) + { + case PROPERTY_FRIENDLYNAME: + propertyString = " " + KMessShared::htmlEscape( newValue ) + "\n"; + propertiesChanged = "DisplayName"; + break; + + case PROPERTY_PRIVACY: + propertyString = ( " \n" + " \n" + " MSN.IM.BLP\n" + " " + newValue + "\n" + " \n" + " \n"); + propertiesChanged = "Annotation"; + break; + + default: + return; + } + + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " \n" + " \n" + " \n" + " Me\n" + + propertyString + + " \n" + " " + propertiesChanged + "\n" + " \n" + " \n" + "" ); + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABContactUpdate", + createCommonHeader( "Timer" ), + body ), + "Contacts" ); +} + + + +void AddressBookService::deleteContact( const QString &contactId ) +{ + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " \n" + " \n" + " " + contactId + "\n" + " \n" + " \n" + "" ); + + MessageData data; + data.type = "ContactDelete"; + data.value = contactId; + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABContactDelete", + createCommonHeader( "Timer" ), + body, + data ), + "Contacts" ); +} + + + +void AddressBookService::deleteContactFromGroup( const QString &contactId, const QString &groupId ) +{ + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " \n" + " \n" + " " + groupId + "\n" + " \n" + " \n" + " \n" + " \n" + " " + contactId + "\n" + " \n" + " \n" + "" ); + + MessageData data; + data.type = "ContactDeleteFromGroup"; + data.value = QStringList() << contactId << groupId; + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABGroupContactDelete", + createCommonHeader( "GroupSave" ), + body, + data ), + "Contacts" ); +} + + + +void AddressBookService::deleteGroup( const QString &groupId ) +{ + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " \n" + " \n" + " " + groupId + "\n" + " \n" + " \n" + "" ); + + MessageData data; + data.type = "GroupDelete"; + data.value = groupId; + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABGroupDelete", + createCommonHeader( "GroupSave" ), + body, + data ), + "Contacts" ); +} + + + +void AddressBookService::renameGroup( const QString &groupId, const QString &name ) +{ + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " \n" + " \n" + " " + groupId + "\n" + " \n" + " " + KMessShared::htmlEscape( name ) + "\n" + " \n" + " GroupName\n" + " \n" + " \n" + "" ); + + MessageData data; + data.type = "GroupRename"; + data.value = QStringList() << groupId << name; + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABGroupUpdate", + createCommonHeader( "GroupSave" ), + body, + data ), + "Contacts" ); +} + + + +/** + * @brief Retrieve the address book. + * + * I've read about a possible small alternative to the current . + * It is: + * +GET email@domain.com/LiveContacts/?Filter=LiveContacts(Contact(ID,IMAddress)) HTTP/1.1 +Host: livecontacts.live.com +Cookie: MSPAuth=.. + + * It goes on with the headers as usual. Must be tested, I don't know if it works, or + * if the response is identical to that of the current AbFindAll. + * + * @param fromTimeStamp A timestamp to retrieve only AB changes after a certain moment. + */ +void AddressBookService::retrieveAddressBook( const QString &fromTimestamp ) +{ + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " Full\n" ); + if( fromTimestamp.isEmpty() ) + { + body += " false\n" + " 0001-01-01T00:00:00.0000000-08:00\n"; + } + else + { + body += " true\n" + " " + fromTimestamp + "\n"; + } + + body += ""; + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABFindAll", + createCommonHeader(), + body ), + "Contacts" ); +} + + + +/** + * @brief Retrieve the membership lists + */ +void AddressBookService::retrieveMembershipLists() +{ + QString body( "\n" + " \n" + " \n" + " Messenger\n" +// TODO: Adding more WLM features may require retrieval of the membership lists for these services +/* + " Invitation\n" + " SocialNetwork\n" + " Space\n" + " Profile\n" +*/ + " \n" + " \n" + "" ); + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK_SHARING, + "http://www.msn.com/webservices/AddressBook/FindMembership", + createCommonHeader(), + body ), + "Contacts" ); +} + + + +/** + * @brief Retrieve the Dynamic Items: Gleams + */ +void AddressBookService::retrieveGleams() +{ + QString body( "\n" + " 00000000-0000-0000-0000-000000000000\n" + " Full\n" + " false\n" + " 0001-01-01T00:00:00.0000000-08:00\n" + " Gleam\n" + " 0001-01-01T00:00:00.0000000-08:00\n" + "" ); + + sendSecureRequest( new SoapMessage( SERVICE_URL_ADDRESSBOOK, + "http://www.msn.com/webservices/AddressBook/ABFindAll", + createCommonHeader(), + body ), + "Contacts" ); +} + + + +// Parse the address book +void AddressBookService::parseAddressBook( const QDomElement &body ) +{ +#ifdef KMESSDEBUG_ADDRESSBOOKSERVICE + kDebug() << "Parsing address book."; + + int debugGroupCount = 0; +#endif + + // Parse the adress book lists + // First parse the one containing the groups + const QDomNodeList& groups( body.elementsByTagName( "Group" ) ); + + for( int index = 0; index < groups.count(); index++ ) + { + const QDomNode& group( groups.item( index ) ); + + const QString& groupId( XmlFunctions::getNodeValue( group, "groupId" ) ); + const QString& name( textNodeDecode( XmlFunctions::getNodeValue( group, "groupInfo/name" ) ) ); + + if( groupId.isEmpty() || name.isEmpty() ) + { + continue; + } + +#ifdef KMESSDEBUG_ADDRESSBOOKSERVICE + ++debugGroupCount; +#endif + emit gotGroup( groupId, name ); + } + + // Then parse the list which contains the contacts + const QDomNodeList& contactsNode( body.elementsByTagName( "Contact" ) ); + QList< QHash > contacts; + QString handle; + QString information; + QStringList guidList; + + for( int index = 0; index < contactsNode.count(); index++ ) + { + const QDomNode& contact( contactsNode.item( index ) ); + const QDomNode& contactInfo( XmlFunctions::getNode( contact, "contactInfo" ) ); + + // Get some user information + const QString& contactType( XmlFunctions::getNodeValue( contactInfo, "contactType" ) ); + const QString& friendlyName( textNodeDecode( XmlFunctions::getNodeValue( contactInfo, "displayName" ) )); + + // Check if the contact type is Me: it has the information about personal profile + if( contactType == "Me" ) + { + const QString& cid( XmlFunctions::getNodeValue( contactInfo, "CID" ) ); + + // Search for "...MSN.IM.BLPVALUE.." + const QDomNodeList& annotations( contactInfo.toElement().elementsByTagName( "Annotation" ) ); + int blp; + for( int index2 = 0; index2 < annotations.count(); index2++ ) + { + const QDomNode& annotation( annotations.at( index2 ) ); + + if( XmlFunctions::getNodeValue( annotation, "Name" ) == "MSN.IM.BLP" ) + { + // Set BLP argument + blp = XmlFunctions::getNodeValue( annotation, "Value" ).toInt(); + break; + } + } + + emit gotPersonalInformation( friendlyName, cid, blp ); + continue; + } + + // If the contact is not in our Messenger contact list, skip it. + if( XmlFunctions::getNodeValue( contactInfo, "isMessengerUser" ) == "false" ) + { + continue; + } + + // Store all information about contact in one qhash + QHash contactInformations; + + if( XmlFunctions::getNodeValue( contactInfo, "contactEmailType" ) == "Messenger3" ) + { + contactInformations.insert( "isMessenger3", 1 ); + handle = XmlFunctions::getNodeValue( contactInfo, "email" ).toLower(); + } + else + { + handle = XmlFunctions::getNodeValue( contactInfo, "passportName" ).toLower(); + } + + // The second condition is an HACK, the handle shouldn't be exist in the list of user + // indeed is impossible to add it on the contact list because microsoft server doesn't accept + // the request. The contact should be removed from the user's list, but for now we prefer to make + // easy the life of the users...for the moment..:P + if( handle.isEmpty() || handle == "messenger@microsoft.com" ) + { + continue; + } + + // Add the handle + contactInformations.insert( "handle", handle ); + + // Retrieve the other information about the contact + // TODO implement the method for dynamic items, + // please refer to msnpiki in the MSNP13 section. + // and enable retrieval of the other services in + // retrieveMembershipLists(). + + // Add display name + contactInformations.insert( "friendlyName", friendlyName ); + // Grep contact id + information = XmlFunctions::getNodeValue( contact, "contactId" ); + contactInformations.insert( "contactId", information ); + // Determinate if the contact is messenger user or not + information = XmlFunctions::getNodeValue( contactInfo, "isMessengerUser" ); + contactInformations.insert( "isMessengerUser", information ); + // Determinate if the contact has a space + information = XmlFunctions::getNodeValue( contactInfo, "hasSpace" ); + contactInformations.insert( "hasSpace", information ); + + // Check if the contact is assigned to any groups + const QDomNodeList& guids( contactInfo.toElement().elementsByTagName( "guid" ) ); + guidList.clear(); + if( ! guids.isEmpty() ) + { + for( int i = 0; i < guids.count(); i++ ) + { + guidList.append( guids.item( i ).toElement().text() ); + } + + contactInformations.insert( "guidList", guidList ); + } + + contacts.append( contactInformations ); + } + +#ifdef KMESSDEBUG_ADDRESSBOOKSERVICE + kDebug() << "Address book successfully parsed: found" << contacts.count() << "contacts and" << debugGroupCount << "groups."; +#endif + + // Signal that the of address book has been parsed + emit gotAddressBookList( contacts ); +} + + + +// Parse the membership lists +void AddressBookService::parseMembershipLists( const QDomElement &body ) +{ + const QDomNodeList& services( body.elementsByTagName( "Service" ) ); + + // New, empty accounts have no Services + if( services.count() == 0 ) + { + emit gotMembershipLists( "Messenger", QHash() ); + return; + } + + for( int serviceIndex = 0; serviceIndex < services.count(); serviceIndex++ ) + { + const QDomNode& service( services.item( serviceIndex ) ); + + // Get the name of the service + QString serviceType( XmlFunctions::getNodeValue( service, "Info/Handle/Type" ) ); + + if( serviceType.isEmpty() ) + { + kWarning() << "Retrieved unknown service type!"; + continue; + } + + const QDomNodeList &memberships( XmlFunctions::getNode( service, "Memberships" ).childNodes() ); + + // TODO Parse the timestamp of current retrieve to update the timestamp in the XML list + /* + QDomNodeList listInfo = body.elementsByTagName( "LastChange" ); + QString timestamp( listInfo.item( listInfo.count() - 1 ).toElement().text() ); + */ + + int roleId; + QString role; + QString handle; + + // Parse the service's membership lists and save the results in the contactsRole hash table + QHash contactsRole; + + for( int index = 0; index < memberships.count(); index++ ) + { + // Parse each role structure + const QDomNode& membership( memberships.item( index ) ); + role = XmlFunctions::getNodeValue( membership, "MemberRole" ); + + roleId = 0; + if( role == "Allow" ) roleId = Contact::MSN_LIST_ALLOWED; + else if( role == "Block" ) roleId = Contact::MSN_LIST_BLOCKED; + else if( role == "Reverse" ) roleId = Contact::MSN_LIST_REVERSE; + else if( role == "Pending" ) roleId = Contact::MSN_LIST_PENDING; + else + { + kWarning() << "Unknown membership role" << role << "in service" << serviceType << "!"; + continue; + } + + // Parse each member + const QDomNodeList& members( membership.toElement().elementsByTagName( "Member" ) ); + for( int i = 0; i < members.count(); i++ ) + { + // FIXME: This only works for the "Messenger" service. Others don't have the PassportName nor Email nodes. + // We need a flexible system! + const QDomNode& memberNode( members.item( i ) ); + handle = XmlFunctions::getNodeValue( memberNode, "PassportName" ).toLower(); + + if( handle.isEmpty() ) + { + handle = XmlFunctions::getNodeValue( memberNode, "Email" ).toLower(); + + if( handle.isEmpty() ) + { + continue; + } + } + + // Insert the current contact in the hash with their respective role + // If the contact is already listed, the new value is OR'ed (set bit flag) with the old roleId + contactsRole.insert( handle, contactsRole.value( handle, 0 ) | roleId ); + } + } + + // When finished parsing the service's memberships list, signal that its list is ready + emit gotMembershipLists( serviceType, contactsRole ); + } +} + + + +/** + * @brief Parse a SOAP error message. + * + * This method interprets incoming fault messages from the server. + * + * @param message The message containing a soap fault conXML node which contains the SOAP fault. + */ +void AddressBookService::parseSecureFault( SoapMessage *message ) +{ + // Should never happen + if( ! message->isFaultMessage() ) + { + kWarning() << "Incorrect fault detected on incoming message"; + return; + } + + // Get the type of error + QString faultCode ( message->getFaultCode() ); + QString faultString( message->getFaultDescription() ); + QString errorCode ( XmlFunctions::getNodeValue( message->getFault(), "detail/errorcode" ) ); + + // Get the message data + MessageData messageData( message->getData() ); + QString type ( messageData.type ); + QVariant info ( messageData.value ); + + // See which fault we received + if( faultCode == "soap:Client" && ! errorCode.isEmpty() ) + { + // We forgot to check if the email was valid: + if( errorCode == "BadEmailArgument" ) + { + QString email( info.toStringList().first() ); + + kWarning() << "Malformed email address found by the server:" << email; + + emit soapWarning( i18nc( "Warning message", + "The specified email address, \"%1\", is not a valid email address!", + email ), + true /* isImportant */ ); + } + // The email we tried to add is not an address registered on Passport + else if( errorCode == "InvalidPassportUser" ) + { + QString email( info.toStringList().first() ); + + emit soapWarning( i18nc( "Error message", + "The specified email address, \"%1\", does not belong to a Live Messenger account!", + email ), + true /* isImportant */ ); + } + // We messed up something in the header. Our bad, sorry! + else if( errorCode == "InvalidApplicationHeader" ) + { + emit soapError( i18nc( "Error message (system-generated description)", + "Invalid web service request (%1)", message->getFaultDescription() ), + MsnSocketBase::ERROR_INTERNAL ); + } + // This is a new account which doesn't have an address book. Create one + else if( errorCode == "ABDoesNotExist" ) + { +#ifdef KMESSDEBUG_ADDRESSBOOKSERVICE + kDebug() << "Address book does not exist: creating new one."; +#endif + createAddressBook(); + return; + } +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION + else + { + // Do nothing, the HttpSoapConnection debug output should suffice + } +#endif + } + // There was another unspecified error with our SOAP request: + else + { + emit soapError( i18nc( "Error message (system-generated description)", + "Invalid web service request (%1)", message->getFaultDescription() ), + MsnSocketBase::ERROR_INTERNAL ); + } +} + + + +/** + * @brief Parse the result of the response from the server + * + * We can parse two differente soap reply: + * 1) the membership lists that contains the lists of contacts and them + * respective roles: Allow, Block, Reverse, Pending. + * 2) the address book list that contains the groups and the contacts with them friendlyname, id etc.. + * + * @param resultRoot the xml response + */ +void AddressBookService::parseSecureResult( SoapMessage *message ) +{ + QDomElement body( message->getBody().toElement() ); + QString resultName( body.localName() ); + + if( ! body.firstChildElement( "FindMembershipResponse" ).isNull() ) + { + parseMembershipLists( body ); + return; + } + else if( ! body.firstChildElement( "ABFindAllResponse" ).isNull() ) + { + parseAddressBook( body ); + return; + } + else if( ! body.firstChildElement( "ABContactUpdateResponse" ).isNull() ) + { + // Updated a contact's info + return; + } + else if( ! body.firstChildElement( "DeleteMemberResponse" ).isNull() ) + { + // Contact removed from Membership list from selected Role + return; + } + else if( ! body.firstChildElement( "ABAddResponse" ).isNull() ) + { + // New address book was created: proceed with it +#ifdef KMESSDEBUG_ADDRESSBOOKSERVICE + kDebug() << "Address book successfully created: retrying to obtain membership lists."; +#endif + retrieveMembershipLists(); + return; + } + + // Get the message's data + MessageData data( message->getData() ); + + if( data.type == "ContactAdd" ) + { + // A contact was added to the AB + + QStringList info ( data.value.toStringList() ); + const QString& handle ( info.takeFirst() ); + const QStringList& groupsId ( info ); + const QString& contactId( body.elementsByTagName( "guid" ).item(0).toElement().text() ); + + // If the contact is valid, signal that the contact was added to AB + if( ! contactId.isEmpty() && ! handle.isEmpty() ) + { + emit contactAdded( handle, contactId, groupsId ); + } + } + else if( data.type == "ContactDelete" ) + { + // A contact was deleted from the AB + + const QString& contactId( data.value.toString() ); + + if( ! contactId.isEmpty() ) + { + emit contactDeleted( contactId ); + } + } + else if( data.type == "ContactBlock" || data.type == "ContactUnblock" ) + { + // A contact was added to the Membership list in a certain Role + + const QStringList& info ( data.value.toStringList() ); + const QString& handle( info.value( 0 ) ); + const QString& role ( info.value( 1 ) ); + + if( role == "BL" ) + { + emit contactBlocked( handle ); + } + else if( role == "AL" ) + { + emit contactUnblocked( handle ); + } + } + else if( data.type == "ContactAddToGroup" ) + { + // A contact was added to a group + + const QString& groupId ( data.value.toString() ); + const QString& contactId( body.elementsByTagName( "guid" ).item(0).toElement().text() ); + + if( ! contactId.isEmpty() && ! groupId.isEmpty() ) + { + emit contactAddedToGroup( contactId, groupId ); + } + } + else if( data.type == "ContactDeleteFromGroup" ) + { + // A contact was removed from a group + + const QStringList& info ( data.value.toStringList() ); + const QString& contactId( info.value( 0 ) ); + const QString& groupId ( info.value( 1 ) ); + + if( ! contactId.isEmpty() && ! groupId.isEmpty() ) + { + emit contactDeletedFromGroup( contactId, groupId ); + } + } + else if( data.type == "GroupAdd" ) + { + // A group was added + const QString& name ( data.value.toString() ); + const QString& groupId( body.elementsByTagName( "guid" ).item(0).toElement().text() ); + + if( ! groupId.isEmpty() && ! name.isEmpty() ) + { + emit groupAdded( groupId, name ); + } + } + else if( data.type == "GroupDelete" ) + { + // A group was removed + const QString& groupId( data.value.toString() ); + + if( ! groupId.isEmpty() ) + { + emit groupDeleted( groupId ); + } + } + else if( data.type == "GroupRename" ) + { + // A group was renamed + const QStringList& info ( data.value.toStringList() ); + const QString& groupId( info.value( 0 ) ); + const QString& name ( info.value( 1 ) ); + + if( ! groupId.isEmpty() && ! name.isEmpty() ) + { + emit groupRenamed( groupId, name ); + } + } + else + { + kWarning() << "Response data not recognized:" << data.type; + } +} + + + +// Unblock contact +void AddressBookService::unblockContact( const QString &handle ) +{ + SoapMessage *message = getMembershipListUpdate( handle, "Allow", true ); + + MessageData data; + data.type = "ContactUnblock"; + data.value = QStringList() << handle << "AL"; + + message->setData( data ); + + sendSecureRequest( message, "Contacts" ); +} + + + +// Create a message to update the membership list +SoapMessage *AddressBookService::getMembershipListUpdate( const QString &handle, const QString &role, bool adding ) +{ + QString body( "\n" + " \n" + " 0\n" + " Messenger\n" + " \n" + " \n" + " \n" + " \n" + " " + role + "\n" + " \n" + " \n" + " Passport\n" + " Accepted\n" + " " + handle + "\n" + " \n" + " \n" + " \n" + " \n" + "" ); + + QString action; + if( adding ) + { + action = "http://www.msn.com/webservices/AddressBook/AddMember"; + } + else + { + action = "http://www.msn.com/webservices/AddressBook/DeleteMember"; + } + + return new SoapMessage( SERVICE_URL_ADDRESSBOOK_SHARING, + action, + createCommonHeader( "BlockUnblock" ), + body ); +} + + + +#include "addressbookservice.moc" diff --git a/src/network/soap/addressbookservice.h b/src/network/soap/addressbookservice.h new file mode 100644 index 0000000..bceab9d --- /dev/null +++ b/src/network/soap/addressbookservice.h @@ -0,0 +1,125 @@ +/*************************************************************************** + addressbookservice.h + ------------------- + begin : Fri July 25 2008 + copyright : (C) 2008 by Antonio Nastasi + email : sifcenter(at)gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef ADDRESSBOOK_H +#define ADDRESSBOOK_H + +#include "passportloginservice.h" + +#include +#include + + +/** + * @brief Soap actions for retrieve the address book and membership lists. + * + * + * @author Antonio Nastasi + * @ingroup NetworkSoap + */ +class AddressBookService : public PassportLoginService +{ + Q_OBJECT + + public: + enum ContactProperty + { + PROPERTY_FRIENDLYNAME = 0, + PROPERTY_PRIVACY + }; + + // The constructor + AddressBookService( QObject *parent = 0 ); + // The destructor + virtual ~AddressBookService(); + // Add contact to AB + void addContact( const QString &handle, const QStringList& groupsId = QStringList(), bool alreadyExists = false ); + // Add contact to group + void addContactToGroup( const QString &contactId, const QString &groupId ); + // Add group + void addGroup( const QString &name ); + // Block contact + void blockContact( const QString &handle ); + // Put the Soap action to update the information about contact + void contactUpdate( ContactProperty property, const QString &newValue ); + // Delete contact + void deleteContact( const QString &contactId ); + // Delete contact from group + void deleteContactFromGroup( const QString &contactId, const QString &groupId ); + // Delete group + void deleteGroup( const QString &groupId ); + // Create a message to update the membership list + SoapMessage *getMembershipListUpdate( const QString &handle, const QString &role, bool adding ); + // Rename group + void renameGroup( const QString &groupId, const QString &name ); + // Retrieve the address book + void retrieveAddressBook( const QString &fromTimestamp = QString() ); + // Retrieve the membership lists + void retrieveMembershipLists(); + // Retrieve the Dynamic Items: Gleams + void retrieveGleams(); + // Unblock contact + void unblockContact( const QString &handle ); + + private: // private methods + // Request creation of a new address book (for new accounts) + void createAddressBook(); + // Create the common header for the soap requests + QString createCommonHeader( const QString partnerScenario = "Initial" ); + // Parse the address book + void parseAddressBook( const QDomElement &body ); + // Parse the membership lists + void parseMembershipLists( const QDomElement &body ); + // Parse a SOAP error message. + void parseSecureFault( SoapMessage *message ); + // Parse the result of the response from the server + void parseSecureResult( SoapMessage *message ); + + signals: // Contact Address Book signals + // Contact was added + void contactAdded( const QString &handle, const QString &contactId, const QStringList &groupsId ); + // Contact was added to group + void contactAddedToGroup( const QString &contactId, const QString &groupId ); + // Contact was blocked + void contactBlocked( const QString &handle ); + // Contact was deleted + void contactDeleted( const QString &contactId ); + // Contact was delete from group + void contactDeletedFromGroup( const QString &contactId, const QString &groupId ); + // Contact was unblocked + void contactUnblocked( const QString &handle ); + + signals: // Group Address Book signals + // Group was added + void groupAdded( QString groupId, QString name ); + // Group was removed + void groupDeleted( QString groupId ); + // Group was renamed + void groupRenamed( QString groupId, QString name ); + // A group's details have been received + void gotGroup( const QString &guid, const QString &name ); + + signals: // Generic Address Book signals + // Received a membership list, with its contacts and their respective roles + void gotMembershipLists( const QString &serviceType, const QHash &contactsRole ); + // Received information about the logged in contact + void gotPersonalInformation( const QString &friendlyName, const QString &cid, int blp ); + // The address book was entirely received and parsed + void gotAddressBookList( const QList< QHash > &contacts ); +}; + +#endif diff --git a/src/network/soap/httpsoapconnection.cpp b/src/network/soap/httpsoapconnection.cpp index 12b3dbc..5b750bd 100644 --- a/src/network/soap/httpsoapconnection.cpp +++ b/src/network/soap/httpsoapconnection.cpp @@ -17,6 +17,7 @@ #include "httpsoapconnection.h" +#include "../../utils/kmessshared.h" #include "../../utils/xmlfunctions.h" #include "../../kmessdebug.h" #include "../mimemessage.h" @@ -24,7 +25,9 @@ #include "config-kmess.h" #include -#include +#include +#include +#include #include #include @@ -32,13 +35,18 @@ #ifdef KMESSDEBUG_HTTPSOAPCONNECTION #define KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL -// #define KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP + #define KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP #endif -#define XMLNS_XSD "http://www.w3.org/2001/XMLSchema" -#define XMLNS_XSI "http://www.w3.org/2001/XMLSchema-instance" -#define XMLNS_SOAP "http://schemas.xmlsoap.org/soap/envelope/" +/** + * Maximum allowed time between a request and its response + * + * KMess will wait at most this number of milliseconds after sending a request. + * If no response arrives and this timeout expires, an error signal will be + * emitted. + */ +#define SOAPCONNECTION_RESPONSE_TIMEOUT 30000 @@ -48,34 +56,33 @@ * Initializes the class. * The actual connection is established when a SOAP call is made. * - * @param endpoint The endpoint of the webservice, should be a http:// or https:// URL. * @param parent The Qt parent object. The object is deleted when the parent is deleted. */ -HttpSoapConnection::HttpSoapConnection( const QString &endpoint, QObject *parent ) - : QObject( parent ) - , currentRequestId_( 0 ) +HttpSoapConnection::HttpSoapConnection( QObject *parent ) +: QObject( parent ) +, currentRequest_( 0 ) +, isSending_( false ) { #ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kDebug() << "CREATED. (endpoint=" << endpoint << ")"; + kDebug() << "CREATED."; #endif - // Create the http socket - http_ = new QHttp( this ); + // Create the network request object + http_ = new QNetworkAccessManager( this ); // Make signal connections - connect( http_, SIGNAL( requestFinished(int,bool) ), - this, SLOT ( slotHttpRequestFinished(int,bool) )); - connect( http_, SIGNAL( responseHeaderReceived(const QHttpResponseHeader&) ), - this, SLOT ( slotHttpResponseHeaderReceived(const QHttpResponseHeader&) )); + connect( http_, SIGNAL( finished(QNetworkReply*) ), + this, SLOT ( slotRequestFinished(QNetworkReply*) ) ); + connect( http_, SIGNAL( authenticationRequired(QNetworkReply*,QAuthenticator*) ), + this, SLOT ( slotAuthenticationRequired(QNetworkReply*,QAuthenticator*) ) ); + connect( http_, SIGNAL( sslErrors(QNetworkReply*,const QList&) ), + this, SLOT ( slotSslErrors(QNetworkReply*,const QList&) ) ); - // Also connect to signals for error reporting - connect( http_, SIGNAL( authenticationRequired(const QString&, quint16, QAuthenticator*) ), - this, SLOT ( slotHttpAuthenticationRequired(const QString&, quint16, QAuthenticator*) )); - connect( http_, SIGNAL( sslErrors(const QList&) ), - this, SLOT ( slotSslErrors(const QList&) )); - - // Set endpoint setting - setEndpoint( endpoint ); + // Initialize the timeout timer + responseTimer_.setSingleShot( true ); + responseTimer_.setInterval( SOAPCONNECTION_RESPONSE_TIMEOUT ); + connect( &responseTimer_, SIGNAL( timeout() ), + this, SLOT ( slotRequestTimeout() ) ); } @@ -87,97 +94,35 @@ HttpSoapConnection::HttpSoapConnection( const QString &endpoint, QObject *parent */ HttpSoapConnection::~HttpSoapConnection() { + qDeleteAll( requests_ ); + delete currentRequest_; + delete http_; + #ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL kDebug() << "DESTROYED."; #endif - - closeConnection(); - delete http_; } /** - * @brief Delete any user data associated with the request. + * @brief Return the current request message, if any * - * This method is called when a request is completely handled. - * Overwrite this method to delete any call-specific data stored for the request ID. + * It only returns a message if a request is currently being sent, or if its response is being processed. * - * @param requestId ID of the request, as returned by sendRequest(). + * @param copy If true, creates a copy of the request message. + * @return Returns a message if one is being sent or processed, otherwise returns 0. */ -void HttpSoapConnection::clearRequestData( int requestId ) +SoapMessage *HttpSoapConnection::getCurrentRequest( bool copy ) const { - Q_UNUSED( requestId ); - // Empty default. - // can be overwritten; -} - - - -/** - * @brief Close the connection. - */ -void HttpSoapConnection::closeConnection() -{ - // Close the connection - http_->close(); -} - - - -/** - * @brief Escape a string for inclusion in XML. - * @param value The value to escape for inclusion in an XML message. - * @return The escaped value, with the <, >, & and " tokens escaped. - */ -QString HttpSoapConnection::escapeString( QString value ) const -{ - // Only escape basic properties, nothing else! - return value.replace("<", "<") - .replace(">", ">") - .replace("\"", """) - .replace("&", "&"); -} - - - -/** - * @brief Return the currently active request ID. - * - * This value is only valid inside the parseSoapFault() and parseSoapResult() slots. - * When this method is called outside these slots, the value is 0. - * - * @return The ID of the request which is currently being processed. - */ -int HttpSoapConnection::getCurrentRequestId() const -{ -#ifdef KMESSTEST - KMESS_ASSERT( currentRequestId_ == http_->currentId() ); -#endif - - return currentRequestId_; -} - - - -/** - * @brief Return the endpoint - * @return Returns the endpoint given with the constructor. - */ -QString HttpSoapConnection::getEndpoint() const -{ - return endpoint_.toString(); -} - - - -/** - * @brief Return the last SOAP action - * @return The last SOAP action sent. - */ -const QString & HttpSoapConnection::getSoapAction() const -{ - return soapAction_; + if( copy ) + { + return new SoapMessage( *currentRequest_ ); + } + else + { + return currentRequest_; + } } @@ -188,8 +133,7 @@ const QString & HttpSoapConnection::getSoapAction() const */ bool HttpSoapConnection::isIdle() { - return http_->state() == QHttp::Unconnected - || http_->state() == QHttp::Closing; + return ( ! isSending_ ); } @@ -203,7 +147,7 @@ bool HttpSoapConnection::isIdle() * * @param responseBody The full message body received from the HTTP server. * @return Whether there is a parsing error that should be emitted. - */ + * bool HttpSoapConnection::parseHttpBody( const QByteArray &responseBody ) { #ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL @@ -261,7 +205,7 @@ bool HttpSoapConnection::parseHttpBody( const QByteArray &responseBody ) // WS-I compliant webservices wrap the response in another object so the response has one root element. // So you get a ... // This object wrapper is stripped transparently in .Net, also do this here: - QString resultNodeName = resultNode.nodeName(); + QString resultNodeName( resultNode.nodeName() ); if( resultNodeName.endsWith("Response") && resultNode.childNodes().length() == 1 && resultNode.firstChild().nodeName() == resultNodeName.replace("Response", "Result") ) @@ -282,92 +226,124 @@ bool HttpSoapConnection::parseHttpBody( const QByteArray &responseBody ) parseSoapResult( resultNode, headerNode ); return true; } +*/ /** * @brief Parse the SOAP fault. * - * This method extracts the node data, and emits a requestFailed() signal. + * This method extracts the node data, and emits a soapError() signal. * Overwrite this method to implement custom error handling. * - * @param faultNode The XML node which contains the SOAP fault. - * @param headerNode The XML node which contains the SOAP header. + * @param message The message containing a soap fault conXML node which contains the SOAP fault. */ -void HttpSoapConnection::parseSoapFault( const QDomElement &faultNode, const QDomElement &/*headerNode*/ ) +void HttpSoapConnection::parseSoapFault( SoapMessage *message ) { - QString faultCode = XmlFunctions::getNodeValue( faultNode, "/faultcode" ); - QString faultString = XmlFunctions::getNodeValue( faultNode, "/faultstring" ); - -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kDebug() << "Signalling the request failed, " - << faultCode << ": " << faultString << endl; -#endif - - emit requestFailed( this, faultCode, faultString, faultNode ); + // Assemble a generic error message + emit soapError( QString( "%1 (%2)" ).arg( message->getFaultDescription() ) + .arg( message->getFaultCode() ), + MsnSocketBase::ERROR_SOAP_UNKNOWN ); } /** - * @brief Send the a raw POST request to the server. - * - * This method is used internally by sendRequest(). - * - * @param content The POST data to send. - * @param soapAction The SOAPAction header to send, may be QString::null to omit the header. - * @return The request ID. + * @brief Send the next request in queue to the endpoint. */ -int HttpSoapConnection::sendRawPostRequest( const QString &content, const QString &soapAction ) +void HttpSoapConnection::sendNextRequest() { -#ifdef KMESSTEST - if( ! isIdle() ) + if( isSending_ || requests_.isEmpty() ) { - kDebug() << "NOTICE: A new SOAP request started while the previous request is not finished yet."; + return; } + +#ifdef KMESSTEST + KMESS_ASSERT( currentRequest_ == 0 ); #endif - // Create HTTP request - QHttpRequestHeader header( "POST", endpoint_.path() ); - QByteArray rawPostData = content.toUtf8(); + // We're sending from now on, block further sending attempts + isSending_ = true; + + // Get the request to send + currentRequest_ = requests_.takeFirst(); + + // Verify if the request we're sending is valid + if( ! currentRequest_->isValid() ) + { + // Inform listeners that the request could not be sent (and disconnect) + emit soapError( i18nc( "Error message (system-generated description)", + "Invalid web service request (%1)", currentRequest_->getFaultDescription() ), + MsnSocketBase::ERROR_INTERNAL ); + + // Reset the internal data + delete currentRequest_; + currentRequest_ = 0; + isSending_ = false; + return; + } + + const QString &endpointAddress( currentRequest_->getEndPoint() ); + + QNetworkRequest request; + QUrl endpoint( endpointAddress ); + QByteArray contents( currentRequest_->getMessage() ); + QString soapAction( currentRequest_->getAction() ); + + // Transparently handle host redirections + if( redirections_.contains( endpointAddress ) ) + { + endpoint.setUrl( redirections_[ endpointAddress ] ); + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Sending with redirection from:" << endpointAddress << "to:" << endpoint; +#endif + } + +#ifdef KMESSTEST + KMESS_ASSERT( endpoint.isValid() ); + KMESS_ASSERT( ( endpoint.scheme() == "http" ) || ( endpoint.scheme() == "https" ) ); +#endif + + // Set the request header + request.setUrl ( endpoint ); + request.setHeader ( QNetworkRequest::ContentTypeHeader, "text/xml; charset=utf-8" ); + request.setHeader ( QNetworkRequest::ContentLengthHeader, contents.size() ); + request.setRawHeader( "Host", endpoint.host().toLatin1() ); + request.setRawHeader( "Accept", "*/*" ); + request.setRawHeader( "User-Agent", "KMess/" KMESS_VERSION ); + request.setRawHeader( "Connection", "Keep-Alive" ); + request.setRawHeader( "Cache-Control", "no-cache" ); if( ! soapAction.isNull() ) { - header.setValue( "SOAPAction", "\"" + soapAction + "\"" ); + QString quotedAction( "\"" + soapAction + "\"" ); + request.setRawHeader( "SOAPAction", quotedAction.toLatin1() ); } - header.setValue( "Host", endpoint_.host() ); - header.setValue( "Content-Type", "text/xml; charset=utf-8" ); - header.setValue( "Content-Length", QString::number( rawPostData.length() ) ); - header.setValue( "User-Agent", "KMess/" KMESS_VERSION ); - header.setValue( "Accept", "*/*" ); - header.setValue( "Cache-Control", "no-cache" ); + http_->post( request, contents ); - // Initialize state vars - soapAction_ = soapAction_; + // Start the response timer + responseTimer_.start(); #ifdef KMESS_NETWORK_WINDOW QUrl soapActionUrl( soapAction ); if( ! soapAction.isEmpty() && soapActionUrl.isValid() ) { - KMESS_NET_INIT(this, "SOAP " + soapActionUrl.path() ); + KMESS_NET_INIT( this, "SOAP " + soapActionUrl.path() ); } else { - KMESS_NET_INIT(this, "SOAP " + endpoint_.path() ); + KMESS_NET_INIT( this, "SOAP " + endpoint.path() ); } - KMESS_NET_SENT( this, header.toString().toUtf8() ); - KMESS_NET_SENT( this, rawPostData ); + KMESS_NET_SENT( this, contents ); #endif #ifdef KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP - kDebug() << "Sending HTTP request:\n" << header.toString().toUtf8() + "\n\n" + content; + kDebug() << "Request contents:"; + kDebug() << contents; #endif - - // Send the request - int httpRequestId = http_->request( header, rawPostData ); - return httpRequestId; } @@ -375,104 +351,37 @@ int HttpSoapConnection::sendRawPostRequest( const QString &content, const QStrin /** * @brief Send a SOAP request to the webservice. * - * This is a convenience function for sendRawPostRequest(). - * The message is generated by SoapMessage::getMessage(). + * This method adds a message to the sending queue. + * If the urgent parameter is true, the request is sent before all + * the other messages. * - * @param soapAction The SOAPAction header to send, may be QString::null to omit the header. - * @param message The SOAP message to send. - * @return The request ID. + * @param message The message to send. + * @param urgent Whether the request needs to be sent before everything else. */ -int HttpSoapConnection::sendRequest(const QString &soapAction, const SoapMessage &message ) -{ - return sendRawPostRequest( message.getMessage(), soapAction ); -} - - - -/** - * @brief Send a SOAP request to the webservice. - * - * This method constructs the <soap:Envelope>, - * <soap:Header> and <soap:Body> fields - * to embedding the message. The generated message is sent with sendRawPostRequest(). - * - * When an example defines additional XML namespaces in the <soap:Envelope> header, - * include those namespaces in the sub elements instead. Make sure the XML namespace is always - * declared in the parent element which uses the XML namespace. - * - * @param soapAction The SOAPAction header to send, may be QString::null to omit the header. - * @param messageBody The raw XML body to send. For a readable formatting in the network window, use 4 spaces indent and no trailing newline. - * @param messageHeader The raw XML header to send. - * @return The request ID. - */ -int HttpSoapConnection::sendRequest( const QString &soapAction, const QString &messageBody, const QString &messageHeader ) +void HttpSoapConnection::sendRequest( SoapMessage *message, bool urgent ) { #ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kDebug() << "Connecting to endpoint for SOAP action '" << soapAction << "'."; -#endif - - // Build the SOAP request - QString postData = "\n" - "\n"; - - // Append header - if( ! messageHeader.isEmpty() ) + if( urgent ) { - postData += " \n" + messageHeader + "\n \n"; + kDebug() << "Immediately sending message to endpoint:" << message->getEndPoint(); } - - // Append body - postData += " \n" + messageBody + "\n \n\n"; - - return sendRawPostRequest( postData, soapAction ); -} - - - -/** - * @brief Change the SOAP endpoint. - * - * This method is available for the rare occasion - * a webservice wants to change it's endpoint (e.g. passport login). - */ -void HttpSoapConnection::setEndpoint( const QString &endpoint ) -{ -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - QString oldEndpoint = endpoint_.toString(); -#endif -#ifdef KMESSTEST - KMESS_ASSERT( endpoint.startsWith("http://") || endpoint.startsWith("https://") ); - KMESS_ASSERT( http_->state() == QHttp::Unconnected ); -#endif - - // Avoid a http host request if this is not needed. - if( endpoint_ == endpoint ) + else { - return; - } - - // Parse the endpoint - endpoint_.setUrl( endpoint ); - QString protocol = endpoint_.scheme(); - QHttp::ConnectionMode mode = ( protocol == "https" ) ? QHttp::ConnectionModeHttps : QHttp::ConnectionModeHttp; - - - // Make host request, tricky bits: - // - this starts a request so slotHttpRequestFinished() will be called. - // - if mode is an int, it will call setHost( name, port ) instead of setHost( name, mode, port = 0 ) - // so appending the default 3rd argument so it's more difficult to break. - int hostRequestId = http_->setHost( endpoint_.host(), mode, 0 ); - hostRequestIds_.append( hostRequestId ); - -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - if( endpoint_.isValid() ) - { - kDebug() << "Changing HttpSoapConnection endpoint from " << oldEndpoint << " to " << endpoint << ", request ID" << hostRequestId; + kDebug() << "Queueing message to endpoint:" << message->getEndPoint(); } #endif + + if( urgent ) + { + requests_.prepend( message ); + } + else + { + requests_.append( message ); + } + + // Try sending the request now + sendNextRequest(); } @@ -480,179 +389,191 @@ void HttpSoapConnection::setEndpoint( const QString &endpoint ) /** * @brief Called when the remote server requires authentication. */ -void HttpSoapConnection::slotHttpAuthenticationRequired( const QString &hostname, quint16 port, QAuthenticator *authenticator ) +void HttpSoapConnection::slotAuthenticationRequired( QNetworkReply *reply, QAuthenticator *authenticator ) { - Q_UNUSED(hostname); - Q_UNUSED(port); + // A response has arrived, stop the timeout detection timer + responseTimer_.stop(); kWarning() << "Got http authentication request for" << authenticator->realm() << - "while connecting to" << endpoint_; + "while connecting to" << reply->url(); + + // Inform listeners that the request failed + emit soapError( i18nc( "Error message (system-generated description)", + "The web service is not accessible (%1)", + reply->errorString() ), + MsnSocketBase::ERROR_SOAP_AUTHENTICATION ); } // The request to the remote server finished -void HttpSoapConnection::slotHttpRequestFinished( int requestId, bool error ) +void HttpSoapConnection::slotRequestFinished( QNetworkReply *reply ) { - // Get the error code - QHttp::Error errorCode = http_->error(); + // A response has arrived, stop the timeout detection timer + responseTimer_.stop(); - // Very annoying. QHttp also generates a request for the setHost() and close() calls. - if( hostRequestIds_.contains( requestId ) ) - { -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kDebug() << "completed host request (id=" << requestId << "error=" << errorCode << ")."; -#endif - - // Abort next requests if the host request failed. - if( error ) - { - kWarning() << "Failed to resolve host" << endpoint_; - - // It turns out that calling abort() from a requestFinished() slot causes crashes later (Qt 4.3.3) -// http_->abort(); - http_->clearPendingRequests(); - } - - return; - } - - // Catch other QHttp requests we don't want to parse. - if( ! http_->currentRequest().isValid() ) - { -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kDebug() << "completed close request (id=" << requestId << "error=" << errorCode << ")."; -#endif - - return; - } + QByteArray replyContents( reply->readAll() ); + int statusCode = reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).toInt(); + QString error( reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString() ); #ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - QHttpResponseHeader header = http_->lastResponse(); - kDebug() << "start processing http response (id=" << requestId << "error=" << errorCode << "status=" << header.statusCode() << header.reasonPhrase() << ")."; + bool requestSuccess = false; + QUrl replyUrl( reply->url() ); + kDebug() << "Received response: code" << statusCode + << reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ) + << " from" << replyUrl; #endif - - // Set current request ID for all slots. - currentRequestId_ = requestId; - - - // See if an error occurred - if( error ) - { - // Avoid double errors by our abort() calls. - if( errorCode == QHttp::Aborted ) - { - return; - } - - // Display at the console for logging - QString httpError = http_->errorString(); - kWarning() << "Got HTTP error '" << httpError << "' while connecting to '" << endpoint_ << "'."; - - // Inform listeners the request failed. - emit requestFailed( this, i18n( "Unable to make a connection: %1", httpError ) ); - - // Reset all data. - clearRequestData( currentRequestId_ ); - currentRequestId_ = 0; - return; - } - - - // Read the body, make copy - bool responseOk = true; - QByteArray body = http_->readAll(); - - // Avoid XML errors if there is no response - if( body.isEmpty() ) - { - kWarning() << "Received an empty response " - "(state=" << http_->state() << - " error=" << http_->error() << - " endpoint=" << endpoint_ << ")"; - responseOk = false; - } - else - { - // Parse the body -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_RECEIVED( this, body ); -#endif - #ifdef KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP - kDebug() << "Received the HTTP response:\n" << body; + kDebug() << "Reply contents:"; + kDebug() << replyContents; #endif - responseOk = parseHttpBody( body ); - } + // Parse the body of the HTTP response (copying the other attributes from the request) + SoapMessage *currentResponse = getCurrentRequest( true /* copy */ ); + currentResponse->setMessage( replyContents ); - // emit later, so the caller can destroy this class - if( ! responseOk ) +#ifdef KMESS_NETWORK_WINDOW + KMESS_NET_RECEIVED( this, replyContents ); +#endif + + // Check for errors + bool success = currentResponse->isValid(); + if( success ) { - // It turns out that calling abort() from a requestFinished() slot causes crashes later (Qt 4.3.3) -// http_->abort(); - http_->clearPendingRequests(); +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + requestSuccess = true; +#endif - emit requestFailed( this, i18n( "There was an internal error in KMess: %1", - i18n("Unable to parse SOAP response") ) ); + // Parse the message contents + if( currentResponse->isFaultMessage() ) + { + // Verify if the server is redirecting us to another server + if( currentResponse->getFaultCode() == "psf:Redirect" ) + { + const QString& originalUrl( currentResponse->getEndPoint() ); + const QString& redirectUrl( XmlFunctions::getNodeValue( currentResponse->getFault(), "redirectUrl" ) ); + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Received redirection from:" << originalUrl << "to:" << redirectUrl; +#endif + + // Save the redirection target + if( ! redirectionCounts_.contains( originalUrl ) ) + { + redirectionCounts_[ originalUrl ] = 0; + } + redirections_[ originalUrl ] = redirectUrl; + redirectionCounts_[ originalUrl ] = redirectionCounts_[ originalUrl ] + 1; + + // Limit the number of redirects from the original host + if( redirectionCounts_[ originalUrl ] > 5 ) + { + emit soapError( i18nc( "Error message", "Too many redirections by web service" ), + MsnSocketBase::ERROR_SOAP_TOOMANYREDIRECTS ); + } + else + { + // Retry sending the message by sending an identical one immediately. + // We've mapped the old endpoint to the new one so there's no need to change the message + // endpoint. Also, we copy it because this method deletes the current message. + SoapMessage *messageCopy = new SoapMessage( *currentRequest_ ); + requests_.prepend( messageCopy ); + } + } + else + { + parseSoapFault( currentResponse ); + } + } + else + { + const QString& originalUrl( currentResponse->getEndPoint() ); + QString preferredHostName( XmlFunctions::getNodeValue( currentResponse->getHeader(), + "ServiceHeader/PreferredHostName" ) ); + + // Verify if the server is suggesting us to use another server + if( ! preferredHostName.isEmpty() && ! redirections_.contains( originalUrl ) ) + { +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Received hostname suggestion for:" << preferredHostName; +#endif + + QUrl suggestedUrl( originalUrl ); + suggestedUrl.setHost( preferredHostName ); + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Setting redirection from:" << originalUrl << "to:" << suggestedUrl; +#endif + + redirectionCounts_[ originalUrl ] = 0; + redirections_[ originalUrl ] = suggestedUrl.toString(); + } + + // Then parse this response + parseSoapResult( currentResponse ); + } + } + else if( statusCode == 503 ) + { + if( metaObject()->className() == QString( "OfflineImService" ) ) + { + emit soapWarning( i18nc( "Warning message", + "The Offline Messages web service is currently not available" ), + false ); + } + else + { + emit soapWarning( i18nc( "Warning message", + "The Live Messenger web service is experiencing problems" ), + false ); + } } else { -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL - kDebug() << "completed response handling (id=" << requestId << ")"; -#endif + // Display at the console for logging + kWarning() << "Received an unknown" << statusCode << "status code (" << error + << ") while connecting to endpoint" << reply->url(); + kWarning() << "Reply contents:"; + kWarning() << replyContents; + + // Inform listeners that the request failed + emit soapError( i18nc( "Error message with description (system-generated description)", + "Invalid web service response %1 (%2)", + error, + currentResponse->getFaultDescription() ), + MsnSocketBase::ERROR_SOAP_RESPONSE ); } - // Reset - currentRequestId_ = 0; + // Terminate the reply + reply->abort(); + reply->deleteLater(); + + // Reset all internal data + delete currentRequest_; + delete currentResponse; + currentRequest_ = 0; + isSending_ = false; + +#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_GENERAL + kDebug() << "Completed response handling from endpoint" << replyUrl << ", with success?" << requestSuccess; +#endif + + // Send the next queued message + sendNextRequest(); + return; } /** - * Called when the response header is received + * @brief Called when a timeout occurred while sending a request. */ -void HttpSoapConnection::slotHttpResponseHeaderReceived( const QHttpResponseHeader &header ) +void HttpSoapConnection::slotRequestTimeout() { - // Log it in the network window. -#ifdef KMESS_NETWORK_WINDOW - KMESS_NET_RECEIVED( this, header.toString().toLatin1() ); -#endif - - // TODO: generate custom error message, and call http_->abort(). - - // Check the response header - if( ! header.isValid() ) - { - kWarning() << "could not parse last http response from '" << endpoint_ << "'."; - return; - } - - // Check response code - int statusCode = header.statusCode(); - if( statusCode != 200 && statusCode != 500 ) // 500 might happen with SOAP faults. - { - kWarning() << "received unexpected header code: " << header.statusCode() << " " << header.reasonPhrase() << "."; - return; - } - - // Check Content-Type - QString contentType = header.contentType(); - if( contentType.contains(";") ) - { - contentType = contentType.section(';', 0, 0); - } - - if( contentType != "text/xml" - && contentType != "text/html" ) // Needed for PassportLoginService, amazing! - { - kWarning() << "received unexpected response type '" << contentType << "' from '" << endpoint_ << "'."; - return; - } - -#ifdef KMESSDEBUG_HTTPSOAPCONNECTION_HTTPDUMP - kDebug() << "Received the HTTP response header:\n" << header.toString().toLatin1(); -#endif + // Inform listeners that the request failed + emit soapError( i18nc( "Error message", + "No response from web service" ), + MsnSocketBase::ERROR_SOAP_TIME_LIMIT ); } @@ -660,15 +581,26 @@ void HttpSoapConnection::slotHttpResponseHeaderReceived( const QHttpResponseHead /** * @brief Called when an ssl error occurred while setting up the connection. */ -void HttpSoapConnection::slotSslErrors( const QList &sslErrors ) +void HttpSoapConnection::slotSslErrors( QNetworkReply *reply, const QList &sslErrors ) { foreach( QSslError error, sslErrors ) { - kWarning() << "Got SSL error '" << error.errorString() << "' while connecting to '" << endpoint_ << "'."; + kWarning() << "Got SSL error" << error.errorString() << "while connecting to endpoint" << reply->url(); } // It's needed to ignore SSL errors because rsi.hotmail.com uses an invalid certificate. - http_->ignoreSslErrors(); + reply->ignoreSslErrors(); +} + + + +/** + * @brief Decode UTF-8 text from a SOAP node (usually friendly names). + */ +QString HttpSoapConnection::textNodeDecode( const QString &string ) +{ + QString copy( QString::fromUtf8( string.toLatin1() ) ); + return KMessShared::htmlUnescape( copy ); } diff --git a/src/network/soap/httpsoapconnection.h b/src/network/soap/httpsoapconnection.h index eecba54..6d4ee98 100644 --- a/src/network/soap/httpsoapconnection.h +++ b/src/network/soap/httpsoapconnection.h @@ -18,14 +18,18 @@ #ifndef HTTPSOAPCONNECTION_H #define HTTPSOAPCONNECTION_H +#include "../msnsocketbase.h" + #include +#include #include +#include #include -class QHttp; -class QHttpResponseHeader; class QAuthenticator; +class QNetworkAccessManager; +class QNetworkReply; class QSslError; class SoapMessage; @@ -53,11 +57,11 @@ class MimeMessage; * - http://wanderingbarque.com/nonintersecting/2006/11/15/the-s-stands-for-simple/ * * To use this class, extend it to implement method wrappers for the SOAP calls. - * The request can be sent with sendRequest(). The response is received as QDomElement in parseSoapResult. - * Overwrite parseSoapResult() to implement the response handling. - * The XmlFunctions class is useful to parse complex result structures. + * A request can be sent with sendRequest(). The response is received as SoapMessage in parseSoapResult(): + * overwrite parseSoapResult() to handle the normal responses, and parseSoapFault() for the error responses. * * @author Diederik van der Boor + * @author Valerio Pilo * @ingroup NetworkSoap */ class HttpSoapConnection : public QObject @@ -66,84 +70,79 @@ class HttpSoapConnection : public QObject public: // public methods // The constructor - HttpSoapConnection( const QString &endpoint, QObject *parent = 0 ); + explicit HttpSoapConnection( QObject *parent = 0 ); // The destructor virtual ~HttpSoapConnection(); - // Close the connection - void closeConnection(); - - // Return the endpoint - QString getEndpoint() const; - // Return the last SOAP action - const QString & getSoapAction() const; // Whether the connection is idle, not processing a SOAP request/response bool isIdle(); protected: - // The request is processed, delete any user data associated with the request. - virtual void clearRequestData( int requestId ); - // Escape a string for inclusion in XML - QString escapeString( QString value ) const; - // Return the currently active request ID. - int getCurrentRequestId() const; - // The connection received the full response - virtual void parseSoapResult( const QDomElement &resultNode, const QDomElement &headerNode ) = 0; + // Return the current request message, if any + SoapMessage *getCurrentRequest( bool copy = false ) const; // Parse the SOAP fault - virtual void parseSoapFault( const QDomElement &faultNode, const QDomElement &headerNode ); - // Send a SOAP request - int sendRawPostRequest( const QString &content, const QString &soapAction = QString::null ); - // Send a SOAP request - int sendRequest( const QString &soapAction, const SoapMessage &message ); - // Send a SOAP request - int sendRequest( const QString &soapAction, const QString &messageBody, const QString &messageHeader = QString::null ); - // Change the SOAP endpoint. - void setEndpoint( const QString &endpoint ); + virtual void parseSoapFault( SoapMessage *message ); + // The connection received the full response + virtual void parseSoapResult( SoapMessage *message ) = 0; + // Send a SOAP request to the webservice + virtual void sendRequest( SoapMessage *message, bool urgent = false ); + // Decode UTF-8 text from a SOAP node (usually friendly names). + QString textNodeDecode( const QString &string ); private: - // The connection received the full response - bool parseHttpBody( const QByteArray &responseBody ); + // Send the next request in queue to the endpoint. + void sendNextRequest(); private slots: // Called when the remote server requires authentication - void slotHttpAuthenticationRequired( const QString &hostname, quint16 port, QAuthenticator *authenticator ); + void slotAuthenticationRequired( QNetworkReply *reply, QAuthenticator *authenticator ); // Called when the request to the remote server finished - void slotHttpRequestFinished( int requestId, bool error ); - // Called when the response header is received - void slotHttpResponseHeaderReceived( const QHttpResponseHeader &header ); + void slotRequestFinished( QNetworkReply *reply ); + // Called when a timeout occurred while sending a request + void slotRequestTimeout(); // Called when an ssl error occurred while setting up the connection - void slotSslErrors( const QList &sslErrors ); + void slotSslErrors( QNetworkReply *reply, const QList &sslErrors ); private: // private attributes - /// The current request ID which the slots are processing. - int currentRequestId_; - /// The endpoint for the request - QUrl endpoint_; - /// The http request ids for the setHost() call - QList hostRequestIds_; - /// The http connection helper - QHttp *http_; + /// The current request which is being processed + SoapMessage *currentRequest_; + /// The list of redirections + QHash redirections_; + /// The redirection counter for each redirection + QHash redirectionCounts_; + /// The queue of active requests + QList requests_; + /// The connection manager + QNetworkAccessManager *http_; + /// Whether a message is being sent or not + bool isSending_; + /// Timer used to detect timeouts when sending requests + QTimer responseTimer_; /// The last SOAP action QString soapAction_; signals: /** - * @brief Fired when another error occured. - * @param client The object sending the signal. - * @param reason The message to display in the user interface. + * @brief Fired when a fatal error occured. + * + * This signal is *not* meant to be used when the server answers with an error + * message, but when the request could not be sent, or when the answer does not + * arrive within a reasonable timeframe. + * + * @param error The message to display in the user interface. + * @param type The type of error. */ - void requestFailed( HttpSoapConnection *client, const QString &reason ); - + void soapError( QString error, MsnSocketBase::ErrorType type ); /** - * @brief Fired when the SOAP request returned a SOAP fault. - * @param client The object sending the signal. - * @param faultCode The SOAP fault code. - * @param faultString The SOAP fault string value. - * @param faultNode The XML node of the SOAP fault, to extract custom fields if needed. + * @brief Fired when the user needs to be notified about a problem. + * + * This is used whenever the SOAP classes have to send messages back to the user. + * + * @param warning The message to display in the user interface. + * @param isImportant Whether the message is important enough to interrupt the user or not */ - void requestFailed( HttpSoapConnection *client, const QString &faultCode, - const QString &faultString, QDomElement faultNode ); + void soapWarning( const QString &warning, bool isImportant ); }; #endif diff --git a/src/network/soap/msnappdirectoryservice.cpp b/src/network/soap/msnappdirectoryservice.cpp index 81e1ca5..68ada02 100644 --- a/src/network/soap/msnappdirectoryservice.cpp +++ b/src/network/soap/msnappdirectoryservice.cpp @@ -20,6 +20,7 @@ #include "../../utils/xmlfunctions.h" #include "../../kmessdebug.h" #include "httpsoapconnection.h" +#include "soapmessage.h" #ifdef KMESSDEBUG_APPDIRECTORYSERVICE @@ -27,10 +28,16 @@ #endif +/** + * @brief URL of the Application Directory Service + */ +#define SERVICE_URL_APPDIRSERVICE "http://appdirectory.messenger.msn.com/AppDirectory/AppDirectory.asmx" + + // Constructor MsnAppDirectoryService::MsnAppDirectoryService( QObject *parent ) - : HttpSoapConnection( "http://appdirectory.messenger.msn.com/AppDirectory/AppDirectory.asmx", parent ) + : HttpSoapConnection( parent ) { #ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL kDebug() << "CREATED."; @@ -54,11 +61,11 @@ MsnAppDirectoryService::~MsnAppDirectoryService() // Return an application entry with a certain ID -const MsnAppDirectoryService::Entry * MsnAppDirectoryService::getEntryById(int entryId) +const MsnAppDirectoryService::Entry * MsnAppDirectoryService::getEntryById( int entryId ) { foreach( Entry *entry, entries_ ) { - if( entry->entryId == entryId) + if( entry->entryId == entryId ) { return entry; } @@ -78,23 +85,22 @@ const QList& MsnAppDirectoryService::getEntries( // A soap request finished -void MsnAppDirectoryService::parseSoapResult( const QDomElement &resultRoot, const QDomElement &headerNode ) +void MsnAppDirectoryService::parseSoapResult( SoapMessage *message ) { - Q_UNUSED( headerNode ); - #ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL kDebug() << "Got query response"; #endif // Parse the list of result entries - QDomNode dataSet = XmlFunctions::getNode( resultRoot, "diffgram/NewDataSet" ); - QDomNodeList entries = dataSet.childNodes(); + QDomNode dataSet( XmlFunctions::getNode( message->getBody(), "diffgram/NewDataSet" ) ); + QDomNodeList entries( dataSet.childNodes() ); + for( int i = 0; i < entries.count(); i++ ) { - QDomNode entryProperties = entries.item(i); + QDomNode entryProperties( entries.item( i ) ); - int entryId = XmlFunctions::getNodeValue(entryProperties, "EntryID").toInt(); - if(getEntryById(entryId) != 0) + int entryId = XmlFunctions::getNodeValue( entryProperties, "EntryID" ).toInt(); + if( getEntryById( entryId ) != 0 ) { // Ignore entries that are already present continue; @@ -103,36 +109,36 @@ void MsnAppDirectoryService::parseSoapResult( const QDomElement &resultRoot, con // Fill the values Entry *entry = new Entry; entry->entryId = entryId; - entry->subscriptionUrl = XmlFunctions::getNodeValue(entryProperties, "SubscriptionURL"); - entry->error = XmlFunctions::getNodeValue(entryProperties, "Error"); - entry->locale = XmlFunctions::getNodeValue(entryProperties, "Locale"); - entry->kids = XmlFunctions::getNodeValue(entryProperties, "Kids") == "1"; - entry->page = XmlFunctions::getNodeValue(entryProperties, "Page").toInt(); - entry->categoryId = XmlFunctions::getNodeValue(entryProperties, "CategoryID").toInt(); - entry->sequence = XmlFunctions::getNodeValue(entryProperties, "Sequence"); - entry->name = XmlFunctions::getNodeValue(entryProperties, "Name"); - entry->description = XmlFunctions::getNodeValue(entryProperties, "Description"); - entry->url = XmlFunctions::getNodeValue(entryProperties, "URL"); - entry->iconUrl = XmlFunctions::getNodeValue(entryProperties, "IconURL"); - entry->appIconUrl = XmlFunctions::getNodeValue(entryProperties, "AppIconURL"); - entry->passportSiteId = XmlFunctions::getNodeValue(entryProperties, "PassportSiteID").toInt(); - entry->type = XmlFunctions::getNodeValue(entryProperties, "Type"); - entry->height = XmlFunctions::getNodeValue(entryProperties, "Height").toInt(); - entry->width = XmlFunctions::getNodeValue(entryProperties, "Width").toInt(); - entry->location = XmlFunctions::getNodeValue(entryProperties, "Location"); - entry->minUsers = XmlFunctions::getNodeValue(entryProperties, "MinUsers").toInt(); - entry->maxUsers = XmlFunctions::getNodeValue(entryProperties, "MaxUsers").toInt(); - entry->enableIp = XmlFunctions::getNodeValue(entryProperties, "EnableIP") == "True"; - entry->activeX = XmlFunctions::getNodeValue(entryProperties, "ActiveX") == "True"; - entry->sendFile = XmlFunctions::getNodeValue(entryProperties, "SendFile") == "True"; - entry->receiveIM = XmlFunctions::getNodeValue(entryProperties, "ReceiveIM") == "True"; - entry->replaceIM = XmlFunctions::getNodeValue(entryProperties, "ReplaceIM") == "True"; - entry->windows = XmlFunctions::getNodeValue(entryProperties, "Windows") == "True"; - entry->maxPacketRate = XmlFunctions::getNodeValue(entryProperties, "MaxPacketRate").toInt(); - entry->userProperties = XmlFunctions::getNodeValue(entryProperties, "UserProperties") == "True"; - entry->clientVersion = XmlFunctions::getNodeValue(entryProperties, "ClientVersion"); - entry->appType = XmlFunctions::getNodeValue(entryProperties, "AppType").toInt(); - entry->hidden = XmlFunctions::getNodeValue(entryProperties, "Hidden") == "True"; + entry->subscriptionUrl = XmlFunctions::getNodeValue( entryProperties, "SubscriptionURL" ); + entry->error = XmlFunctions::getNodeValue( entryProperties, "Error" ); + entry->locale = XmlFunctions::getNodeValue( entryProperties, "Locale" ); + entry->sequence = XmlFunctions::getNodeValue( entryProperties, "Sequence" ); + entry->name = XmlFunctions::getNodeValue( entryProperties, "Name" ); + entry->description = XmlFunctions::getNodeValue( entryProperties, "Description" ); + entry->url = XmlFunctions::getNodeValue( entryProperties, "URL" ); + entry->iconUrl = XmlFunctions::getNodeValue( entryProperties, "IconURL" ); + entry->appIconUrl = XmlFunctions::getNodeValue( entryProperties, "AppIconURL" ); + entry->type = XmlFunctions::getNodeValue( entryProperties, "Type" ); + entry->location = XmlFunctions::getNodeValue( entryProperties, "Location" ); + entry->clientVersion = XmlFunctions::getNodeValue( entryProperties, "ClientVersion" ); + entry->page = XmlFunctions::getNodeValue( entryProperties, "Page" ).toInt(); + entry->categoryId = XmlFunctions::getNodeValue( entryProperties, "CategoryID" ).toInt(); + entry->passportSiteId = XmlFunctions::getNodeValue( entryProperties, "PassportSiteID" ).toInt(); + entry->height = XmlFunctions::getNodeValue( entryProperties, "Height" ).toInt(); + entry->width = XmlFunctions::getNodeValue( entryProperties, "Width" ).toInt(); + entry->minUsers = XmlFunctions::getNodeValue( entryProperties, "MinUsers" ).toInt(); + entry->maxUsers = XmlFunctions::getNodeValue( entryProperties, "MaxUsers" ).toInt(); + entry->maxPacketRate = XmlFunctions::getNodeValue( entryProperties, "MaxPacketRate" ).toInt(); + entry->appType = XmlFunctions::getNodeValue( entryProperties, "AppType" ).toInt(); + entry->kids = XmlFunctions::getNodeValue( entryProperties, "Kids" ) == "1"; + entry->enableIp = XmlFunctions::getNodeValue( entryProperties, "EnableIP" ) == "True"; + entry->activeX = XmlFunctions::getNodeValue( entryProperties, "ActiveX" ) == "True"; + entry->sendFile = XmlFunctions::getNodeValue( entryProperties, "SendFile" ) == "True"; + entry->receiveIM = XmlFunctions::getNodeValue( entryProperties, "ReceiveIM" ) == "True"; + entry->replaceIM = XmlFunctions::getNodeValue( entryProperties, "ReplaceIM" ) == "True"; + entry->windows = XmlFunctions::getNodeValue( entryProperties, "Windows" ) == "True"; + entry->userProperties = XmlFunctions::getNodeValue( entryProperties, "UserProperties" ) == "True"; + entry->hidden = XmlFunctions::getNodeValue( entryProperties, "Hidden" ) == "True"; #ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL kDebug() << "Received entry " << entry->name << "."; @@ -150,22 +156,27 @@ void MsnAppDirectoryService::parseSoapResult( const QDomElement &resultRoot, con // Request a list of all services -void MsnAppDirectoryService::queryServiceList(MsnAppDirectoryServiceType /*type*/) +void MsnAppDirectoryService::queryServiceList( MsnAppDirectoryServiceType type ) { + Q_UNUSED( type ); + #ifdef KMESSDEBUG_APPDIRECTORYSERVICE_GENERAL kDebug() << "Querying service list"; #endif - QString body = "\n" - " en-us\n" - " 1\n" - " -1\n" - " 0\n" - ""; + QString body( "\n" + " en-us\n" + " 1\n" + " -1\n" + " 0\n" + "" ); - sendRequest( "http://www.msn.com/webservices/Messenger/Client/GetFilteredDataSet2", body ); + sendRequest( new SoapMessage( SERVICE_URL_APPDIRSERVICE, + "http://www.msn.com/webservices/Messenger/Client/GetFilteredDataSet2", + QString(), + body ) ); } + #include "msnappdirectoryservice.moc" diff --git a/src/network/soap/msnappdirectoryservice.h b/src/network/soap/msnappdirectoryservice.h index 8aa4e61..e31c137 100644 --- a/src/network/soap/msnappdirectoryservice.h +++ b/src/network/soap/msnappdirectoryservice.h @@ -45,35 +45,36 @@ class MsnAppDirectoryService : public HttpSoapConnection struct Entry { int entryId; + QString subscriptionUrl; QString error; QString locale; - bool kids; - int page; - int categoryId; QString sequence; QString name; QString description; QString url; QString iconUrl; QString appIconUrl; - int passportSiteId; QString type; + QString location; + QString clientVersion; + int page; + int categoryId; + int passportSiteId; int height; int width; - QString location; int minUsers; int maxUsers; + int maxPacketRate; + int appType; + bool kids; bool enableIp; bool activeX; bool sendFile; bool receiveIM; bool replaceIM; bool windows; - int maxPacketRate; bool userProperties; - QString clientVersion; - int appType; bool hidden; }; @@ -88,11 +89,11 @@ class MsnAppDirectoryService : public HttpSoapConnection // Return all entries const QList& getEntries() const; // Request a list of all services - void queryServiceList(MsnAppDirectoryServiceType type); + void queryServiceList( MsnAppDirectoryServiceType type ); private: // Process server responses - void parseSoapResult( const QDomElement &resultRoot, const QDomElement &headerNode ); + void parseSoapResult( SoapMessage *message ); private: diff --git a/src/network/soap/offlineimservice.cpp b/src/network/soap/offlineimservice.cpp index 867ab47..5cb44cc 100644 --- a/src/network/soap/offlineimservice.cpp +++ b/src/network/soap/offlineimservice.cpp @@ -25,6 +25,7 @@ #include "../chatmessage.h" #include "../mimemessage.h" #include "../msnchallengehandler.h" +#include "soapmessage.h" #include @@ -36,8 +37,18 @@ #endif -#define PRODUCT_KEY "ILTXC!4IXB5FB*PX" -#define PRODUCT_ID "PROD0119GSJUC$18" + +/** + * @brief URL of the Offline IM Receiving Service + */ +#define SERVICE_URL_INCOMING_OFFLINE_IM_SERVICE "https://rsi.hotmail.com/rsi/rsi.asmx" + +/** + * @brief URL of the Offline IM Sending Service + */ +#define SERVICE_URL_OUTGOING_OFFLINE_IM_SERVICE "https://ows.messenger.msn.com/OimWS/oim.asmx" + + @@ -52,23 +63,22 @@ */ OfflineImService::OfflineImService( const QString &authT, const QString &authP, QObject *parent ) - : HttpSoapConnection( "https://rsi.hotmail.com/rsi/rsi.asmx", parent ) - , authT_(authT) - , authP_(authP) - , nextSequenceNum_(0) - , passportService_(0) +: PassportLoginService( parent ) +, authT_(authT) +, authP_(authP) +, nextSequenceNum_(0) { #ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kDebug() << "CREATED receiver service."; + kDebug() << "CREATED offline IM receiver service"; #endif setObjectName( "OfflineImService[receiver]" ); - // Initialize the header once. + // Initialize the header once. The tokens are escaped after getting copied (mid(0) returns a copy) passportCookieHeader_ = " \n" - " " + escapeString(authT) + "\n" - "

    " + escapeString(authP) + "

    \n" + " " + KMessShared::htmlEscape( authT.mid( 0 ) ) + "\n" + "

    " + KMessShared::htmlEscape( authP.mid( 0 ) ) + "

    \n" "
    "; } @@ -82,12 +92,11 @@ OfflineImService::OfflineImService( const QString &authT, const QString &authP, * @param parent The Qt parent object, when it's destroyed this class will be cleaned up automatically too. */ OfflineImService::OfflineImService( QObject *parent ) - : HttpSoapConnection( "https://ows.messenger.msn.com/OimWS/oim.asmx", parent ) + : PassportLoginService( parent ) , nextSequenceNum_(0) - , passportService_(0) { #ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kDebug() << "CREATED sender service."; + kDebug() << "CREATED offline IM sender service"; #endif setObjectName( "OfflineImService[sender]" ); @@ -100,12 +109,6 @@ OfflineImService::OfflineImService( QObject *parent ) */ OfflineImService::~OfflineImService() { - delete passportService_; - - // Delete stored request data - qDeleteAll( getMessageCallData_ ); - qDeleteAll( storeMessageCallData_ ); - #ifdef KMESSDEBUG_OFFLINE_IM_GENERAL kDebug() << "DESTROYED."; #endif @@ -113,56 +116,6 @@ OfflineImService::~OfflineImService() -/** - * @brief Delete the temporary data associated with the request id. - * - * This method is called by the base class when a request is completely processed. - * - * @param requestId ID of the request, as returned by sendRequest(). - */ -void OfflineImService::clearRequestData( int requestId ) -{ -#ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kDebug() << "deleting call data of request" << requestId; -#endif - - // Delete stored objects - delete getMessageCallData_.take( requestId ); - delete storeMessageCallData_.take( requestId ); - - // Reset other state tracking vars. - passportRequestIds_.removeAll( requestId ); -} - - - -/** - * @brief Create a passport login service on demand. - * - * This service is used to authenticate the client to send offline messages. - */ -PassportLoginService * OfflineImService::createPassportLoginService() -{ - // Create the new passport service - PassportLoginService *passportService = new PassportLoginService( this ); - - // Connect the signals to continue sending the offline message - connect( passportService, SIGNAL( loginIncorrect() ), - this, SLOT ( slotLoginRequestFailed() ) ); - connect( passportService, SIGNAL( loginSucceeded(QString, QString, QString) ), - this, SLOT ( slotLoginSucceeded(QString, QString, QString) ) ); - - // Also relay the standard signals. - connect( passportService, SIGNAL( requestFailed(HttpSoapConnection*, const QString&) ), - this, SLOT ( slotLoginRequestFailed(HttpSoapConnection*, const QString&) ) ); - connect( passportService, SIGNAL( requestFailed(HttpSoapConnection*, const QString&, const QString&, QDomElement) ), - this, SLOT ( slotLoginRequestFailed(HttpSoapConnection*, const QString&, const QString&, QDomElement) ) ); - - return passportService; -} - - - /** * @brief SOAP call to delete messages from the remote storage. * @param messageIds List of messages to delete. @@ -170,35 +123,34 @@ PassportLoginService * OfflineImService::createPassportLoginService() void OfflineImService::deleteMessages( const QStringList &messageIds ) { #ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kDebug() << "requesting deletion of messages: '" << messageIds.join("', '") << "'"; + kDebug() << "requesting deletion of messages:" << messageIds; #endif #ifdef KMESSTEST KMESS_ASSERT( ! messageIds.isEmpty() ); #endif - // Initialize request - QString soapAction = "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/DeleteMessages"; - QString soapBody = - " \n" - " \n" - " " + messageIds.join("\n ") + "\n" - " \n" - " "; + QString body( " \n" + " \n" + " " + messageIds.join("\n ") + "\n" + " \n" + " " ); - // Make the request - sendRequest( soapAction, soapBody, passportCookieHeader_ ); + sendSecureRequest( new SoapMessage( SERVICE_URL_INCOMING_OFFLINE_IM_SERVICE, + "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/DeleteMessages", + passportCookieHeader_, + body ) ); } /** - * @brief Internal function to extract the e-mail address from an RFC822 formatted string. + * @brief Internal function to extract the email address from an RFC822 formatted string. * * For a value such as '"Contactname" <contact@hotmail.com>', * this method returns 'contact@hotmail.com'. * - * @param address The string with an e-mail address. - * @returns The e-mail address of the contact. + * @param address The string with an email address. + * @returns The email address of the contact. */ QString OfflineImService::extractRFC822Address( const QString &address ) { @@ -232,25 +184,27 @@ QString OfflineImService::extractRFC822Address( const QString &address ) void OfflineImService::getMessage( const QString &messageId, bool markAsRead ) { #ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kDebug() << "requesting message '" << messageId << "'"; + kDebug() << "requesting message with ID:" << messageId; #endif - // Initialize the call data. - // Will be used in the slots to know which session this was. - GetMessageCallData *callData = new GetMessageCallData; - callData->messageId = messageId; + // Initialize the call data, which will be used in the slots to know which session this was + MessageData data; + data.type = "GetMessage"; + data.value = messageId; // Initialize request - QString soapAction = "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage"; - QString soapBody = + QString soapBody( " \n" - " " + escapeString( messageId ) + "\n" + " " + KMessShared::htmlEscape( messageId ) + "\n" " " + ( markAsRead ? "true" : "false" ) + "\n" - " "; + " " ); // Send the request. - int requestId = sendRequest( soapAction, soapBody, passportCookieHeader_ ); - getMessageCallData_.insert( requestId, callData ); + sendRequest( new SoapMessage( SERVICE_URL_INCOMING_OFFLINE_IM_SERVICE, + "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage", + passportCookieHeader_, + soapBody, + data ) ); } @@ -270,9 +224,16 @@ void OfflineImService::getMetaData() kDebug() << "requesting Mail-Data field"; #endif - QString soapAction = "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMetadata"; - QString soapBody = " "; - sendRequest( soapAction, soapBody, passportCookieHeader_ ); + // Initialize the call data, which will be used in the slots to know which session this was + MessageData data; + data.type = "GetMetaData"; + + // Send the request. + sendRequest( new SoapMessage( SERVICE_URL_INCOMING_OFFLINE_IM_SERVICE, + "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMetadata", + passportCookieHeader_, + "", + data ) ); } @@ -280,98 +241,91 @@ void OfflineImService::getMetaData() /** * @brief Process the SOAP fault returned when sending an offline message. */ -void OfflineImService::parseSoapFault( const QDomElement &faultNode, const QDomElement &headerNode ) +void OfflineImService::parseSecureFault( SoapMessage *message ) { - // Get the type of the error - int currentRequestId = getCurrentRequestId(); - QString faultCode = XmlFunctions::getNodeValue( faultNode, "faultcode" ); + // Should never happen + if( ! message->isFaultMessage() ) + { + kWarning() << "Incorrect fault detected on incoming message"; + return; + } - // Get calling data. - StoreMessageCallData *callData = storeMessageCallData_[ currentRequestId ]; + // Get the type of the error + QString faultCode( message->getFaultCode() ); + + // Get the message data + MessageData messageData( message->getData() ); + QStringList info ( messageData.value.toStringList() ); + QString recipient ( info.value( 0 ) ); + QString contents ( info.value( 1 ) ); + int sequenceNum( info.value( 2 ).toInt() ); // See which fault we received if( faultCode == "q0:AuthenticationFailed" ) { - if( KMESS_NULL(callData) ) return; - - QString lockKeyChallenge = XmlFunctions::getNodeValue( faultNode, "detail/LockKeyChallenge" ); - QString twnChallenge = XmlFunctions::getNodeValue( faultNode, "detail/TweenerChallenge" ); + QDomNode faultNode( message->getFault() ); + QString lockKeyChallenge( XmlFunctions::getNodeValue( faultNode, "detail/LockKeyChallenge" ) ); + QString tweenerChallenge( XmlFunctions::getNodeValue( faultNode, "detail/TweenerChallenge" ) ); // See if a lock key challenge was requested. if( ! lockKeyChallenge.isEmpty() ) { // In the response from server there is a LockKeyChallenge that allows - // to calculate hash for LockKey (together the Product Key and Product id of MSN). + // to calculate the LockKey hash (together the Product Key and Product id of MSN). // Compute hash with MSN product key/id for the identification - MSNChallengeHandler handler( PRODUCT_KEY, PRODUCT_ID ); + MSNChallengeHandler handler; // Compute the lock key using the MSNP11 Challenge algorithm - CurrentAccount::instance()->setOfflineImKey( handler.computeHash( lockKeyChallenge ) ); + currentAccount_->setOfflineImKey( handler.computeHash( lockKeyChallenge ) ); #ifdef KMESSDEBUG_OFFLINE_IM_GENERAL kDebug() << "Lock key to compute:" << lockKeyChallenge; - kDebug() << "Computed lock key:" << CurrentAccount::instance()->getOfflineImKey(); + kDebug() << "Computed lock key:" << currentAccount_->getOfflineImKey(); #endif - // Check if there is also TweenerChallenge - if( twnChallenge.isEmpty() ) + // Check if there is a TweenerChallenge, and if not re-send the message with the new lock key + if( tweenerChallenge.isEmpty() ) { - // Re-send the message with the new lock key - storeMessage( callData->to, callData->message, callData->sequenceNum ); + storeMessage( recipient, contents, sequenceNum ); return; } } - - // See if a tweaner challenge was requested. - if( ! twnChallenge.isEmpty() ) + // See if a tweener challenge was requested. + if( ! tweenerChallenge.isEmpty() ) { - // Initialize login service on demand. - if( passportService_ == 0 ) - { - passportService_ = createPassportLoginService(); - } - - // Start the login attempt. - CurrentAccount *currentAccount = CurrentAccount::instance(); - passportService_->login( twnChallenge, currentAccount->getHandle(), currentAccount->getPassword() ); - passportRequestIds_.append( currentRequestId ); + // Start the login attempt using the base class + login( tweenerChallenge, currentAccount_->getHandle(), currentAccount_->getPassword() ); return; } // Any other situation means something is wrong. kWarning() << "Unknown challenge type received"; - emit sendMessageFailed( callData->to, callData->message ); + emit sendMessageFailed( recipient, contents ); } else if( faultCode == "q0:SystemUnavailable" || faultCode == "q0:DeliveryFailed" // happens with unverified passport accounts || faultCode == "q0:InvalidParameter" // seen with SOAP syntax error - || faultCode == "q0:SenderThrottleLimitExceeded" ) // TODO: what to for that one?? + || faultCode == "q0:SenderThrottleLimitExceeded" ) // TODO: Implement throttle control in HttpSoapConnection { - if( KMESS_NULL(callData) ) return; - // failed, can't send offline IM's - emit sendMessageFailed( callData->to, callData->message ); + emit sendMessageFailed( recipient, contents ); // Also report at the console. - kWarning() << "Received SOAP fault" << faultCode << "when sending an offline-im message to" << callData->to; + kWarning() << "Received SOAP fault" << faultCode << "when sending an offline-im message to" << recipient; } else { // Any other situation means something is wrong. - kWarning() << "Unknown response type received " - "(faultCode=" << faultCode << " endpoint=" << getEndpoint() << ")" << endl; + kWarning() << "Unknown response type received: fault code:" << faultCode + << "endpoint:" << message->getEndPoint(); // Notify the sender if this error was // in response of a sent offline im. - if( callData != 0 ) + if( ! info.isEmpty() ) { - emit sendMessageFailed( callData->to, callData->message ); + emit sendMessageFailed( recipient, contents ); } - - // Do standard SOAP error handling. - // (currently will relay to a kWarning() for the msn swichboard connection). - HttpSoapConnection::parseSoapFault( faultNode, headerNode ); } } @@ -387,25 +341,24 @@ void OfflineImService::parseSoapFault( const QDomElement &faultNode, const QDomE * * Other unrecognized response types result in a warning message at the console. * - * @param resultRoot The result root of the SOAP response. - * @param headerNode The header node of the SOAP response. + * @param message The SOAP response message. */ -void OfflineImService::parseSoapResult( const QDomElement &resultRoot, const QDomElement &/*headerNode*/ ) +void OfflineImService::parseSecureResult( SoapMessage *message ) { #ifdef KMESSDEBUG_OFFLINE_IM_GENERAL kDebug() << "parsing SOAP response."; #endif - int currentRequestId = getCurrentRequestId(); + QDomElement body ( message->getBody().toElement() ); + QString resultName( body.firstChildElement().localName() ); - QString resultName = resultRoot.localName(); - if( resultName == "GetMessageResult" ) + if( resultName == "GetMessageResponse" ) { - processGetMessageResult( resultRoot ); + processGetMessageResult( message ); } else if( resultName == "GetMetadataResponse" ) { - emit metaDataReceived( resultRoot.namedItem("MD").toElement() ); + emit metaDataReceived( body.namedItem("MD").toElement() ); } else if( resultName == "DeleteMessagesResponse" ) { @@ -414,11 +367,11 @@ void OfflineImService::parseSoapResult( const QDomElement &resultRoot, const QDo else if( resultName == "StoreResponse" ) { #ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - StoreMessageCallData *callData = storeMessageCallData_[ currentRequestId ]; - if( ! KMESS_NULL(callData) ) - { - kDebug().nospace() << "Stored offline message for " << callData->to << ": " << callData->message; - } + QStringList info ( message->getData().value.toStringList() ); + QString recipient( info.value( 0 ) ); + QString contents ( info.value( 1 ) ); + + kDebug() << "Stored offline message for" << recipient << ":" << contents; #endif // Reset the session ID @@ -426,8 +379,7 @@ void OfflineImService::parseSoapResult( const QDomElement &resultRoot, const QDo } else { - kWarning().nospace() << "Unknown response type received " - "(rootnode=" << resultName << " endpoint=" << getEndpoint() << ")" << endl; + kWarning() << "Unknown response type" << resultName << "received from endpoint" << message->getEndPoint(); } } @@ -441,26 +393,24 @@ void OfflineImService::parseSoapResult( const QDomElement &resultRoot, const QDo * * @param resultRoot The GetMessageResult node of the response. */ -void OfflineImService::processGetMessageResult( const QDomElement &resultRoot ) +void OfflineImService::processGetMessageResult( SoapMessage *message ) { #ifdef KMESSDEBUG_OFFLINE_IM_GENERAL - kDebug() << "parsing downloaded Offline-IM message."; + kDebug() << "Parsing downloaded Offline-IM message."; #endif - // Get the call data with original message ID. - int currentRequestId = getCurrentRequestId(); - GetMessageCallData *callData = getMessageCallData_[ currentRequestId ]; - if( KMESS_NULL(callData) ) return; + // Retrieve the data stored in the SOAP message + QString messageId( message->getData().value.toString() ); - // Parse as MIME message. - MimeMessage message( resultRoot.text() ); + // Parse as MIME message + MimeMessage mimeMessage( message->getBody().toElement().text() ); // Extract the fields - QString from = message.decodeRFC2047String( message.getValue("From").toUtf8() ); - QString to = message.decodeRFC2047String( message.getValue("To").toUtf8() ); - QString dateString = message.getValue("Date"); - QString runId = message.getValue("X-OIM-Run-Id"); - int sequenceNum = message.getValue("X-OIM-Sequence-Num").toInt(); + QString from ( mimeMessage.decodeRFC2047String( mimeMessage.getValue( "From" ).toUtf8() ) ); + QString to ( mimeMessage.decodeRFC2047String( mimeMessage.getValue( "To" ).toUtf8() ) ); + QString dateString ( mimeMessage.getValue( "Date" ) ); + QString runId ( mimeMessage.getValue( "X-OIM-Run-Id" ) ); + int sequenceNum( mimeMessage.getValue( "X-OIM-Sequence-Num" ).toInt() ); // Convert the 'From' and 'To' lines, it's something like "Contactname " from = extractRFC822Address( from ); @@ -471,33 +421,33 @@ void OfflineImService::processGetMessageResult( const QDomElement &resultRoot ) date.setTime_t( KDateTime::fromString( dateString, KDateTime::RFCDate ).toTime_t() ); // Validate content type - QString contentType = message.getValue("Content-Type"); + QString contentType( mimeMessage.getValue( "Content-Type" ) ); if( contentType.toLower() != "text/plain; charset=utf-8" ) { - kWarning() << "received unexpected content type: " << contentType; + kWarning() << "Received unexpected content type:" << contentType; } // Validate transfer encoding - QString transferEncoding = message.getValue("Content-Transfer-Encoding"); + QString transferEncoding( mimeMessage.getValue( "Content-Transfer-Encoding" ) ); if( transferEncoding != "base64" ) { - kWarning() << "received unexpected transfer encoding: " << transferEncoding; + kWarning() << "Received unexpected transfer encoding:" << transferEncoding; } // Validate message type - QString messageType = message.getValue("X-OIM-Message-Type"); + QString messageType( mimeMessage.getValue( "X-OIM-Message-Type" ) ); if( messageType != "OfflineMessage" ) { - kWarning() << "received unexpected message type: " << messageType; + kWarning() << "Received unexpected message type:" << messageType; } // Process the body - QByteArray decodedBody = QByteArray::fromBase64( message.getBody().toUtf8() ); - QString body = QString::fromUtf8( decodedBody.data(), decodedBody.length() ); + QByteArray decodedBody( QByteArray::fromBase64( mimeMessage.getBody().toUtf8() ) ); + QString body ( QString::fromUtf8( decodedBody.data(), decodedBody.length() ) ); // Return to caller // The MessageID was stored in the "RequestId" field of the sendRawRequest() method - emit messageReceived( callData->messageId, from, to, date, body, runId, sequenceNum ); + emit messageReceived( messageId, from, to, date, body, runId, sequenceNum ); } @@ -514,7 +464,7 @@ void OfflineImService::processGetMessageResult( const QDomElement &resultRoot ) void OfflineImService::sendMessage( const QString &to, const QString &message ) { // Increment sequence counter. - nextSequenceNum_++; + ++nextSequenceNum_; // Call internal version with sequence number storeMessage( to, message, nextSequenceNum_ ); @@ -525,7 +475,7 @@ void OfflineImService::sendMessage( const QString &to, const QString &message ) /** * @brief Internal method to store a message in the offline-im storage. * - * This method is used internally by sendMessag() and others to send the message. + * This method is used internally by sendMessage() and others to send the message. * It accepts a third sequenceNum parameter so retries are stored with the same sequence number. * * @param to Handle of the message sender. @@ -534,19 +484,19 @@ void OfflineImService::sendMessage( const QString &to, const QString &message ) */ void OfflineImService::storeMessage( const QString &to, const QString &message, int sequenceNum ) { - CurrentAccount *currentAccount = CurrentAccount::instance(); + // Get a copy of the message with Windows linefeeds + QString windowsMessage( message ); + windowsMessage.replace( QRegExp("\r?\n"), "\n" ); + MSNChallengeHandler handler; - QString auth = Qt::escape( currentAccount->getAuthenticationTicket() ); - const QString &from = currentAccount->getHandle(); - const QString &friendlyName = currentAccount->getFriendlyName(); - const QString &offlineImKey = currentAccount->getOfflineImKey(); + const QString &from ( currentAccount_->getHandle() ); + const QString &friendlyName( currentAccount_->getFriendlyName( STRING_ORIGINAL ) ); + const QString &offlineImKey( currentAccount_->getOfflineImKey() ); - // Initialize the call data. - // Will be used in the slots to know which session this was. - StoreMessageCallData *callData = new StoreMessageCallData; - callData->to = to; - callData->message = message; - callData->sequenceNum = sequenceNum; + // Save the session data in the SOAP message, to allow slots to identify the source session + MessageData data; + data.type = "OIMStore"; + data.value = QStringList() << to << message << QString::number( sequenceNum ); // Store the GUID for this sending session if( runID_.isEmpty() ) @@ -555,131 +505,39 @@ void OfflineImService::storeMessage( const QString &to, const QString &message, } // Build the request - QString soapAction = "http://messenger.msn.com/ws/2004/09/oim/Store"; + QString header( "\n" + "\n" + "" // This attribute is filled by the base class + "\n" + " http://messenger.msn.com\n" + " " + QString::number( sequenceNum ) + "\n" + "" ); - QString soapHeader = - "\n" - "\n" - "" - "\n" - " http://messenger.msn.com\n" - " " + QString::number( sequenceNum ) + "\n" - ""; + QString body( "text\n" + "" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: base64\n" + "X-OIM-Message-Type: OfflineMessage\n" + "X-OIM-Run-Id:" + runID_ + "\n" + "X-OIM-Sequence-Num: " + QString::number( sequenceNum ) + "\n" + "\n" + + windowsMessage.toUtf8().toBase64() + + "" ); - QString soapBody = - "text\n" - "MIME-Version: 1.0\r\n" - "Content-Type: text/plain; charset=UTF-8\r\n" - "Content-Transfer-Encoding: base64\r\n" - "X-OIM-Message-Type: OfflineMessage\r\n" - "X-OIM-Run-Id:" + runID_ + "\r\n" - "X-OIM-Sequence-Num: " + QString::number( sequenceNum ) + "\r\n" - "\r\n" + - callData->message.replace( "\n" ,"\r\n" ).toUtf8().toBase64() + - ""; - - // Send the request. - int requestId = sendRequest( soapAction, soapBody, soapHeader ); - storeMessageCallData_.insert( requestId, callData ); -} - - - -/** - * @brief Called when the passport login was succesful. - * - * Send the offline IM message again. - */ -void OfflineImService::slotLoginSucceeded( QString authenticationKey, QString passportToken, - QString proofToken ) -{ - // See which messages were waiting for passport authentication. - QList loginRequestIds = passportRequestIds_; // copy so clearRequestData() can also clear this list. - foreach( int loginRequestId, loginRequestIds ) - { - // Don't delete yet, might get another call. - StoreMessageCallData *callData = storeMessageCallData_[ loginRequestId ]; - if( ! KMESS_NULL(callData) ) // yes, warn for this! - { - // Update the authentication ticket - CurrentAccount *currentAccount = CurrentAccount::instance(); - currentAccount->setAuthenticationTicket( authenticationKey ); - currentAccount->setPassportToken ( passportToken ); - currentAccount->setProofToken ( proofToken ); - - // Send the OIM message again. - storeMessage( callData->to, callData->message, callData->sequenceNum ); - } - } -} - - - -/** - * @brief Called when the login of the passport login request failed. - * - * Notify the calling class that sending the offline IM message failed. - */ -void OfflineImService::slotLoginRequestFailed() -{ - // See which messages were waiting for passport authentication. - QList loginRequestIds = passportRequestIds_; // copy so clearRequestData() can also clear this list. - foreach( int loginRequestId, loginRequestIds ) - { - // Notify the sender this message can't be delivered. - // Delete call data manually here. - StoreMessageCallData *callData = storeMessageCallData_.take( loginRequestId ); - if( ! KMESS_NULL(callData) ) // yes, warn for this! - { - emit sendMessageFailed( callData->to, callData->message ); - delete callData; - } - } - - passportRequestIds_.clear(); -} - - - -/** - * @brief Called when the sub request of the passport login failed. - */ -void OfflineImService::slotLoginRequestFailed( HttpSoapConnection *passportService, const QString &reason ) -{ - // Display a standard "message could not be sent" notice. - slotLoginRequestFailed(); - - // Display the exact detailed reason at the console, as always. - kWarning() << "A offline message could not be sent. The passport login request failed with the following error message: " << reason; - - // TODO: Also relay to caller? - Q_UNUSED( passportService ); - Q_UNUSED( reason ); -// emit requestFailed( this, reason ); -} - - - -/** - * @brief Called when the sub request of the passport login failed. - */ -void OfflineImService::slotLoginRequestFailed( HttpSoapConnection *passportService, const QString &faultCode, - const QString &faultString, QDomElement faultNode ) -{ - Q_UNUSED( faultNode ); - - // Reform to standard message. - // Just like MsnConnection::slotSoapFault() does. - - slotLoginRequestFailed( passportService, faultCode + ": " + faultString ); + // Send the request + sendSecureRequest( new SoapMessage( SERVICE_URL_OUTGOING_OFFLINE_IM_SERVICE, + "http://messenger.live.com/ws/2006/09/oim/Store2", + header, + body, + data ), + "MessengerSecure" ); } diff --git a/src/network/soap/offlineimservice.h b/src/network/soap/offlineimservice.h index 3f77daf..87bab44 100644 --- a/src/network/soap/offlineimservice.h +++ b/src/network/soap/offlineimservice.h @@ -18,7 +18,6 @@ #ifndef OFFLINEIMSERVICE_H #define OFFLINEIMSERVICE_H -#include "httpsoapconnection.h" #include "passportloginservice.h" #include @@ -48,7 +47,7 @@ class QDateTime; * @author Diederik van der Boor * @ingroup NetworkSoap */ -class OfflineImService : public HttpSoapConnection +class OfflineImService : public PassportLoginService { Q_OBJECT @@ -70,66 +69,31 @@ class OfflineImService : public HttpSoapConnection void sendMessage( const QString &to, const QString &message ); private: - // Delete the temporary data associated with the request id. - void clearRequestData( int requestId ); - // Create a passport login service on demand. - PassportLoginService *createPassportLoginService(); - // Extract the e-mail address from an RFC822 formatted string. + // Extract the email address from an RFC822 formatted string. QString extractRFC822Address( const QString &address ); // Process the SOAP fault returned when sending an offline message. - void parseSoapFault( const QDomElement &resultRoot, const QDomElement &headerNode ); + void parseSecureFault( SoapMessage *message ); // Process server responses - void parseSoapResult( const QDomElement &resultRoot, const QDomElement &headerNode ); + void parseSecureResult( SoapMessage *message ); // Process the getMessage response - void processGetMessageResult( const QDomElement &resultRoot ); + void processGetMessageResult( SoapMessage *message ); // Internal method to store a message in the offline-im storage. void storeMessage( const QString &to, const QString &message, int sequenceNum ); - private slots: - // Called when the passport login was succesful. - void slotLoginSucceeded( QString authenticationKey, QString passportToken, - QString proofToken ); - // Notify the calling class that sending the offline IM message failed. - void slotLoginRequestFailed(); - // Called when the sub request of the passport login failed. - void slotLoginRequestFailed( HttpSoapConnection *passportService, const QString &reason ); - // Called when the sub request of the passport login failed. - void slotLoginRequestFailed( HttpSoapConnection *passportService, const QString &faultCode, - const QString &faultString, QDomElement faultNode ); - private: - struct GetMessageCallData - { - QString messageId; - }; - - struct StoreMessageCallData - { - QString to; - QString message; - int sequenceNum; - }; - /// The t value of the passport cookie. QString authT_; /// The p value of the passport cookie. QString authP_; - // Additional request data to track - QHash getMessageCallData_; // Offline message sequence number int nextSequenceNum_; /// The passport header to send with SOAP QString passportCookieHeader_; - // The request ID's which are waiting for passport authentication. - QList passportRequestIds_; // The passport service for require the new ticket PassportLoginService *passportService_; - // Server lock key used to authorize OIM sending - QString lockKey_; // GuID for the OIM session QString runID_; - // Additional request data to track - QHash storeMessageCallData_; + signals: /** @@ -161,7 +125,7 @@ class OfflineImService : public HttpSoapConnection const QDateTime &date, const QString &body, const QString &runId, int sequenceNum ); - void sendMessageFailed( QString to, QString message ); + void sendMessageFailed( const QString &to, const QString &message ); }; #endif diff --git a/src/network/soap/passportloginservice.cpp b/src/network/soap/passportloginservice.cpp index d4f0504..67e0db5 100644 --- a/src/network/soap/passportloginservice.cpp +++ b/src/network/soap/passportloginservice.cpp @@ -17,11 +17,11 @@ #include "passportloginservice.h" -#include "../../utils/xmlfunctions.h" -#include "../../kmessdebug.h" -#include "../mimemessage.h" -#include "../../currentaccount.h" #include "../../utils/kmessshared.h" +#include "../../utils/xmlfunctions.h" +#include "../../currentaccount.h" +#include "../mimemessage.h" +#include "soapmessage.h" #include #include @@ -29,20 +29,33 @@ #include +/** + * @brief URL of the Request Security Token Service + */ +#define SERVICE_URL_RST_SERVICE "https://login.live.com/RST.srf" + + +// Static attributes initialization +QHash PassportLoginService::tokenExpirationDates_; + + + /* * Great documentation about this can be found at * http://msnpiki.msnfanatic.com/index.php/MSNP13:SOAPTweener */ + /** * @brief The constructor * * Initializes the client to connect to the passport login (RST) service. */ PassportLoginService::PassportLoginService( QObject *parent ) -: HttpSoapConnection( "https://loginnet.passport.com/RST.srf", parent ) -, redirects_(0) +: HttpSoapConnection( parent ) +, currentAccount_( CurrentAccount::instance() ) +, isWaitingForNewTokens_( false ) { // RST stands for "Request Security Token" // This class is called "PassportLoginService" since "RequestSecurityTokenService" is too hard to understand. @@ -57,7 +70,7 @@ PassportLoginService::PassportLoginService( QObject *parent ) */ PassportLoginService::~PassportLoginService() { - + qDeleteAll( queuedRequests_.keys() ); } @@ -69,7 +82,7 @@ PassportLoginService::~PassportLoginService() * The loginIncorrect() signal is fired when the login data is incorrect. * * @param parameters The login parameters found in the USR command of notification server. - * @param handle The account handle; the e-mail address. + * @param handle The account handle; the email address. * @param password The account password in plain text. */ void PassportLoginService::login( const QString ¶meters, const QString &handle, const QString &password ) @@ -90,41 +103,48 @@ void PassportLoginService::login( const QString ¶meters, const QString &hand // Compute the string for live hotmail access -QString PassportLoginService::createHotmailToken( const QString &passportToken, const QString &proofToken, +const QString PassportLoginService::createHotmailToken( const QString &passportToken, + const QString &proofToken, const QString &folder ) { - QString token; - - // Create the token - token = "ct=" + QString::number( QDateTime::currentDateTime().toTime_t(), 10 ) + - "&rru=" + QUrl::toPercentEncoding( folder ) + - "&sru=" + QUrl::toPercentEncoding( folder ) + - "&ru=" + QUrl::toPercentEncoding( folder ) + - "&bver=4&svc=mail&js=yes&id=2&pl=%3Fid%3D2&da="; - token += QUrl::toPercentEncoding( "http://Passport.NET/STS" - "" , "", ".-" ); - - token += QUrl::toPercentEncoding( passportToken + "" ); - - // Create and append the nonce + // Create the nonce QByteArray nonce; for( int i = 0; i < 24; i++ ) { - nonce += (char)( ( rand() % 74 ) + 48 ); + nonce += (char)( ( rand() % 74 ) + 48 ); } - token += "&nonce=" + QUrl::toPercentEncoding( nonce.toBase64() ); + + // Create the percent encoded string + const QString& encodedString( QUrl::toPercentEncoding( + "" + " " + " " + " http://Passport.NET/STS" + " " + " " + " " + passportToken + "" + " " + "" + , "", ".-" ) ); + + // Create the token + QString token( "ct=" + QString::number( QDateTime::currentDateTime().toTime_t(), 10 ) + + "&rru=" + QUrl::toPercentEncoding( folder ) + + "&sru=" + QUrl::toPercentEncoding( folder ) + + "&ru=" + QUrl::toPercentEncoding( folder ) + + "&bver=4&svc=mail&js=yes&id=2&pl=%3Fid%3D2&da=" + + encodedString + + "&nonce=" + QUrl::toPercentEncoding( nonce.toBase64() ) ); // Compute the keys with HMAC-Sha1 algorithm - QByteArray key1( QByteArray::fromBase64( proofToken.toLatin1() ) ); + const QByteArray& key1( QByteArray::fromBase64( proofToken.toLatin1() ) ); - QByteArray magic = "WS-SecureConversation" + nonce; + const QByteArray& magic( "WS-SecureConversation" + nonce ); - QByteArray key2( KMessShared::deriveKey( key1, magic ) ); + const QByteArray& key2( KMessShared::deriveKey( key1, magic ) ); - QByteArray hash( KMessShared::createHMACSha1( key2, token.toLatin1() ) ); + const QByteArray& hash( KMessShared::createHMACSha1( key2, token.toLatin1() ) ); token += "&hash=" + QUrl::toPercentEncoding( hash.toBase64() ); @@ -132,11 +152,55 @@ QString PassportLoginService::createHotmailToken( const QString &passportToken, } + +/** + * @brief Bounce the authenticated SOAP fault to a subclass. + * @internal + * + * This method receives SOAP fault messages which are not related to + * authentication and analyzes them. It can be overridden by child classes + * to allow them to obtain their own content. + * + * @param message The SOAP response message. + */ +void PassportLoginService::parseSecureFault( SoapMessage *message ) +{ + HttpSoapConnection::parseSoapFault( message ); +} + + + +/** + * @brief Bounce the authenticated SOAP response to a subclass + * @internal + * + * This method receives SOAP result messages which are not related to + * authentication and analyzes them. It can be overridden by child classes + * to allow them to obtain their own content. + * + * @param message The SOAP response message. + */ +void PassportLoginService::parseSecureResult( SoapMessage *message ) +{ + const QString& resultType( message->getBody().firstChildElement().nodeName() ); + + kWarning() << "Could not parse response type" << resultType + << "from endpoint" << message->getEndPoint(); + + emit soapError( i18nc( "Error message (sytem-generated description)", + "Unexpected response from server (%1)", + resultType ), + MsnSocketBase::ERROR_SOAP_RESPONSE ); +} + + + + /** * @brief Internal function to parse the SOAP fault. * * This method detects the faultcode wsse:FailedAuthentication, - * to fire a loginIncorrect() signal instead of requestFailed(). + * to fire a loginIncorrect() signal instead of soapError(). * * It also traps SOAP fauls which are used to redirect the client. * So far this has been observed with \@msn.com passport accounts. @@ -195,49 +259,54 @@ QString PassportLoginService::createHotmailToken( const QString &passportToken, * Note the Fault object is not in * a Body but Envelope element. * - * @param faultNode The XML node which contains the SOAP fault. - * @param headerNode The XML node which contains the SOAP header. + * @param message The SOAP response message. */ -void PassportLoginService::parseSoapFault( const QDomElement &faultNode, const QDomElement &headerNode ) +void PassportLoginService::parseSoapFault( SoapMessage *message ) { - // Detect if the login failed. - QString faultCode = XmlFunctions::getNodeValue( faultNode, "faultcode" ); + // Should never happen + if( ! message->isFaultMessage() ) + { + kWarning() << "Incorrect fault detected on incoming message"; + return; + } + + const QString& faultCode( message->getFaultCode() ); + + // React accordingly to the received error if related to login issues, + // if not, fall back to the base class fault parsing if( faultCode == "wsse:FailedAuthentication" ) { - emit loginIncorrect(); - } - else if( faultCode == "psf:Redirect" ) - { - QString redirectUrl = XmlFunctions::getNodeValue( faultNode, "redirectUrl" ); #ifdef KMESSDEBUG_PASSPORTLOGINSERVICE - kDebug() << "received redirect to " << redirectUrl; + kDebug() << "Authentication failed!"; #endif - // Limit the number of redirects. - if( redirects_ > 5 ) - { - emit requestFailed( this, faultCode, i18n("Too many redirects by login service"), faultNode ); - return; - } - - // Switch to different end point and retry. - redirects_++; - setEndpoint( redirectUrl ); + emit loginIncorrect(); + } + // The tickets have expired, require new ones + else if( faultCode == "q0:BadContextToken" ) + { requestMultipleSecurityTokens(); + + // Resend the failed message + SoapMessage *message = getCurrentRequest( true /* copy */ ); + sendSecureRequest( message, inProgressRequests_.value( getCurrentRequest() ) ); } else { - HttpSoapConnection::parseSoapFault( faultNode, headerNode ); + // Relay parsing to subclasses + parseSecureFault( message ); } + + // Remove the request from the list + inProgressRequests_.remove( getCurrentRequest() ); } /** - * @brief Internal function to process the server response. + * @brief Internal function to extract security tokens from the server response. * * This handles the wst:RequestSecurityTokenResponseCollection response node. - * It ignores most of the XML by only looking for the BinarySecurityToken element. * * The result messsage looks like: * @code @@ -333,56 +402,123 @@ void PassportLoginService::parseSoapFault( const QDomElement &faultNode, const Q @endcode * - * @param resultRoot The result root of the SOAP response. - * @param headerNode The SOAP header node. + * @param message The SOAP response message. */ -void PassportLoginService::parseSoapResult( const QDomElement &resultRoot, const QDomElement &/*headerNode*/ ) +void PassportLoginService::parseSoapResult( SoapMessage *message ) { - QString resultType = resultRoot.nodeName(); + const QDomElement& body( message->getBody().firstChildElement() ); + + // Remove the request from the list + inProgressRequests_.remove( getCurrentRequest() ); + + // Pass all other messages to child classes + if( body.nodeName() != "wst:RequestSecurityTokenResponseCollection" ) + { + parseSecureResult( message ); + return; + } #ifdef KMESSDEBUG_PASSPORTLOGINSERVICE - kDebug() << "Parsing result node '" << resultType << "'"; + kDebug() << "Obtaining security tokens.."; #endif - // Close first so crashes in TcpConnectionBase::slotSocketReadyRead() are avoided. - // That would happen when the listeners destroy this object. - closeConnection(); - - // Determine the object type - if( resultType == "wst:RequestSecurityTokenResponseCollection" ) + const QDomNodeList& authTokens( body.childNodes() ); + if( authTokens.count() == 0 ) { - // Received the response for our "RequestMultipleSecurityTokens" request. - QDomNodeList authTokens = resultRoot.elementsByTagName("BinarySecurityToken"); - if( authTokens.count() == 0 ) + // Likely a login error. + emit loginIncorrect(); + return; + } + + // Set the token and proof for hotmail live services (mail, spaces etc..) + QHash tokens; + tokenExpirationDates_.clear(); + for( uint index = 0; index < authTokens.length(); ++index ) + { + const QDomNode &tokenResponse( authTokens.item( index ) ); + + // Extract the token's expiration date + const QString expirationString( XmlFunctions::getNodeValue( tokenResponse, "LifeTime/Expires" ) ); + const QDateTime &expirationDate( QDateTime::fromString( expirationString, Qt::ISODate ) ); + + const QString &referenceEndPoint( XmlFunctions::getNodeValue( tokenResponse, "AppliesTo/EndpointReference/Address" ) ); + +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Found token for endpoint:" << referenceEndPoint << "expiring on:" << expirationDate; +#endif + + if( referenceEndPoint == "http://Passport.NET/tb" ) { - // Likely an login error. - emit loginIncorrect(); + tokens.insert( "Passport", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/EncryptedData/CipherData/CipherValue" ) ); + tokens.insert( "PassportProof", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedProofToken/BinarySecret" ) ); + tokenExpirationDates_.insert( "Passport", expirationDate ); } - else + else if( referenceEndPoint == "messengerclear.live.com" ) { - if( authTokens.count() > 1 ) - { - kWarning() << "Multiple authentication tokens found, " - << "using first one!" << endl; - } - // Set the token and proof for hotmail live services ( mail, spaces etc.. ) - QDomNodeList passportToken = resultRoot.elementsByTagName( "CipherValue" ); - QDomNodeList proofToken = resultRoot.elementsByTagName( "BinarySecret" ); - - - // The 't=...&p=..." like should be in the "BinarySecurityToken" element. - emit loginSucceeded( authTokens .item(0).toElement().text(), - passportToken.item(0).toElement().text(), - proofToken .item(0).toElement().text() ); + tokens.insert( "MessengerClear", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokens.insert( "MessengerClearProof", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedProofToken/BinarySecret" ) ); + tokenExpirationDates_.insert( "MessengerClear", expirationDate ); + } + else if( referenceEndPoint == "messenger.msn.com" ) + { + tokens.insert( "Messenger", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokenExpirationDates_.insert( "Messenger", expirationDate ); + } + else if( referenceEndPoint == "contacts.msn.com" ) + { + tokens.insert( "Contacts", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokenExpirationDates_.insert( "Contacts", expirationDate ); + } + else if( referenceEndPoint == "messengersecure.live.com" ) + { + tokens.insert( "MessengerSecure", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokenExpirationDates_.insert( "MessengerSecure", expirationDate ); + } + else if( referenceEndPoint == "storage.msn.com" ) + { + tokens.insert( "Storage", + XmlFunctions::getNodeValue( tokenResponse, + "RequestedSecurityToken/BinarySecurityToken" ) ); + tokenExpirationDates_.insert( "Storage", expirationDate ); } } - else + +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Obtained" << tokens.count() << "security tokens:" << tokens.keys(); +#endif + + // Save the tokens + currentAccount_->setTokens( tokens ); + + isWaitingForNewTokens_ = false; + + // Send any message which was waiting for a new token + QHashIterator it( queuedRequests_ ); + while( it.hasNext() ) { - kWarning() << "Could not parse response " - << "(type=" << resultType - << " endpoint=" << getEndpoint() << ")" << endl; - emit requestFailed( this, "Unexpected response type" ); // not translated, see MsnNotificationConnection::soapRequestFailed + it.next(); + sendSecureRequest( it.key(), it.value() ); } +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Sent" << queuedRequests_.count() << "queued messages."; +#endif + + + emit loginSucceeded(); } @@ -440,65 +576,264 @@ void PassportLoginService::parseSoapResult( const QDomElement &resultRoot, const - + @endcode */ void PassportLoginService::requestMultipleSecurityTokens() { #ifdef KMESSDEBUG_PASSPORTLOGINSERVICE - kDebug() << "PassportLoginService - Step 1. Requesting authentication data."; + kDebug() << "Requesting security tokens"; #endif - QString authParams =QUrl::fromPercentEncoding( authenticationParameters_.toUtf8() ) - .replace(",", "&"); + const QString authParams( KMessShared::htmlEscape( QUrl::fromPercentEncoding( authenticationParameters_.toUtf8() ) + .replace( ",", "&" ) ) ); - QString header = "\n" - " {7108E71A-9926-4FCB-BCC9-9A9D3F32E423}\n" - " 4\n" - " 1\n" - " \n" - "AQAAAAIAAABsYwQAAAAzMDg0\n" - "\n" - "\n" - " \n" - " " + escapeString( handle_ ) + "\n" - " " + escapeString( password_ ) + "\n" - " \n" - ""; + QString header( "\n" + " {7108E71A-9926-4FCB-BCC9-9A9D3F32E423}\n" + " 4\n" + " 1\n" + " \n" + "AQAAAAIAAABsYwQAAAAzMDg0\n" + "\n" + "\n" + " \n" + " " + KMessShared::htmlEscape( handle_ ) + "\n" + " " + KMessShared::htmlEscape( password_ ) + "\n" + " \n" + "" ); - QString body = "\n" - " \n" - " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" - " \n" - " \n" - " http://Passport.NET/tb\n" - " \n" - " \n" - " \n" + QString body( "\n" - " \n" - " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" - " \n" - " \n" - " messenger.msn.com\n" - " \n" - " \n" - " \n" - " \n" + // Unknown, but it's required for the request to succeed + " \n" + " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" + " \n" + " \n" + " http://Passport.NET/tb\n" + " \n" + " \n" + " \n" - ""; + // Authentication for messenger + " \n" + " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" + " \n" + " \n" + " messengerclear.live.com\n" + " \n" + " \n" + " \n" + " \n" - sendRequest( QString::null, body, header ); + // Messenger website authentication + " \n" + + " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" + " \n" + " \n" + " messenger.msn.com\n" + " \n" + " \n" + + " \n" + + " \n" + + // Authentication for the Contact server + " \n" + " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" + " \n" + " \n" + " contacts.msn.com\n" + " \n" + " \n" + " \n" + " \n" + + // Authentication for the messenger live ( example: to send offline messages ) + " \n" + " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" + " \n" + " \n" + " messengersecure.live.com\n" + " \n" + " \n" + " \n" + " \n" + + // Authentication for the storage msn site ( for roaming service ) + " \n" + " http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue\n" + " \n" + " \n" + " storage.msn.com\n" + " \n" + " \n" + " \n" + " \n" + + "" ); + + isWaitingForNewTokens_ = true; + + sendRequest( new SoapMessage( SERVICE_URL_RST_SERVICE, + QString(), // This service doesn't require an action + header, + body ) ); } + +/** + * @brief Send the authenticated SOAP request from a subclass + * @internal + * + * This method sends authenticated SOAP messages. It first needs to verify + * if the session's ticket tokens are still valid - and if not, request new + * ones then sends the request. + * + * @param message The SOAP response message. + */ +void PassportLoginService::sendSecureRequest( SoapMessage *message, const QString &requiredTokenName ) +{ + // Send requests without authentication + if( requiredTokenName.isEmpty() ) + { + sendRequest( message ); + return; + } + +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Sending secure request with token:" << requiredTokenName; +#endif + + const QString &tokenValue( currentAccount_->getToken( requiredTokenName ) ); + const QDateTime &tokenExpiration( tokenExpirationDates_[ requiredTokenName ] ); + + int timeDifference = QDateTime::currentDateTime().secsTo( tokenExpiration ); + +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Token has a value?" << (!tokenValue.isEmpty()); + kDebug() << "Token expires on:" << tokenExpiration << ", that is within seconds:" << timeDifference; +#endif + + // If there is no value for this token, or the token is about to expire, ask a new one + if( tokenValue.isEmpty() || timeDifference < 10 ) + { +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Token is expired or invalid."; +#endif + + // Queue the message + if( ! queuedRequests_.contains( message ) ) + { + queuedRequests_.insert( message, requiredTokenName ); + } + + // We're already waiting for new tokens + if( isWaitingForNewTokens_ ) + { +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Already requesting new tokens."; +#endif + return; + } + +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Asking for new tokens."; +#endif + + // Ask for new tokens, altogether instead of just one at a time, + // for convenience and bandwidth saving + isWaitingForNewTokens_ = true; + requestMultipleSecurityTokens(); + return; + } + +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Token is valid, adding it to the request."; +#endif + + // Insert the token value within the SOAP message header + QDomNodeList list; + QDomElement header( message->getHeader().toElement() ); + + list = header.elementsByTagName( "TicketToken" ); + + // There is no tag: search for the tag + if( list.isEmpty() ) + { + list = header.elementsByTagName( "Ticket" ); + } + + // None of the ticket token tags were found, send the message as is + if( list.isEmpty() ) + { + kWarning() << "Token tag not found! Sending the request as is."; + + sendRequest( message ); + return; + } + + for( uint index = 0; index < list.length(); ++index ) + { + QDomElement item( list.item( index ).toElement() ); + + // tags directly contain the token value + if( item.tagName() == "TicketToken" ) + { +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "TicketToken tag found!"; +#endif + + // If there is a child text node, simply replace its text + if( item.firstChild().nodeType() == QDomNode::TextNode ) + { + item.firstChild().toText().setNodeValue( tokenValue ); + } + else + { + QDomText text( item.ownerDocument().createTextNode( tokenValue ) ); + item.appendChild( text ); + } + break; + } + + // tags contain the token value within the "passport" attribute + if( item.tagName() == "Ticket" ) + { +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Ticket tag found!"; +#endif + item.setAttribute( "passport", tokenValue ); + break; + } + } + + // Remove the message from the queue (if it was there) and add it to the in progress messages + if( queuedRequests_.contains( message ) ) + { + queuedRequests_.remove( message ); + } + inProgressRequests_.insert( message, requiredTokenName ); + +#ifdef KMESSDEBUG_PASSPORTLOGINSERVICE + kDebug() << "Sending authenticated request."; +#endif + + // Send the changed message + sendRequest( message ); +} + + + #include "passportloginservice.moc" diff --git a/src/network/soap/passportloginservice.h b/src/network/soap/passportloginservice.h index bea7aa2..191e4e4 100644 --- a/src/network/soap/passportloginservice.h +++ b/src/network/soap/passportloginservice.h @@ -19,15 +19,45 @@ #define SSLLOGINHANDLER_H #include "httpsoapconnection.h" +#include "../../kmessdebug.h" + +#include + + +// Forward declarations +class CurrentAccount; +class SoapMessage; /** * @brief SOAP calls to the passport authentication service. * - * This class is used by the MsnNotificationConnection to retrieve - * the authentication tokens. These tokens are used to login to the - * MSN Messenger service. + * This class can be used to retrieve the authentication tokens + * from the Passport web service. + * Tokens can be used to access other specific services. + * + * It can be used in two ways: + * - Instance it, connect to the login*() signals and call + * login(). This can be used during the initial authentication, + * to retrieve the tokens for the "USR" command. + * - Subclass it and use the parseSecure*() and + * sendSecureRequest() methods to send and retrieve your own + * SOAP messages. + * + * The first case is trivial and doesn't need much explanation. + * The second is more complex: many Passport web services need + * authentication tokens to be present in the request header. + * These tokens expire after a certain amount of time, just like + * browser cookies. + * + * This class allows for transparent token management. From the + * subclasses, you can simply leave the header + * @code@endcode or @code@endcode + * tags empty: this class will always fill in the correct fields + * with a valid non-expired token, and will automatically send + * token update requests when they expire. + * * * This replaces the SSL-based Passport 1.4 login. * The old class used a simple HTTP header to send results, @@ -39,6 +69,7 @@ * http://msnpiki.msnfanatic.com/index.php/MSNP13:SOAPTweener * * @author Diederik van der Boor + * @author Valerio Pilo * @ingroup NetworkSoap */ class PassportLoginService : public HttpSoapConnection @@ -53,26 +84,46 @@ class PassportLoginService : public HttpSoapConnection // Start the login process void login( const QString ¶meters, const QString &handle, const QString &password ); // Compute the string for live hotmail access - static QString createHotmailToken( const QString &passportToken, const QString &proofToken, + static const QString createHotmailToken( const QString &passportToken, const QString &proofToken, const QString &folder ); + protected: // Protected members + // Bounce the authenticated SOAP fault to a subclass + virtual void parseSecureFault( SoapMessage *message ); + // Bounce the authenticated SOAP response to a subclass + virtual void parseSecureResult( SoapMessage *message ); + // Send the authenticated SOAP request from a subclass + void sendSecureRequest( SoapMessage *message, const QString &requiredTokenName = QString() ); + private: // Parse the SOAP fault - void parseSoapFault( const QDomElement &resultRoot, const QDomElement &headerNode ); + void parseSoapFault( SoapMessage *message ); // Process server responses - void parseSoapResult( const QDomElement &resultRoot, const QDomElement &headerNode ); + void parseSoapResult( SoapMessage *message ); // Send the authentication request void requestMultipleSecurityTokens(); - private : // Private attributes + protected: // Protected attributes + // Current account instance + CurrentAccount *currentAccount_; + + private: // Private attributes /// The list of parameters sent by the notification server QString authenticationParameters_; /// The user's handle QString handle_; /// The user's password QString password_; - /// The number of redirects made - int redirects_; + /// Whether we're waiting for new authentication tokens + bool isWaitingForNewTokens_; + /// The queue of requests waiting new authentication tokens + QHash queuedRequests_; + /// The list of requests which are being sent + QHash inProgressRequests_; + + private: // Private static attributes + /// The expiration dates of the security tokens + static QHash tokenExpirationDates_; signals : // Public signals /** @@ -81,9 +132,9 @@ class PassportLoginService : public HttpSoapConnection void loginIncorrect(); /** - * @brief Fired when the login succeeded. + * @brief Fired when the login succeeded. (version for MSN Protocol 15) */ - void loginSucceeded( QString authentication, QString passportToken, QString proofToken ); + void loginSucceeded(); }; #endif diff --git a/src/network/soap/roamingservice.cpp b/src/network/soap/roamingservice.cpp new file mode 100644 index 0000000..8692554 --- /dev/null +++ b/src/network/soap/roamingservice.cpp @@ -0,0 +1,112 @@ +/*************************************************************************** + roamingservice.cpp - description + ------------------- + begin : sun Jan 4 2009 + copyright : (C) 2009 by Antonio Nastasi + email : sifcenter(at)gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "roamingservice.h" +#include "soapmessage.h" + +#include "../../utils/kmessshared.h" +#include "../../kmessdebug.h" + + +/** + * @brief URL of the Storage Service + */ +#define SERVICE_URL_STORAGE_SERVICE "https://storage.msn.com/storageservice/SchematizedStore.asmx" + + + +RoamingService::RoamingService( QObject *parent ) +: PassportLoginService( parent ) +{ +} + + + +RoamingService::~RoamingService() +{ +} + + + +QString RoamingService::createCommonHeader() const +{ + QString header( "\n" + "Messenger Client 8.5\n" + "RoamingSeed\n" + "\n" + "\n" + "0\n" + "\n" // Filled in by the base class + "\n" ); + return header; +} + + + +void RoamingService::getProfile( const QString& cid ) +{ + QString body( "\n" + "\n" + "\n" + "" + cid +"\n" + "MyCidStuff\n" + "\n" + "MyProfile\n" + "\n" + "\n" + "true\n" + "true\n" + "\n" + "true\n" + "true\n" + "true\n" + "true\n" + "true\n" + "true\n" + "true\n" + "true\n" + "true\n" + "\n" + "\n" + "\n" ); + + sendSecureRequest( new SoapMessage( SERVICE_URL_STORAGE_SERVICE, + "http://www.msn.com/webservices/storage/w10/GetProfile", + createCommonHeader(), + body ), + "Storage" ); +} + + + +// Parse the SOAP fault +void RoamingService::parseSecureFault( SoapMessage *message ) +{ + Q_UNUSED( message ); +} + + + +// The connection received the full response +void RoamingService::parseSecureResult( SoapMessage *message ) +{ + Q_UNUSED( message ); +} + + + +#include "roamingservice.moc" diff --git a/src/network/soap/roamingservice.h b/src/network/soap/roamingservice.h new file mode 100644 index 0000000..9e35a45 --- /dev/null +++ b/src/network/soap/roamingservice.h @@ -0,0 +1,53 @@ +/*************************************************************************** + roamingservice.h - description + ------------------- + begin : sun Jan 4 2009 + copyright : (C) 2009 by Antonio Nastasi + email : sifcenter(at)gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef ROAMINGSERVICE_H +#define ROAMINGSERVICE_H + +#include "passportloginservice.h" + + + +/** + * @brief Soap actions for retrieve the address book and membership lists. + * + * + * @author Antonio Nastasi + * @ingroup NetworkSoap + */ +class RoamingService : public PassportLoginService +{ + Q_OBJECT + + public: + // Constructor + RoamingService( QObject *parent ); + // Destructor + ~RoamingService(); + // Get the profile for given cid + void getProfile( const QString& cid ); + + private: // Private method + // Create the commod header + QString createCommonHeader() const; + // Parse the SOAP fault + void parseSecureFault( SoapMessage *message ); + // The connection received the full response + void parseSecureResult( SoapMessage *message ); +}; + +#endif diff --git a/src/network/soap/soapmessage.cpp b/src/network/soap/soapmessage.cpp index bc13abc..fdabd67 100644 --- a/src/network/soap/soapmessage.cpp +++ b/src/network/soap/soapmessage.cpp @@ -20,26 +20,61 @@ #include "../../utils/xmlfunctions.h" #include "../../kmessdebug.h" +#include + #ifdef KMESSDEBUG_SOAPMESSAGE #define KMESSDEBUG_SOAPMESSAGE_GENERAL #endif +#define XMLNS_XSD "http://www.w3.org/2001/XMLSchema" +#define XMLNS_XSI "http://www.w3.org/2001/XMLSchema-instance" +#define XMLNS_SOAP "http://schemas.xmlsoap.org/soap/envelope/" -// The soap message constructor -SoapMessage::SoapMessage() -: errorCode_(0) + + +// The constructor +SoapMessage::SoapMessage( const QString &endPointUrl, const QString &action, const QString &header, const QString &body, const MessageData &data ) +: action_( action ) +, data_( data ) +, endPoint_( endPointUrl ) { + // Assemble an essential envelope for the parser + QString envelope( "\n" + "\n" ); + + if( ! header.isEmpty() ) + { + envelope += "" + header + ""; + } + + if( ! body.isEmpty() ) + { + envelope += "" + body + ""; + } + + envelope += ""; + + setMessage( envelope ); } -// The constructor for action SoapMessages -SoapMessage::SoapMessage(const QString &message) -: errorCode_(0) +// The copy constructor +SoapMessage::SoapMessage( const SoapMessage &other ) +: action_( other.action_ ) +, body_( other.body_ ) +, data_( other.data_ ) +, endPoint_( other.endPoint_ ) +, fault_( other.fault_ ) +, faultCode_( other.faultCode_ ) +, faultDescription_( other.faultDescription_ ) +, isValid_( other.isValid_ ) +, header_( other.header_ ) { - parseMessage(message); } @@ -47,32 +82,6 @@ SoapMessage::SoapMessage(const QString &message) // The destructor SoapMessage::~SoapMessage() { - -} - - - -// Add a field to the message -void SoapMessage::addField(const QString& field, const QString& value) -{ - fields_ << field; - values_ << value; -} - - - -// Change a field, or add it -void SoapMessage::setField(const QString& field, const QString& value) -{ - int index = fields_.indexOf(field); - if(index == -1) - { - addField( field, value ); - } - else - { - values_[ index ] = value; - } } @@ -85,228 +94,179 @@ const QString& SoapMessage::getAction() const -// Return the message action namespace prefix -const QString& SoapMessage::getActionPrefix() const +// Return the associated request data +const MessageData& SoapMessage::getData() const { - return actionPrefix_; + return data_; } -// Return the message action namespace -const QString& SoapMessage::getActionNamespace() const +// Return the URL of the SOAP endpoint to which the message will be sent +const QString& SoapMessage::getEndPoint() const { - return actionNs_; + return endPoint_; +} + + + +// Return the message fault's xml tree +const QDomNode& SoapMessage::getFault() const +{ + return fault_; } // Return the error code -int SoapMessage::getErrorCode() const +const QString& SoapMessage::getFaultCode() const { - return errorCode_; + return faultCode_; } // Return the error description -const QString& SoapMessage::getErrorDescription() const +const QString &SoapMessage::getFaultDescription() const { - return errorDescription_; + return faultDescription_; } -// Return the entire message as string -QString SoapMessage::getMessage() const +// Return the entire message as a byte array +QByteArray SoapMessage::getMessage() const { - // Create the data message - QString soapMessage = ""; - - // Add the body tag - if(actionPrefix_.isEmpty()) + // Just do nothing if there's no data + if( ! isValid_ ) { - soapMessage += "<" + action_; - if(! actionNs_.isEmpty()) - { - soapMessage += " xmlns=\"" + actionNs_ + "\""; - } - soapMessage += ">"; - } - else - { - // Create a tag - soapMessage += "<" + actionPrefix_ + ":" + action_; - if(! actionNs_.isEmpty()) - { - soapMessage += " xmlns:" + actionPrefix_ + "=\"" + actionNs_ + "\""; - } - soapMessage += ">"; + return QByteArray(); } - // If we received a tree of result nodes, include that - if(! responseBody_.isNull()) - { - QString str; - QTextStream ts( &str, QIODevice::WriteOnly ); - ts << responseBody_; - soapMessage += str; - } - else - { - // Otherwise, add the parsed field/value pairs + QByteArray contents; + QTextStream stream( &contents, QIODevice::Append ); - // Add the fields and values - for( int i = 0; i < fields_.count(); i++ ) - { - soapMessage += "<" + fields_[i] + ">" + values_[i] + ""; - } + // Write the header + if( ! header_.isNull() ) + { + stream << header_ << "\n"; +// stream << "\n" << header_ << "\n"; } - // Add the body closing tag - if(actionPrefix_.isEmpty()) + // Write the body + if( ! body_.isNull() ) { - soapMessage += ""; - } - else - { - soapMessage += ""; + stream << body_ << "\n"; +// stream << "\n" << body_ << "\n"; } - // Add the remaining tags - soapMessage += ""; + // Other blocks are not included, since this method is used for common use, not corner cases - // Return the message - return soapMessage; + // Return the complete data message + return "\n" + "\n" + + contents + + "\n"; } -// The total number of fields -int SoapMessage::getNoFields() const +// Return the message body's xml tree +const QDomNode& SoapMessage::getBody() const { - return fields_.count(); + return body_; } -// Get a value given a field -QString SoapMessage::getValue(const QString& field ) const +// Return the message header's xml tree +QDomNode& SoapMessage::getHeader() { - int index = fields_.indexOf( field ); - - // Warn if not found - if(index == -1) - { - kWarning() << "This message does not have a field named '" << field << "'."; - return QString(); - } - - return values_[index]; + return header_; } -// Return the response xml tree -const QDomNode& SoapMessage::getResponseBody() const +// Return whether this was an error response. Note that you should only use this method on valid messages. +bool SoapMessage::isFaultMessage() const { - return responseBody_; + return ( ! faultCode_.isEmpty() ); } -// Test whether a given field exists in the message header -bool SoapMessage::hasField(const QString& field) const +// Return whether this message contains valid useable data +bool SoapMessage::isValid() const { - return (fields_.indexOf( field ) == -1); + return isValid_; } -// Return whether this was an error response -bool SoapMessage::isErrorMessage() const +// Change the associated request data +void SoapMessage::setData( const MessageData &data ) { - return (errorCode_ != 0); + data_ = data; } // Parse the incoming message -void SoapMessage::parseMessage(const QString &message) +void SoapMessage::setMessage( const QString &message ) { QDomDocument xml; + // Reset the error indicator + faultCode_ = QString(); + // Parse the XML - QString errorMessage; - bool error = ! xml.setContent(message, true, &errorMessage); + // see http://doc.trolltech.com/4.3/qdomdocument.html#setContent + isValid_ = xml.setContent( message, true, &faultDescription_ ); // true for namespace processing. - // Handle errors first - if(error) + // Create an error message if the message can't be parsed + if( ! isValid_ ) { - kWarning() << "XML Parsing failed: '" << errorMessage << "'."; - // Create a dummy the error message - errorCode_ = 1; - errorDescription_ = errorMessage; + faultCode_ = "parsingFailed"; + body_ = QDomNode(); + fault_ = QDomNode(); + header_ = QDomNode(); + + kWarning() << "XML parsing failed (code" << faultCode_ << "):" << faultDescription_ << "."; return; } - // Get the body child node - QDomNode resultNode = XmlFunctions::getNode(xml, "/Envelope/Body").firstChild(); - QString resultNodeName = resultNode.toElement().nodeName(); + // Get the message's child nodes + header_ = XmlFunctions::getNode( xml, "/Envelope/Header" ); + body_ = XmlFunctions::getNode( xml, "/Envelope/Body" ); - if(resultNode.isNull()) + // Verify if any faults are present in the message + QDomNode rootFault = XmlFunctions::getNode( xml, "/Envelope/Fault" ); + QDomNode bodyFault = XmlFunctions::getNode( body_, "/Fault" ); + if( ! rootFault.isNull() ) { - kWarning() << "XML Parsing failed: result node is null."; - // Create a dummy the error message - errorCode_ = 1; - errorDescription_ = "result node is null"; + fault_ = rootFault; + faultCode_ = XmlFunctions::getNodeValue( rootFault, "/faultcode" ); + faultDescription_ = XmlFunctions::getNodeValue( rootFault, "/faultstring" ); + } + else if( ! bodyFault.isNull() ) + { + fault_ = bodyFault; + faultCode_ = XmlFunctions::getNodeValue( bodyFault, "/faultcode" ); + faultDescription_ = XmlFunctions::getNodeValue( bodyFault, "/faultstring" ); + } + + // Catch empty messages... unlikely + if( fault_.isNull() && header_.isNull() && body_.isNull() ) + { + isValid_ = false; + faultCode_ = "missingBody"; + faultDescription_ = "message body is not present"; + + kWarning() << "XML parsing failed (code" << faultCode_ << "):" << faultDescription_ << "."; return; } - - // See if it's a soap error message - if(resultNodeName == "Fault") - { - QString faultString = XmlFunctions::getNodeValue(resultNode, "/faultstring"); - errorCode_ = XmlFunctions::getNodeValue(resultNode, "/detail/" + faultString + "/errorCode").toInt(); - errorDescription_ = XmlFunctions::getNodeValue(resultNode, "/detail/" + faultString + "/errorDescription"); - return; - } - - // TODO: test this parsing code - action_ = resultNodeName; - actionPrefix_ = resultNode.prefix(); - actionNs_ = resultNode.namespaceURI(); - - // Try to parse the result node - if(resultNodeName.endsWith("Response")) - { - responseBody_ = resultNode.firstChild(); - } - else - { - // Parse all parameters - // It's possible to pass the entire QDomNode object to the gotActionResponse() - // function, but this is somewhat nicer, and reduces code boat in the subclasses - QDomNodeList children = resultNode.childNodes(); - for( int i = 0; i < children.count(); i++ ) - { - fields_.append( children.item(i).nodeName() ); - values_.append( children.item(i).toElement().text() ); - } - } -} - - - -// Set the message type -void SoapMessage::setAction(const QString &action, const QString &prefix, const QString &xmlns) -{ - action_ = action; - actionPrefix_ = prefix; - actionNs_ = xmlns; } diff --git a/src/network/soap/soapmessage.h b/src/network/soap/soapmessage.h index 45396b5..619b8a5 100644 --- a/src/network/soap/soapmessage.h +++ b/src/network/soap/soapmessage.h @@ -19,89 +19,103 @@ #define SOAPMESSAGE_H #include -#include +#include +#include +#include + + +/** + * @brief A simple container class for SOAP message data + * + * This class is used to hold extra information about the message. + */ +class MessageData +{ + public: + // Empty constructor + MessageData() {}; + // Copy constructor + MessageData( const MessageData &other ) { type = other.type; value = other.value; }; + // Destructor + ~MessageData() {}; + + public: // Public properties + // Type of message + QString type; + // Data contained within the message + QVariant value; +}; /** - * A class to parse SOAP messages. - * These messages can be sent to a remote server with the HttpSoapConnection class. + * @brief A class to parse SOAP messages. + * + * These messages are sent to and received from a remote server by using the HttpSoapConnection class. + * You can also attach some data to a message, so that data sent along with the request will be available when + * the response is received. * * @author Diederik van der Boor + * @author Valerio Pilo * @ingroup NetworkSoap */ class SoapMessage { public: // public methods - // The constructor to create messages - SoapMessage(); - // The constructor to parse incoming messages - SoapMessage(const QString &message); + // The constructor + explicit SoapMessage( const QString &endPointUrl, const QString &action, const QString &header = QString(), const QString &body = QString(), const MessageData &data = MessageData() ); + // The copy constructor + explicit SoapMessage( const SoapMessage &other ); // The destructor virtual ~SoapMessage(); - // Add a field to the message - void addField(const QString& field, const QString& value); - // Sets the field in the message, or adds it if it doesn't exist. - void setField(const QString& field, const QString& value); // Return the action type const QString& getAction() const; - // Return the action type namespace prefix - const QString& getActionPrefix() const; - // Return the action type namespace - const QString& getActionNamespace() const; + // Return the message body's xml tree + const QDomNode& getBody() const; + // Return the associated request data + const MessageData& getData() const; + // Return the URL of the SOAP endpoint to which the message will be sent + const QString& getEndPoint() const; + // Return the message fault's xml tree + const QDomNode& getFault() const; // Return the error code - int getErrorCode() const; + const QString& getFaultCode() const; // Return the error description - const QString& getErrorDescription() const; + const QString& getFaultDescription() const; + // Return the message header's xml tree + QDomNode& getHeader(); // Return the entire message as string - QString getMessage() const; - // The total number of fields - int getNoFields() const; - // Get a value given a field - QString getValue(const QString& field) const; - // Return the response xml tree - const QDomNode& getResponseBody() const; - // Test whether a given field exists in the message - bool hasField(const QString& field) const; - - // Return whether this was an error response - bool isErrorMessage() const; - - // Set the message type - void setAction(const QString &action, - const QString &prefix = QString::null, - const QString &xmlns = QString::null); + QByteArray getMessage() const; + // Return whether this is an error or a valid response + bool isFaultMessage() const; + // Return whether this message contains valid useable data + bool isValid() const; + // Change the associated request data + void setData( const MessageData &data ); + // Parse an incoming message + void setMessage( const QString &message ); - private: // Protected methods - // Helper function, get a specific node - QDomNode getNode(const QDomNode &rootNode, const QString &path) const; - // Helper function, get the text value of a node - QString getNodeValue(const QDomNode &rootNode, const QString &path) const; - // Parse the incoming message - void parseMessage(const QString &message); - - private: - // The error code from the soap response - int errorCode_; - // The error description from the soap response - QString errorDescription_; - + private: // Protected properties // The message type QString action_; - // The xml namespace prefix for the message - QString actionPrefix_; - // The xml namespace - QString actionNs_; - - // The message fields - QStringList fields_; - // The message values (corresponding to the fields) - QStringList values_; - - // The result nodes - QDomNode responseBody_; + // The message contents + QDomNode body_; + // Data associated to the message + MessageData data_; + // The target endpoint URL + QString endPoint_; + // Contents of the message fault notice + QDomNode fault_; + // The error code from the soap response + QString faultCode_; + // The error description from the soap response + QString faultDescription_; + // Flag to easily check if the message contains useable data + bool isValid_; + // The content header + QDomNode header_; }; #endif diff --git a/src/network/upnp/igdcontrolpoint.cpp b/src/network/upnp/igdcontrolpoint.cpp index c3de796..4327063 100644 --- a/src/network/upnp/igdcontrolpoint.cpp +++ b/src/network/upnp/igdcontrolpoint.cpp @@ -162,8 +162,8 @@ void IgdControlPoint::slotWanConnectionFound(bool error) if(! error) { // Get the retreived service description - QString deviceUrn = forwardingService_->getConnectionDeviceUdn(); - QString serviceId = forwardingService_->getConnectionServiceId(); + QString deviceUrn( forwardingService_->getConnectionDeviceUdn() ); + QString serviceId( forwardingService_->getConnectionServiceId() ); ServiceParameters params = rootService_->getServiceById(serviceId, deviceUrn); if(! params.controlUrl.isNull()) diff --git a/src/network/upnp/layer3forwardingservice.cpp b/src/network/upnp/layer3forwardingservice.cpp index b1f553c..92fc836 100644 --- a/src/network/upnp/layer3forwardingservice.cpp +++ b/src/network/upnp/layer3forwardingservice.cpp @@ -83,7 +83,7 @@ void Layer3ForwardingService::gotActionResponse(const QString &responseType, con if(responseType == "GetDefaultConnectionServiceResponse" ) { - QString newService = resultValues["NewDefaultConnectionService"]; + QString newService ( resultValues["NewDefaultConnectionService"] ); QStringList serviceItems = newService.split( ',', QString::SkipEmptyParts ); QString uuid; QString urn; @@ -91,7 +91,7 @@ void Layer3ForwardingService::gotActionResponse(const QString &responseType, con // Extract the uuid and urn from the NewDefaultConnectionService value for( int i = 0; i < serviceItems.count(); i++ ) { - QString type = serviceItems[i].section(':', 0, 0); + QString type( serviceItems[i].section( ':', 0, 0 ) ); if(type == "uuid") { // format: uuid::: diff --git a/src/network/upnp/service.cpp b/src/network/upnp/service.cpp index 70d9c03..86055ab 100644 --- a/src/network/upnp/service.cpp +++ b/src/network/upnp/service.cpp @@ -112,14 +112,14 @@ int Service::callActionInternal(const QString &actionName, const QMap" - "" - ""; + QString soapMessage( "" + "" + "" ); // Do we have any arguments? if(arguments != 0) @@ -128,7 +128,7 @@ int Service::callActionInternal(const QString &actionName, const QMap::ConstIterator it; for(it = arguments->begin(); it != arguments->end(); ++it) { - QString argumentName = it.key(); + QString argumentName( it.key() ); soapMessage += "<" + argumentName + ">" + it.value() + ""; } } @@ -185,9 +185,9 @@ void Service::gotActionErrorResponse(const QDomNode &response) KMESS_ASSERT( response.nodeName() == "s:Fault"); #endif - QString faultString = XmlFunctions::getNodeValue(response, "/faultstring"); - QString errorCode = XmlFunctions::getNodeValue(response, "/detail/" + faultString + "/errorCode"); - QString errorDescription = XmlFunctions::getNodeValue(response, "/detail/" + faultString + "/errorDescription"); + QString faultString ( XmlFunctions::getNodeValue( response, "/faultstring" ) ); + QString errorCode ( XmlFunctions::getNodeValue( response, "/detail/" + faultString + "/errorCode" ) ); + QString errorDescription( XmlFunctions::getNodeValue( response, "/detail/" + faultString + "/errorDescription" ) ); kWarning() << "Action failed: " << errorCode << " " << errorDescription; } @@ -204,7 +204,7 @@ void Service::gotActionResponse(const QString &responseType, const QMapbind( QHostAddress(), bindPort ); diff --git a/src/notification/chatnotification.cpp b/src/notification/chatnotification.cpp index e81276d..d7fdfd5 100644 --- a/src/notification/chatnotification.cpp +++ b/src/notification/chatnotification.cpp @@ -19,53 +19,73 @@ #include "chatnotification.h" #include "../chat/chat.h" +#include "../chat/chatwindow.h" #include "../contact/contactbase.h" +#include "../contact/invitedcontact.h" #include "../network/chatmessage.h" #include "../kmessdebug.h" #include "../currentaccount.h" #include "notificationmanager.h" -#include "passivepopup.h" #include #include +#include -#define MAX_BALLOON_MESSAGE_SIZE 128 +// How long a message can be without being cropped away +#define MAX_BALLOON_MESSAGE_SIZE 64 // Class constructor ChatNotification::ChatNotification( NotificationManager* manager ) - : enableChatStart_(true) - , enableChatMessages_(false) - , manager_(manager) +: manager_(manager) { + // Connect the activation signal to process notification actions + connect( manager_, SIGNAL( eventActivated(NotificationManager::EventSettings,NotificationManager::Buttons) ), + this, SLOT ( activate(NotificationManager::EventSettings,NotificationManager::Buttons) ) ); } -// Trigger this event's action (Raise the chat window for the calling contact) -void ChatNotification::activate( QStringList /*stringList*/, QObject *object ) +// Execute the action triggered in a notification +void ChatNotification::activate( NotificationManager::EventSettings settings, NotificationManager::Buttons button ) { - Chat *chatWindow = static_cast( object ); - if ( chatWindow != 0 ) + // The signal wasn't meant for us + if( settings.sender != this ) { - // Force the window to be raised to front and focused - emit raiseChat( chatWindow, true ); + return; } - else + + switch( button ) { + case NotificationManager::BUTTON_VIEW_MESSAGE: #ifdef KMESSDEBUG_CHATNOTIFICATION - kDebug() << "The given chat window was not valid."; + kDebug() << "Raising chat with" << settings.contact->getHandle(); #endif + emit raiseChat( static_cast( settings.widget ), true ); + break; + + case NotificationManager::BUTTON_HIDE: +#ifdef KMESSDEBUG_CHATNOTIFICATION + kDebug() << "Hiding chat notification"; +#endif + // Do nothing + break; + + default: +#ifdef KMESSDEBUG_CHATNOTIFICATION + kDebug() << "Invalid button" << button; +#endif + return; } } // Notify the user about this event (a contact has contacted the user) -void ChatNotification::notify( const ChatMessage &message, Chat *chatWindow ) +void ChatNotification::notify( const ChatMessage &message, Chat *chat ) { // End if the event is coming from us instead of from a contact if( ! message.isIncoming() ) @@ -76,8 +96,8 @@ void ChatNotification::notify( const ChatMessage &message, Chat *chatWindow ) return; } - // Check the chat window pointer, we need it - if( ! chatWindow ) + // Check the chat pointer, we need it + if( ! chat ) { #ifdef KMESSDEBUG_CHATNOTIFICATION kDebug() << "Invalid pointer to chat window."; @@ -85,69 +105,35 @@ void ChatNotification::notify( const ChatMessage &message, Chat *chatWindow ) return; } - // First send the sound notification; even if the balloon is disabled. - if( chatWindow->isChatFirstMessage() ) - { - KNotification::event( "chat start", QString(), QPixmap(), chatWindow ); - } - else - { - KNotification::event( "new message", QString(), QPixmap(), chatWindow ); - } - - // If all possible notifications for this event are disabled, do nothing. - if( ! enableChatStart_ && ! enableChatMessages_ ) + // Verify if the chat is active, and if so don't notify anything + if( KWindowSystem::activeWindow() == chat->getChatWindow()->winId() + && chat == chat->getChatWindow()->getCurrentChat() ) { #ifdef KMESSDEBUG_CHATNOTIFICATION - kDebug() << "Start and messages notifications are off, skipping."; -#endif - return; - } - - int messageType = message.getType(); - - // If we should only notify chat starts, skip notificating further messages - if( ! enableChatMessages_ && enableChatStart_ && - messageType == ChatMessage::TYPE_INCOMING && ! chatWindow->isChatFirstMessage() ) - { -#ifdef KMESSDEBUG_CHATNOTIFICATION - kDebug() << "Messages notification is off and it's not the first message, skipping."; + kDebug() << "Window is active, skipping."; #endif return; } - QString text; - QString friendlyName; - Status status; - QString body = Qt::escape( message.getBody() ); - const QString &handle = message.getContactHandle(); + QString text; + int messageType = message.getType(); + QString body( message.getBody() ); + const QString &handle = message.getContactHandle(); CurrentAccount *currentAccount = CurrentAccount::instance(); - ContactBase *contact = currentAccount->getContactByHandle( handle ); + ContactBase *contact = currentAccount->getContactByHandle( handle ); + QString friendlyName( contact->getFriendlyName( STRING_LIST_SETTING_ESCAPED ) ); + + // When the contact doesn't exist, only use the handle + if( contact == 0 ) + { + contact = currentAccount->addInvitedContact( handle ); + } #ifdef KMESSDEBUG_CHATNOTIFICATION - kDebug() << "Contact " << message.getContactHandle(); + kDebug() << "Contact" << handle; #endif - // Check for a contact handle, we need it for the popup - if( handle.isEmpty() ) - { - kWarning() << "Cannot notify chat event, no contact handle given!"; - return; - } - - if( contact ) - { - // Use rich text for friendlyname - friendlyName = contact->getFriendlyName( USE_LIST_SETTING ); - status = contact->getStatus(); - } - else - { - friendlyName = handle; - status = STATUS_ONLINE; // Invalid status code, will be shown as Online - } - // Truncate the message so it doesn't make the balloon too big if( body.length() > MAX_BALLOON_MESSAGE_SIZE ) { @@ -155,20 +141,25 @@ void ChatNotification::notify( const ChatMessage &message, Chat *chatWindow ) body += " ..."; } + // Parse the emoticons in the message + if( ! message.hasHtmlBody() ) + { + RichTextParser::parseMsnString( body, true, true, false, false ); + } // Set the balloon text to a generic message, which will be overridden with more useful messages, if available switch( messageType ) { case ChatMessage::TYPE_NOTIFICATION: - text = i18n( "In %1's chat: %2", friendlyName, body ); + text = i18n( "In %1's chat:
    %2", friendlyName, body ); break; case ChatMessage::TYPE_INCOMING: - text = i18n( "%1 says:
    '%2'", friendlyName, body ); + text = i18n( "%1 says:
    '%2'", friendlyName, body ); break; case ChatMessage::TYPE_OFFLINE_INCOMING: - text = i18n( "%1 has sent you an offline message:
    '%2'", friendlyName, body ); + text = i18n( "%1 has sent you an offline message:
    '%2'", friendlyName, body ); break; case ChatMessage::TYPE_APPLICATION: @@ -180,7 +171,7 @@ void ChatNotification::notify( const ChatMessage &message, Chat *chatWindow ) case ChatMessage::TYPE_SYSTEM: default: - text = i18n( "%1:
    %2", friendlyName, body ); + text = i18n( "%1:
    %2", friendlyName, body ); break; } @@ -247,26 +238,27 @@ void ChatNotification::notify( const ChatMessage &message, Chat *chatWindow ) break; } + QString eventName; + if( message.getContentsClass() == ChatMessage::CONTENT_NOTIFICATION_NUDGE ) + { + eventName = "nudge"; + } + else if( messageType == ChatMessage::TYPE_INCOMING && chat->isChatFirstMessage() ) + { + eventName = "chat start"; + } + else + { + eventName = "new message"; + } - // Display a popup for this event - PassivePopup::PopupProperties props; - props.source = message.getContactHandle(); - props.message = text; - props.icon = message.getContactPicturePath(); - props.status = status; - props.destMessages = QStringList(); - props.destObject = chatWindow; + NotificationManager::EventSettings settings; + settings.sender = this; + settings.widget = chat; + settings.contact = contact; + settings.buttons = NotificationManager::BUTTON_HIDE | NotificationManager::BUTTON_VIEW_MESSAGE; - manager_->notify( this, props ); -} - - - -// Enable or disable the chat notifications -void ChatNotification::setEnabled( bool enableChatStart, bool enableChatMessages ) -{ - enableChatStart_ = enableChatStart; - enableChatMessages_ = enableChatMessages; + manager_->notify( eventName, text, settings ); } diff --git a/src/notification/chatnotification.h b/src/notification/chatnotification.h index dc088ad..f3ff115 100644 --- a/src/notification/chatnotification.h +++ b/src/notification/chatnotification.h @@ -19,14 +19,14 @@ #ifndef CHATNOTIFICATION_H #define CHATNOTIFICATION_H +#include "notificationmanager.h" + #include // Forward declarations class Chat; class ChatMessage; -class PassivePopup; -class NotificationManager; @@ -44,13 +44,9 @@ class ChatNotification : public QObject public: // Public methods // Class constructor - ChatNotification( NotificationManager* manager ); - // Enable or disable the chat notifications - void setEnabled( bool enableChatStart, bool enableChatMessages ); + ChatNotification( NotificationManager* manager ); signals: - // Start a chat with the contact who is calling us - void startChat( QString contactHandle ); // Raise an existing chat which received a message void raiseChat( Chat *chatWindow, bool force ); @@ -59,18 +55,12 @@ class ChatNotification : public QObject void notify( const ChatMessage &message, Chat *chatWindow ); private slots: - // Trigger this event's action (Raise the chat window for the calling contact) - void activate( QStringList stringList, QObject *object ); + // Execute the action triggered in a notification + void activate( NotificationManager::EventSettings settings, NotificationManager::Buttons button ); private: // Private properties - // Notifications status for new chats - bool enableChatStart_; - // Notification status for subsequent chat messages - bool enableChatMessages_; // The notification manager instance NotificationManager *manager_; - // The popup object which we'll be using until it disappears or gets clicked - PassivePopup *popup_; }; diff --git a/src/notification/contactstatusnotification.cpp b/src/notification/contactstatusnotification.cpp index 1b1c957..66effdf 100644 --- a/src/notification/contactstatusnotification.cpp +++ b/src/notification/contactstatusnotification.cpp @@ -21,12 +21,15 @@ #include "../contact/contact.h" #include "../contact/contactextension.h" #include "../currentaccount.h" +#include "../kmess.h" +#include "../kmessapplication.h" #include "../kmessdebug.h" #include "notificationmanager.h" -#include "passivepopup.h" #include +#include +#include #include #include #include @@ -35,29 +38,47 @@ // Class constructor ContactStatusNotification::ContactStatusNotification( NotificationManager* manager ) - : enableNotifyOnline_(true) - , enableNotifyOffline_(false) - , enableNotifyStatus_(false) - , manager_(manager) +: manager_(manager) { + // Connect the activation signal to process notification actions + connect( manager_, SIGNAL( eventActivated(NotificationManager::EventSettings,NotificationManager::Buttons) ), + this, SLOT ( activate(NotificationManager::EventSettings,NotificationManager::Buttons) ) ); } -// Trigger this event's action -void ContactStatusNotification::activate( QStringList stringList, QObject */*object*/ ) +// Execute the action triggered in a notification +void ContactStatusNotification::activate( NotificationManager::EventSettings settings, NotificationManager::Buttons button ) { -#ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION - kDebug() << "Starting chat."; -#endif - - // Do not try to open a chat with a contact which has gone offline - if( stringList[1] == "FLN" ) + // The signal wasn't meant for us + if( settings.sender != this ) { return; } - emit startChat( stringList[0], ChatInformation::CONNECTION_CHAT ); + switch( button ) + { + case NotificationManager::BUTTON_OPEN_CHAT: + case NotificationManager::BUTTON_OPEN_OFFLINE_CHAT: +#ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION + kDebug() << "Opening a chat with" << settings.contact->getHandle(); +#endif + emit startChat( settings.contact->getHandle() ); + break; + + case NotificationManager::BUTTON_HIDE: +#ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION + kDebug() << "Hiding status notification"; +#endif + // Do nothing + break; + + default: +#ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION + kDebug() << "Invalid button" << button; +#endif + return; + } } @@ -67,15 +88,15 @@ QString ContactStatusNotification::getStatusString( const Status status, const Q { switch( status ) { - case STATUS_ONLINE: return i18n( "%1 is now online", friendlyName ); - case STATUS_AWAY: return i18n( "%1 has gone away", friendlyName ); - case STATUS_BE_RIGHT_BACK: return i18n( "%1 will be right back", friendlyName ); - case STATUS_BUSY: return i18n( "%1 is now busy", friendlyName ); - case STATUS_INVISIBLE: return i18n( "%1 has become invisible", friendlyName ); // Is this one even possible?! - case STATUS_IDLE: return i18n( "%1 has gone idle", friendlyName ); - case STATUS_OFFLINE: return i18n( "%1 has logged out", friendlyName ); - case STATUS_ON_THE_PHONE: return i18n( "%1 is on the phone", friendlyName ); - case STATUS_OUT_TO_LUNCH: return i18n( "%1 is out for lunch", friendlyName ); + case STATUS_ONLINE: return i18n( "%1
    is now online", friendlyName ); + case STATUS_AWAY: return i18n( "%1
    has gone away", friendlyName ); + case STATUS_BE_RIGHT_BACK: return i18n( "%1
    will be right back", friendlyName ); + case STATUS_BUSY: return i18n( "%1
    is now busy", friendlyName ); + case STATUS_INVISIBLE: return i18n( "%1
    has become invisible", friendlyName ); // Is this one even possible?! + case STATUS_IDLE: return i18n( "%1
    has gone idle", friendlyName ); + case STATUS_OFFLINE: return i18n( "%1
    has logged out", friendlyName ); + case STATUS_ON_THE_PHONE: return i18n( "%1
    is on the phone", friendlyName ); + case STATUS_OUT_TO_LUNCH: return i18n( "%1
    is out for lunch", friendlyName ); default: kWarning() << "Invalid status" << status << "!"; return getStatusString( STATUS_ONLINE, friendlyName ); @@ -93,14 +114,6 @@ void ContactStatusNotification::notify( Contact *contact, bool isNeeded ) return; } - if( ! KMESS_NULL(contact->getExtension()) && ! contact->getExtension()->getNotifyOnline() ) - { -#ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION - kDebug() << "Skipping, notification disabled for " << contact->getHandle() << "."; -#endif - return; - } - // If notification for this event is disabled, don't show a balloon. if( ! isNeeded ) { @@ -111,47 +124,32 @@ void ContactStatusNotification::notify( Contact *contact, bool isNeeded ) } + QString friendlyName( contact->getFriendlyName( STRING_LIST_SETTING_ESCAPED ) ); QString text; Status status = contact->getStatus(); Status lastStatus = contact->getLastStatus(); #ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION - kDebug() << "Contact: " << contact->getHandle() << ", status: " << MsnStatus::getCode( lastStatus ) << "->" << status << " - " - << "Online: " << ( enableNotifyOnline_ ? "true" : "false" ) << ", " - << "Offline: " << ( enableNotifyOffline_ ? "true" : "false" ) << ", " - << "Status: " << ( enableNotifyStatus_ ? "true" : "false" ) << endl; + kDebug() << "Contact:" << contact->getHandle() + << "Status:" << MsnStatus::getCode( lastStatus ) << "->" << MsnStatus::getCode( status ); #endif // When contacts go online, whichever may be their status, just show an 'is now online'. - if( lastStatus == STATUS_OFFLINE && status != STATUS_OFFLINE && enableNotifyOnline_ ) + if( lastStatus == STATUS_OFFLINE && status != STATUS_OFFLINE ) { - text = getStatusString( STATUS_ONLINE, contact->getFriendlyName( USE_LIST_SETTING ) ); + text = getStatusString( STATUS_ONLINE, friendlyName ); } else { - text = getStatusString( status, contact->getFriendlyName( USE_LIST_SETTING ) ); + text = getStatusString( status, friendlyName ); } - +// TODO Fix custom contact sound, possibly using contexts and setComponentData() from KNotification +/* // Play a sound - QString soundPath = contact->getExtension()->getContactSoundPath(); + QString soundPath( contact->getExtension()->getContactSoundPath() ); QFile soundFile( soundPath ); - // Find what kind of event is this, and skip the notification if it's a disabled event - bool notifyUser = true; - if( lastStatus == STATUS_OFFLINE && status != STATUS_OFFLINE ) notifyUser = enableNotifyOnline_; - else if( lastStatus != STATUS_OFFLINE && status == STATUS_OFFLINE ) notifyUser = enableNotifyOffline_; - else notifyUser = enableNotifyStatus_; - - if( ! notifyUser ) - { -#ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION - kDebug() << "Event popup disabled, skipping."; -#endif - - return; - } - // If a custom audio file exists, play it if ( soundFile.exists() ) { @@ -164,50 +162,42 @@ void ContactStatusNotification::notify( Contact *contact, bool isNeeded ) media->setCurrentSource( soundPath ); media->play(); } +*/ + + QString eventName; + if( lastStatus == STATUS_OFFLINE ) + { + eventName = "contact online"; + } + else if( status == STATUS_OFFLINE ) + { + eventName = "contact offline"; + } else { -#ifdef KMESSDEBUG_CONTACTSTATUSNOTIFICATION - kDebug() << "Play the default sound."; -#endif - - QString statusText; - - if( lastStatus == STATUS_OFFLINE ) - { - statusText = "contact online"; - } - else if( status == STATUS_OFFLINE ) - { - statusText = "contact offline"; - } - else - { - statusText = "contact status"; - } - - KNotification::event( statusText, text ); + eventName = "contact status"; } - // Display a popup for this event - PassivePopup::PopupProperties props; - props.source = contact->getHandle(); - props.message = text; - props.icon = contact->getContactPicturePath(); - props.status = status; - props.destMessages << contact->getHandle() << MsnStatus::getCode( status ); - props.destObject = 0; + // Associate the list events with the contact list window + KMessApplication *kmessApp = static_cast( kapp ); + QWidget *mainWindow = kmessApp->getContactListWindow()->window(); - manager_->notify( this, props ); -} + NotificationManager::EventSettings settings; + settings.sender = this; + settings.widget = mainWindow; + settings.contact = contact; + settings.buttons = NotificationManager::BUTTON_HIDE; + if( status == STATUS_OFFLINE ) + { + settings.buttons |= NotificationManager::BUTTON_OPEN_OFFLINE_CHAT; + } + else + { + settings.buttons |= NotificationManager::BUTTON_OPEN_CHAT; + } - -// Enable or disable the contact offline notifications -void ContactStatusNotification::setEnabled( bool enableNotifyOnline, bool enableNotifyOffline, bool enableNotifyStatus ) -{ - enableNotifyOnline_ = enableNotifyOnline; - enableNotifyOffline_ = enableNotifyOffline; - enableNotifyStatus_ = enableNotifyStatus; + manager_->notify( eventName, text, settings ); } diff --git a/src/notification/contactstatusnotification.h b/src/notification/contactstatusnotification.h index c873ebf..5d9a00d 100644 --- a/src/notification/contactstatusnotification.h +++ b/src/notification/contactstatusnotification.h @@ -21,14 +21,13 @@ #include "../contact/msnstatus.h" #include "../network/chatinformation.h" +#include "notificationmanager.h" #include // Forward declarations class Contact; -class NotificationManager; -class PassivePopup; @@ -46,9 +45,7 @@ class ContactStatusNotification : public QObject public: // Public methods // Class constructor - ContactStatusNotification( NotificationManager* manager ); - // Enable or disable the contact status notifications - void setEnabled( bool enableNotifyOnline, bool enableNotifyOffline, bool enableNotifyStatus ); + ContactStatusNotification( NotificationManager* manager ); private: // Obtains a status string like "contact has come online" for a MSN status code @@ -56,27 +53,19 @@ class ContactStatusNotification : public QObject signals: // Start a chat with a contact - void startChat( QString contactHandle, ChatInformation::ConnectionType connection ); + void startChat( QString contactHandle ); public slots: // Notify the user about this event (a contact has changed status) void notify( Contact *contact, bool isNeeded ); private slots: - // Trigger this event's action - void activate( QStringList stringList, QObject *object ); + // Execute the action triggered in a notification + void activate( NotificationManager::EventSettings settings, NotificationManager::Buttons button ); private: // Private properties - // Notification status for contacts which come online - bool enableNotifyOnline_; - // Notification status for contacts which disconnect - bool enableNotifyOffline_; - // Notification status for contacts which change MSN status - bool enableNotifyStatus_; // The notification manager instance NotificationManager *manager_; - // The popup object which we'll be using until it disappears or gets clicked - PassivePopup *popup_; }; diff --git a/src/notification/newemailnotification.cpp b/src/notification/newemailnotification.cpp index 173427e..13e920f 100644 --- a/src/notification/newemailnotification.cpp +++ b/src/notification/newemailnotification.cpp @@ -21,7 +21,6 @@ #include "../currentaccount.h" #include "../kmessdebug.h" #include "notificationmanager.h" -#include "passivepopup.h" #include @@ -32,10 +31,46 @@ // Class constructor NewEmailNotification::NewEmailNotification( NotificationManager* manager ) - : doNotifyInbox_(true) - , doNotifyOther_(false) - , manager_(manager) +: manager_(manager) { + // Connect the activation signal to process notification actions + connect( manager_, SIGNAL( eventActivated(NotificationManager::EventSettings,NotificationManager::Buttons) ), + this, SLOT ( activate(NotificationManager::EventSettings,NotificationManager::Buttons) ) ); +} + + + +// Execute the action triggered in a notification +void NewEmailNotification::activate( NotificationManager::EventSettings settings, NotificationManager::Buttons button ) +{ + // The signal wasn't meant for us + if( settings.sender != this ) + { + return; + } + + switch( button ) + { + case NotificationManager::BUTTON_OPEN_MAILBOX: +#ifdef KMESSDEBUG_NEWEMAILNOTIFICATION + kDebug() << "Opening mailbox on folder" << settings.data.toString(); +#endif + CurrentAccount::instance()->openMail( settings.data.toString() ); + break; + + case NotificationManager::BUTTON_HIDE: +#ifdef KMESSDEBUG_NEWEMAILNOTIFICATION + kDebug() << "Hiding email notification"; +#endif + // Do nothing + break; + + default: +#ifdef KMESSDEBUG_NEWEMAILNOTIFICATION + kDebug() << "Invalid button" << button; +#endif + return; + } } @@ -43,79 +78,27 @@ NewEmailNotification::NewEmailNotification( NotificationManager* manager ) // Notify the user about this event (a new email has arrived) void NewEmailNotification::notify( QString sender, QString subject, bool inInbox, QString command, QString folder, QString url ) { + // Command and url are not used at the moment (jun 2008) Q_UNUSED( url ); Q_UNUSED( command ); - currentAccount_ = CurrentAccount::instance(); - - if( inInbox && ! doNotifyInbox_ ) - { #ifdef KMESSDEBUG_NEWEMAILNOTIFICATION - kDebug() << "New email notification disabled for inbox messages."; -#endif - return; - } - else if( ! inInbox && ! doNotifyOther_ ) - { -#ifdef KMESSDEBUG_NEWEMAILNOTIFICATION - kDebug() << "New email notification disabled for non-inbox messages."; -#endif - return; - } - -#ifdef KMESSDEBUG_NEWEMAILNOTIFICATION - kDebug() << "New email from " << sender << " in inbox: " << inInbox << "."; + kDebug() << "New email from" << sender << "- Is in inbox?" << inInbox; #endif - QString text; - QStringList stringList; - // Command and url are not used at the moment (jun 2008) -// stringList.append( command ); - stringList.append( folder ); -// stringList.append( url ); + QString text( i18nc("%1 is the subject of the mail, %2 is the sender of the mail", "New email:
    '%1'
    by '%2'", + Qt::escape( subject ), + Qt::escape( sender ) ) ); - text = i18n( "New email:
    '%1'
    by '%2'", - Qt::escape( subject ), - Qt::escape( sender ) - ); + NotificationManager::EventSettings settings; + settings.sender = this; + settings.widget = 0; + settings.contact = 0; + settings.data = folder; + settings.buttons = NotificationManager::BUTTON_HIDE | NotificationManager::BUTTON_OPEN_MAILBOX; - - // Display a popup for this event - PassivePopup::PopupProperties props; - props.source = sender; - props.message = text; - props.icon = "envelope"; - props.status = STATUS_ONLINE; - props.destMessages = stringList; - props.destObject = 0; - - manager_->notify( this, props ); - - - // Also play a sound -#ifdef KMESSDEBUG_NEWEMAILNOTIFICATION - kDebug() << "Play the default sound."; -#endif - KNotification::event( "new email", text ); -} - - - -// Trigger this event's action (Open the mailbox where the new mail is) -void NewEmailNotification::activate( QStringList stringList, QObject */*object*/ ) -{ - // Open hotmail at the given email - currentAccount_->openMail( stringList[0] ); -} - - - -// Enable or disable the new email notifications -void NewEmailNotification::setEnabled( bool doNotifyInbox, bool doNotifyOther ) -{ - doNotifyInbox_ = doNotifyInbox; - doNotifyOther_ = doNotifyOther; + manager_->notify( "new email", text, settings ); } diff --git a/src/notification/newemailnotification.h b/src/notification/newemailnotification.h index a81ef8a..897ed55 100644 --- a/src/notification/newemailnotification.h +++ b/src/notification/newemailnotification.h @@ -19,6 +19,8 @@ #ifndef NEWEMAILNOTIFICATION_H #define NEWEMAILNOTIFICATION_H +#include "notificationmanager.h" + #include @@ -43,29 +45,21 @@ class NewEmailNotification : public QObject public: // Public methods // Class constructor - NewEmailNotification( NotificationManager* manager ); - // Enable or disable the new email notifications - void setEnabled( bool doNotifyInbox, bool doNotifyOther ); + NewEmailNotification( NotificationManager* manager ); public slots: // Notify the user about this event (a new email has arrived) void notify( QString sender, QString subject, bool inInbox, QString command, QString folder, QString url ); private slots: - // Trigger this event's action (Open the mailbox where the new mail is) - void activate( QStringList stringList, QObject *object ); + // Execute the action triggered in a notification + void activate( NotificationManager::EventSettings settings, NotificationManager::Buttons button ); private: // Private properties // Current account reference CurrentAccount *currentAccount_; - // Enable the notification for incoming Inbox mail - bool doNotifyInbox_; - // Enable the notification for incoming mail in other folders - bool doNotifyOther_; // The notification manager instance NotificationManager *manager_; - // The popup object which we'll be using until it disappears or gets clicked - PassivePopup *popup_; }; diff --git a/src/notification/notificationmanager.cpp b/src/notification/notificationmanager.cpp index 545582b..0ce08f0 100644 --- a/src/notification/notificationmanager.cpp +++ b/src/notification/notificationmanager.cpp @@ -18,12 +18,16 @@ #include "notificationmanager.h" +#include "../contact/contactbase.h" #include "../utils/xautolock.h" #include "../currentaccount.h" #include "../kmessdebug.h" #include +#include +#include +#include #include #ifdef Q_WS_WIN @@ -48,14 +52,93 @@ NotificationManager::NotificationManager() // Class destructor NotificationManager::~NotificationManager() { - qDeleteAll( stack_ ); - stack_.clear(); + foreach( KNotification *notification, events_.keys() ) + { + notification->close(); + } + + events_.clear(); + eventSettings_.clear(); delete autoLock_; } +// Associate a KNotification action with an item of the Buttons bitfield +NotificationManager::Buttons NotificationManager::getButtonFromAction( int buttons, int action ) +{ + int number = 1; + + // It's important to keep the synchronization and the same order for the buttons, + // both here and in getButtonsLabels(): KNotification just uses the index for each action + if( ( buttons & BUTTON_OPEN_CHAT ) && number++ == action ) + { + return BUTTON_OPEN_CHAT; + } + if( ( buttons & BUTTON_OPEN_OFFLINE_CHAT ) && number++ == action ) + { + return BUTTON_OPEN_OFFLINE_CHAT; + } + if( ( buttons & BUTTON_VIEW_MESSAGE ) && number++ == action ) + { + return BUTTON_VIEW_MESSAGE; + } + if( ( buttons & BUTTON_MORE_DETAILS ) && number++ == action ) + { + return BUTTON_MORE_DETAILS; + } + if( ( buttons & BUTTON_OPEN_MAILBOX ) && number++ == action ) + { + return BUTTON_OPEN_MAILBOX; + } + if( ( buttons & BUTTON_HIDE ) && number++ == action ) + { + return BUTTON_HIDE; + } + + return BUTTON_INVALID; +} + + + +// Associate a Buttons bitfield with button actions +QStringList NotificationManager::getButtonsLabels( int buttons ) +{ + QStringList labels; + + // It's important to keep the synchronization and the same order for the buttons, + // both here and in getButtonFromAction(): KNotification just uses the index for each action + if( buttons & BUTTON_OPEN_CHAT ) + { + labels << i18nc( "Button text for KDE notification boxes", "Start Chatting" ); + } + if( buttons & BUTTON_OPEN_OFFLINE_CHAT ) + { + labels << i18nc( "Button text for KDE notification boxes", "Leave a Message" ); + } + if( buttons & BUTTON_VIEW_MESSAGE ) + { + labels << i18nc( "Button text for KDE notification boxes", "View Message" ); + } + if( buttons & BUTTON_MORE_DETAILS ) + { + labels << i18nc( "Button text for KDE notification boxes", "Details" ); + } + if( buttons & BUTTON_OPEN_MAILBOX ) + { + labels << i18nc( "Button text for KDE notification boxes", "Read Email" ); + } + if( buttons & BUTTON_HIDE ) + { + labels << i18nc( "Button text for KDE notification boxes", "Hide" ); + } + + return labels; +} + + + // Return the current tray object QSystemTrayIcon *NotificationManager::getTrayObject() { @@ -63,24 +146,28 @@ QSystemTrayIcon *NotificationManager::getTrayObject() } -// Insert a new popup in the stack if needed, or change an existing one -void NotificationManager::notify( QObject *caller, PassivePopup::PopupProperties props ) + +// Insert a new notification in the stack if needed, or update an existing one +void NotificationManager::notify( const QString &event, const QString &text, EventSettings settings ) { // Check if the screen saver is running if( autoLock_->isScreenSaverActive() ) { #ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kDebug() << "Screen saver/locker is active, not showing balloons."; + kDebug() << "Screen saver/locker is active, not showing notifications."; #endif return; } CurrentAccount *currentAccount = CurrentAccount::instance(); - // if we are busy and we're not supposed to show notifications, return. - if( ( currentAccount->getStatus() == STATUS_BUSY ) - && ( currentAccount->getHideNotificationsWhenBusy() ) ) + // Do nothing if, when busy, the user doesn't want to be disturbed + if( currentAccount->getStatus() == STATUS_BUSY + && currentAccount->getHideNotificationsWhenBusy() ) { +#ifdef KMESSDEBUG_NOTIFICATIONMANAGER + kDebug() << "User is busy, not showing notifications."; +#endif return; } @@ -105,85 +192,79 @@ void NotificationManager::notify( QObject *caller, PassivePopup::PopupProperties isFullscreen = ( screenWidth == windowWidth && screenHeight == windowHeight ); #else - #warning Fullscreen detection is not implemented for this platform. + #warning Full screen application detection is not implemented for this platform yet. #endif #endif if( isFullscreen ) { - kDebug() << "Active window is full screen, do not show the balloon."; + kDebug() << "Active window is full screen, not showing notifications."; return; } #ifdef KMESSDEBUG_NOTIFICATIONMANAGER #ifdef Q_WS_X11 - kDebug() << "Active window was valid?" << info.valid() <<". If valid, it is not fullscreen: showing balloons."; + kDebug() << "Active window was valid?" << info.valid() <<". If so, it is not fullscreen, showing notifications."; #endif #endif - // We have to show a popup + KNotification *notification; - PassivePopup *popup; - - if( stack_[ props.source ] ) + // An event already exists for this contact, update it + notification = events_.key( settings.contact, (KNotification*)0 ); + if( notification ) { #ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kDebug() << "a popup for " << props.source << " is already in the stack, updating it"; + kDebug() << "Updating existing notification" << notification; #endif + notification->setText ( text ); + notification->setActions( getButtonsLabels( settings.buttons ) ); + // We can't update the event ID, crap. - popup = stack_[ props.source ]; - popup->change( props ); + if( settings.contact != 0 ) + { + notification->setPixmap( QPixmap( settings.contact->getContactPicturePath() ) ); + } - popup->show(); + eventSettings_[ notification ] = settings; + notification->update(); return; } + // We have to send a new event + + // Create the notification + notification = new KNotification( event ); + #ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kDebug() << "creating new popup for " << props.source << " in the stack"; + kDebug() << "Showing notification" << notification << "for event" << event; #endif - int minY = 99999999; - int current; - QHashIterator it( stack_ ); + // Add it to our lists to be able to find it later + events_ .insert( notification, settings.contact ); + eventSettings_.insert( notification, settings ); - // Set the new popup's position - while( it.hasNext() ) + // Set it up + // TODO: Try using KNotification::setWidget( settings.widget ); + // it highlights the window forever as of march 6, 2009. + notification->setText ( text ); + notification->setActions( getButtonsLabels( settings.buttons ) ); + notification->setFlags ( KNotification::CloseOnTimeout + | KNotification::CloseWhenWidgetActivated ); + + if( settings.contact != 0 ) { - PassivePopup *currentPopup = it.next().value(); - - if( ! currentPopup ) - { - continue; - } - - current = currentPopup->getPosition().y(); - if( current < minY ) - { - minY = current; - } + notification->setPixmap( QPixmap( settings.contact->getContactPicturePath() ) ); } - props.position = trayObject_->geometry().topLeft(); + // The slots will call the appropriate *Notification class + connect( notification, SIGNAL( activated(unsigned int) ), + this, SLOT ( relayActivation(unsigned int) ) ); + connect( notification, SIGNAL( destroyed(QObject*) ), + this, SLOT ( remove(QObject*) ) ); - if( minY != 99999999 ) - { - // TODO Adding like, 10px to this would make the balloons touch. But I haven't found a method to obtain the distance - // value that is actually used by KDE to space them. - props.position.ry() = minY; - } - - props.timeout = currentAccount->getNotificationDuration() * 1000; - - popup = new PassivePopup( 0, props ); - stack_.insert( props.source, popup ); - - connect( popup, SIGNAL( activate( QStringList, QObject * ) ), - caller, SLOT( activate( QStringList, QObject * ) ) ); - connect( popup, SIGNAL( popupDestroyed( QString ) ), - this, SLOT( remove( QString ) ) ); - - popup->show(); + notification->sendEvent(); } @@ -201,13 +282,49 @@ NotificationManager* NotificationManager::instance() -// Remove a timed out popup from the stack -void NotificationManager::remove( QString source ) +// Forward an activation action to the class which will manage it +void NotificationManager::relayActivation( unsigned int action ) { - delete stack_.take( source ); + KNotification *notification = static_cast( sender() ); + if( ! notification || ! eventSettings_.contains( notification ) ) + { +#ifdef KMESSDEBUG_NOTIFICATIONMANAGER + kDebug() << "Cannot relay notification activation, pointer" << notification << "not found!"; +#endif + return; + } #ifdef KMESSDEBUG_NOTIFICATIONMANAGER - kDebug() << "deleted popup for " << source << " from the stack"; + kDebug() << "Relaying activation for notification" << notification; +#endif + + EventSettings settings = eventSettings_[ notification ]; + Buttons clickedButton = getButtonFromAction( settings.buttons, action ); + + emit eventActivated( settings, clickedButton ); +} + + + +// Delete an expired notification +void NotificationManager::remove( QObject *object ) +{ + KNotification *notification = static_cast( object ); + + if( notification == 0 ) + { +#ifdef KMESSDEBUG_NOTIFICATIONMANAGER + kDebug() << "Cannot remove notification, pointer" << notification << "not found!"; +#endif + return; + } + + // Don't delete the notification, it will do it automatically + events_.remove( notification ); + eventSettings_.remove( notification ); + +#ifdef KMESSDEBUG_NOTIFICATIONMANAGER + kDebug() << "Deleted notification" << notification << "from the stack"; #endif } diff --git a/src/notification/notificationmanager.h b/src/notification/notificationmanager.h index 6bc6e05..79f98f9 100644 --- a/src/notification/notificationmanager.h +++ b/src/notification/notificationmanager.h @@ -19,13 +19,16 @@ #ifndef NOTIFICATIONMANAGER_H #define NOTIFICATIONMANAGER_H -#include "passivepopup.h" - #include +#include // Forward declarations class QSystemTrayIcon; + +class KNotification; + +class ContactBase; class XAutoLock; @@ -42,37 +45,78 @@ class NotificationManager : public QObject { Q_OBJECT - public: // Public methods - // Class constructor - NotificationManager(); - // Class destructor - virtual ~NotificationManager(); + public: // Public enumerations + + /// Types of buttons which can be shown in popups + enum Buttons + { + BUTTON_INVALID = 0 /// No button pressed (invalid choice) + , BUTTON_OPEN_CHAT = 1 /// Button to open a chat + , BUTTON_OPEN_OFFLINE_CHAT = 2 /// Button to open an offline chat + , BUTTON_VIEW_MESSAGE = 4 /// Button to raise an existing chat + , BUTTON_OPEN_MAILBOX = 8 /// Button to open the mail box + , BUTTON_MORE_DETAILS = 16 /// Button to show more details about an event + , BUTTON_HIDE = 16384 /// Button to hide the popup + }; + + public: // Public data structures + + struct EventSettings + { + public: + QObject *sender; + QWidget *widget; + ContactBase *contact; + QVariant data; + int buttons; + }; + public: // Public methods + // Class destructor + virtual ~NotificationManager(); + // Insert a new popup in the stack if needed, or change an existing one - void notify( QObject *caller, PassivePopup::PopupProperties props ); + void notify( const QString &event, const QString &text, EventSettings settings ); // Return the current tray widget object - QSystemTrayIcon *getTrayObject(); + QSystemTrayIcon *getTrayObject(); // Set the tray widget object that will be used - void setTrayObject( QSystemTrayIcon *trayObject ); + void setTrayObject( QSystemTrayIcon *trayObject ); public: // Public static methods // Return a singleton instance of the current account - static NotificationManager *instance(); + static NotificationManager *instance(); - public slots: - // Remove a timed out popup from the stack - void remove( QString source ); + private: // Private methods + // Class constructor + NotificationManager(); + // Associate a KNotification action with an item of the Buttons bitfield + Buttons getButtonFromAction( int buttons, int action ); + // Associate a Buttons bitfield with button labels + QStringList getButtonsLabels( int buttons ); + + private slots: + // Forward an activation action to the class which will manage it + void relayActivation( unsigned int action ); + // Delete an expired notification + void remove( QObject *object ); private: // Private properties // Autolock instance, used to check for screensaver/locker presence when showing popups - XAutoLock *autoLock_; - // Stack of popups currently on screen - QHash stack_; + XAutoLock *autoLock_; + // List of notifications currently active + QHash events_; + // Additional data stored for each notification + QHash eventSettings_; // The System Tray widget to which the popups will refer - QSystemTrayIcon *trayObject_; + QSystemTrayIcon *trayObject_; // The instance of the singleton manager - static NotificationManager *instance_; + static NotificationManager *instance_; + + signals: + // A notification button has been pressed + void eventActivated( NotificationManager::EventSettings settings, + NotificationManager::Buttons clickedButton ); }; diff --git a/src/notification/passivepopup.cpp b/src/notification/passivepopup.cpp deleted file mode 100644 index 6494b26..0000000 --- a/src/notification/passivepopup.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/*************************************************************************** - passivepopup.cpp - KMess' Notification Popup - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : valerio@kmess.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "passivepopup.h" - -#include "../kmessdebug.h" -#include "passivepopupview.h" -#include "passivepopupwidget.h" - - - -// Class constructor -PassivePopup::PassivePopup( QWidget *parent, PopupProperties props ) - : properties_(props) -{ - popup_ = new PassivePopupWidget( parent ); - viewWidget_ = new PassivePopupView( popup_, properties_.icon, properties_.message, properties_.status ); - // Connect the closeRequested signal to rightClicked to hide this popup - connect( viewWidget_, SIGNAL( closeRequested() ), this, SLOT( rightClicked() ) ); - - popup_->setTimeout( properties_.timeout ); - popup_->setView( viewWidget_ ); - - connect( popup_, SIGNAL( leftClicked() ), - this, SLOT( leftClicked() ) ); - connect( popup_, SIGNAL( rightClicked() ), - this, SLOT( rightClicked() ) ); - connect( popup_, SIGNAL( destroyed(QObject*) ), - this, SLOT( forwardDestroyed() ) ); - -} - - - -// Change the popup's properties -bool PassivePopup::change( PopupProperties newProps ) -{ - if( properties_.source != newProps.source ) - { -#ifdef KMESSDEBUG_PASSIVEPOPUP - kDebug() << "Tried to update a popup for " << newProps.source << ", but i'm made for " << properties_.source << "!"; -#endif - return false; - } - - if( properties_.message != newProps.message ) - { - properties_.message = newProps.message; - viewWidget_->changeMessage( newProps.message ); - } - - if( properties_.icon != newProps.icon ) - { - properties_.icon = newProps.icon; - viewWidget_->changeIcon( newProps.icon ); - } - - if( properties_.status != newProps.status ) - { - properties_.status = newProps.status; - viewWidget_->changeStatusIcon( newProps.status ); - } - - // NOTE: timeout is not changed.. - // seeing the update in a quick flash is better. - - return true; -} - - - -// Obtain the current popup position -QPoint PassivePopup::getPosition() -{ - return popup_->pos(); -} - - - -// Display the popup -void PassivePopup::show() -{ - popup_->show( properties_.position ); -} - - - -// Called when it's being destroyed, to remove the popup from the stack -void PassivePopup::forwardDestroyed() -{ -#ifdef KMESSDEBUG_PASSIVEPOPUP - kDebug() << "PassivePopup:forwardDestroyed() - killing popup for " << properties_.source; -#endif - - // Disconnect all signals which go from or to this object - emit popupDestroyed( properties_.source ); -} - - - -// Called when the popup gets left-clicked with the mouse; emits the activate() signal -void PassivePopup::leftClicked() -{ -#ifdef KMESSDEBUG_PASSIVEPOPUP - kDebug() << "Activating popup for " << properties_.source; -#endif - - emit activate( properties_.destMessages, properties_.destObject ); - - popup_->hide(); -} - - - -// Called when the popup gets right-clicked with the mouse; does no actions -void PassivePopup::rightClicked() -{ -#ifdef KMESSDEBUG_PASSIVEPOPUP - kDebug() << "Hiding popup for " << properties_.source; -#endif - - popup_->hide(); -} - - -#include "passivepopup.moc" diff --git a/src/notification/passivepopup.h b/src/notification/passivepopup.h deleted file mode 100644 index 9368dd3..0000000 --- a/src/notification/passivepopup.h +++ /dev/null @@ -1,100 +0,0 @@ -/*************************************************************************** - passivepopup.h - KMess' Notification Popup - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : valerio@kmess.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef PASSIVEPOPUP_H -#define PASSIVEPOPUP_H - -#include "../contact/msnstatus.h" - -#include - - -// Forward declarations -class PassivePopupView; -class PassivePopupWidget; - - - -/** - * @brief KMess' passive popup class for events notification - * - * Implements a customized popup balloon to be used with notifications. - * The actual layout is defined in the passivepopupinterface.ui file. - * - * @author Valerio Pilo - * @ingroup Notification - */ -class PassivePopup : public QObject -{ - Q_OBJECT - - public: // Public properties - struct PopupProperties - { - // Handle of the contact which caused the popup to open - QString source; - // Contact icon - QString icon; - // Message to display - QString message; - // Name of the contact status icon - Status status; - // Timeout after which the popup must disappear - int timeout; - // Position at which it must appear - QPoint position; - // Object to call when the popup is clicked - QObject *destObject; - // Messages to send when the popup is clicked - QStringList destMessages; - }; - - - public: // Public methods - // Class constructor - PassivePopup( QWidget *parent, PopupProperties props ); - // Change the popup's properties's - bool change( PopupProperties newProps ); - // Obtain the current popup position - QPoint getPosition(); - // Display the popup - void show(); - - signals: - // Activate the event triggered via a left-click on the popup balloon - void activate( QStringList strings, QObject *object ); - // Emitted when it's being destroyed, to remove the popup from the stack - void popupDestroyed( QString source ); - - private slots: - // Called when it's being destroyed, to remove the popup from the stack - void forwardDestroyed(); - // Called when the popup gets left-clicked with the mouse; emits the activate() signal - void leftClicked(); - // Called when the popup gets right-clicked with the mouse; does no actions - void rightClicked(); - - private: // Private properties - // The actual popup balloons widget - PassivePopupWidget *popup_; - // The properties of this popup - PopupProperties properties_; - // Layout of the popup balloon - PassivePopupView *viewWidget_; -}; - -#endif diff --git a/src/notification/passivepopupview.cpp b/src/notification/passivepopupview.cpp deleted file mode 100644 index 58c31b1..0000000 --- a/src/notification/passivepopupview.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/*************************************************************************** - passivepopupview.cpp - Displays the passive popup - contents - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : valerio@kmess.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "passivepopupview.h" - -#include "contact/msnstatus.h" - - - -// Class constructor -PassivePopupView::PassivePopupView( QWidget *parent, QString icon, QString message, Status status ) - : QWidget( parent ) - , Ui::PassivePopupView() -{ - // First, setup the interface widgets - setupUi( this ); - - iconLoader_ = KIconLoader::global(); - - changeIcon( icon ); - changeStatusIcon( status ); - message_->setText( message ); - - // Add a side image, the KMess Hummingbird, to make the popups identifiable - // as belonging to KMess. - kMessLogo_->setPixmap( iconLoader_->loadIcon( "kmess", KIconLoader::Desktop, KIconLoader::SizeHuge ) ); - closeButton_->setIcon( iconLoader_->loadIcon( "dialog-close", KIconLoader::Desktop, KIconLoader::SizeHuge ) ); - connect( closeButton_, SIGNAL( pressed() ), this, SIGNAL( closeRequested() ) ); -} - - - -// Changes the popup icon -void PassivePopupView::changeIcon( QString icon ) -{ - QPixmap picture; - - // If the specified icon is not valid, we'll use the KMess icon - if( ! picture.load( icon ) ) - { - picture = iconLoader_->loadIcon( "kmesspic", KIconLoader::User ); - } - - displayPicture_->setPixmap( picture ); -} - - - -// Changes the popup status icon -void PassivePopupView::changeStatusIcon( Status status ) -{ - statusPixmap_->setPixmap( MsnStatus::getIcon( status ) ); -} - - - -// Changes the popup message -void PassivePopupView::changeMessage( QString message ) -{ - message_->setText( message ); -} - - - -#include "passivepopupview.moc" diff --git a/src/notification/passivepopupview.h b/src/notification/passivepopupview.h deleted file mode 100644 index 1e48f54..0000000 --- a/src/notification/passivepopupview.h +++ /dev/null @@ -1,62 +0,0 @@ -/*************************************************************************** - passivepopupview.h - Displays the passive popup - contents - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : valerio@kmess.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef PASSIVEPOPUPVIEW_H -#define PASSIVEPOPUPVIEW_H - -#include "../contact/msnstatus.h" -#include "ui_passivepopupview.h" - -#include - - - -/** - * @brief Passive popups layout interface - * - * This class derives the passive popup's ui file to insert - * the layout into the actual popup balloon. - * The actual layout is defined in the passivepopupinterface.ui file. - * - * @author Valerio Pilo - * @ingroup Notification - */ -class PassivePopupView : public QWidget, private Ui::PassivePopupView -{ - Q_OBJECT - - public: // Public methods - // Class constructor - PassivePopupView( QWidget *parent, QString icon, QString message, Status status = STATUS_ONLINE ); - // Changes the popup icon - void changeIcon( QString icon ); - // Changes the popup status icon - void changeStatusIcon( Status status ); - // Changes the popup message - void changeMessage( QString message ); - - private: // Private properties - // Icons loader - KIconLoader *iconLoader_; - - signals: - // Close of popup was requested - void closeRequested(); -}; - -#endif diff --git a/src/notification/passivepopupview.ui b/src/notification/passivepopupview.ui deleted file mode 100644 index 219442d..0000000 --- a/src/notification/passivepopupview.ui +++ /dev/null @@ -1,299 +0,0 @@ - - PassivePopupView - - - - 0 - 0 - 444 - 162 - - - - - 0 - 0 - - - - - 230 - 64 - - - - - 32767 - 32767 - - - - - 310 - 100 - - - - PointingHandCursor - - - - 2 - - - 0 - - - - - - - - 0 - 0 - - - - - 48 - 48 - - - - - 48 - 48 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - 2 - - - 1 - - - true - - - Qt::AlignCenter - - - false - - - Qt::NoTextInteraction - - - - - - - Qt::Vertical - - - QSizePolicy::Maximum - - - - 20 - 15 - - - - - - - - - 0 - 0 - - - - - 16 - 16 - - - - - 16 - 16 - - - - QFrame::NoFrame - - - 0 - - - true - - - Qt::AlignHCenter|Qt::AlignTop - - - false - - - Qt::NoTextInteraction - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 10 - - - - - - - - - - 2 - - - - - - 0 - 0 - - - - - 120 - 30 - - - - - true - - - - QFrame::NoFrame - - - 1 - - - Qt::RichText - - - true - - - Qt::AlignTop - - - true - - - 0 - - - Qt::NoTextInteraction - - - - - - - - - 0 - - - - - - - - true - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 10 - - - - - - - - - 0 - 0 - - - - - 24 - 24 - - - - - 24 - 24 - - - - QFrame::NoFrame - - - 0 - - - true - - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - - false - - - Qt::NoTextInteraction - - - - - - - - - qPixmapFromMimeSource - - - diff --git a/src/notification/passivepopupwidget.cpp b/src/notification/passivepopupwidget.cpp deleted file mode 100644 index 330a4e1..0000000 --- a/src/notification/passivepopupwidget.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - passivepopupwidget.cpp - Implements the passive - popups widget - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : valerio@kmess.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "passivepopupwidget.h" - -#include "../kmessdebug.h" - -#include - - - -// Class constructor -PassivePopupWidget::PassivePopupWidget( QWidget *parent ) - : KPassivePopup( parent ) -{ - setPopupStyle( KPassivePopup::Balloon ); - setAutoDelete( true ); -} - - - -// Class destructor -PassivePopupWidget::~PassivePopupWidget() -{ - -} - - - -// Handles mouse events for the balloon -void PassivePopupWidget::mouseReleaseEvent( QMouseEvent *e ) -{ - if( e->button() == Qt::LeftButton ) - { - emit leftClicked(); - e->accept(); - } - else if( e->button() == Qt::RightButton ) - { - emit rightClicked(); - e->accept(); - } - else - { - e->ignore(); - } -} - - - -#include "passivepopupwidget.moc" diff --git a/src/notification/passivepopupwidget.h b/src/notification/passivepopupwidget.h deleted file mode 100644 index c16cd63..0000000 --- a/src/notification/passivepopupwidget.h +++ /dev/null @@ -1,57 +0,0 @@ -/*************************************************************************** - passivepopupwidget.h - Defines the passive - popups widget - ------------------- - begin : Tuesday April 10 2007 - copyright : (C) 2007 by Valerio Pilo - email : valerio@kmess.org - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef PASSIVEPOPUPWIDGET_H -#define PASSIVEPOPUPWIDGET_H - -#include - - - -/** - * @brief Passive popups widget - * - * This class inherits KPassivePopup to allow distinction between - * clicks of left and right mouse buttons in the popup. - * - * @author Valerio Pilo - * @ingroup Notification - */ -class PassivePopupWidget : public KPassivePopup -{ - Q_OBJECT - - public: // Public methods - // Class constructor - PassivePopupWidget( QWidget *parent ); - // Class destructor - virtual ~PassivePopupWidget(); - - signals: - // Emitted when the user left-clicks on the popup balloon: triggers the popup's action - void leftClicked(); - // Emitted when the user right-clicks on the popup balloon: does nothing - void rightClicked(); - - private: // Private methods - // Handles mouse events for the balloon - void mouseReleaseEvent( QMouseEvent *e ); - -}; - -#endif diff --git a/src/systemtraywidget.cpp b/src/notification/systemtraywidget.cpp similarity index 82% rename from src/systemtraywidget.cpp rename to src/notification/systemtraywidget.cpp index cc216e4..24b60ef 100644 --- a/src/systemtraywidget.cpp +++ b/src/notification/systemtraywidget.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -36,13 +37,26 @@ #include #endif + + // The constructor SystemTrayWidget::SystemTrayWidget( QWidget *parent ) : KSystemTrayIcon( parent ) { + currentAccount_ = CurrentAccount::instance(); + + // Connect the "changed status" and "changed friendly name" signals + connect( currentAccount_, SIGNAL( changedStatus() ), + this, SLOT ( statusChanged() ) ); + connect( currentAccount_, SIGNAL( changedFriendlyName() ), + this, SLOT ( statusChanged() ) ); + + // Force changing the icon + statusChanged(); } + /** * Display an Hide On Close dialog window with a trayicon screenshot * @@ -61,8 +75,8 @@ void SystemTrayWidget::displayCloseMessage( QString /*fileMenu*/ ) if ( ! KMessageBox::shouldBeShownContinue("hideOnCloseInfo") ) return; - QString message = i18n( "Closing the main window will keep KMess running in the" - " system tray. Use 'Quit' from the 'File' menu to quit the application." ); + const QString& message( i18n( "Closing the main window will keep KMess running in the system tray. " + "Use 'Quit' from the 'Connect' menu to quit the application." ) ); // If the system tray is not visible, just show the text message if( ! QSystemTrayIcon::isSystemTrayAvailable() || ! isVisible() ) @@ -83,6 +97,7 @@ void SystemTrayWidget::displayCloseMessage( QString /*fileMenu*/ ) // Get initial position of the tray icon and the the screen size QRect pictureArea( geometry() ); + QRect pictureGeometry( geometry() ); QRect desktopArea = kapp->desktop()->screenGeometry( geometry().topLeft() ); // Compute the final size and position of the pixmap to grab @@ -90,13 +105,14 @@ void SystemTrayWidget::displayCloseMessage( QString /*fileMenu*/ ) const int yRadius = desktopArea.height() / 16; pictureArea.adjust( -xRadius, -yRadius, xRadius, yRadius ); - // This obtains the geometry of the tray icon, translated to the picture area - QRect pictureGeometry( geometry() ); - pictureGeometry.translate( -pictureArea.x(), -pictureArea.y() ); // Crop the picture if it goes out of screen pictureArea = pictureArea.intersected( desktopArea ); + // This translates the geometry of the tray icon into the picture area + pictureGeometry.translate( -pictureArea.x(), -pictureArea.y() ); + + #ifdef KMESSDEBUG_SYSTEMTRAY kDebug() << "Creating screenshot from area" << pictureArea << "using a desktop size of" << desktopArea << "and geometry" << pictureGeometry; #endif @@ -190,30 +206,6 @@ SystemTrayWidget::~SystemTrayWidget() -// Initialize the class -bool SystemTrayWidget::initialize() -{ - CurrentAccount *currentAccount = CurrentAccount::instance(); - - connect( currentAccount, SIGNAL( changedStatus() ), - this, SLOT ( statusChanged() ) ); - connect( currentAccount, SIGNAL( accountOnline() ), - this, SLOT ( statusChanged() ) ); - connect( currentAccount, SIGNAL( accountInvisible() ), - this, SLOT ( statusChanged() ) ); - connect( currentAccount, SIGNAL( accountOffline() ), - this, SLOT ( statusChanged() ) ); - connect( currentAccount, SIGNAL( changedFriendlyName() ), - this, SLOT ( statusChanged() ) ); - - // Force changing the icon - statusChanged(); - - return true; -} - - - // Return the context menu QMenu* SystemTrayWidget::menu() const { @@ -225,26 +217,38 @@ QMenu* SystemTrayWidget::menu() const // Change the icon when the user's status changes void SystemTrayWidget::statusChanged() { - QString newTooltip; - QString iconName; - CurrentAccount *currentAccount = CurrentAccount::instance(); - Status status = currentAccount->getStatus(); - - // Update the icon - setIcon( MsnStatus::getIcon( status ) ); + Status status = currentAccount_->getStatus(); + + if( status == STATUS_OFFLINE ) + { + // Show only kmess icon + setIcon( KIconLoader::global()->loadIcon( "kmess", KIconLoader::Small ) ); + } + else + { + // Else show the status icon + setIcon( MsnStatus::getIcon( status ) ); + } // Change the tooltip - newTooltip = "KMess " KMESS_VERSION; + QString newTooltip( "KMess " KMESS_VERSION ); if( status != STATUS_OFFLINE ) { #if !defined(Q_WS_WIN) - newTooltip += i18n( "
    %1 (%2)", currentAccount->getFriendlyName(), MsnStatus::getName( status ) ); + newTooltip += i18nc( "Tray icon tooltip, HTML version", + "
    %1 (%2)", + currentAccount_->getFriendlyName( STRING_CLEANED_ESCAPED ), + MsnStatus::getName( status ) ); #else // Qt on Windows does not support html in the system tray widget. - newTooltip += i18n( "- %1 (%2)", currentAccount->getFriendlyName(), MsnStatus::getName( status ) ); + newTooltip += i18nc( "Tray icon tooltip, text version", + " - %1 (%2)", + currentAccount_->getFriendlyName( STRING_CLEANED ), + MsnStatus::getName( status ) ); #endif } + setToolTip( newTooltip ); } diff --git a/src/systemtraywidget.h b/src/notification/systemtraywidget.h similarity index 91% rename from src/systemtraywidget.h rename to src/notification/systemtraywidget.h index 76b84cc..b288bb2 100644 --- a/src/systemtraywidget.h +++ b/src/notification/systemtraywidget.h @@ -22,6 +22,7 @@ // Forward declarations +class CurrentAccount; class KMenu; @@ -45,12 +46,14 @@ class SystemTrayWidget : public KSystemTrayIcon SystemTrayWidget( QWidget *parent=0 ); // The destructor virtual ~SystemTrayWidget(); - // Initialize the class - bool initialize(); // Display a customized close window with a screenshot of the app's tray icon void displayCloseMessage( QString fileMenu = QString::null ); // Return the context menu - QMenu *menu() const; + QMenu *menu() const; + + private: // private attributes + // Pointer to current account informations + CurrentAccount *currentAccount_; private slots: // Private slots // Change the icon when the user's status changes diff --git a/src/settings/accountpage.cpp b/src/settings/accountpage.cpp index aa00c4c..4d07595 100644 --- a/src/settings/accountpage.cpp +++ b/src/settings/accountpage.cpp @@ -22,6 +22,7 @@ #include "../utils/kmessconfig.h" #include "../utils/kmessshared.h" #include "../kmessdebug.h" +#include #include @@ -37,6 +38,7 @@ + /** * Constructor */ @@ -49,6 +51,15 @@ AccountPage::AccountPage( QWidget* parent ) // First setup the user interface setupUi( this ); +#ifndef HAVE_XSCREENSAVER + useIdleTimerCheckBox_ ->setEnabled( false ); + idleTimeSpinBox_ ->setEnabled( false ); + idleLabel1_ ->setEnabled( false ); + idleLabel2_ ->setEnabled( false ); +#else + needXScreensaverLabel_->setVisible( false ); +#endif + // Connect the UI signals connect( friendlyNameEdit_, SIGNAL( textChanged(const QString&)), this, SLOT(forwardSettingsUpdate() ) ); connect( handleEdit_, SIGNAL( textChanged(const QString&)), this, SLOT(forwardSettingsUpdate() ) ); @@ -58,7 +69,7 @@ AccountPage::AccountPage( QWidget* parent ) // Find the default picture KStandardDirs *dirs = KGlobal::dirs(); - QString defaultPicture = dirs->findResource( "data", "kmess/pics/kmesspic.png" ); + QString defaultPicture ( dirs->findResource( "data", "kmess/pics/kmesspic.png" ) ); // Load the picture in the X-Server: defaultPixmap_ = QPixmap(defaultPicture); @@ -67,8 +78,8 @@ AccountPage::AccountPage( QWidget* parent ) // Create the "Change..." button actions KMenu *browsePopup = new KMenu( this ); KAction *browseSimple = new KAction( KIcon("folder-open"), i18n("Browse..."), this ); - KAction *browseResize = new KAction( KIcon("edit-cut"), i18n("Browse and crop picture..."), this ); - KAction *setPrevious = new KAction( KIcon("edit-redo"), i18n("Set previous image..."), this ); + KAction *browseResize = new KAction( KIcon("edit-cut"), i18n("Browse and Crop Picture..."), this ); + KAction *setPrevious = new KAction( KIcon("edit-redo"), i18n("Set Previous Image..."), this ); connect( browseSimple, SIGNAL(activated()), this, SLOT(pictureBrowseSimple() ) ); connect( browseResize, SIGNAL(activated()), this, SLOT(pictureBrowseResize() ) ); connect( setPrevious, SIGNAL(activated()), this, SLOT( pictureSetPrevious() ) ); @@ -92,6 +103,9 @@ AccountPage::AccountPage( QWidget* parent ) << i18n("On the Phone") << i18n("Invisible"); initialStatus_->addItems( states ); + + // Default the path to the display picture original + originalPicturePath_ = QString(); } @@ -158,6 +172,7 @@ void AccountPage::loadSettings(Account *account, bool isCurrentAccount) pictureDir_ = KMessConfig::instance()->getAccountDirectory( myHandle_ ) + "/displaypics/"; tempPictureFile_ = pictureDir_ + "temporary-picture.png"; showPicture = account->getShowPicture(); + originalPicturePath_ = account->getOriginalPicturePath(); // Load default properties friendlyNameEdit_ ->setText( account->getFriendlyName( STRING_ORIGINAL ) ); @@ -167,6 +182,9 @@ void AccountPage::loadSettings(Account *account, bool isCurrentAccount) autologinCheckBox_ ->setChecked( account->getUseAutologin() ); + useIdleTimerCheckBox_ ->setChecked( account->getUseIdleTimer() ); + idleTimeSpinBox_ ->setValue( account->getIdleTime() ); + hideNotificationsWhenBusyCheckBox_->setChecked( account->getHideNotificationsWhenBusy() ); // Make sure the drop down list matches the user's initial status int item; @@ -330,7 +348,11 @@ void AccountPage::saveSettings( Account *account ) account->setPicturePath( pictureDir_ + pictureName ); } + // Save path to the display picture original + account->setOriginalPicturePath( originalPicturePath_ ); + // When the account is a guest account, see if the user wanted to "upgrade" it. + if( account->isGuestAccount() ) { if( rememberCheckbox_->isChecked() ) @@ -370,6 +392,9 @@ void AccountPage::saveSettings( Account *account ) default: initialStatus = STATUS_ONLINE; break; } account->setInitialStatus( initialStatus ); + + account->setStatusOptions( useIdleTimerCheckBox_->isChecked(), idleTimeSpinBox_->value(), + hideNotificationsWhenBusyCheckBox_->isChecked() ); } @@ -398,29 +423,43 @@ void AccountPage::selectPicture( bool resize, QString picturePath ) QString localFilePath; QImage pictureData; - // all pictures: dirs->findAllResources("data", "kdm/pics/users/*.png") - // default dir: dirs->findResource("data", "kdm/pics/users/"); - - // Get the resourcedir which contains the largest collection of pictures. - // This fixes a problem with SuSE, where /etc/opt/kde/share is returned instead of /opt/kde3/share - QString startDir; - QStringList kdmDirs = dirs->findDirs("data", "kdm/pics/users/"); - QDir kdmDir; - int fileCount = 0; - for( QStringList::Iterator it = kdmDirs.begin(); it != kdmDirs.end(); ++it ) - { - kdmDir.setPath(*it); - QStringList pngFiles = kdmDir.entryList( QStringList("*.png") ); - if( pngFiles.size() > fileCount ) - { - fileCount = pngFiles.size(); - startDir = *it; - } - } - // Show the open file dialog if( picturePath.isEmpty() ) { + QString startDir; + + if( ! originalPicturePath_.isEmpty() ) + { + // Directory where the current display picture is. + startDir = originalPicturePath_; + } + else + { + // Search a resourcedir to use as default. + + // all pictures: dirs->findAllResources("data", "kdm/pics/users/*.png") + // default dir: dirs->findResource("data", "kdm/pics/users/"); + + // Get the resourcedir which contains the largest collection of pictures. + // This fixes a problem with SuSE, where /etc/opt/kde/share is returned instead of /opt/kde3/share + + QStringList kdmDirs = dirs->findDirs("data", "kdm/pics/users/"); + QDir kdmDir; + int fileCount = 0; + + for( QStringList::Iterator it = kdmDirs.begin(); it != kdmDirs.end(); ++it ) + { + kdmDir.setPath(*it); + QStringList pngFiles = kdmDir.entryList( QStringList("*.png") ); + + if( pngFiles.size() > fileCount ) + { + fileCount = pngFiles.size(); + startDir = *it; + } + } + } + filePath = KFileDialog::getImageOpenUrl( startDir, this, i18n( "Display Picture" ) ); } else @@ -433,6 +472,12 @@ void AccountPage::selectPicture( bool resize, QString picturePath ) return; } + // Save location if the user selected the image. + if( picturePath.isEmpty() ) + { + originalPicturePath_ = filePath.pathOrUrl(); + } + // Read the path. if(filePath.isLocalFile()) { @@ -528,7 +573,21 @@ void AccountPage::showPictureToggled( bool noPicture ) void AccountPage::showRegisterPassport() { // Launch the browser for the given URL - KMessShared::openBrowser( KUrl( "http://register.passport.com/" ) ); + KMessShared::openBrowser( KUrl( "https://accountservices.passport.net/reg.srf" ) ); +} + + + +// Force the page onto a specific tab +void AccountPage::switchToTab( int tabIndex ) +{ + if( ( tabIndex < 0 ) || tabIndex > tabWidget_->count() ) + { + kWarning() << "Invalid tab index" << tabIndex << "selected!"; + return; + } + + tabWidget_->setCurrentIndex( tabIndex ); } diff --git a/src/settings/accountpage.h b/src/settings/accountpage.h index 400ea53..65b2fb2 100644 --- a/src/settings/accountpage.h +++ b/src/settings/accountpage.h @@ -51,6 +51,8 @@ class AccountPage : public QWidget, private Ui::AccountPage void loadSettings( Account *account, bool isCurrentAccount ); // Request to save the settings void saveSettings( Account *account ); + // Force the page onto a specific tab + void switchToTab( int tabIndex ); public slots: // Show the normal browse dialog to change display picture @@ -85,6 +87,8 @@ class AccountPage : public QWidget, private Ui::AccountPage QPixmap customPixmap_; // User pictures dialog UserPicturesDialog *userPicturesDialog_; + // The original picture path + QString originalPicturePath_; private slots: // Send a signal to the Chat Style page with the new account settings diff --git a/src/settings/accountpage.ui b/src/settings/accountpage.ui index b019bb1..12b4a79 100644 --- a/src/settings/accountpage.ui +++ b/src/settings/accountpage.ui @@ -1,264 +1,612 @@ - + + AccountPage - - + + 0 0 - 515 - 538 + 519 + 494 - - - 0 - + + Form + + - - - - - - 0 - 0 - - - - Your Account Information - - - - - - Enter the name other contacts should see when you're online. - - - &Friendly name: - - - false - - - friendlyNameEdit_ - - - - - - - - - - Enter the e-mail address of your MSN Passport account. You can register a new account at http://register.passport.com/ - - - &Email address: - - - false - - - handleEdit_ - - - - - - - - - - Enter the password of your MSN Passport account. You can register a new account at http://register.passport.com/ - - - &Password: - - - false - - - passwordEdit_ - - - - - - - false - - - - 0 - 0 - - - - QLineEdit::PasswordEchoOnEdit - - - - - - - &Remember Password - - - - - - - - + + + 0 + + + + Account &Info + + - - - - 0 - 0 - - - - Display Picture - - - Qt::AlignCenter - - - false - - - false - - - - + + + + + + 0 + 0 + + + + Your Account Information + + - - - Qt::Horizontal + + + Enter the name other contacts should see when you are online. - - - 10 - 10 - + + &Friendly name: - - - - - - - 0 - 0 - - - - - 96 - 96 - - - - - 96 - 96 - - - - QFrame::StyledPanel - - - QFrame::Sunken - - - true - - + false + + friendlyNameEdit_ + - - - Qt::Horizontal - - - - 10 - 10 - - - - - - - - - - - - Qt::Horizontal - - - - 10 - 10 - - - + - - - + + + Enter the email address of your MSN Passport account. You can register a new account at http://register.passport.com/ + + + &Email address: + + + false + + + handleEdit_ + + + + + + + + + + Enter the password of your MSN Passport account. You can register a new account at http://register.passport.com/ + + + &Password: + + + false + + + passwordEdit_ + + + + + + + false + + + 0 0 - - C&hange... - - - Alt+H + + QLineEdit::PasswordEchoOnEdit - - - Qt::Horizontal + + + &Remember password - - - 10 - 10 - - - + - - - - - &Do not use - - - Alt+Y - - - - + +
    + + + + + 0 + 0 + + + + Display Picture + + + Qt::AlignCenter + + + false + + + false + + + + + + + + Qt::Horizontal + + + + 10 + 10 + + + + + + + + + 0 + 0 + + + + + 96 + 96 + + + + + 96 + 96 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + true + + + false + + + + + + + Qt::Horizontal + + + + 10 + 10 + + + + + + + + + + + + Qt::Horizontal + + + + 10 + 10 + + + + + + + + + 0 + 0 + + + + C&hange... + + + Alt+H + + + + + + + Qt::Horizontal + + + + 10 + 10 + + + + + + + + + + &Do not use + + + Alt+Y + + + + + + +
    +
    + + + + The option "Remember account" was left unchecked while logging in, so your settings won't be saved by default. Enable this option if you want to save your account settings permanently on this system. + +It's recommended to enable this option unless you're using KMess as guest or you're using a public system (e.g. Internet cafe). + + + Re&member the settings of this account + - - + + + true + + + If enabled, KMess automatically logs in with this account. + + + Log in &with this account automatically + + + Alt+W + + + + + + + + + Login &as + + + false + + + initialStatus_ + + + + + + + QComboBox::AdjustToContents + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 250 + 23 + + + + + + + + + Qt::Vertical - + + + 16 + 16 + + + + + + + + + + You need to connect to the Passport site to confirm that your email address exists. + + + You can't change your friendly name because your Passport email address is not verified. + + + Qt::AlignVCenter + + + true + + + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 0 + + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Request verification email + + + https://accountservices.passport.net/ + + + Go to accountservices.passport.net + + + true + + + true + + + + + + + + + + + + + You need a Passport account to connect to the MSN Messenger network. You can register your current email address at register.passport.com or use a Hotmail account to connect. + + + To connect to the MSN Messenger service, you will need to register an email address as Passport account. + + + Qt::AlignVCenter + + + true + + + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 0 + + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Register new account + + + http://register.passport.com/ + + + Go to register.passport.com + + + true + + + true + + + + + + + + + + + + &Status Options + + + + + + If enabled, your status will be changed automatically to "Away-Idle" when you're not using the computer for a few minutes. If this option is not available, KMess was built without support for this feature. + + + Change status to "&Idle" when inactive + + + Alt+Y + + + true + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + Controls the number of minutes before KMess changes the status to "Away-Idle". + + + Become idle after + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + idleTimeSpinBox_ + + + + + + + Controls the number of minutes before KMess changes the status to "Away-Idle". + + + + + + + Controls the number of minutes before KMess changes the status to "Away-Idle". + + + minutes + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 71 + 20 + + + + + + + + + + + true + + + + This happens because KMess was built without support for the "XScreenSaver" Xorg extension, which is used to detect user activity. +Refer to your packaging team for more details. + + + Cannot enable auto idle: KMess was built without inactivity detection. + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + 17 17 @@ -266,309 +614,64 @@ - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 13 - - - - - - - - The option "Remember this profile" was left unchecked while logging in, so your settings won't be saved by default. Enable this option when you want to save your account settings permanently at this system. - -It's recommended to enable this option unless you're using KMess as guest or you're using a public system (e.g. Internet cafe). - - - Re&member the settings of this account - - - - - - - false - - - If enabled, KMess automatically logs in with this account. - - - Login &with this account automatically - - - Alt+W - - - - - - - - - Login &as - - - false - - - initialStatus_ - - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 360 - 20 - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 100 - - - - - - - - - - You need a passport account to connect to the MSN Messenger network. You can register your current e-mail address at register.passport.com or use a Hotmail account to connect. - - - You can't change your friendly name because your passport e-mail address is not verified. - - - Qt::AlignVCenter - - - true - - - - - - - + + + &Hide notifications when my status is set to "Busy" + + + + + + Qt::Vertical - - QSizePolicy::Minimum - - + - 20 - 0 + 17 + 317 - - - - - 0 - 0 - - - - Qt::NoFocus - - - Request verification email - - - https://accountservices.passport.net/ - - - Go to accountservices.passport.net - - - true - - - true - - - - - - - - - - - - You need a passport account to connect to the MSN Messenger network. You can register your current e-mail address at register.passport.com or use a Hotmail account to connect. - - - To connect to the MSN Messenger service, you will need to register an e-mail address as Passport account. - - - Qt::AlignVCenter - - - true - - - - - - - - - Qt::Vertical - - - QSizePolicy::Minimum - - - - 20 - 0 - - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Register new account - - - http://register.passport.com/ - - - Go to register.passport.com - - - true - - - true - - - - - - + + - - qPixmapFromMimeSource - - KLineEdit - QLineEdit -
    klineedit.h
    -
    KPushButton QPushButton
    kpushbutton.h
    + + KLineEdit + QLineEdit +
    klineedit.h
    +
    KUrlLabel QLabel
    kurllabel.h
    - - friendlyNameEdit_ - handleEdit_ - passwordEdit_ - rememberPasswordCheckBox_ - browseButton_ - rememberCheckbox_ - autologinCheckBox_ - initialStatus_ - - - KPasswordDialog - KPushButton - KUrlLabel - - rememberPasswordCheckBox_ + useIdleTimerCheckBox_ toggled(bool) - passwordEdit_ + idleTimeSpinBox_ setEnabled(bool) - - 51 - 209 + + 226 + 59 - - 132 - 182 - - - - - rememberPasswordCheckBox_ - toggled(bool) - autologinCheckBox_ - setEnabled(bool) - - - 49 - 209 - - - 70 - 278 + + 191 + 91 diff --git a/src/settings/accountsettingsdialog.cpp b/src/settings/accountsettingsdialog.cpp index 8fc79ac..bf0c6ef 100644 --- a/src/settings/accountsettingsdialog.cpp +++ b/src/settings/accountsettingsdialog.cpp @@ -23,9 +23,11 @@ #include "../account.h" #include "../currentaccount.h" #include "../emoticonmanager.h" +#include "../kmess.h" +#include "../kmessapplication.h" #include "../kmessdebug.h" #include "accountpage.h" -#include "alertspage.h" +#include "contactlistpage.h" #include "chatloggingpage.h" #include "chatstylepage.h" #include "emoticonspage.h" @@ -52,6 +54,7 @@ AccountSettingsDialog::AccountSettingsDialog( QWidget *parent ) config_ = KMessConfig::instance()->getGlobalConfig( "AccountSettingsDialog" ); // Set up the dialog box + setObjectName( "AccountSettings" ); setButtons( Help | Ok | Apply | Cancel | User1 ); setButtonText( User1, i18n( "&Delete" ) ); setDefaultButton( Ok ); @@ -60,7 +63,7 @@ AccountSettingsDialog::AccountSettingsDialog( QWidget *parent ) // Create the widgets that belong in the pages accountPage_ = new AccountPage(); - alertsPage_ = new AlertsPage(); + contactListPage_ = new ContactListPage(); chattingPage_ = new ChatStylePage(); chatLoggingPage_ = new ChatLoggingPage(); emoticonPage_ = new EmoticonsPage(); @@ -76,12 +79,12 @@ AccountSettingsDialog::AccountSettingsDialog( QWidget *parent ) page->setHeader( i18n( "My Account" ) ); page->setIcon( KIcon( "user-identity" ) ); pageWidgets_.insert( PageAccount, page ); + pageWidgets_.insert( PageAccountStatus, page ); - page = addPage( alertsPage_, i18n("Alerts") ); - page->setHeader( i18n( "Alerts and Notifications" ) ); - page->setIcon( KIcon( "text-speak" ) ); // rationale: the computer is telling you something in a popup balloon. - pageWidgets_.insert( PageAlerts, page ); - pageWidgets_.insert( PageAlertsTabOthers, page ); + page = addPage( contactListPage_, i18n("Contact List") ); + page->setHeader( i18n( "Contact List" ) ); + page->setIcon( KIcon( "view-list-details" ) ); + pageWidgets_.insert( PageContactList, page ); page = addPage( emoticonPage_, i18n("Emoticons") ); page->setHeader( i18n( "Emoticons" ) ); @@ -133,15 +136,25 @@ void AccountSettingsDialog::loadSettings( Account *account, bool isCurrentAccoun // Load account information into the widgets accountPage_ ->loadSettings( account, isCurrentAccount ); - alertsPage_ ->loadSettings( account ); + contactListPage_->loadSettings( account ); chattingPage_ ->loadSettings( account ); chatLoggingPage_->loadSettings( account ); emoticonPage_ ->loadSettings( account ); - // Disable the "remove account" button for guest accounts. - if( account->isGuestAccount() ) + // Disable the "remove account" button for guest accounts and for + // the current account + KMessApplication *kmessApp = static_cast( kapp ); + if( account->isGuestAccount() + || ( CurrentAccount::instance()->getHandle() == account->getHandle() + && kmessApp->getContactListWindow()->isConnected() ) ) { enableButton( KDialog::User1, false ); + setButtonToolTip( KDialog::User1, + i18nc( "Button tooltip text", + "Click here to delete this account from the " + "list of registered accounts.\nYou cannot delete " + "the currently connected account nor a guest account, " + "which will be deleted when you disconnect." ) ); } // Save the initial page for later, when the dialog is actually shown @@ -182,9 +195,9 @@ bool AccountSettingsDialog::saveAccountSettings() } // Save the old handle and name to check if they were changed later - QString oldHandle = account_->getHandle(); - QString newHandle = accountPage_->getEnteredHandle(); - QString oldFriendlyName = account_->getFriendlyName( STRING_ORIGINAL ); + QString oldHandle ( account_->getHandle() ); + QString newHandle ( accountPage_->getEnteredHandle() ); + QString oldFriendlyName ( account_->getFriendlyName( STRING_ORIGINAL ) ); // Make sure the account handle was changed off the default if( newHandle.isEmpty() || ! Account::isValidEmail( newHandle ) @@ -204,7 +217,7 @@ bool AccountSettingsDialog::saveAccountSettings() // Save information from the widgets accountPage_ ->saveSettings( account_ ); - alertsPage_ ->saveSettings( account_ ); + contactListPage_->saveSettings( account_ ); chattingPage_ ->saveSettings( account_ ); chatLoggingPage_->saveSettings( account_ ); emoticonPage_ ->saveSettings( account_ ); @@ -221,15 +234,18 @@ bool AccountSettingsDialog::saveAccountSettings() // Select the Account page when showing the settings dialog void AccountSettingsDialog::showEvent( QShowEvent */*event*/ ) { + // After the first switch (happening when the window is first shown) + // we'll keep whichever page the user has currently selected + if( initialPage_ == PageNone ) + { + return; + } + // Switch the dialog to the specified page setCurrentPage( pageWidgets_.at( initialPage_ ) ); // Switch to the tabs other than the first if needed - if( initialPage_ == PageAlertsTabOthers ) - { - alertsPage_->switchToTab( 1 ); - } - else if( initialPage_ == PageEmoticonsTabCustom ) + if( initialPage_ == PageEmoticonsTabCustom ) { emoticonPage_->switchToTab( 1 ); } @@ -237,6 +253,12 @@ void AccountSettingsDialog::showEvent( QShowEvent */*event*/ ) { chattingPage_->switchToTab( 1 ); } + else if ( initialPage_ == PageAccountStatus ) + { + accountPage_->switchToTab( 1 ); + } + + initialPage_ = PageNone; } diff --git a/src/settings/accountsettingsdialog.h b/src/settings/accountsettingsdialog.h index f7cb2af..debd47f 100644 --- a/src/settings/accountsettingsdialog.h +++ b/src/settings/accountsettingsdialog.h @@ -25,7 +25,7 @@ // Forward declarations class Account; -class AlertsPage; +class ContactListPage; class AccountPage; class ChatLoggingPage; class ChatMessage; @@ -50,9 +50,10 @@ class AccountSettingsDialog : public KPageDialog // A list of all the settings tabs, used to switch the dialog to a determined page and tab when needed enum Page { - PageAccount = 0 - , PageAlerts - , PageAlertsTabOthers + PageNone = -1 /// Used to stop switching pages + , PageAccount = 0 + , PageAccountStatus + , PageContactList , PageEmoticons , PageEmoticonsTabCustom , PageChatStyle @@ -91,8 +92,8 @@ class AccountSettingsDialog : public KPageDialog AccountPage *accountPage_; // Page widgets of the settings, saved to switch to a determined tab QList pageWidgets_; - // The widget for selecting idle timer and notification timer durations. - AlertsPage *alertsPage_; + // The widget for the contact list display options + ContactListPage *contactListPage_; // The widget for selecting the user's font. ChatStylePage *chattingPage_; // A widget for chat logging settings diff --git a/src/settings/accountsmanagerpage.cpp b/src/settings/accountsmanagerpage.cpp index c0787ed..e98d961 100644 --- a/src/settings/accountsmanagerpage.cpp +++ b/src/settings/accountsmanagerpage.cpp @@ -20,6 +20,9 @@ #include "../utils/kmessconfig.h" #include "../account.h" #include "../accountsmanager.h" +#include "../currentaccount.h" +#include "../kmess.h" +#include "../kmessapplication.h" #include "../kmessdebug.h" #include @@ -42,21 +45,21 @@ AccountsManagerPage::AccountsManagerPage( QWidget *parent ) setupUi( this ); // Connect the signals - connect( addAccountButton_, SIGNAL( clicked() ), - this, SLOT( showAddAccountDialog() ) ); - connect( configureAccountButton_, SIGNAL( clicked() ), - this, SLOT( configureAccount() ) ); - connect( removeAccountButton_, SIGNAL( clicked() ), - this, SLOT( deleteAccount() ) ); - connect( accountsList_, SIGNAL( itemActivated(QListWidgetItem*) ), - this, SLOT( configureAccount() ) ); - connect( accountsList_, SIGNAL( itemSelectionChanged() ), - this, SLOT( accountSelected() ) ); + connect( addAccountButton_, SIGNAL( clicked() ), + this, SLOT( showAddAccountDialog() ) ); + connect( configureAccountButton_, SIGNAL( clicked() ), + this, SLOT( configureAccount() ) ); + connect( removeAccountButton_, SIGNAL( clicked() ), + this, SLOT( deleteAccount() ) ); + connect( accountsList_, SIGNAL( doubleClicked(QListWidgetItem*,const QPoint&) ), + this, SLOT( configureAccount() ) ); + connect( accountsList_, SIGNAL( itemSelectionChanged() ), + this, SLOT( accountSelected() ) ); accountsManager_ = AccountsManager::instance(); - connect( accountsManager_, SIGNAL( accountChanged(Account*,QString,QString) ), - this, SLOT ( readProperties() ) ); + connect( accountsManager_, SIGNAL( accountChanged(Account*,QString,QString) ), + this, SLOT ( readProperties() ) ); readProperties(); } @@ -81,6 +84,21 @@ void AccountsManagerPage::accountSelected() configureAccountButton_->setEnabled( hasSelection ); removeAccountButton_ ->setEnabled( hasSelection ); + + // Disallow removal of the currently connected account. + if( hasSelection ) + { + KMessApplication *kmessApp = static_cast( kapp ); + QListWidgetItem *selection = accountsList_->selectedItems().first(); + + const QString &handle( selection->data( Qt::UserRole ).toString() ); + + if( kmessApp->getContactListWindow()->isConnected() + && CurrentAccount::instance()->getHandle() == handle ) + { + removeAccountButton_->setEnabled( false ); + } + } } @@ -96,7 +114,7 @@ void AccountsManagerPage::configureAccount() } QListWidgetItem * selection = accountsList_->selectedItems().first(); - QString accountHandle = selection->data( Qt::UserRole ).toString(); + QString accountHandle( selection->data( Qt::UserRole ).toString() ); #ifdef KMESSDEBUG_SETTINGSDIALOG kDebug() << "Opening Account Settings for account" << accountHandle << "."; @@ -120,8 +138,18 @@ void AccountsManagerPage::deleteAccount() } QListWidgetItem *selection = accountsList_->selectedItems().first(); + const QString &handle( selection->data( Qt::UserRole ).toString() ); - Account *account = accountsManager_->getAccountByHandle( selection->data( Qt::UserRole ).toString() ); + // Prevent deletion of the currently connected account + KMessApplication *kmessApp = static_cast( kapp ); + if( kmessApp->getContactListWindow()->isConnected() + && CurrentAccount::instance()->getHandle() == handle ) + { + kWarning() << "Cannot delete the current account!"; + return; + } + + Account *account = accountsManager_->getAccountByHandle( handle ); if( ! account ) { return; @@ -129,15 +157,17 @@ void AccountsManagerPage::deleteAccount() int result = KMessageBox::warningYesNo( this, - i18n("Are you sure you want to delete the account '%1' ?
    " - "All settings of this account will be lost.", - account->getHandle() ) ); + i18n("Are you sure you want to delete the account '%1' ?
    " + "All settings of this account will be lost.", + handle ) ); if( result != KMessageBox::Yes ) { return; } accountsManager_->deleteAccount( account ); + + // Refresh the accounts list readProperties(); } diff --git a/src/settings/accountsmanagerpage.ui b/src/settings/accountsmanagerpage.ui index 48981eb..37ea252 100644 --- a/src/settings/accountsmanagerpage.ui +++ b/src/settings/accountsmanagerpage.ui @@ -72,13 +72,10 @@ - Click - - - Click here to add a new customized emoticons to send to your contacts. + Click here to create a new KMess account for an email already associated to an MSN account - &Add account... + &Add Account... Alt+W @@ -90,8 +87,8 @@ false - - Select an emoticon and click here to delete it. + + Select an account and click here to modify it &Edit @@ -106,8 +103,8 @@ false - - Select an emoticon and click here to delete it. + + Select an account and click here to delete it &Remove diff --git a/src/settings/alertspage.cpp b/src/settings/alertspage.cpp deleted file mode 100644 index 6408eeb..0000000 --- a/src/settings/alertspage.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/*************************************************************************** - alertspage.cpp - description - ------------------- - begin : Thu Jan 30 2008 - copyright : (C) 2008 by Diederik van der Boor - email : "vdboor" --at-- "codingdomain.com" - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#include "alertspage.h" - -#include "../account.h" -#include "../kmessdebug.h" -#include - - - -/** - * The constructor - */ -AlertsPage::AlertsPage( QWidget *parent ) -: QWidget( parent ) -, Ui::AlertsPage() -{ - setupUi( this ); - - // Connect our signals - connect( showChatStartNotificationsCheckBox_, SIGNAL( toggled(bool) ), - this, SLOT ( notificationsToggled() ) ); -} - - - -/** - * @brief Load the widget state from an account - * - * Reads an Account's info and sets our internal widgets accordingly - * - * @param account The account where to pick settings from - */ -void AlertsPage::loadSettings( const Account *account ) -{ - // Set the notifications widgets - showOnlineNotificationsCheckBox_ ->setChecked( account->getNotifyContactsOnline() ); - showChatStartNotificationsCheckBox_ ->setChecked( account->getNotifyContactsChatStart() ); - showChatMessagesNotificationsCheckBox_->setChecked( account->getNotifyContactsChatMessages() ); - showStatusNotificationsCheckBox_ ->setChecked( account->getNotifyContactsStatus() ); - showOfflineNotificationsCheckBox_ ->setChecked( account->getNotifyContactsOffline() ); - showInboxEmailNotificationsCheckBox_ ->setChecked( account->getNotifyInboxEmails() ); - showOtherEmailNotificationsCheckBox_ ->setChecked( account->getNotifyOtherEmails() ); - hideNotificationsWhenBusyCheckBox_ ->setChecked( account->getHideNotificationsWhenBusy() ); - - // Set the notification popups duration - notificationDurationSpinBox_->setValue( account->getNotificationDuration() ); - - // Also enable or disable the 'notify all incoming messages' when needed - notificationsToggled(); - - // Set the other alerts widgets - idleTimeSpinBox_ ->setValue ( account->getIdleTime() ); - useIdleTimerCheckBox_ ->setChecked( account->getUseIdleTimer() ); - shakeNudgeCheckBox_ ->setChecked( account->getShakeNudge() ); - nowListeningCheckBox_ ->setChecked( account->getShowNowListening() ); - showEmailInfoCheckBox_->setChecked( account->getShowEmail() ); - showWinksCheckBox_ ->setChecked( account->getShowWinks() ); - -#ifndef HAVE_XSCREENSAVER - useIdleTimerCheckBox_ ->setEnabled( false ); - idleTimeSpinBox_ ->setEnabled( false ); -#endif -} - - - -/** - * @brief Update the notifications options - * - * Enables or disables the "notify all incoming chat messages". - */ -void AlertsPage::notificationsToggled() -{ - showChatMessagesNotificationsCheckBox_->setEnabled( showChatStartNotificationsCheckBox_->isChecked() ); -} - - - -/** - * @brief Save account information from the alerts widget - * - * Calls the set-up methods from Account to change its properties, based on how - * the user has set the widgets of this page. - */ -void AlertsPage::saveSettings( Account *account ) -{ - account->setAlertsInformation ( useIdleTimerCheckBox_->isChecked(), - idleTimeSpinBox_->value(), - shakeNudgeCheckBox_->isChecked(), - nowListeningCheckBox_->isChecked(), - showWinksCheckBox_->isChecked() ); - - account->setNotificationsInformation( showOnlineNotificationsCheckBox_->isChecked(), - showStatusNotificationsCheckBox_->isChecked(), - showChatStartNotificationsCheckBox_->isChecked(), - showChatMessagesNotificationsCheckBox_->isChecked(), - showOfflineNotificationsCheckBox_->isChecked(), - showInboxEmailNotificationsCheckBox_->isChecked(), - showOtherEmailNotificationsCheckBox_->isChecked(), - notificationDurationSpinBox_->value(), - hideNotificationsWhenBusyCheckBox_->isChecked() ); -} - - - -// Force the page onto a specific tab -void AlertsPage::switchToTab( int tabIndex ) -{ - if( tabIndex < 0 || tabIndex > tabWidget_->count() ) - { - kWarning() << "Invalid tab index" << tabIndex << "selected!"; - return; - } - - tabWidget_->setCurrentIndex( tabIndex ); -} - - - -#include "alertspage.moc" diff --git a/src/settings/alertspage.ui b/src/settings/alertspage.ui deleted file mode 100644 index 724c1d1..0000000 --- a/src/settings/alertspage.ui +++ /dev/null @@ -1,523 +0,0 @@ - - AlertsPage - - - - 0 - 0 - 534 - 407 - - - - - 0 - - - - - 0 - - - - - 0 - 0 - 526 - 374 - - - - Popup Notifications - - - - - - Contact Events - - - - - - Show notifications when your contacts: - - - - - - - - - If enabled, a popup message is shown when one of your contacts connects to MSN. - - - &Go online - - - Alt+G - - - true - - - - - - - If enabled, a popup message is shown when one of your contacts starts a conversation with you. - - - Start a &chat with you - - - Alt+C - - - true - - - - - - - If enabled, a popup message is shown every time one of your contacts sends you a message. - - - S&end you a message - - - Alt+E - - - - - - - If enabled, a popup message is also shown when your contacts change their MSN status. - - - Change their &status - - - Alt+S - - - - - - - If enabled, a popup message is also shown when one of your contacts goes offline. - - - Go o&ffline - - - Alt+F - - - - - - - - - &Hide notifications when my status is set to Busy - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 10 - 10 - - - - - - - - Email Events - - - - - - Show notifications when email is received: - - - - - - - - - If enabled, a popup message is also shown when one of your contacts goes offline. - - - In the Inbox - - - Alt+V - - - true - - - - - - - If enabled, a popup message also appears when e-mail is received in other folders. This option is only available for Hotmail accounts. - - - In other folders - - - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 10 - 10 - - - - - - - - - - Controls the number of seconds before popups are hidden. - - - Hide popups after - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - false - - - - - - - - - - seconds - - - false - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 51 - 20 - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 13 - 33 - - - - - - - - - - 0 - 0 - 526 - 374 - - - - Other Alerts - - - - - - &Show winks from contacts - - - - - - - <qt><p>When contacts like to have your attention they can send a nudge. By default the chat window shakes when a nudge is received or sent. Disable this option if the shaking effect is too obtrusive.</p> -<p>When this option is enabled, KMess still limits the shaking effect. Contacts may send multiple nudges at once, but KMess only shakes the chat window with the first nudge.</p></qt> - - - Shake the chat &window when a nudge is received or sent - - - Alt+W - - - - - - - If enabled, a popup is shown when e-mail is received in your inbox. The number of unread e-mail messages is shown above the contact list. This option is only available for Hotmail accounts. - - - Display a count of unread mail - - - - - - - If enabled, KMess informs contacts what you're listening to. This information is retrieved from the currently active audio player applications. - - - Inform contacts w&hich song I am listening to - - - Alt+H - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 10 - 10 - - - - - - - - If enabled, your status will be changed automatically to "Away-Idle" when you're not using the computer for a few minutes. If this option is not available, KMess was built without support for this feature. - - - Change status to "Awa&y-Idle" when inactive - - - Alt+Y - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - Controls the number of minutes before KMess changes the status to "Away-Idle". - - - Become idle after - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - false - - - - - - - Controls the number of minutes before KMess changes the status to "Away-Idle". - - - - - - - Controls the number of minutes before KMess changes the status to "Away-Idle". - - - minutes - - - false - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 71 - 20 - - - - - - - - - - Qt::Vertical - - - - 20 - 99 - - - - - - - - - - - - qPixmapFromMimeSource - - tabWidget_ - showOnlineNotificationsCheckBox_ - showChatStartNotificationsCheckBox_ - showOfflineNotificationsCheckBox_ - showChatMessagesNotificationsCheckBox_ - showStatusNotificationsCheckBox_ - showInboxEmailNotificationsCheckBox_ - showOtherEmailNotificationsCheckBox_ - notificationDurationSpinBox_ - shakeNudgeCheckBox_ - showEmailInfoCheckBox_ - nowListeningCheckBox_ - useIdleTimerCheckBox_ - idleTimeSpinBox_ - - - - - useIdleTimerCheckBox_ - toggled(bool) - idleTimeSpinBox_ - setEnabled(bool) - - - 161 - 143 - - - 192 - 171 - - - - - useIdleTimerCheckBox_ - toggled(bool) - textLabel3 - setEnabled(bool) - - - 123 - 139 - - - 114 - 169 - - - - - useIdleTimerCheckBox_ - toggled(bool) - textLabel4 - setEnabled(bool) - - - 255 - 143 - - - 254 - 177 - - - - - diff --git a/src/settings/chatloggingpage.cpp b/src/settings/chatloggingpage.cpp index 1ce89f7..20a3509 100644 --- a/src/settings/chatloggingpage.cpp +++ b/src/settings/chatloggingpage.cpp @@ -33,8 +33,8 @@ ChatLoggingPage::ChatLoggingPage( QWidget *parent ) setupUi( this ); // Connect our signals - connect( chatSavePathButton_, SIGNAL( clicked() ), - this, SLOT ( chooseDirectory() ) ); + connect( chatSavePathButton_, SIGNAL( clicked() ), + this, SLOT ( chooseDirectory() ) ); // Disallow to directly edit the chat logs saving path chatSavePathEdit_->setReadOnly( true ); @@ -71,26 +71,24 @@ void ChatLoggingPage::chooseDirectory() */ void ChatLoggingPage::loadSettings( const Account *account ) { - logChatsCheckBox_->setChecked( account->getSaveChats() ); + logChatsCheckBox_ ->setChecked( account->getSaveChats() ); + saveChatsToFileCheckBox_->setChecked( account->getSaveChatsToFile() ); + + switch( account->getSaveChatsFormat() ) + { + case Account::EXPORT_TEXT: fileFormatComboBox_->setCurrentIndex( 1 ); break; + case Account::EXPORT_HTML: + default: fileFormatComboBox_->setCurrentIndex( 0 ); break; + } + chatSavePathEdit_->setText( account->getSaveChatPath() ); - switch(account->getSavedChatDirectoryStructure()) + switch( account->getSavedChatDirectoryStructure() ) { - case Account::SINGLEDIRECTORY : - singleDirectoryRadioButton_->setChecked( true ); - break; - - case Account::BYYEAR : - yearRadioButton_->setChecked( true ); - break; - - case Account::BYMONTH : - monthRadioButton_->setChecked( true ); - break; - - case Account::BYDAY : - dayRadioButton_->setChecked( true ); - break; + case Account::SINGLEDIRECTORY: singleDirectoryRadioButton_->setChecked( true ); break; + case Account::BYYEAR: yearRadioButton_ ->setChecked( true ); break; + case Account::BYMONTH: monthRadioButton_ ->setChecked( true ); break; + case Account::BYDAY: dayRadioButton_ ->setChecked( true ); break; } } @@ -104,28 +102,38 @@ void ChatLoggingPage::loadSettings( const Account *account ) */ void ChatLoggingPage::saveSettings( Account *account ) { - int directoryStructure = Account::SINGLEDIRECTORY; + int directoryStructure = Account::BYMONTH; - if ( singleDirectoryRadioButton_->isChecked() ) + if( singleDirectoryRadioButton_->isChecked() ) { directoryStructure = Account::SINGLEDIRECTORY; } - else if ( yearRadioButton_->isChecked() ) + else if( yearRadioButton_->isChecked() ) { directoryStructure = Account::BYYEAR; } - else if ( monthRadioButton_->isChecked() ) + else if( monthRadioButton_->isChecked() ) { directoryStructure = Account::BYMONTH; } - else if ( dayRadioButton_->isChecked() ) + else if( dayRadioButton_->isChecked() ) { directoryStructure = Account::BYDAY; } - account->setChatLoggingInformation( logChatsCheckBox_->isChecked(), - chatSavePathEdit_->text(), - directoryStructure ); + Account::ChatExportFormat format; + switch( fileFormatComboBox_->currentIndex() ) + { + case 1: format = Account::EXPORT_TEXT; break; + case 0: + default: format = Account::EXPORT_HTML; break; + } + + account->setChatLoggingInformation( logChatsCheckBox_ ->isChecked(), + saveChatsToFileCheckBox_->isChecked(), + format, + chatSavePathEdit_ ->text(), + directoryStructure ); } diff --git a/src/settings/chatloggingpage.h b/src/settings/chatloggingpage.h index 0d28560..d4bf7e2 100644 --- a/src/settings/chatloggingpage.h +++ b/src/settings/chatloggingpage.h @@ -49,7 +49,7 @@ class ChatLoggingPage : public QWidget, private Ui::ChatLoggingPage private slots: // Get a directory from the user - void chooseDirectory(); + void chooseDirectory(); }; diff --git a/src/settings/chatloggingpage.ui b/src/settings/chatloggingpage.ui index b7c8473..8a0ad2b 100644 --- a/src/settings/chatloggingpage.ui +++ b/src/settings/chatloggingpage.ui @@ -5,105 +5,141 @@ 0 0 - 404 - 339 + 373 + 362 - - - 0 - + - - - 0 - 0 - + + Enable this check box to save your chats for later viewing - If enabled, chat conversations will be saved in a specified directory. + <html><p>If you enable chat logging, every chat you have will be saved in a certain place (which can be specified below).</p> +<p>The saved chats will allow you to find something in your old discussions, like a link, or you may use them to remember what you did say in a certain occasion to someone.</p> +<p>They may also pose some privacy issues though, because unauthorized people who use your account may read your chat logs.</p> +<p><b>Be sure to keep this option disabled on publicly accessible computers!</b></p></html> - Log &all chats + Enable chat logging + + + true - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 16 - 20 - - - - - - - - 0 - - - 6 - - - - - Choose the directory on your system where you'd like to save the chat logs. - - - Save chat files in this directory: - - - false - - - chatSavePathEdit_ - - - - - - - - 22 - 0 - - - - ... - - - - - - - - - - - - - - KMess automatically creates subdirectories when you choose the organize the chat folder by year, month or day. + + + KMess can also save your chats as HTML files, and keep them organized - Log Structure + Save chats to file - + + false + + + true + + + + + + With this option, you can choose how KMess will save your chats + + + File format used for saving: + + + yearRadioButton_ + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + <html> +<p>The file format you use is important.</p> +<p>HTML chat logs can be opened in any web browser, but they usually cannot be displayed correctly on other computers.</p> +<p>Text files, however, can be perfectly read everywhere; but they will not contain any text formatting, display pictures, or emoticons.</p> +</html> + + + + Web Pages (HTML) + + + + + Plain Text + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + These options allow you to choose how KMess will organize your logged chats within the directory specified below. + + + Depending on which option you choose here, KMess will create some directories to help you keep your chat logs organized. Use the "What's This?" feature on a specific option for more details. + - Separate saved chats by: + Separate logged chats by: + + + yearRadioButton_ @@ -115,6 +151,16 @@ 0 + + Create a directory to organize chats by year + + + This option tells KMess to divide your logged chats by year only. +You will find directories for each year of logged chatting; those will contain all of that year's chat logs, grouped together. + +A chat had on November 29, 2008 will be saved in your logged chats directory as: +<chat logs directory here>/2008/date-and-contact-name.html + Year @@ -131,8 +177,18 @@ 0 + + Create directories to organize chats by year then by month + + + This option tells KMess to divide your logged chats by year, then by month. +You will find some directories for each year of logged chatting. Each will contain a directory for each month where chats have been logged; and within those, you will find all of that month's chat logs grouped together. + +A chat had on November 29, 2008 will be saved in your logged chats directory as: +<chat logs directory here>/2008/11/date-and-contact-name.html + - Month + Year then Month @@ -144,8 +200,18 @@ 0 + + Create directories to organize chats by year, by month, then by day + + + This option tells KMess to divide your logged chats by year, then by month, then again by day. +You will find some directories for each year of logged chatting. Each will contain a directory for each month where chats have been logged; and within those, the chats will be further divided in a directory for each day. + +A chat had on November 29, 2008 will be saved in your logged chats directory as: +<chat logs directory here>/2008/11/29/date-and-contact-name.html + - Day + Year, Month then Day 1 @@ -154,14 +220,14 @@ - - - 0 - 0 - + + Place all saved chats directly in the directory specified below + + + This option tells KMess to save all your chat logs in the same folders, without organizing them at all. - Save directly in the specified directory + Do not organize files false @@ -171,6 +237,86 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + 0 + + + 6 + + + + + + 22 + 0 + + + + Click here to choose a directory + + + ... + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + The directory where all your chat logs will be saved + + + Choose the directory on your system where you'd like to save the chat logs. + + + Save logged chats in this directory: + + + false + + + chatSavePathEdit_ + + + + + @@ -184,8 +330,8 @@ - 32 - 57 + 20 + 20 @@ -196,12 +342,30 @@ qPixmapFromMimeSource logChatsCheckBox_ - chatSavePathEdit_ - chatSavePathButton_ + yearRadioButton_ monthRadioButton_ dayRadioButton_ singleDirectoryRadioButton_ + chatSavePathEdit_ + chatSavePathButton_ - + + + logChatsCheckBox_ + toggled(bool) + saveChatsToFileCheckBox_ + setEnabled(bool) + + + 115 + 15 + + + 119 + 49 + + + +
    diff --git a/src/settings/chatstylepage.cpp b/src/settings/chatstylepage.cpp index aa5d37a..bc5e886 100644 --- a/src/settings/chatstylepage.cpp +++ b/src/settings/chatstylepage.cpp @@ -27,6 +27,7 @@ #include #include #include +#include @@ -39,8 +40,10 @@ ChatStylePage::ChatStylePage( QWidget *parent ) { setupUi( this ); + newStylesButton_->setIcon( KIcon( "get-hot-new-stuff" ) ); + QPixmap pixmap; - QString emoticonDir = CurrentAccount::instance()->getEmoticonStyle(); + QString emoticonDir ( CurrentAccount::instance()->getEmoticonStyle() ); KStandardDirs *dirs = KGlobal::dirs(); // Set up the emoticons which explain what the graphics elements in chat are @@ -56,6 +59,10 @@ ChatStylePage::ChatStylePage( QWidget *parent ) this, SLOT ( updatePreview() ) ); connect( fontColorButton_, SIGNAL( changed(const QColor&) ), this, SLOT ( updatePreview() ) ); + connect( contactFontColorButton_,SIGNAL( changed(const QColor&) ), + this, SLOT (slotContactFontColorChanged(const QColor&) ) ); + connect( fontColorButton_, SIGNAL( changed(const QColor&) ), + this, SLOT (slotUserFontColorChanged(const QColor&) ) ); connect( useContactFontCheckBox_,SIGNAL( toggled(bool) ), this, SLOT ( useContactFontToggled(bool) ) ); connect( fontButton_, SIGNAL( clicked() ), @@ -70,10 +77,16 @@ ChatStylePage::ChatStylePage( QWidget *parent ) this, SLOT ( updatePreview() ) ); connect( showTimeCheckbox_, SIGNAL( toggled(bool) ), this, SLOT ( updatePreview() ) ); + connect( showDateCheckbox_, SIGNAL( toggled(bool) ), + this, SLOT ( updatePreview() ) ); + connect( showSecondsCheckbox_, SIGNAL( toggled(bool) ), + this, SLOT ( updatePreview() ) ); connect( groupFollowupCheckbox_, SIGNAL( toggled(bool) ), this, SLOT ( updatePreview() ) ); connect( enableChatFormattingCheckBox_, SIGNAL( toggled(bool) ), this, SLOT ( updatePreview() ) ); + connect( newStylesButton_, SIGNAL( clicked() ), + this, SLOT ( getNewThemes() ) ); // Configure the preview form of the "chatting" widget @@ -85,18 +98,39 @@ ChatStylePage::ChatStylePage( QWidget *parent ) QBoxLayout *layout = new QHBoxLayout( khtmlPlaceholder_ ); layout->addWidget( chatMessageView_->view() ); + loadStyleList(); +} + + + +// Destructor +ChatStylePage::~ChatStylePage() +{ +} + + + +// Update the style list +void ChatStylePage::loadStyleList() +{ + // Save the current choice to apply it again, after the list has been reloaded + QString text( chatStyle_->currentText() ); + + // Remove any previous items, in case they're in + chatStyle_->clear(); + QStringList styleNames; // Get all available chat styles for the "chatting" widget, avoiding duplicate entries - QStringList stylesDirectories( dirs->findDirs( "data", "kmess/styles" ) ); - foreach( QString dir, stylesDirectories ) + QStringList stylesDirectories( KGlobal::dirs()->findDirs( "data", "kmess/styles" ) ); + foreach( const QString &dir, stylesDirectories ) { QDir styleDir( dir ); QStringList styles = styleDir.entryList( QDir::Dirs, QDir::Name | QDir::IgnoreCase ); - foreach( QString styleName, styles ) + foreach( const QString &styleName, styles ) { - QString xslFile = styleDir.path() + "/" + styleName + "/" + styleName + ".xsl"; // e.g. share/apps/kmess/styles/Demo/Demo.xsl + QString xslFile( styleDir.path() + '/' + styleName + '/' + styleName + ".xsl" ); // e.g. share/apps/kmess/styles/Demo/Demo.xsl if( QFile::exists( xslFile ) && ! styleNames.contains( styleName ) ) { styleNames.append( styleName ); @@ -108,15 +142,12 @@ ChatStylePage::ChatStylePage( QWidget *parent ) chatStyle_->addItems( styleNames ); // Prepare the XSL transformation - chatStyleTransform_ = new ChatMessageStyle(); -} + chatStyleTransform_ = chatMessageView_->getStyle(); - - -// Destructor -ChatStylePage::~ChatStylePage() -{ - delete chatStyleTransform_; + if( ! text.isEmpty() ) + { + chatStyle_->setCurrentIndex( chatStyle_->findText( text, Qt::MatchExactly ) ); + } } @@ -124,24 +155,20 @@ ChatStylePage::~ChatStylePage() // The contact font button was pressed. Show a font dialog to get a new font. void ChatStylePage::contactFontClicked() { - // Get a new font and font family from the user - QFont font = contactFontButton_->font(); - bool accepted = getFont( font ); - - // If it was accepted, set the font to the button - if ( accepted ) + // Get a new font and font family from the user: if they get + // changed, set the new font to the button + if( ! getFont( contactFont_ ) ) { - // Reset size, as it can't be used in the chat message view. - font.setPointSize(10); - - contactFontButton_->setText( font.family().replace("&", "&&") ); - contactFontButton_->setFont( font ); - contactFontButton_->setShortcut( QKeySequence() ); - - // Update the preview - chatStyleTransform_->setContactFont( font ); - updatePreview(); + return; } + + contactFontButton_->setText( contactFont_.family().replace( '&', "&&" ) ); + contactFontButton_->setFont( contactFont_ ); + contactFontButton_->setShortcut( QKeySequence() ); + + // Update the preview + chatStyleTransform_->setContactFont( contactFont_ ); + updatePreview(); } @@ -149,23 +176,22 @@ void ChatStylePage::contactFontClicked() // The font button was pressed. Show a font dialog to get a new font. void ChatStylePage::fontClicked() { - // Get a new font and font family from the user - QFont font = fontButton_->font(); - bool accepted = getFont( font ); - - // If it was accepted, set the font to the button - if ( accepted ) + // Get a new font and font family from the user: if they get + // changed, set the new font to the button + if( ! getFont( userFont_ ) ) { - // Reset size, as it can't be used in the chat message view. - font.setPointSize(10); - - fontButton_->setText( font.family().replace("&", "&&") ); - fontButton_->setFont( font ); - fontButton_->setShortcut( QKeySequence() ); - - // Update the preview - updatePreview(); + return; } + + fontButton_->setText( userFont_.family().replace( '&', "&&" ) ); + fontButton_->setFont( userFont_ ); + fontButton_->setShortcut( QKeySequence() ); + + // Update the preview + // We don't set chatStyleTransform like in contactFontClicked(), + // because user messages are automatically generated with the currently + // selected font + updatePreview(); } @@ -186,6 +212,7 @@ bool ChatStylePage::getFont( QFont &font ) const { font = selection; } + return accepted; } @@ -200,37 +227,34 @@ bool ChatStylePage::getFont( QFont &font ) const */ void ChatStylePage::loadSettings( const Account *account ) { - QColor color; - QFont font; + userFont_ = account->getFont(); + contactFont_ = account->getContactFont(); + userColor_ .setNamedColor( account->getFontColor() ); + contactColor_.setNamedColor( account->getContactFontColor() ); - // Set up the values - color.setNamedColor( account->getFontColor() ); - font = account->getFont(); - font.setPointSize(10); // Reset size, as it can't be used in the chat message view. - - fontButton_->setText( font.family().replace("&", "&&") ); - fontButton_->setFont( font ); + fontButton_->setText( userFont_.family().replace( '&', "&&" ) ); + fontButton_->setFont( userFont_ ); fontButton_->setShortcut( QKeySequence() ); - fontColorButton_->setColor( color ); + fontColorButton_->setColor( userColor_ ); - color.setNamedColor( account->getContactFontColor() ); - font = account->getContactFont(); - font.setPointSize(10); // Reset size, as it can't be used in the chat message view. - - contactFontButton_->setText( font.family().replace("&", "&&") ); - contactFontButton_->setFont( font ); + contactFontButton_->setText( contactFont_.family().replace( '&', "&&" ) ); + contactFontButton_->setFont( contactFont_ ); contactFontButton_->setShortcut( QKeySequence() ); - contactFontColorButton_->setColor( color ); + contactFontColorButton_->setColor( contactColor_ ); useContactFontCheckBox_->setChecked( account->getUseContactFont() ); useContactFontToggled( account->getUseContactFont() ); useEmoticonsCheckBox_->setChecked( account->getUseEmoticons() ); + showWinksCheckBox_->setChecked( account->getShowWinks() ); showTimeCheckbox_->setChecked( account->getShowMessageTime() ); + showDateCheckbox_->setChecked( account->getTimestampShowDate() ); + showSecondsCheckbox_->setChecked( account->getTimestampShowSeconds() ); useFontEffectsCheckBox_->setChecked( account->getUseFontEffects() ); groupFollowupCheckbox_->setChecked( account->getGroupFollowupMessages() ); - enableListFormattingCheckBox_->setChecked( account->getUseListFormatting() ); - enableChatFormattingCheckBox_->setChecked( account->getUseChatFormatting() ); tabbedChatMode_->setCurrentIndex( account->getTabbedChatMode() ); + shakeNudgeCheckBox_->setChecked( account->getShakeNudge() ); + enableChatFormattingCheckBox_->setChecked( account->getUseChatFormatting() ); + displayChatUserPictureCheckBox_->setChecked( account->getShowChatUserPicture() ); // Select the correct chat style, int item = chatStyle_->findText( account->getChatStyle(), Qt::MatchExactly | Qt::MatchCaseSensitive ); @@ -248,8 +272,8 @@ void ChatStylePage::loadSettings( const Account *account ) // Also load contact font settings into the chatStyle object, // other settings are set in updatePreview() - chatStyleTransform_->setContactFont( font ); - chatStyleTransform_->setContactFontColor( color.name() ); + chatStyleTransform_->setContactFont( contactFont_ ); + chatStyleTransform_->setContactFontColor( contactColor_.name() ); } @@ -262,30 +286,25 @@ void ChatStylePage::loadSettings( const Account *account ) */ void ChatStylePage::saveSettings( Account *account ) { - QFont font, contactFont; - - font = fontButton_->font(); - font.setFamily( fontButton_->font().family() ); - - contactFont = contactFontButton_->font(); - contactFont.setFamily( contactFontButton_->font().family() ); - account->setChatInformation( useContactFontCheckBox_->isChecked(), useEmoticonsCheckBox_->isChecked(), + showWinksCheckBox_->isChecked(), useFontEffectsCheckBox_->isChecked(), - enableListFormattingCheckBox_->isChecked(), enableChatFormattingCheckBox_->isChecked(), + shakeNudgeCheckBox_ ->isChecked(), showTimeCheckbox_->isChecked(), + showDateCheckbox_->isChecked(), + showSecondsCheckbox_->isChecked(), groupFollowupCheckbox_->isChecked(), tabbedChatMode_->currentIndex(), chatStyle_->currentText() ); - + account->setShowChatUserPicture( displayChatUserPictureCheckBox_->isChecked() ); // After setChatInformation, due the way ChatView changes updates in font and chat. // If the ordering is changed, it will re-generate all messages twice; // once for the changedFontSettings(), and once for the changedChatStyleSettings() signal. - account->setFontInformation( font, fontColorButton_->color().name(), - contactFont, contactFontColorButton_->color().name() ); + account->setFontInformation( userFont_, userColor_ .name(), + contactFont_, contactColor_.name() ); } @@ -302,10 +321,26 @@ void ChatStylePage::slotChatStyleChanged(const QString &style) +// Update the contacts font color +void ChatStylePage::slotContactFontColorChanged( const QColor &color ) +{ + contactColor_ = color; +} + + + +// Update the user font color +void ChatStylePage::slotUserFontColorChanged( const QColor &color ) +{ + userColor_ = color; +} + + + // Force the page onto a specific tab void ChatStylePage::switchToTab( int tabIndex ) { - if( tabIndex < 0 || tabIndex > tabWidget_->count() ) + if( ( tabIndex < 0 ) || tabIndex > tabWidget_->count() ) { kWarning() << "Invalid tab index" << tabIndex << "selected!"; return; @@ -328,54 +363,38 @@ void ChatStylePage::updatePreview() } // Update the boolean settings (other settings are updated in their slots) - chatStyleTransform_->setContactFontColor( contactFontColorButton_->color().name() ); + chatStyleTransform_->setContactFont ( contactFont_ ); + chatStyleTransform_->setContactFontColor( contactColor_.name() ); chatStyleTransform_->setShowTime ( showTimeCheckbox_->isChecked() ); + chatStyleTransform_->setShowDate ( showDateCheckbox_->isChecked() ); + chatStyleTransform_->setShowSeconds ( showSecondsCheckbox_->isChecked() ); chatStyleTransform_->setUseContactFont ( useContactFontCheckBox_->isChecked() ); chatStyleTransform_->setUseEmoticons ( useEmoticonsCheckBox_->isChecked() ); chatStyleTransform_->setUseFontEffects ( useFontEffectsCheckBox_->isChecked() ); chatStyleTransform_->setUseFormatting ( enableChatFormattingCheckBox_->isChecked() ); + chatStyleTransform_->setGroupFollowupMessages( groupFollowupCheckbox_->isChecked() ); // Create three fake messages ChatMessage fake1( ChatMessage::TYPE_INCOMING, ChatMessage::CONTENT_MESSAGE, true, i18n("Hi, how are you doing? :)"), "test@kmess.org", i18n("Stacy") ); ChatMessage fake2( ChatMessage::TYPE_OUTGOING, ChatMessage::CONTENT_MESSAGE, false, i18n("Great!"), previewHandle_, - previewUsername_, previewPicture_, fontButton_->font(), fontColorButton_->color().name() ); + previewUsername_, previewPicture_, userFont_, userColor_.name() ); ChatMessage fake3( ChatMessage::TYPE_OUTGOING, ChatMessage::CONTENT_MESSAGE, false, i18n("I /just/ got back from my vacation in Italy!"), previewHandle_, - previewUsername_, previewPicture_, fontButton_->font(), fontColorButton_->color().name() ); + previewUsername_, previewPicture_, userFont_, userColor_.name() ); + + // Remove any old chat samples + chatMessageView_->clearView( true ); // Display the sample chat - htmlBody += "
    " + chatStyleTransform_->convertMessage(fake1) + "
    \n"; - - if( groupFollowupCheckbox_->isChecked() ) - { - QList messageGroup; - messageGroup.append(&fake2); - messageGroup.append(&fake3); - htmlBody += "
    " + chatStyleTransform_->convertMessageList(messageGroup) + "
    \n"; - } - else - { - htmlBody += "
    " + chatStyleTransform_->convertMessage(fake2) + "
    \n"; - htmlBody += "
    " + chatStyleTransform_->convertMessage(fake3) + "
    \n"; - } - - QString messageRoot = chatStyleTransform_->convertMessageRoot(); - if( messageRoot.isNull() ) - { - // Assign standard HTML - chatMessageView_->setStandardHtml( htmlBody, chatStyleTransform_->getCssFile(), chatStyleTransform_->getBaseFolder() ); - } - else - { - // Assign the custom HTML root - chatMessageView_->setHtml( messageRoot, htmlBody ); - } + chatMessageView_->showMessage( fake1 ); + chatMessageView_->showMessage( fake2 ); + chatMessageView_->showMessage( fake3 ); } // Update the data shown in the message preview -void ChatStylePage::updatePreviewDetails( const QString &handle, const QString &name, const QString picture ) +void ChatStylePage::updatePreviewDetails( const QString &handle, const QString &name, const QString &picture ) { previewHandle_ = handle; previewPicture_ = picture; @@ -405,4 +424,17 @@ void ChatStylePage::useContactFontToggled( bool checked ) } + +// Open a dialog for KDE New Stuff Chat Themes +void ChatStylePage::getNewThemes() +{ + KNS::Engine engine( this ); + engine.init( "kmesschatstyles.knsrc" ); + KNS::Entry::List entries = engine.downloadDialogModal( this ); + + loadStyleList(); +} + + + #include "chatstylepage.moc" diff --git a/src/settings/chatstylepage.h b/src/settings/chatstylepage.h index f709444..5f32f60 100644 --- a/src/settings/chatstylepage.h +++ b/src/settings/chatstylepage.h @@ -20,6 +20,8 @@ #include "ui_chatstylepage.h" +#include +#include #include @@ -59,7 +61,7 @@ class ChatStylePage : public QWidget, private Ui::ChatStylePage public slots: // Update the data shown in the message preview - void updatePreviewDetails( const QString &handle, const QString &name, const QString picture ); + void updatePreviewDetails( const QString &handle, const QString &name, const QString &picture ); private slots: // The contact font button was pressed. Show a font dialog to get a new font. @@ -68,22 +70,38 @@ class ChatStylePage : public QWidget, private Ui::ChatStylePage void fontClicked(); // The chat style was changed void slotChatStyleChanged( const QString &style ); + // Update the contacts font color + void slotContactFontColorChanged( const QColor &color ); + // Update the user font color + void slotUserFontColorChanged( const QColor &color ); // Update the chat style preview void updatePreview(); // Enable or disable the contact font and color selectors void useContactFontToggled( bool checked ); + // Open a dialog for KDE New Stuff Chat Themes + void getNewThemes(); + // Update the style list + void loadStyleList(); private: // Private properties + // The chat message preview + ChatMessageView *chatMessageView_; + // The XSL transformation handler + ChatMessageStyle *chatStyleTransform_; + // Color used for contact messages + QColor contactColor_; + // Font used for contact messages + QFont contactFont_; // User handle shown in the chat preview QString previewHandle_; // User picture shown in the chat preview QString previewPicture_; // Username shown in the chat preview QString previewUsername_; - // The chat message preview - ChatMessageView *chatMessageView_; - // The XSL transformation handler - ChatMessageStyle *chatStyleTransform_; + // Color used for user messages + QColor userColor_; + // Font used for user messages + QFont userFont_; }; diff --git a/src/settings/chatstylepage.ui b/src/settings/chatstylepage.ui index f458b23..701c863 100644 --- a/src/settings/chatstylepage.ui +++ b/src/settings/chatstylepage.ui @@ -1,63 +1,56 @@ - + + ChatStylePage - - + + 0 0 - 460 - 467 + 433 + 408 - + - - + + 0 - - + + 0 - - - - 0 - 0 - 448 - 429 - - - + + St&yle - + - - + + QLayout::SetMinimumSize - - + + Allows you to change the theme KMess uses to display all chat messages. - + &Chat style: - + false - + chatStyle_ - - + + 200 0 @@ -65,15 +58,22 @@ + + + + Get &New Styles... + + + - + Qt::Horizontal - + QSizePolicy::Expanding - + 211 20 @@ -84,144 +84,150 @@ - - - + + + 0 0 - + 0 100 - + + + 16777215 + 300 + + + false - + QFrame::NoFrame - + QFrame::Plain - - + + Chat Settings - + - + - - - Enables the appearance of emoticons in the chat conversations. + + + Enables the appearance of emoticons in the chat window. - + &Show emoticons - + Alt+S - - - + + + 0 0 - + 20 20 - + 20 20 - + true - + false - - - + + + 0 0 - + 20 20 - + 20 20 - + true - + false - - - + + + 0 0 - + 20 20 - + 20 20 - + true - + false - + Qt::Horizontal - + QSizePolicy::Expanding - + 310 16 @@ -232,98 +238,126 @@ - - - Enables the appearance of a timestamp in each chat message. - - - S&how messages time - - - Alt+H + + + Show &winks - - - This option enables grouping of messages from the same contact. When the contact types uses multiple messages to explain something, KMess groups those messages as one single message. The exact appearance depends on the chosen chat style. + + + This option enables the grouping of messages from the same contact. Whenever a contact sends you multiple messages, KMess will group those messages to one single message. The exact appearance depends on the chosen chat style. - + &Group follow-up messages from the same contact - + Alt+G - + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 16 + + + + + + + + Enables the appearance of a timestamp in each chat message. + + + S&how timestamp + + + Alt+H + + + + + - - - Allows you to change the theme KMess uses to display all chat messages. - - - G&roup chats in the same window: - - - false - - - tabbedChatMode_ - - - - - - - - 200 - 0 - - - - - Always - - - - - For contacts in the same group - - - - - Never - - - - - - - + + Qt::Horizontal - + + QSizePolicy::Fixed + + - 40 - 20 + 16 + 16 + + + + false + + + Show &date + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 16 + 16 + + + + + + + + false + + + Show s&econds + + + - - + + Qt::Vertical - + + QSizePolicy::Expanding + + 20 40 @@ -333,84 +367,76 @@ - - - - 0 - 0 - 448 - 429 - - - + + &Text - + - - - + + + 0 0 - + This is the font style and color used in your chat messages. - + Your &message font: - + false - + fontButton_ - + - - + + 250 0 - + - - - + + + 0 0 - + 80 32767 - + - + Qt::Horizontal - + QSizePolicy::Expanding - + 351 20 @@ -421,14 +447,14 @@ - - + + Qt::Vertical - + QSizePolicy::Fixed - + 20 16 @@ -437,58 +463,58 @@ - - + + Allows to override the font style and color of your contacts' messages with a the chosen font style and color below. - - &Force contacts' messages to use this font: + + &Force messages from your contacts to use this font: - + - - + + 250 0 - + - - - + + + 0 0 - + 80 32767 - + - + Qt::Horizontal - + QSizePolicy::Expanding - + 331 20 @@ -499,14 +525,14 @@ - - + + Qt::Vertical - + QSizePolicy::Fixed - + 20 16 @@ -515,51 +541,28 @@ - - - Enables the use of font effects. Typing *bold*, /italic/, and _underline_ causes those words appear in a bold, italics or underlined font respectively. + + + Chat Window Formatting - - Use font &effects in messages, like *bold*, /italic/, and _underline_ - - - Alt+E - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 16 - - - - - - - - MSN Plus formatting - - + - - - Enable in the contact list + + + Enables the use of font effects. Typing *bold*, /italic/, and _underline_ causes those words to appear in a bold, italic or underlined font respectively. + + + Use font &effects in messages, like *bold*, /italic/, and _underline_ + + + Alt+E - - - Enable in the chat windows + + + Enable MSN Plus formatting @@ -567,14 +570,132 @@ - - + + Qt::Vertical - + - 441 - 119 + 16 + 16 + + + + + + + + + &Behavior + + + + + + <qt><p>When contacts like to have your attention they can send a nudge. By default the chat window shakes when a nudge is received or sent. Disable this option if the shaking effect is too obtrusive.</p> +<p>When this option is enabled, KMess still limits the shaking effect. Contacts may send multiple nudges at once, but KMess only shakes the chat window with the first nudge.</p></qt> + + + Shake the chat &window when a nudge is received or sent + + + Alt+W + + + + + + + <qt><p>When this option is enabled, you will see your own display picture in the contacts panel, along with the pictures of the contacts in that chat.</p></qt> + + + Display your own &display picture in the chat window + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 16 + 16 + + + + + + + + + + Allows you to change the theme KMess uses to display all chat messages. + + + G&roup chats in the same window: + + + false + + + tabbedChatMode_ + + + + + + + + 200 + 0 + + + + + Always + + + + + For contacts in the same group + + + + + Never + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 @@ -586,6 +707,11 @@ + + KPushButton + QPushButton +
    kpushbutton.h
    +
    KColorButton QPushButton @@ -593,19 +719,48 @@
    - tabWidget_ chatStyle_ useEmoticonsCheckBox_ - showTimeCheckbox_ groupFollowupCheckbox_ - tabbedChatMode_ fontButton_ fontColorButton_ useContactFontCheckBox_ contactFontButton_ contactFontColorButton_ - useFontEffectsCheckBox_ - + + + showTimeCheckbox_ + toggled(bool) + showDateCheckbox_ + setEnabled(bool) + + + 94 + 295 + + + 100 + 329 + + + + + showTimeCheckbox_ + toggled(bool) + showSecondsCheckbox_ + setEnabled(bool) + + + 132 + 298 + + + 132 + 362 + + + +
    diff --git a/src/settings/contactlistpage.cpp b/src/settings/contactlistpage.cpp new file mode 100644 index 0000000..48b9542 --- /dev/null +++ b/src/settings/contactlistpage.cpp @@ -0,0 +1,73 @@ +/*************************************************************************** + contactlistpage.cpp - description + ------------------- + begin : Sun Mar 1 2009 + copyright : (C) 2009 by Andrea Decorte + email : "adecorte" --at-- "gmail.com" + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "contactlistpage.h" + +#include "../account.h" +#include "../kmessdebug.h" + + + +/** + * The constructor + */ +ContactListPage::ContactListPage( QWidget *parent ) +: QWidget( parent ) +, Ui::ContactListPage() +{ + setupUi( this ); +} + + + +/** + * @brief Load the widget state from an account + * + * Reads an Account's info and sets our internal widgets accordingly + * + * @param account The account where to pick settings from + */ +void ContactListPage::loadSettings( const Account *account ) +{ + nowListeningCheckBox_ ->setChecked( account->getShowNowListening() ); + showEmailInfoCheckBox_ ->setChecked( account->getShowEmail() ); + enableListFormattingCheckBox_->setChecked( account->getUseListFormatting() ); + showContactEmailCheckBox_ ->setChecked( account->getShowContactEmail() ); + showBirdCheckBox_ ->setChecked( account->getShowContactListBird() ); +} + + + +/** + * @brief Save account information from the alerts widget + * + * Calls the set-up methods from Account to change its properties, based on how + * the user has set the widgets of this page. + */ +void ContactListPage::saveSettings( Account *account ) +{ + account->setContactListOptions ( nowListeningCheckBox_->isChecked(), + showContactEmailCheckBox_->isChecked(), + enableListFormattingCheckBox_->isChecked() ); + account->setEmailInformation ( showEmailInfoCheckBox_->isChecked(), + false ); + account->setShowContactListBird( showBirdCheckBox_->isChecked() ); +} + + + +#include "contactlistpage.moc" diff --git a/src/settings/alertspage.h b/src/settings/contactlistpage.h similarity index 65% rename from src/settings/alertspage.h rename to src/settings/contactlistpage.h index 83e4c7c..db5d5dd 100644 --- a/src/settings/alertspage.h +++ b/src/settings/contactlistpage.h @@ -1,9 +1,9 @@ /*************************************************************************** - alertspage.h - description + contactlistpage.h - description ------------------- - begin : Thu Jan 30 2008 - copyright : (C) 2008 by Diederik van der Boor - email : "vdboor" --at-- "codingdomain.com" + begin : Sun Mar 1 2009 + copyright : (C) 2009 by Andrea Decorte + email : "adecorte" --at-- "gmail.com" ***************************************************************************/ /*************************************************************************** @@ -15,10 +15,10 @@ * * ***************************************************************************/ -#ifndef ALERTSPAGE_H -#define ALERTSPAGE_H +#ifndef CONTACTLISTPAGE_H +#define CONTACTLISTPAGE_H -#include "ui_alertspage.h" +#include "ui_contactlistpage.h" #include @@ -29,29 +29,24 @@ class Account; /** - * Setttings page for the alerts settings page. + * Setttings page for the contact list settings. * * @ingroup Settings + * @author Andrea Decorte */ -class AlertsPage : public QWidget, private Ui::AlertsPage +class ContactListPage : public QWidget, private Ui::ContactListPage { Q_OBJECT public: // Constructor - AlertsPage( QWidget* parent = 0 ); + ContactListPage( QWidget* parent = 0 ); public: // Public methods // Load the widget state from an account void loadSettings( const Account *account ); // Save an account's information according to the widgets void saveSettings( Account *account ); - // Force the page onto a specific tab - void switchToTab( int tabIndex ); - - private slots: - // Update status of dependent options for the notifications - void notificationsToggled(); }; diff --git a/src/settings/contactlistpage.ui b/src/settings/contactlistpage.ui new file mode 100644 index 0000000..682a664 --- /dev/null +++ b/src/settings/contactlistpage.ui @@ -0,0 +1,105 @@ + + + ContactListPage + + + + 0 + 0 + 412 + 250 + + + + + + + Display Options + + + + + + If enabled, a popup is shown when email is received in your inbox. The number of unread email messages is shown above the contact list. This option is only available for Hotmail accounts. + + + Display a count of &unread mail + + + + + + + If enabled, KMess informs contacts what you're listening to. This information is retrieved from the currently active audio player. + + + Show contacts w&hich song I am listening to + + + Alt+H + + + + + + + If enabled, KMess informs contacts what you're listening to. This information is retrieved from the currently active audio player. + + + Show background &image + + + Alt+H + + + + + + + + + + List Formatting + + + + + + Enable MSN &Plus formatting + + + + + + + Show the &email of contacts instead of the friendly name + + + + + + + + + + Qt::Vertical + + + + 16 + 16 + + + + + + + + qPixmapFromMimeSource + + showEmailInfoCheckBox_ + nowListeningCheckBox_ + + + + diff --git a/src/settings/emoticonspage.cpp b/src/settings/emoticonspage.cpp index ed1209c..2861e25 100644 --- a/src/settings/emoticonspage.cpp +++ b/src/settings/emoticonspage.cpp @@ -92,7 +92,7 @@ EmoticonsPage::~EmoticonsPage() */ void EmoticonsPage::customEmoticonRenamed( QListWidgetItem *item ) { - QString newName = item->text(); + QString newName( item->text() ); #ifdef KMESSDEBUG_EMOTICONS_SETTINGS kDebug() << "Renaming emoticon '" << renamedItemName_ << "' to '" << newName << "'"; @@ -110,7 +110,21 @@ void EmoticonsPage::customEmoticonRenamed( QListWidgetItem *item ) return; } - // First, check if an emoticon with the new name already exists + // Verify if the shortcut length is within the allowed limit + if( newName.size() > 7 ) + { + KMessageBox::sorry( this, + i18nc( "Dialog box text", + "You can only use 7 characters for the emoticon shortcuts." ), + i18nc( "Dialog box title", "Invalid emoticon name" ) ); + + // Opening the editor on the item again fails here, probably because this + // method is called as a slot by the editor itself; so only cut down the + // new name to size (losing data). Stuff sucks. + newName.truncate( 7 ); + } + + // Check if an emoticon with the new name already exists if( emoticonTheme_->contains( newName ) ) { // Don't ask for confirmation if the emoticon isn't valid @@ -118,8 +132,8 @@ void EmoticonsPage::customEmoticonRenamed( QListWidgetItem *item ) if( emoticonTheme_->getEmoticon( newName )->isValid() ) { result = KMessageBox::questionYesNo( this, - i18n( "The emoticon \"%1\" already exists, do you want to replace it?", newName ), - i18n( "Replace Existing Emoticon" ) + i18n( "The emoticon \"%1\" already exists. Do you want to replace it?", newName ), + i18nc( "Dialog box title", "Replace Existing Emoticon" ) ); } else @@ -214,6 +228,15 @@ void EmoticonsPage::removeCustomEmoticon() QListWidgetItem *item = selectedItems.first(); + // Request confirmation + int result = KMessageBox::questionYesNo( this, + i18n( "Are you sure you want to delete the emoticon \"%1\" ?", item->text() ), + i18nc( "Dialog box title", "Delete Emoticon" ) ); + if( result != KMessageBox::Yes ) + { + return; + } + // Remove the emoticon from the temporary theme, and if that succeeds, from the list int itemRow = customEmoticonsView_->row( item ); if( emoticonTheme_->removeEmoticon( item->text() ) && itemRow >= 0 ) @@ -301,7 +324,7 @@ void EmoticonsPage::showAddEmoticonDialog() // Force the page onto a specific tab void EmoticonsPage::switchToTab( int tabIndex ) { - if( tabIndex < 0 || tabIndex > tabWidget_->count() ) + if( ( tabIndex < 0 ) || tabIndex > tabWidget_->count() ) { kWarning() << "Invalid tab index" << tabIndex << "selected!"; return; @@ -361,7 +384,7 @@ void EmoticonsPage::updateThemesList() QStringList themes = themeDir.entryList( QDir::Dirs, QDir::Name | QDir::IgnoreCase ); for( QStringList::Iterator it = themes.begin(); it != themes.end(); ++it ) { - QString dirName = *it; + QString dirName( *it ); // Ignore '.' and '..' if( dirName == "." || dirName == ".." ) diff --git a/src/settings/emoticonspage.ui b/src/settings/emoticonspage.ui index f66d010..0721359 100644 --- a/src/settings/emoticonspage.ui +++ b/src/settings/emoticonspage.ui @@ -1,7 +1,8 @@ - + + EmoticonsPage - - + + 0 0 @@ -9,63 +10,55 @@ 440 - - + + 0 - - + + 0 - - - - 0 - 0 - 501 - 407 - - - + + &Emoticon Themes - + - - - + + + 0 0 - + Available emoticon styles: - + false - - + + true - + QAbstractItemView::SelectRows - + Qt::Vertical - + QSizePolicy::Preferred - + 20 20 @@ -75,53 +68,81 @@ - - - - 0 - 0 - 501 - 407 - - - + + &Custom Emoticons - + - - + + Custom emoticons for this account: - + false - - + + true - + + QAbstractItemView::DoubleClicked + + + true + + + false + + QAbstractItemView::SelectItems - + + + 36 + 36 + + + + Qt::ElideNone + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + + + QListView::Static + + + QListView::Adjust + + + 16 + + QListView::IconMode + + false + - + - + Qt::Horizontal - + QSizePolicy::Expanding - + 170 21 @@ -130,30 +151,27 @@ - - - Click + + + Click here to add a new custom emoticon - - Click here to add a new customized emoticons to send to your contacts. + + Add Ne&w... - - Add ne&w... - - + Alt+W - + Qt::Horizontal - + QSizePolicy::Fixed - + 12 12 @@ -162,36 +180,33 @@ - - + + false - - Click + + Click here to rename the selected emoticon - - Click here to rename the selected emoticon. - - + Re&name - + Alt+N - - + + false - - Select an emoticon and click here to delete it. + + Click here to delete the selected emoticon - + Remo&ve - + Alt+V @@ -204,7 +219,7 @@ - + qPixmapFromMimeSource diff --git a/src/settings/globalsettingsdialog.cpp b/src/settings/globalsettingsdialog.cpp index 78a2888..f1ae523 100644 --- a/src/settings/globalsettingsdialog.cpp +++ b/src/settings/globalsettingsdialog.cpp @@ -40,6 +40,7 @@ GlobalSettingsDialog::GlobalSettingsDialog( QWidget *parent ) config_ = KMessConfig::instance()->getGlobalConfig( "GlobalSettingsDialog" ); // Set up the dialog box + setObjectName( "GlobalSettings" ); setButtons( Help | Ok | Apply | Cancel ); setDefaultButton( Ok ); setCaption( i18n("KMess Settings") ); @@ -58,9 +59,9 @@ GlobalSettingsDialog::GlobalSettingsDialog( QWidget *parent ) page->setHeader( i18n( "Accounts" ) ); page->setIcon( KIcon( "system-users" ) ); - page = addPage( notificationPage_, i18n( "Notification" ) ); + page = addPage( notificationPage_, i18n( "Notifications" ) ); page->setIcon( KIcon( "text-speak" ) ); - page->setHeader( i18n( "Notification" ) ); + page->setHeader( i18n( "Notifications" ) ); page = addPage( miscellaneousPage_, i18n("Settings") ); page->setHeader( i18n( "Settings" ) ); diff --git a/src/settings/miscellaneouspage.cpp b/src/settings/miscellaneouspage.cpp index c49525f..5adb2a8 100644 --- a/src/settings/miscellaneouspage.cpp +++ b/src/settings/miscellaneouspage.cpp @@ -18,9 +18,11 @@ #include "miscellaneouspage.h" #include "kmessdebug.h" +#include #include #include #include +#include #include @@ -96,7 +98,7 @@ MiscellaneousPage::MiscellaneousPage( QWidget *parent ) { useCustomMailClientRadio_->setChecked( true ); useCustomMailClientRadio_->setEnabled( false ); - mailClientsCombo_->addItem( i18n("No selectable e-mail clients detected.") ); + mailClientsCombo_->addItem( i18n("No selectable email clients detected.") ); mailClientsCombo_->setEnabled( false ); } @@ -281,12 +283,12 @@ bool MiscellaneousPage::saveSettings( KConfigGroup &group ) { if( customBrowserEdit_->text().isEmpty() ) { - KMessageBox::error( 0, i18n( "You have to select a command to run as custom browser!" ) ); + KMessageBox::error( 0, i18n( "You have to specify a console command to launch a custom browser!" ) ); return false; } else if( ! customBrowserEdit_->text().contains( "%u" ) ) { - int result = KMessageBox::warningYesNoCancel( 0, i18n( "The command you selected to run as custom browser " + int result = KMessageBox::warningYesNoCancel( 0, i18n( "The console command you have specified to launch a custom browser " "does not contain the '%u' parameter. Without this, opening Web " "sites will not work.
    Do you want KMess to add it for you?" ) ); @@ -311,12 +313,12 @@ bool MiscellaneousPage::saveSettings( KConfigGroup &group ) { if( customMailClientEdit_->text().isEmpty() ) { - KMessageBox::error( 0, i18n( "You have to select a command to run as custom email client!" ) ); + KMessageBox::error( 0, i18n( "You have to specify a console command to launch a custom email client!" ) ); return false; } else if( ! customMailClientEdit_->text().contains( "%u" ) ) { - int result = KMessageBox::warningYesNoCancel( 0, i18n( "The command you selected to run as custom email client " + int result = KMessageBox::warningYesNoCancel( 0, i18n( "The console command you specified to launch a custom email client " "does not contain the '%u' parameter. Without this, composing " "mail will not work.
    Do you want KMess to add it for you?" ) ); diff --git a/src/settings/miscellaneouspage.ui b/src/settings/miscellaneouspage.ui index 78c2bb3..8c80247 100644 --- a/src/settings/miscellaneouspage.ui +++ b/src/settings/miscellaneouspage.ui @@ -1,70 +1,63 @@ - + + MiscellaneousPage - - + + 0 0 - 515 - 354 + 381 + 230 - + - - + + 0 - - + + 0 - - - - 0 - 0 - 507 - 321 - - - + + Web Browser - + - - + + Choose this option to use the browser used by the rest of KDE. - + &Use the KDE default browser - - + + Select this option to choose from a list of installed browsers. - + &Use an installed browser: - + - - + + Qt::Horizontal - + QSizePolicy::Fixed - + 20 20 @@ -73,8 +66,8 @@ - - + + false @@ -82,26 +75,26 @@ - - + + Choose this option to enter the path to your favorite browser. - + &Specify a custom command: - + - - + + Qt::Horizontal - + QSizePolicy::Fixed - + 20 20 @@ -110,26 +103,26 @@ - + - - + + false - + Specify the path of a program to use to open links; a '%u' here will be replaced with the links' URL. - + 32767 - - + + false - + Use '%u' to insert the URL in the command line. @@ -139,11 +132,11 @@ - - + + Qt::Vertical - + 20 20 @@ -153,60 +146,52 @@ - - - - 0 - 0 - 507 - 321 - - - + + Email Client - + - - + + Check this box to use the Live Mail webmail site when you connect with accounts compatible with Live Mail. - - Use Live Mail if the account supports it + + Use &Live Mail if the account supports it - - + + Choose this option to use the email client used by the rest of KDE. - - &Use the KDE default email client + + Use the &KDE default email client - - + + Select this option to choose from a list of installed browsers. - - &Use an installed email client: + + Use an &installed email client: - + - - + + Qt::Horizontal - + QSizePolicy::Fixed - + 20 20 @@ -215,8 +200,8 @@ - - + + false @@ -224,26 +209,26 @@ - - + + Choose this option to enter the path to your favorite browser. - + &Specify a custom command: - + - - + + Qt::Horizontal - + QSizePolicy::Fixed - + 20 20 @@ -252,26 +237,26 @@ - + - - + + false - + Specify the path of a program to use to open links; a '%u' here will be replaced with the links' URL. - + 32767 - - + + false - + Use '%u' to insert the email address in the command line. @@ -281,11 +266,11 @@ - - + + Qt::Vertical - + 20 27 @@ -295,47 +280,39 @@ - - - - 0 - 0 - 507 - 321 - - - + + File Transfers - + - - + + true - + &Save all received files in one directory: - + false - + - - + + false - - + + false - + ... @@ -343,14 +320,14 @@ - - + + Qt::Vertical - + QSizePolicy::Fixed - + 16 16 @@ -359,72 +336,75 @@ - + - - + + &Use ports between - + lowestTransferPort_ - - - + + + 0 0 - + true - - 32766 + + 65534 - - + + and - + highestTransferPort_ - - - + + + 0 0 - + true - - 32767 + + 1 + + + 65535 - - + + for file transfers - - + + Qt::Horizontal - + 40 20 @@ -435,11 +415,11 @@ - - + + Qt::Vertical - + 20 40 @@ -452,7 +432,6 @@ - tabWidget_ @@ -472,11 +451,11 @@ receivedFilesDirEdit_ setEnabled(bool) - + 73 58 - + 78 89 @@ -488,11 +467,11 @@ chooseDirButton_ setEnabled(bool) - + 192 52 - + 426 88 diff --git a/src/utils/crashhandler.cpp b/src/utils/crashhandler.cpp index 8804f4f..82680d9 100644 --- a/src/utils/crashhandler.cpp +++ b/src/utils/crashhandler.cpp @@ -3,7 +3,7 @@ ------------------- begin : (Weekday) (Month) (day) 2008 copyright : (C) 2008 by (yourname) - email : (e-mail address) + email : (email address) ***************************************************************************/ /*************************************************************************** @@ -110,6 +110,8 @@ void CrashHandler::kmessCrashed( int signal ) #endif KProcess gdb; + gdb.setOutputChannelMode( KProcess::SeparateChannels ); + gdb << "gdb" << "--quiet" // avoid banners at startup << "--batch" // exit after processing << "--nw" // no window interface @@ -137,22 +139,53 @@ void CrashHandler::kmessCrashed( int signal ) kDebug() << "full gdb command:" << commandLine; #endif - // Start gdb, limit to 30 seconds. - int returnCode = gdb.execute( 30000 ); - if( returnCode == -2 ) - { - kWarning() << "No backtrace could be generated, gdb not found. Printing KDE backtrace."; - kWarning() << kBacktrace(); + // Start gdb. + gdb.start(); - return; // let the standard crash handler take over. - } - else if( returnCode == -1 ) + bool showKdeBacktrace = false; + + // Wait maximum 300 seconds for gdb to finish. + if( ! gdb.waitForFinished( 300000 ) ) { - kWarning() << "No backtrace could be generated, gdb crashed."; + // Something went wrong + int returnCode = gdb.exitCode(); + + if( returnCode == -2 ) + { + kWarning() << "No backtrace could be generated, gdb not found. Printing KDE backtrace."; + } + else if( returnCode == -1 ) + { + kWarning() << "No backtrace could be generated, gdb crashed."; + } + else if( returnCode != 0 ) + { + kDebug() << "No backtrace could be generated, gdb returned: " << returnCode; + } + else + { + kDebug() << "No backtrace could be generated, gdb timed out."; + } + + showKdeBacktrace = true; } - else if( returnCode != 0 ) + else { - kDebug() << "No backtrace could be generatd, gdb returned: " << returnCode; + // gdb finished, read and check its output. + QString backtrace( gdb.readAll() ); + + if ( backtrace.contains( "No stack." ) + || backtrace.contains( "Backtrace stopped" ) ) + { + showKdeBacktrace = true; + } + + kError() << "KMess backtrace:" << backtrace; + } + + if( showKdeBacktrace ) + { + kError() << "KDE backtrace:" << kBacktrace(); } #else #warning Crash handler code is not implemented for this platform. diff --git a/src/utils/kmess-send/CMakeLists.txt b/src/utils/kmess-send/CMakeLists.txt new file mode 100644 index 0000000..1564e30 --- /dev/null +++ b/src/utils/kmess-send/CMakeLists.txt @@ -0,0 +1,25 @@ +########### kmess send plugin ############### + +SET( kmesssendplugin_SOURCES + kmesssendplugin.cpp + kmesssendmenuitem.cpp +) + +ADD_DEFINITIONS(-fPIC) + +ADD_LIBRARY( kmesssendpluginlib + ../kmessdbusdatatypes.cpp + ../../contact/msnstatus.cpp +) + +LINK_DIRECTORIES( kmesssendpluginlib ) + +KDE4_ADD_PLUGIN( kmesssendplugin WITH_PREFIX ${kmesssendplugin_SOURCES} ) + +TARGET_LINK_LIBRARIES( kmesssendplugin kmesssendpluginlib konq ${KDE4_KDECORE_LIBS} ${KDE4_KPARTS_LIBS} ) + +INSTALL( TARGETS kmesssendplugin DESTINATION ${PLUGIN_INSTALL_DIR} ) + +########## install files ############### + +INSTALL( FILES kmesssendplugin.desktop DESTINATION ${SERVICES_INSTALL_DIR} ) diff --git a/src/utils/kmess-send/kmesssendmenuitem.cpp b/src/utils/kmess-send/kmesssendmenuitem.cpp new file mode 100644 index 0000000..26ec424 --- /dev/null +++ b/src/utils/kmess-send/kmesssendmenuitem.cpp @@ -0,0 +1,47 @@ +/*************************************************************************** + kmesssendmenuitem.cpp - description + ------------------- + begin : Wednesday July 10 2008 + copyright : (C) 2008 by Ruben Vandamme + email : vandammeru gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kmesssendmenuitem.h" +#include "../../kmessdebug.h" +#include "../../contact/msnstatus.h" + + + +// Constructor +KMessSendMenuItem::KMessSendMenuItem( DBusContact contact, QDBusInterface *dbusInterface, KActionCollection* actionCollection ) + : KAction( + *new KIcon( MsnStatus::getIcon( (Status)contact.status ) ), + contact.friendlyName.length() > 30 ? contact.friendlyName.left( 25 ).append( "..." ) : contact.friendlyName, + actionCollection + ), + contact_( contact ), + dbusInterface_( dbusInterface ) +{ +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Creating menuitem for" << contact.friendlyName << "with status" << contact.status; +#endif +} + + + +// Destructor +KMessSendMenuItem::~KMessSendMenuItem() +{ +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "DESTROYED."; +#endif +} diff --git a/src/utils/kmess-send/kmesssendmenuitem.h b/src/utils/kmess-send/kmesssendmenuitem.h new file mode 100644 index 0000000..c71a1f6 --- /dev/null +++ b/src/utils/kmess-send/kmesssendmenuitem.h @@ -0,0 +1,44 @@ +/*************************************************************************** + kmesssendmenuitem.h - description + ------------------- + begin : Wednesday July 10 2008 + copyright : (C) 2008 by Ruben Vandamme + email : vandammeru gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef KMESSSENDMENUITEM_H +#define KMESSSENDMENUITEM_H + +#include "../kmessdbusdatatypes.h" +#include +#include +#include + + + +class KMessSendMenuItem: public KAction +{ + public: // Public methods + // Constructor + KMessSendMenuItem( DBusContact contact, QDBusInterface *dbusInterface, KActionCollection* actionCollection ); + // Destructor + virtual ~KMessSendMenuItem(); + + public: // Public attributes + // Contains necesarry information about contact + DBusContact contact_; + // DBus interface where to connect to + QDBusInterface *dbusInterface_; +}; + +#endif diff --git a/src/utils/kmess-send/kmesssendplugin.cpp b/src/utils/kmess-send/kmesssendplugin.cpp new file mode 100644 index 0000000..e6448bf --- /dev/null +++ b/src/utils/kmess-send/kmesssendplugin.cpp @@ -0,0 +1,247 @@ +/*************************************************************************** + kmesssendplugin.cpp - description + ------------------- + begin : Wednesday July 09 2008 + copyright : (C) 2008 by Ruben Vandamme + email : vandammeru gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#include "kmesssendplugin.h" +#include "kmesssendmenuitem.h" +#include "../kmessdbusdatatypes.h" +#include "../../kmessdebug.h" +#include "../../contact/msnstatus.h" + +#include +#include +#include +#include +#include +#include +#include + + + +class KMessSendPluginFactory : public KGenericFactory +{ + public: + KMessSendPluginFactory( const char *instanceName = 0 ) + : KGenericFactory( instanceName ) + { + } + + + + ~KMessSendPluginFactory() + { + } +}; + + + +K_EXPORT_COMPONENT_FACTORY (libkmesssendplugin, KMessSendPluginFactory ("kmesssendplugin")) + + + +// Constructor +KMessSendPlugin::KMessSendPlugin( KonqPopupMenu *popupMenu, const QStringList & /* list */ ) +:KonqPopupMenuPlugin(popupMenu) +{ + KGlobal::locale()->insertCatalog("kmesssend_plugin"); + + KMESSDBUS_REGISTER_DATATYPES +} + + + +// Setup the menu +void KMessSendPlugin::setup( KActionCollection *actionCollection, const KonqPopupMenuInformation& popupMenuInfo, QMenu *menu ) +{ +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Setting up plugin"; +#endif + + // Remember currently selected files + KFileItemList itemList = popupMenuInfo.items(); + + foreach( const KFileItem& item, itemList ) + { + itemList_.append( item.localPath() ); + } + + // First see if KMess is running + QDBusConnection bus = QDBusConnection::sessionBus(); + + // Search for a running KMess instance +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Searching for KMess instances on DBus"; +#endif + + const QStringList serviceNames = bus.interface()->registeredServiceNames(); + QString service; + QStringList instances; + + foreach( service, serviceNames ) + { + if( service.startsWith( "org.kmess.kmess" ) ) + { +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << service; +#endif + instances << service; + } + } + + // Quit if KMess is not running + if( instances.isEmpty() ) + { +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "No running KMess instance found, aborting"; +#endif + + return; + } + + // Create the menu + KActionMenu *sendMenu = new KActionMenu( KIcon("kmess"), i18n ("Send with KMess"), actionCollection ); + + menu->addSeparator(); + menu->addAction( sendMenu ); + menu->addSeparator(); + + KMessSendMenuItem *menuItem = 0; + + KActionMenu *subMenu = sendMenu; + + // Connect to all found KMess instances + foreach( service, instances ) + { +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Connecting to " + service; +#endif + // Open the found DBus interface + QDBusInterface *dbusInterface = new QDBusInterface( service, "/remoteControl", "org.kmess.remoteControl", bus, this); + + QDBusReply > reply = dbusInterface->call("getList"); + + if( !reply.isValid() ) + { +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Invalid reply when getting contactlist: " << reply.error(); +#endif + sendMenu->setEnabled( false ); + return; + } + + // If more than one KMess instance is running, create submenus per account + if( instances.size() > 1 ) + { + QDBusReply nickName = dbusInterface->call("getFriendlyName"); + + if( !nickName.isValid() ) + { +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Invalid reply when getting friendly name: " << reply.error(); +#endif + sendMenu->setEnabled( false ); + return; + } + +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Creating submenu for account " << nickName; +#endif + subMenu = new KActionMenu( KIcon("kmess"), nickName, actionCollection); + sendMenu->addAction( subMenu ); + } + + QListIterator i( reply ); + DBusContact contact; + bool contactsToShow = false; + + // Add every contact + while( i.hasNext() ) + { + contact = i.next(); + + // Don't show contact if invisible or offline + if( contact.status == 4 || contact.status == 6 ) + { + continue; + } + contactsToShow = true; + + menuItem = new KMessSendMenuItem( contact, dbusInterface, actionCollection ); + connect( menuItem, SIGNAL( triggered( bool ) ), this, SLOT( slotSendFile() ) ); + subMenu->addAction( menuItem ); + } + +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + if( !contactsToShow ) + { + kDebug() << "No contacts to show"; + } +#endif + subMenu->setEnabled( contactsToShow ); + } +} + + + +// Destructor +KMessSendPlugin::~KMessSendPlugin() +{ +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "DESTROYED."; +#endif +} + + + +// Send the selected files +void KMessSendPlugin::slotSendFile() +{ + const KMessSendMenuItem *menuItem = dynamic_cast( sender() ); + +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Sending Files to " << menuItem->contact_.handle << " via " << menuItem->dbusInterface_; +#endif + + QStringListIterator i( itemList_ ); + QString fileName; + + while( i.hasNext() ) + { + fileName = i.next(); + +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Sending file" << fileName; +#endif + + QList args; + args.append( menuItem->contact_.handle ); + args.append( fileName ); + + QDBusReply reply = menuItem->dbusInterface_->callWithArgumentList( QDBus::AutoDetect, "startFileTransfer", args ); + + if( !reply.isValid() ) + { +#ifdef KMESSDEBUG_KMESSSENDPLUGIN + kDebug() << "Failed to send files:" << reply.error(); +#endif + } + } +} + + + +#include "kmesssendplugin.moc" diff --git a/src/utils/kmess-send/kmesssendplugin.desktop b/src/utils/kmess-send/kmesssendplugin.desktop new file mode 100644 index 0000000..951979c --- /dev/null +++ b/src/utils/kmess-send/kmesssendplugin.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=Service +Name=Send with KMess +X-KDE-Library=libkmesssendplugin +ServiceTypes=KonqPopupMenu/Plugin +MimeType=application/octet-stream; diff --git a/src/utils/kmess-send/kmesssendplugin.h b/src/utils/kmess-send/kmesssendplugin.h new file mode 100644 index 0000000..6e36558 --- /dev/null +++ b/src/utils/kmess-send/kmesssendplugin.h @@ -0,0 +1,51 @@ +/*************************************************************************** + kmesssendplugin.h - description + ------------------- + begin : Wednesday July 09 2008 + copyright : (C) 2008 by Ruben Vandamme + email : vandammeru gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef _KMESSSENDPLUGIN_H_ +#define _KMESSSENDPLUGIN_H_ + +#include +#include +#include + + + +class QStringList; +class QDBusInterface; + +class KMessSendPlugin : public KonqPopupMenuPlugin +{ + Q_OBJECT + +public: + // Constructor + KMessSendPlugin (KonqPopupMenu *popupMenu, const QStringList & list); + // Destructor + virtual ~KMessSendPlugin(); + // Setup the menu + virtual void setup( KActionCollection *actionCollection, const KonqPopupMenuInformation &popupMenuInfo, QMenu *menu ); + +private slots: + // Send the selected files + void slotSendFile(); + +private: + // Selected files + QStringList itemList_; +}; + +#endif diff --git a/src/utils/kmessconfig.cpp b/src/utils/kmessconfig.cpp index 4f29640..e083fbc 100644 --- a/src/utils/kmessconfig.cpp +++ b/src/utils/kmessconfig.cpp @@ -17,12 +17,14 @@ #include "kmessconfig.h" #include "../contact/msnobject.h" +#include "../notification/notificationmanager.h" #include "../kmessdebug.h" -#include - #include +#include +#include + // Initialize the instance to zero KMessConfig* KMessConfig::instance_(0); @@ -31,6 +33,7 @@ KMessConfig* KMessConfig::instance_(0); // Constructor KMessConfig::KMessConfig() +: tempConfigFile_( 0 ) { } @@ -56,6 +59,9 @@ KMessConfig::~KMessConfig() accountsConfigs_ .clear(); listsConfigs_.clear(); instance_ = 0; + + delete tempConfigFile_; + kDebug() << "DESTROYED"; } @@ -76,7 +82,7 @@ bool KMessConfig::destroyConfigDir( const QString &fullDirPath ) QList filesList = dir.entryInfoList( QDir::AllEntries | QDir::NoDotAndDotDot ); foreach( QFileInfo entry, filesList ) { - QString entryPath = entry.absoluteFilePath(); + QString entryPath( entry.absoluteFilePath() ); if( entry.isDir() ) { @@ -166,6 +172,7 @@ const QString KMessConfig::getAccountsDirectory() QStringList KMessConfig::getAccountsList() { QDir dirs( getAccountsDirectory() ); + return dirs.entryList( QStringList( "*@*" ), QDir::Dirs | QDir::NoDotAndDotDot ); } @@ -182,20 +189,34 @@ QStringList KMessConfig::getAccountsList() */ KConfigGroup KMessConfig::getAccountConfig( const QString &accountHandle, const QString &groupName ) { + KConfigGroup configGroup; + // Search for config in QHash if( accountsConfigs_.contains( accountHandle ) ) { - return accountsConfigs_.value( accountHandle )->group( groupName ); + configGroup = accountsConfigs_.value( accountHandle )->group( groupName ); + } + else + { + QDir accountDir( getAccountsDirectory() + "/" + accountHandle ); + + KConfig *config = new KConfig( QString( accountDir.absolutePath() + "/settings" ) ); + + // insert current config into QHash for future search + accountsConfigs_.insert( accountHandle, config ); + + configGroup = config->group( groupName ); } - QDir accountDir( getAccountsDirectory() + "/" + accountHandle ); + // We're unable to write on the configuration files, + // avoid crashing (when kdelibs are compiled in debug mode) + if( configGroup.accessMode() != KConfigBase::ReadWrite ) + { + warnUser(); + return getInvalidConfig(); + } - KConfig *config = new KConfig( QString( accountDir.absolutePath() + "/settings" ) ); - - // insert current config into QHash for future search - accountsConfigs_.insert( accountHandle, config ); - - return config->group( groupName ); + return configGroup; } @@ -211,19 +232,33 @@ KConfigGroup KMessConfig::getAccountConfig( const QString &accountHandle, const */ KConfigGroup KMessConfig::getContactListConfig( const QString &accountHandle, const QString &groupName ) { + KConfigGroup configGroup; + // Search for config in QHash if( listsConfigs_.contains( accountHandle ) ) { - return listsConfigs_.value( accountHandle )->group( groupName ); + configGroup = listsConfigs_.value( accountHandle )->group( groupName ); + } + else + { + QDir accountDir( getAccountsDirectory() + "/" + accountHandle ); + KConfig *config = new KConfig( QString( accountDir.absolutePath() + "/contactlist" ) ); + + // insert current config into QHash for future search + listsConfigs_.insert( accountHandle, config ); + + configGroup = config->group( groupName ); } - QDir accountDir( getAccountsDirectory() + "/" + accountHandle ); - KConfig *config = new KConfig( QString( accountDir.absolutePath() + "/contactlist" ) ); + // We're unable to write on the configuration files, + // avoid crashing (when kdelibs are compiled in debug mode) + if( configGroup.accessMode() != KConfigBase::ReadWrite ) + { + warnUser(); + return getInvalidConfig(); + } - // insert current config into QHash for future search - listsConfigs_.insert( accountHandle, config ); - - return config->group( groupName ); + return configGroup; } @@ -251,10 +286,47 @@ KConfigGroup KMessConfig::getGlobalConfig( const QString &groupName ) // insert current config into QHash for future search accountsConfigs_.insert( generalGroup, config ); - return config->group( groupName ); + KConfigGroup configGroup( config->group( groupName ) ); + + // We're unable to write on the configuration files, + // avoid crashing (when kdelibs are compiled in debug mode) + if( configGroup.accessMode() != KConfigBase::ReadWrite ) + { + warnUser(); + return getInvalidConfig(); + } + + return configGroup; } +/** + * Return an invalid config file. + * + * When the configuration files cannot be written to, KMess will use fake config + * files, which means none of the user settings will be read from or written to + * until the problem gets fixed. This avoid crashes when using debugging KDE + * libraries. + * + * @returns A config group + */ +KConfigGroup KMessConfig::getInvalidConfig() +{ +#ifdef KMESSDEBUG_SHAREDMETHODS + kDebug() << "Switching to a temporary config file..."; +#endif + + if( tempConfigFile_ == 0 ) + { + tempConfigFile_ = new QTemporaryFile(); + tempConfigFile_->open(); + } + + KConfig *config = new KConfig( tempConfigFile_->fileName() ); + + return config->group( "invalid" ); +} + /** * Return the path for an MsnObject in the cache. @@ -270,7 +342,7 @@ QString KMessConfig::getMsnObjectFileName(const MsnObject &msnObject) // Replace bad characters, in case someone intends to send a bad SHA1. // The sha1 string is actually base64 encoded, meaning we could // also expect a "/" character in the string. - QString sha1d = msnObject.getDataHash(); + QString sha1d( msnObject.getDataHash() ); const QString safeSha1 = sha1d.replace(QRegExp("[^a-zA-Z0-9+=]"), "_"); // Be friendly for file managers. @@ -291,7 +363,7 @@ QString KMessConfig::getMsnObjectFileName(const MsnObject &msnObject) // If the list isn't empty check for image file if( ! files.isEmpty() ) { - foreach( QString file, files ) + foreach( const QString &file, files ) { if( ! file.contains( ".dat" ) ) { @@ -332,3 +404,25 @@ QString KMessConfig::getMsnObjectFileName(const MsnObject &msnObject) +/** + * Warn the user about a configuration problem. + * + * When a configuration file isn't writeable or readable, a message bothers the user + * to have the problem resolved :) + */ +void KMessConfig::warnUser() +{ + NotificationManager::EventSettings settings; + settings.sender = 0; + settings.contact = 0; + settings.widget = 0; + settings.buttons = NotificationManager::BUTTON_HIDE; + + // Notify the user about the network error + NotificationManager::instance()->notify( "status", + i18nc( "Passive notification message", + "

    KMess was unable to access its configuration files!

    " ), + settings ); +} + + diff --git a/src/utils/kmessconfig.h b/src/utils/kmessconfig.h index 8cd6ecf..a0ca033 100644 --- a/src/utils/kmessconfig.h +++ b/src/utils/kmessconfig.h @@ -23,6 +23,7 @@ #include #include +#include class MsnObject; @@ -62,11 +63,19 @@ class KMessConfig private: // Private methods KMessConfig(); ~KMessConfig(); + // Return an invalid config file + KConfigGroup getInvalidConfig(); + // Warn the user about a configuration problem + void warnUser(); private: // Private attributes static KMessConfig *instance_; + // The list of account configuration containers QHash accountsConfigs_; + // The list of contact list configuration containers QHash listsConfigs_; + // A temporary config file to use on emergency + QTemporaryFile *tempConfigFile_; }; #endif diff --git a/src/utils/kmessdbus.cpp b/src/utils/kmessdbus.cpp index 46f4b1e..8179a25 100644 --- a/src/utils/kmessdbus.cpp +++ b/src/utils/kmessdbus.cpp @@ -18,8 +18,13 @@ #include "currentaccount.h" #include "kmess.h" #include "kmessdbus.h" -#include "kmessdbusadaptor.h" #include "kmessdebug.h" +#include "chat/chatmaster.h" +#include "model/contactlist.h" +#include "utils/kmessdbusadaptor.h" +#include "utils/richtextparser.h" + +#include @@ -30,6 +35,8 @@ KMessDBus::KMessDBus( KMess *parent ) new RemoteControlAdaptor( this ); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerObject( "/remoteControl", this ); + + KMESSDBUS_REGISTER_DATATYPES } @@ -95,7 +102,7 @@ void KMessDBus::setStatus( int status ) if( kmess_->isConnected() ) { - kmess_->changeStatus( status ); + kmess_->changeStatus( (Status) status ); } } @@ -110,3 +117,95 @@ int KMessDBus::getStatus() return kmess_->currentAccount_->getStatus(); } + + + +// Get friendly name +QString KMessDBus::getFriendlyName( int formattingMode ) +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "getFriendlyname( int ) called"; +#endif + + if(formattingMode < 0 || formattingMode > 2 ) + { +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "Unknown formattingMode supplied (" << formattingMode << "), defaulting"; +#endif + + return kmess_->currentAccount_->getFriendlyName(); + } + else + { + return kmess_->currentAccount_->getFriendlyName( FormattingMode( formattingMode ) ); + } +} + + +// Comparison function for qSort() +static bool _compareDBusContact( const DBusContact &contact1, const DBusContact &contact2 ) +{ + return QString::compare( contact1.friendlyName, contact2.friendlyName, Qt::CaseInsensitive ) < 0; +} + + + +// Get contactlist +QList KMessDBus::getList() +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "getList() called"; +#endif + + QList list; + Contact *contact; + + QHashIterator i( kmess_->currentAccount_->getContactList()->getContactList() ); + DBusContact dbusContact; + + while( i.hasNext() ) + { + contact = i.next().value(); + + // Don't show offline contacts + if( contact->isOffline() ) continue; + + dbusContact = DBusContact(); + dbusContact.friendlyName = contact->getFriendlyName(); + dbusContact.handle = contact->getHandle(); + dbusContact.status = contact->getStatus(); + list.append( dbusContact ); + } + + qSort( list.begin(), list.end(), _compareDBusContact ); + + return list; +} + + +// Request Chat +void KMessDBus::requestChat( QString handle ) +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "startChat() called"; +#endif + + kmess_->chatMaster_->requestChat( handle ); +} + + + +// Start a filetransfer +void KMessDBus::startFileTransfer( QString handle, QString filename ) +{ +#ifdef KMESSDEBUG_KMESSDBUS + kDebug() << "startFileTransfer() called"; + kDebug() << "sending file " << filename << " to " << handle; +#endif + + kmess_->chatMaster_->startChatAndFileTransfer( handle, filename ); +} + + + +#include "kmessdbus.moc" diff --git a/src/utils/kmessdbus.h b/src/utils/kmessdbus.h index c1d59cc..cf934cb 100644 --- a/src/utils/kmessdbus.h +++ b/src/utils/kmessdbus.h @@ -19,6 +19,11 @@ #define KMESSDBUS_H #include +#include +#include +#include +#include "contact/contact.h" +#include "kmessdbusdatatypes.h" class KMess; @@ -41,6 +46,10 @@ class KMessDBus: public QObject bool isConnected(); void setStatus( int status ); int getStatus(); + QString getFriendlyName( int formattingMode = -1 ); + QList getList(); + void requestChat( QString handle ); + void startFileTransfer( QString handle, QString filename ); private: KMess *kmess_; diff --git a/src/utils/kmessdbus.xml b/src/utils/kmessdbus.xml deleted file mode 100644 index 30c9ba0..0000000 --- a/src/utils/kmessdbus.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/utils/kmessdbusadaptor.cpp b/src/utils/kmessdbusadaptor.cpp new file mode 100644 index 0000000..3c74235 --- /dev/null +++ b/src/utils/kmessdbusadaptor.cpp @@ -0,0 +1,130 @@ +/*************************************************************************** + kmessdbusadaptor.cpp - description + ------------------- + begin : Wednesday July 10 2008 + copyright : (C) 2008 by Ruben Vandamme + email : vandammeru gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "utils/kmessdbusadaptor.h" + +#include +#include +#include +#include +#include +#include +#include + + + +// constructor +RemoteControlAdaptor::RemoteControlAdaptor( KMessDBus *parent ) + : QDBusAbstractAdaptor( parent ) +{ + setAutoRelaySignals( true ); +} + + + +// destructor +RemoteControlAdaptor::~RemoteControlAdaptor() +{ +} + +inline KMessDBus* RemoteControlAdaptor::parent() const +{ + return static_cast( QObject::parent() ); +} + + +// handle method call org.kmess.remoteControl.connect +void RemoteControlAdaptor::connect() +{ + parent()->connect(); +} + + + +// handle method call org.kmess.remoteControl.disconnect +void RemoteControlAdaptor::disconnect() +{ + parent()->disconnect(); +} + + + +// handle method call org.kmess.remoteControl.getFriendlyName +QString RemoteControlAdaptor::getFriendlyName() +{ + return parent()->getFriendlyName(); +} + + + +// handle method call org.kmess.remoteControl.getFriendlyName +QString RemoteControlAdaptor::getFriendlyName( int formattingMode ) +{ + return parent()->getFriendlyName(formattingMode); +} + + + +// handle method call org.kmess.remoteControl.getStatus +int RemoteControlAdaptor::getStatus() +{ + return parent()->getStatus(); +} + + + +// handle method call org.kmess.remoteControl.isConnected +bool RemoteControlAdaptor::isConnected() +{ + return parent()->isConnected(); +} + + + +// handle method call org.kmess.remoteControl.setStatus +void RemoteControlAdaptor::setStatus(int status) +{ + parent()->setStatus(status); +} + + + +// handle method call org.kmess.remoteControl.getList +QList RemoteControlAdaptor::getList() +{ + return parent()->getList(); +} + + + +// handle method call org.kmess.remoteControl.requestChat +void RemoteControlAdaptor::requestChat( QString handle ) +{ + parent()->requestChat(handle); +} + + + +// handle method call org.kmess.remoteControl.startFileTransfer +void RemoteControlAdaptor::startFileTransfer( QString handle, QString file ) +{ + parent()->startFileTransfer(handle,file); +} + + + +#include "kmessdbusadaptor.moc" diff --git a/src/utils/kmessdbusadaptor.h b/src/utils/kmessdbusadaptor.h new file mode 100644 index 0000000..5a58174 --- /dev/null +++ b/src/utils/kmessdbusadaptor.h @@ -0,0 +1,101 @@ +/*************************************************************************** + kmessdbusadaptor.h - description + ------------------- + begin : Wednesday July 10 2008 + copyright : (C) 2008 by Ruben Vandamme + email : vandammeru gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KMESSDBUSADAPTOR_H +#define KMESSDBUSADAPTOR_H + +#include "utils/kmessdbus.h" + +#include +#include + + + +class QByteArray; +template class QList; +template class QMap; +class QString; +class QStringList; +class QVariant; + + + +class RemoteControlAdaptor: public QDBusAbstractAdaptor +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.kmess.remoteControl") + Q_CLASSINFO("D-Bus Introspection", "" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "") + +public: // Public methods + // Constructor + RemoteControlAdaptor( KMessDBus *parent ); + // Destructor + virtual ~RemoteControlAdaptor(); + + // Get parent + inline KMessDBus *parent() const; + +public slots: // Public slots + // handle method call org.kmess.remoteControl.connect + void connect(); + // handle method call org.kmess.remoteControl.disconnect + void disconnect(); + // handle method call org.kmess.remoteControl.getFriendlyName + QString getFriendlyName(); + // handle method call org.kmess.remoteControl.getFriendlyName + QString getFriendlyName( int formattingMode ); + // handle method call org.kmess.remoteControl.getStatus + int getStatus(); + // handle method call org.kmess.remoteControl.isConnected + bool isConnected(); + // handle method call org.kmess.remoteControl.setStatus + void setStatus( int status ); + // handle method call org.kmess.remoteControl.getList + QList getList(); + // handle method call org.kmess.remoteControl.requestChat + void requestChat( QString handle ); + // handle method call org.kmess.remoteControl.startFileTransfer + void startFileTransfer( QString handle, QString filename ); +}; + + + +#endif diff --git a/src/utils/kmessdbusdatatypes.cpp b/src/utils/kmessdbusdatatypes.cpp new file mode 100644 index 0000000..70fc044 --- /dev/null +++ b/src/utils/kmessdbusdatatypes.cpp @@ -0,0 +1,42 @@ +/*************************************************************************** + kmessdbusdatatypes.cpp - description + ------------------- + begin : Thursday July 09 2008 + copyright : (C) 2008 by Ruben Vandamme + email : vandammeru gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kmessdbusdatatypes.h" + +QDBusArgument &operator << ( QDBusArgument &argument, const DBusContact &account ) +{ + argument.beginStructure(); + argument << account.friendlyName + << account.handle + << account.status; + argument.endStructure(); + + return argument; +} + + + +const QDBusArgument &operator >> ( const QDBusArgument &argument, DBusContact &account ) +{ + argument.beginStructure(); + argument >> account.friendlyName + >> account.handle + >> account.status; + argument.endStructure(); + + return argument; +} diff --git a/src/utils/kmessdbusdatatypes.h b/src/utils/kmessdbusdatatypes.h new file mode 100644 index 0000000..6d22478 --- /dev/null +++ b/src/utils/kmessdbusdatatypes.h @@ -0,0 +1,44 @@ +/*************************************************************************** + kmessdbusdatatypes.h - description + ------------------- + begin : Thursday July 09 2008 + copyright : (C) 2008 by Ruben Vandamme + email : vandammeru gmail.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KMESSDBUSDATATYPES_H +#define KMESSDBUSDATATYPES_H + +#include +#include +#include + +#define KMESSDBUS_REGISTER_DATATYPES\ + qDBusRegisterMetaType();\ + qDBusRegisterMetaType >(); + + + +class DBusContact { + public: + QString friendlyName; + QString handle; + int status; +}; + +QDBusArgument &operator<<( QDBusArgument &argument , const DBusContact &entry ); +const QDBusArgument &operator>>( const QDBusArgument &argument, DBusContact &entry ); + +Q_DECLARE_METATYPE( DBusContact ); +Q_DECLARE_METATYPE( QList ); + +#endif diff --git a/src/utils/kmessshared.cpp b/src/utils/kmessshared.cpp index 503af50..751e611 100644 --- a/src/utils/kmessshared.cpp +++ b/src/utils/kmessshared.cpp @@ -26,6 +26,8 @@ #include #include +#include +#include #include #include @@ -42,7 +44,6 @@ QByteArray KMessShared::createHMACSha1 ( const QByteArray &keyForHash , const QB // The algorithm is definited into RFC 2104 int blocksize = 64; QByteArray key( keyForHash ); - QByteArray data( secret ); QByteArray opad( blocksize, 0x5c ); QByteArray ipad( blocksize, 0x36 ); @@ -56,7 +57,6 @@ QByteArray KMessShared::createHMACSha1 ( const QByteArray &keyForHash , const QB if( key.size() < blocksize ) { key += QByteArray( blocksize - key.size() , 0x00 ); - } // Compute the XOR operations @@ -67,14 +67,10 @@ QByteArray KMessShared::createHMACSha1 ( const QByteArray &keyForHash , const QB } // Append the data to ipad - ipad += data; + ipad += secret; - // Compute result: hash sha1 of ipad - QByteArray result; - result = QCryptographicHash::hash( ipad, QCryptographicHash::Sha1 ); - - // Append the data to opad - opad += result; + // Compute result: hash sha1 of ipad and append the data to opad + opad += QCryptographicHash::hash( ipad, QCryptographicHash::Sha1 );; // Return array contains the result of HMACSha1 return QCryptographicHash::hash( opad, QCryptographicHash::Sha1 ); @@ -83,35 +79,55 @@ QByteArray KMessShared::createHMACSha1 ( const QByteArray &keyForHash , const QB // Create the html file to request the given service -QString KMessShared::createRequestFile( const QString &folder ) +QString KMessShared::createRequestFile( const QString &mailto, const QString &folder ) { CurrentAccount *currentAccount = CurrentAccount::instance(); - // Use the method into passport to compute the token - QString token = PassportLoginService::createHotmailToken( currentAccount->getPassportToken(), - currentAccount->getProofToken(), folder ); - // Use one file for hml page with post method - QString filename = KMessConfig::instance()->getAccountDirectory( currentAccount-> getHandle() ) - + "/hotmail.htm"; + QString filename( KMessConfig::instance()->getAccountDirectory( currentAccount-> getHandle() ) + + "/hotmail.htm" ); QFile file( filename ); if ( ! file.open( QIODevice::WriteOnly | QIODevice::Text ) ) { - return ""; + return QString(); } + QString command( folder ); + + // Check if the user wants to send an email + if( ! mailto.isEmpty() ) + { + command += "?mailto=1&to=" + mailto; + } + + // Use the method into passport to compute the token + QString token( PassportLoginService::createHotmailToken( currentAccount->getToken( "Passport" ), + currentAccount->getToken( "PassportProof" ), + command ) ); QTextStream outBuffer( &file ); - QString pageHtml = "
    getLanguageCode() + - "\" method=\"POST\">\n" + "\n" + " \n" + " \n" + " getLanguageCode() + + "\" method=\"POST\">\n" + " \n" + " \n" + "
    \n" + " \n" + "\n"; - pageHtml += token + "\">"; - - // Write and close the file - outBuffer << pageHtml; + // Then close the buffer file.close(); return filename; @@ -169,20 +185,20 @@ QByteArray KMessShared::deriveKey ( const QByteArray &keyToDerive, const QByteAr QString KMessShared::generateGUID() { // This code is based on Kopete, but much shorter. - QString guid = "{" - + QString::number((rand() & 0xAAFF) + 0x1111, 16) - + QString::number((rand() & 0xAAFF) + 0x1111, 16) - + "-" - + QString::number((rand() & 0xAAFF) + 0x1111, 16) - + "-" - + QString::number((rand() & 0xAAFF) + 0x1111, 16) - + "-" - + QString::number((rand() & 0xAAFF) + 0x1111, 16) - + "-" - + QString::number((rand() & 0xAAFF) + 0x1111, 16) - + QString::number((rand() & 0xAAFF) + 0x1111, 16) - + QString::number((rand() & 0xAAFF) + 0x1111, 16) - + "}"; + QString guid( "{" + + QString::number((rand() & 0xAAFF) + 0x1111, 16) + + QString::number((rand() & 0xAAFF) + 0x1111, 16) + + "-" + + QString::number((rand() & 0xAAFF) + 0x1111, 16) + + "-" + + QString::number((rand() & 0xAAFF) + 0x1111, 16) + + "-" + + QString::number((rand() & 0xAAFF) + 0x1111, 16) + + "-" + + QString::number((rand() & 0xAAFF) + 0x1111, 16) + + QString::number((rand() & 0xAAFF) + 0x1111, 16) + + QString::number((rand() & 0xAAFF) + 0x1111, 16) + + "}" ); return guid.toUpper(); } @@ -195,7 +211,7 @@ QString KMessShared::generateGUID() * * @return A random value between 4 and 4294967295. */ -unsigned long KMessShared::generateID() +quint32 KMessShared::generateID() { return (rand() & 0x00FFFFFC); } @@ -222,6 +238,83 @@ QByteArray KMessShared::generateFileHash( const QString &fileName ) +/** + * Converts a string with HTML to one with escaped entities + * + * Only the main HTML control characters are escaped; the string is made suitable for + * insertion within an HTML tag attribute. + * Neither KDE nor Qt have escape/unescape methods this thorough, they only replace the <>&. Annoying. + * + * @param string The string to modify + * @return A reference to the modified string + */ +QString &KMessShared::htmlEscape( QString &string ) +{ + string.replace( ";", ";" ) + .replace( "&", "&" ) + .replace( "&#59;", ";" ) // oh god :( + .replace( "<", "<" ) + .replace( ">", ">" ) + .replace( "'", "'" ) + .replace( '"', """ ); // NOTE: by not using " this result is also usable for XML. + + return string; +} + + + +/** + * Converts a string constant with HTML to one with escaped entities + * + * This version is suitable for use with string constants, as it creates a copy of the original string. + * + * @param string The string to modify + * @return Another string with the escaped contents + */ +QString KMessShared::htmlEscape( const QString &string ) +{ + QString copy( string ); + return htmlEscape( copy ); +} + + + +/** + * Converts a string with escaped entities to one with HTML + * + * Only the main HTML control characters are unescaped; the string is reverted back to its + * original state. + * Neither KDE nor Qt have HTML to text decoding methods. Annoying. + * + * @param string The string to modify + * @return A reference to the modified string + */ +QString &KMessShared::htmlUnescape( QString &string ) +{ + string.replace( """, "\"" ) + .replace( "'", "'" ) + .replace( ">", ">" ) + .replace( "<", "<" ) + .replace( ";", "&#59;" ) + .replace( "&", "&" ) + .replace( ";", ";" ); + + return string; +} + +/** + * Converts a string with escaped entities to one with HTML + * + * This version is suitable for use with string constants, as it creates a copy of the original string. + * + * @param string The string to modify + * @return Another string with the escaped contents + */ +QString KMessShared::htmlUnescape( const QString &string ) +{ + QString copy( string ); + return htmlUnescape( copy ); +} /** * @brief Open the given URL respecting the user's preference @@ -289,13 +382,13 @@ void KMessShared::openBrowser( const KUrl &url ) #ifdef KMESSDEBUG_SHARED_OPENEXTERNAL kDebug() << "KDE default browser selected."; #endif - new KRun( url, mainWindow ); + KToolInvocation::invokeBrowser( url.url() ); return; } // Replace the %u in the command line with the actual URL, and launch the browser. - browser.replace( "%u", "\"" + url.url() + "\"", Qt::CaseInsensitive ); - KRun::run( browser, KUrl::List(), mainWindow ); + browser.replace( "%u", KShell::quoteArg( url.url() ), Qt::CaseInsensitive ); + KRun::runCommand( browser, mainWindow ); } @@ -305,10 +398,11 @@ void KMessShared::openBrowser( const KUrl &url ) * * The program which will open the URL is the one selected in the Global Settings * + * @param mailto The address to compose a message to (can also be empty to open the folder instead). * @param folder The folder to open. - * @param isHotmailAvailable Whether Hotmail can be used to access the e-mail for this account. + * @param isHotmailAvailable Whether Hotmail can be used to access the email for this account. */ -void KMessShared::openEmailClient( const QString folder, bool isHotmailAvailable ) +void KMessShared::openEmailClient( const QString &mailto, const QString &folder, bool isHotmailAvailable ) { // Open the options KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "General" ); @@ -317,7 +411,7 @@ void KMessShared::openEmailClient( const QString folder, bool isHotmailAvailable if( isHotmailAvailable && group.readEntry( "useLiveMail", true ) ) { // Create the request file - QString filename( createRequestFile( folder ) ); + QString filename( createRequestFile( mailto, folder ) ); if( ! filename.isEmpty() ) { // Open the webmail in the browser @@ -377,38 +471,96 @@ void KMessShared::openEmailClient( const QString folder, bool isHotmailAvailable } // Retrieve the mail address to open - QString handleToSend; - if( folder.contains( "?mailto=1&to=" ) ) - { - handleToSend = folder.split( "?mailto=1&to=" )[1]; - } - if( mailClientChoice == "KDE" ) { #ifdef KMESSDEBUG_SHARED_OPENEXTERNAL kDebug() << "KDE default mail client selected."; #endif - new KRun( "mailto:" + handleToSend, mainWindow ); + KToolInvocation::invokeMailer( KUrl( "mailto:" + mailto ) ); return; } // Replace the %u in the command line with the contact address, and launch the application. - mailClient.replace( "%u", "\"" + handleToSend + "\"", Qt::CaseInsensitive ); - KRun::run( mailClient, KUrl::List(), mainWindow ); + mailClient.replace( "%u", KShell::quoteArg( mailto ), Qt::CaseInsensitive ); + KRun::runCommand( mailClient, mainWindow ); } -// Open the give Profile -void KMessShared::openProfile( const QString &handle ) +/** + * Select the next available file. + * + * This method searches for numbered files and returns the last existing file, + * and the first number available for file creation. + * + * + * For example, calling selectNextFile( "/", "name", "ext", 0 ) returns: + * - if "/name.ext" doesn't exists, returns false, startingNumber = 1 + * - if "/name.ext" exists, returns true, startingNumber = 1 + * - if "/name.1.ext" and "/name.2.ext" exist, returns true, fileName = "name.2", + * startingNumber = 3 + * + * @param directory Path where the files will be searched, followed by '/'. + * May be relative. + * @param baseName Common name for the files. Will be updated with the name + * of the last existing numbered file. + * @param suffix Append to the baseName to get the name of the last + * existing numbered file. + * @param startingNumber File number to start from, set to zero to start with + * the common name alone. Gets updated with the number of + * the first available file. + * @return bool If the file in the updated fileName param exists or not. + */ +bool KMessShared::selectNextFile( const QString &directory, const QString &baseName, QString &suffix, const QString &extension, int &startingNumber ) { - QString folder = "http://members.msn.com/default.msnw?mem=" + handle + "&pgmarket"; - QString filename = createRequestFile( folder ); - if( filename.isEmpty() ) + QString path( directory + baseName + "." ); + + // "baseName.ext" doesn't exist, find the next available file + if( startingNumber == 0 && ! QFile::exists( directory + baseName + "." + extension ) ) { - return; +#ifdef KMESSDEBUG_SHAREDMETHODS + kDebug() << "Initial file" << ( directory + baseName + "." + extension ) << "does not exist, finding next available."; +#endif + while( QFile::exists( path + QString::number( ++startingNumber ) + "." + extension ) ) ; +#ifdef KMESSDEBUG_SHAREDMETHODS + kDebug() << "Next available:" << path << startingNumber; +#endif + return false; } - // Open the profile in the browser - openBrowser( KUrl( "file://" + filename ) ); +#ifdef KMESSDEBUG_SHAREDMETHODS + kDebug() << "Initial file exists, finding the last numbered."; +#endif + + // "baseName.ext" exists, find the last existing numbered one + + // Start the sequence number from 1 + if( startingNumber == 0 ) + { + startingNumber = 1; + } + + while( QFile::exists( path + QString::number( startingNumber ) + "." + extension ) ) + { + startingNumber++; + } + + // Found the first non-existing file + if( startingNumber == 1 ) + { + // Select the first numbered file + suffix = QString(); + } + else + { + suffix = "." + QString::number( startingNumber - 1 ); // That's the number of the last existing file + } + +#ifdef KMESSDEBUG_SHAREDMETHODS + kDebug() << "Last existent file name:" << ( baseName + suffix ); +#endif + + return true; } + + diff --git a/src/utils/kmessshared.h b/src/utils/kmessshared.h index f47e592..6b1721b 100644 --- a/src/utils/kmessshared.h +++ b/src/utils/kmessshared.h @@ -46,19 +46,27 @@ class KMessShared // Generate a random GUID. static QString generateGUID(); // Generate an random number to use as ID - static unsigned long generateID(); + static quint32 generateID(); // Return the hash of a file name using the SHA1 algorithm static QByteArray generateFileHash( const QString &fileName ); + // Converts a string with HTML to one with escaped entities + static QString &htmlEscape( QString &string ); + // Converts a string constant with HTML to one with escaped entities + static QString htmlEscape( const QString &string ); + // Converts a string with escaped entities to one with HTML + static QString &htmlUnescape( QString &string ); + // Converts a string constant with escaped entities to one with HTML + static QString htmlUnescape( const QString &string ); // Open the given URL respecting the user's preference static void openBrowser( const KUrl &url ); // Open the given URL mail respecting the user's preference - static void openEmailClient( const QString folder, bool isHotmailAvailable = true ); - // Open the give Profile - static void openProfile( const QString &handle ); + static void openEmailClient( const QString &mailto, const QString &folder, bool isHotmailAvailable = true ); + // Select the next available file + static bool selectNextFile( const QString &directory, const QString &baseName, QString &suffix, const QString &extension, int &startingNumber ); private: // Create the html file to request the given service - static QString createRequestFile( const QString &folder ); + static QString createRequestFile( const QString &mailto, const QString &folder ); }; #endif diff --git a/src/utils/likeback/likeback.cpp b/src/utils/likeback/likeback.cpp new file mode 100644 index 0000000..90bb8b3 --- /dev/null +++ b/src/utils/likeback/likeback.cpp @@ -0,0 +1,499 @@ +/*************************************************************************** + * Copyright (C) 2006 by Sebastien Laout * + * slaout@linux62.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 2 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * + ***************************************************************************/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "likeback.h" +#include "likebackbar.h" +#include "likebackdialog.h" +#include "likeback_p.h" +#include "../../kmessdebug.h" + + + +// Constructor +LikeBack::LikeBack( Button buttons, bool showBarByDefault, KConfig *config, const KAboutData *aboutData ) + : QObject() +{ + // Use default KApplication config and aboutData if not provided: + if( config == 0 ) + { + config = KGlobal::config().data(); + } + if( aboutData == 0 ) + { + aboutData = KGlobal::mainComponent().aboutData(); + } + + // Initialize properties (1/2): + d = new LikeBackPrivate(); + d->buttons = buttons; + d->config = config->group( "LikeBack" ); + d->aboutData = aboutData; + d->showBarByDefault = showBarByDefault; + + // Initialize properties (2/2) [Needs aboutData to be set]: + d->showBar = userWantsToShowBar(); + + // Initialize the button-bar: + d->bar = new LikeBackBar( this ); + + // Show the information message if it is the first time, and if the button-bar is shown: + showInformationMessage(); + + // Show the bar if that's wanted by the developer or the user: + if( d->showBar ) + { + d->bar->startTimer(); + } +} + + + +// Destructor +LikeBack::~LikeBack() +{ + delete d; +} + + + +// Set the windows listing flag +void LikeBack::setWindowNamesListing(WindowListing windowListing) +{ + d->windowListing = windowListing; +} + + + +// Return the windows listing flag +LikeBack::WindowListing LikeBack::windowNamesListing() +{ + return d->windowListing; +} + + + +// Set which languages are accepted by the developers for the comments +void LikeBack::setAcceptedLanguages( const QStringList &locales ) +{ + d->acceptedLocales = locales; +} + + + +// Return the accepted languages for the comments +QStringList LikeBack::acceptedLocales() +{ + return d->acceptedLocales; +} + + + +// Set the site address where to send feedback +void LikeBack::setServer(const QString &hostName, const QString &remotePath, quint16 hostPort) +{ + d->hostName = hostName; + d->remotePath = remotePath; + d->hostPort = hostPort; +} + + + +// Get the developers site hostname +QString LikeBack::hostName() +{ + return d->hostName; +} + + + +// Get the path on the developers site +QString LikeBack::remotePath() +{ + return d->remotePath; +} + + + +// Get the developers site port +quint16 LikeBack::hostPort() +{ + return d->hostPort; +} + + + +// Disable the LikeBack Bar +void LikeBack::disableBar() +{ + d->disabledCount++; + if( d->bar && d->disabledCount > 0 ) + { + d->bar->hide(); + d->bar->stopTimer(); + } +} + + + +// Enable the LikeBack Bar +void LikeBack::enableBar() +{ + d->disabledCount--; + +#ifdef KMESSDEBUG_LIKEBACK + if( d->disabledCount < 0 ) + { + kError() << "Enabled more times than it was disabled. Please refer to the disableBar() documentation for more information and hints."; + } +#endif + + if( d->bar && d->disabledCount <= 0 ) + { + d->bar->startTimer(); + } +} + + + +// Get whether the bar is enabled or not +bool LikeBack::enabledBar() +{ + return d->disabledCount <= 0; +} + + + +// Display the Send Comments dialog +void LikeBack::execCommentDialog( Button type, const QString &initialComment, const QString &windowPath, const QString &context ) +{ + disableBar(); + + LikeBackDialog dialog( type, initialComment, windowPath, context, this ); + dialog.exec(); + + enableBar(); +} + + + +// Display the Send Comments dialog +void LikeBack::execCommentDialogFromHelp() +{ + execCommentDialog( AllButtons, /*initialComment=*/"", /*windowPath=*/"HelpMenuAction" ); +} + + + +// Retrieve which feedback buttons are active +LikeBack::Button LikeBack::buttons() +{ + return d->buttons; +} + + + +// Get the KAboutData stored object +const KAboutData* LikeBack::aboutData() +{ + return d->aboutData; +} + + + +// Get the KDE config stored object +KConfig *LikeBack::config() +{ + return d->config.config(); +} + + + +// Return an action which opens the Send Comment dialog window +KAction* LikeBack::sendACommentAction( KActionCollection *parent ) +{ + if( d->action == 0 ) + { + d->action = new KAction( KIcon("mail-message-new"), i18n("&Send a Comment to the Developers"), this ); + connect( d->action, SIGNAL( triggered(bool) ), + this, SLOT ( execCommentDialog() ) ); + + parent->addAction( "likeBackSendComment", d->action ); + } + + return d->action; +} + + + +// Return whether the user wants to enable the likeback bar or not +bool LikeBack::userWantsToShowBar() +{ + // Store the button-bar per version, so it can be disabled by the developer for the final version: + return d->config.readEntry( "userWantToShowBarForVersion_" + d->aboutData->version(), d->showBarByDefault ); +} + + + +// Set whether the user wants to enable the likeback bar or not +void LikeBack::setUserWantsToShowBar( bool showBar ) +{ + if( showBar == d->showBar ) + return; + + d->showBar = showBar; + + // Store the button-bar per version, so it can be disabled by the developer for the final version: + d->config.writeEntry( "userWantToShowBarForVersion_" + d->aboutData->version(), showBar ); + d->config.sync(); // Make sure the option is saved, even if the application crashes after that. + + if( showBar ) + d->bar->startTimer(); +} + + + +// Show a dialog box to introduce the user to LikeBack +void LikeBack::showInformationMessage() +{ + // Load and register the images needed by the message: + KIconLoader *loader = KIconLoader::global(); + QString likeIconPath ( loader->iconPath( "likeback_like", KIconLoader::Small ) ); + QString dislikeIconPath( loader->iconPath( "likeback_dislike", KIconLoader::Small ) ); + QString bugIconPath ( loader->iconPath( "likeback_bug", KIconLoader::Small ) ); + QString featureIconPath( loader->iconPath( "likeback_feature", KIconLoader::Small ) ); + + // Show a message reflecting the allowed types of comment: + Button buttons = d->buttons; + int nbButtons = ( buttons & Like ? 1 : 0 ) + + ( buttons & Dislike ? 1 : 0 ) + + ( buttons & Bug ? 1 : 0 ) + + ( buttons & Feature ? 1 : 0 ); + + // Construct the welcome phrase + QString welcomePhrase; + if( isDevelopmentVersion( d->aboutData->version() ) ) + { + welcomePhrase = i18nc( "Welcome dialog text,header text for test apps", + "Welcome to this testing version of %1.", d->aboutData->programName() ); + } + else + { + welcomePhrase = i18nc( "Welcome dialog text,header text for released apps", + "Welcome to %1.", d->aboutData->programName() ); + } + + // Construct the like and dislike explanation + QString likeAndDislikePhrase; + if( ( buttons & LikeBack::Like ) && ( buttons & LikeBack::Dislike ) ) + { + likeAndDislikePhrase = i18nc( "Welcome dialog text,explanation for both the like and dislike buttons", + "Each time you have a great or frustrating experience, " + "please click the appropriate face below the window title-bar, " + "briefly describe what you like or dislike and click Send." ); + } + else if( buttons & LikeBack::Like ) + { + likeAndDislikePhrase = i18nc( "Welcome dialog text,explanation for the like button alone", + "Each time you have a great experience, " + "please click the smiling face below the window title-bar, " + "briefly describe what you like and click Send." ); + } + else + { + likeAndDislikePhrase = i18nc( "Welcome dialog text,explanation for the dislike button alone", + "Each time you have a frustrating experience, " + "please click the frowning face below the window title-bar, " + "briefly describe what you dislike and click Send." ); + } + + // Construct the bug report explanation + QString bugPhrase; + if( buttons & LikeBack::Bug ) + { + bugPhrase = i18nc( "Welcome dialog text,explanation for the bug button", + "If you experience an improper behavior in the application, just click " + "the broken-object icon in the top-right corner of the window, describe " + "it and click Send." ); + } + + // Construct the usage examples + QString examplesBlocks; + if( buttons & LikeBack::Like ) + { + examplesBlocks += "  " + + i18nc( "Welcome dialog text,usage example", + "I like the new artwork. Very refreshing." ) + + "
    "; + } + if( buttons & LikeBack::Dislike ) + { + examplesBlocks += "  " + + i18nc( "Welcome dialog text,usage example", + "I dislike the welcome page of that assistant. Too time consuming." ) + + "
    "; + } + if( buttons & LikeBack::Bug ) + { + examplesBlocks += "  " + + i18nc( "Welcome dialog text,usage example", + "The application has an improper behaviour when clicking the Add button. Nothing happens." ) + + "
    "; + } + if( buttons & LikeBack::Feature ) + { + examplesBlocks += "  " + + i18nc( "Welcome dialog text,usage example", + "I desire a new feature allowing me to send my work by email." ) + + "
    "; + } + + // Finally, merge all the strings together + QString dialogText( "

    %1

    " + "

    %2

    " + "

    %3

    " + "

    %4

    " + "

    %5:

    " + "

    %6

    " ); + dialogText = dialogText.arg( welcomePhrase ) + .arg( i18nc( "Welcome dialog text,us=the developers,it=the application", + "To help us improve it, your comments are important." ) ) + .arg( likeAndDislikePhrase ) + .arg( bugPhrase ) + .arg( i18ncp( "Welcome dialog text,header for the examples", "Example", "Examples", nbButtons ) ) + .arg( examplesBlocks ); + + // And show them + KMessageBox::information( 0, + dialogText, + i18nc( "Welcome dialog title", "Help Improve the Application" ), + "LikeBack_starting_information" ); +} + + + +// Return the current window hierarchy +QString LikeBack::activeWindowPath() +{ + // Compute the window hierarchy (from the oldest to the latest, each time prepending to the list): + QStringList windowNames; + QWidget *window = kapp->activeWindow(); + while( window ) + { + QString name( window->objectName() ); + + // Append the class name to the window name if it is unnamed: + if( name == "unnamed" ) + { + name += QString( ":" ) + window->metaObject()->className(); + } + windowNames.prepend( name ); + + window = dynamic_cast( window->parent() ); + } + + // Return the string of windows starting by the end (from the oldest to the latest): + return windowNames.join( " -> " ); +} + + + +// Return whether the email address was confirmed by the user +bool LikeBack::emailAddressAlreadyProvided() +{ + return d->config.readEntry( "emailAlreadyAsked", false ); +} + + + +// Return the currently saved email address, or the account's email address, if present +QString LikeBack::emailAddress() +{ + KEMailSettings emailSettings; + return d->config.readEntry( "emailAddress", emailSettings.getSetting( KEMailSettings::EmailAddress ) ); +} + + + +// Change the saved email address +void LikeBack::setEmailAddress( const QString &address, bool userProvided ) +{ + d->config.writeEntry( "emailAddress", address ); + d->config.writeEntry( "emailAlreadyAsked", ( userProvided || emailAddressAlreadyProvided() ) ); + d->config.sync(); // Make sure the option is saved, even if the application crashes after that. +} + + + +// FIXME: Should be moved to KAboutData? Cigogne will also need it. +bool LikeBack::isDevelopmentVersion( const QString &version ) +{ + return version.indexOf( "alpha", 0, Qt::CaseInsensitive ) != -1 || + version.indexOf( "beta", 0, Qt::CaseInsensitive ) != -1 || + version.indexOf( "rc", 0, Qt::CaseInsensitive ) != -1 || + version.indexOf( "svn", 0, Qt::CaseInsensitive ) != -1 || + version.indexOf( "cvs", 0, Qt::CaseInsensitive ) != -1; +} + + + +// Return whether the Like button is active +bool LikeBack::isLikeActive() const +{ + return ( d->buttons & Like ); +} + + + +// Return whether the Dislike button is active +bool LikeBack::isDislikeActive() const +{ + return ( d->buttons & Dislike ); +} + + + +// Return whether the Bug button is active +bool LikeBack::isBugActive() const +{ + return ( d->buttons & Bug ); +} + + + +// Return whether the Feature button is active +bool LikeBack::isFeatureActive() const +{ + return ( d->buttons & Feature ); +} + + + +#include "likeback.moc" diff --git a/src/utils/likeback/likeback.h b/src/utils/likeback/likeback.h new file mode 100644 index 0000000..d3ee02f --- /dev/null +++ b/src/utils/likeback/likeback.h @@ -0,0 +1,357 @@ +/*************************************************************************** + * Copyright (C) 2006 by Sebastien Laout * + * slaout@linux62.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 2 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * + ***************************************************************************/ + +#ifndef LIKEBACK_H +#define LIKEBACK_H + +#include + + +class KAboutData; +class KAction; +class KConfig; +class KActionCollection; + +class LikeBackPrivate; + +/** + * @short System to Get Quick Feedback from Beta-Testers + * + * This system allows users to communicate theire liking of the application to its developers. + * Thus, developers know what theire users prefer of theire applications, what should be enhanced, etc. + * + * Basically, how does it work? + * Whenever the user notice something good he appreciate or something he do not like, do not understand, do not find polished... + * he can send a few short words to the developers to tell them what he like or do not like. It is only two or three clicks away. + * It is fast and efficient. + * + * This greatly lowers the communication barrier between the application developers and the application users. + * It makes the developers understand and satisfy better the needs of the users. + * + * The LikeBack system has 5 components: + * @li In the application: The comment dialog, where the user write a comment, select a type of comment, etc. + * @li In the application: The KAction to plug in the Help menu. This action displays the comment dialog. + * @li In the application: The button-bar, that floats bellow titlebar of every windows of the application, and let the user to quickly show the comment dialog. + * The button-bar can be hidden. + * @li On the server: A PHP script that collects every comments that users send. The LikeBack object should be configured to contact that server. + * @li On the server: The developer interface. It lists every comments that were sent, let you sort them, add remarks to them, and mark them as fixed or another status. + * + * Here is an example of code to call to quickly setup LikeBack on the client: + * @code + * // Instanciate the LikeBack system, and show the first-use information dialog if the button-bar is shown: + * LikeBack *likeBack = new LikeBack(LikeBack::AllButtons, LikeBack::isDevelopmentVersion(KGlobal::mainComponent().aboutData->version())); // Show button-bar only in beta-versions + * likeBack->setServer("myapp.kde.org", "/likeback/send.php"); + * likeBack->setAcceptedLanguages(QStringList::split(";", "en;fr"), i18n("Please write in English or French.")); + * + * // Comment the following line once you are sure all your windows have a name: + * likeBack->setWindowNamesListing(LikeBack::WarnUnnamedWindows); + * + * // This line should be called early in your KMainWindow constructor because it references actionCollection(). + * // It should be called before createGUI() for the action to be plugged in the Help menu: + * likeBack->sendACommentAction(actionCollection()); + * @endcode + * + * @see Visit http://basket.kde.org/likeback.php for more information, screenshots, a tutorial, hints, return of experiences, and to download the server-side developer interface... + * @author Sebastien Laout + */ +class LikeBack : public QObject +{ + Q_OBJECT + public: + /** + * Ids of every LikeBack buttons the button-bar can have. + * The four first values are each individual buttons you can enable or not. + * The next ones are combinations: all buttons at once, and the default set of buttons (Like, Dislike). + * Those values are used in the constructor, to set the allowed type of comments, and when triggering the comment dialog, to set the default checked type. + * @See The LikeBack constructor and execCommentDialog(). + */ + enum Button { + Like = 0x01, /// The user select that option to report a positive experience he got with the application. + Dislike = 0x02, /// The user select that option to report a frustrating experience he got with the application. + Bug = 0x04, /// The user select that option to report a bug in the application. + Feature = 0x10, /// The user select that option to ask for a new feature he desire. + /// If not enabled, the user is explicitely informed she cannot ask for new features. + AllButtons = Like | Dislike | Bug | Feature, /// Usable in the constructor to enable every posible buttons. + DefaultButtons = Like | Dislike /// Usable in the constructor to enable only the recommended default set of buttons. + }; + + /** + * Flags letting LikeBack print out name and path of each window you show during execution, for debugging purpose. + * @See The method setWindowNamesListing() explains how to use those values. + */ + enum WindowListing { + NoListing = 0, /// Do not print out any window name. For release time. + WarnUnnamedWindows = 1, /// Each time the user option a window, print out a message if the window is unnamed. For development needs, to check windows. + AllWindows = 2 /// Print out the window hierarchy of each opened windows during execution. For development needs, to check every windows have an understandable name. + }; + + /** + * You only need to call the constructor once, typically in main.cpp. + * Even if you do not show the button-bar by default, you should instanciate LikeBack, + * to include its action in the Help menu of your application, to let the users send comments or activate the bar. + * @param buttons The types of comments you want to get. Determine which radio-buttons are shown in the comment dialog, + * and which ones are displayed in the button-bar. Default buttons do not show the Bug and Feature buttons because you are + * likely to already have a way to get bug and feature reports (most of the time, it is a bugs.kde.org account). + * If you do not have that, then use the value LikeBack::AllButtons to show every possible buttons. + * @param showBarByDefault Determines if the floating button-bar should also be shown, in addition to the action in the Help menu. + * Advise: to avoid getting too much noise, enable it only if it is a small application or a development release. + * Notes: This is only a default value, the user will be able to enable or disabled the bar afterward. + * The button-bar display is stored by version. On a new version, your default value will take effect again. + * This allow you to disable the button-bar once the version is stable enought to be released as final. + * @param config Set the configuration file where to store the user email address and if the button-bar should be shown. + * By default (null), the KApplication configuration object is used. + * @param aboutData Set the KAboutData instance used to get the application name and version. By default (null), the KApplication about data object is used. + * The application name is only used in the first-use information message. + * The version is used to store the button-bar visibility per version (can be shown in a development version but not in a final one...) + * and to send with the comment, so you can filter per version and know if a comment refers the latest version of the application or not. + */ + explicit LikeBack(Button buttons = DefaultButtons, bool showBarByDefault = false, KConfig *config = 0, const KAboutData *aboutData = 0 ); + + /** + * Destructor. + * Also hide the button-bar, if it was shown. + * Be careful, the KAction is deleted. Do not use it afterward, and take care to unplug it before destroying this LikeBack instance. + */ + ~LikeBack(); + + /** + * This method is interesting while setting up the system for the first time. + * LikeBack send the current window name (and hierarchy) with the comment. This allows you to put the comments in theire context. + * So, of course, you are encouraged to give a name to your windows. It is done in the constructor of the widgets. + * This method allows to output the name of the current window to the standard output. + * So you can use the application, open all the windows, and when you see a warning, you know which window you should assign a name. + * @see The WindowListing flags for an enumeration and explaining of every possibilities. + * @Note If you do not name your windows, the name of the classes will be sent. So it is not that grave. + */ + void setWindowNamesListing(WindowListing windowListing); + + /** + * @Returns The window listing flag. + * @see setWindowNamesListing() + */ + WindowListing windowNamesListing(); + + /** + * By default, only English comments are accepted. The user is informed she must write in this language by a sentence placed in the comment dialog. + * If you have people talking other languages in your development team, it can be interesting to call this method to define the accepted locales (languages), + * and provide a message to inform users. The developer interface on the server let developers view comments in theire locale. + * Note that no verification is done to check if the user used the right language, it would be impossible. + * The list of locales is there to make it possible to NOT show the message for users of the accepted languages. + * For instance, if you accept only English and French, and that the application run in a French environment, + * it is likely the user is French and will write comments using French. Telling him he should write in French is unnecessary and redundant. + * Passing an empty list and an empty string to the method will make LikeBack display the default message telling the user only English is accepted. + * Example of call you can quickly copy, paste and adapt: + * @code + * likeBack->setAcceptedLanguages(QStringList::split(";", "en;fr"), i18n("Please write in English or French.")); + * @endcode + * @Note During tests, if you do not see the sentence, it is because you are running the application with an "accepted language": do not be surprised ;-) + * @param locales The list of locales where the message does not need to be shown. See TODO TODO for a list of available locales for you to choose. + */ + void setAcceptedLanguages(const QStringList &locales); + + /** + * @Returns The list of accepted locales for the user to write comments. + * @see setAcceptedLanguages() + */ + QStringList acceptedLocales(); + + /** + * Set the path where LikeBack should send every comments. + * It is composed of the server host name, the path to the PHP script used to send comments, and optionnaly a port number if it is not 80. + * This call is mandatory for LikeBack to work. + * @param hostName The server host name to contact when sending comments. For instance "myapp.kde.org". + * @param remotePath The path to the send script on the server. For instance, "/likeback/send.php". + * @param hostPort Optionnal port used to contact the server using the HTTP protocol. By default, it is port 80. + */ + void setServer(const QString &hostName, const QString &remotePath, quint16 hostPort = 80); + + /** + * @Returns The server host name to contact when sending comments. + * @see setServer() + */ + QString hostName(); + + /** + * @Returns The path to the send script on the server. + * @see setServer() + */ + QString remotePath(); + + /** + * @Returns The port used to contact the server using the HTTP protocol. + * @see setServer() + */ + quint16 hostPort(); + + /** + * Get the KAction letting user to show the comment dialog. + * You should plug it in your Help menu, just bellow the "Report a Bug" action, or replace it. + * Adding the action below "Report a Bug" or replacing "Report a Bug" depends on your application and if you have a Bugzilla account. + * If you do not have a Bugzilla account, LikeBack is a good way for your small application to get bug reports: remove "Report a Bug". + * For more information about how to configure LikeBack depending on your application size and settings, see the constructor documentation. + * @Note The action is named "likeback_send_a_comment". So you should add the following XML in the *ui.rc file of your application: + * @code + * + * @endcode + */ + KAction* sendACommentAction(KActionCollection *parent = 0); + + /** + * @Returns The path of the currently active window. Each windows are separated with "~~". + * Normally, you should not need to call this method since it is used to send the window path. + * But if you call execCommentDialog(), you could need to use it. + */ + static QString activeWindowPath(); + + /** + * @Returns The combination of buttons that are shown in the comment dialog and the button-bar. + */ + Button buttons(); + + /** + * @Returns true if the button-bar is currently enabled. Ie, if it has been re-enabled as many times as it has been disabled. + * @see The method disableBar() for more information on how enabling/disabling works. + */ + bool enabledBar(); + + public slots: + + /** + * Temporarily disable the button-bar: it is hiden from the screen if it was shown. + * Does not affect anything if the user has not choosen to show the button-bar. + * @Note Calls to enableBar() and disableBar() are ref-counted. + * This means that the number of times disableBar() is called is memorized, + * and enableBar() will only have effect after it has been called as many times as disableBar() was called before. + * So, make sure to always call enableBar() the same number of times ou called disableBar(). + * And please make sure to ALWAYS call disableBar() BEFORE enableBar(). + * In the counter-case, another code could call disableBar() and EXCPECT the bar to be disabled. But it will not, because its call only canceled yours. + * @Note Sometimes, you will absolutely need to call enableBar() before disableBar(). + * For instance, MyWindow::show() calls enableBar() and MyWindow::hide() calls disableBar(). + * This is the trick used to show the LikeBack button-bar of a Kontact plugin only when the main widget of that plugin is active. + * In this case, call disableBar() at the begin of your program, so the disable count will never be negative. + * @Note If the bar is enabled, it does not mean the bar is shown. For that, the developer (using showBarByDefault in the construcor) + * or the user (by checking the checkbox in the comment dialog) have to explicitely show the bar. + */ + void disableBar(); + + /** + * Re-enable the button-bar one time. + * @see The method disableBar() for more information on how enabling/disabling works. + */ + void enableBar(); + + /** + * Show the first-use information dialog telling the user the meaning of the LikeBack system and giving examples of every comment types. + */ + void showInformationMessage(); + + /** + * Popup the comment dialog. + * With no parameter, it popups in the default configuration: the first type is checked, empty message, current window path, and empty context. + * You can use the following parameters to customize how it should appears: + * @param type Which radiobutton should be checked when poping up. AllButton, the default value, means the first available type will be checked. + * @param initialComment The text to put in the comment text area. Allows you to popup the dialog in some special circumstances, + * like to let the user report an internal error by populating the comment area with technical details useful for you to debug. + * @param windowPath The window path to send with the comment. If empty (the default), the current window path is took. + * Separate window names with "~~". For instance "MainWindow~~NewFile~~FileOpen". + * If you popup the dialog after an error occurred, you can put the error name in that field (if the window path has no sense in that context). + * When the dialog is popuped up from the sendACommentAction() KAction, this value is "HelpMenu", because there is no way to know if the user + * is commenting a thing he found/thinked about in a sub-dialog. + * @param context Not used for the moment. Will allow more fine-grained application status report. + */ + void execCommentDialog(Button type = AllButtons, const QString &initialComment = "", const QString &windowPath = "", const QString &context = ""); + + private: + LikeBackPrivate *d; + + /** + * Get the user email address from KControl. + */ + void fetchUserEmail(); + + private slots: + /** + * Slot triggered by the "Help -> Send a Comment to Developers" KAction. + * It popups the comment dialog, and set the window path to "HelpMenuAction", + * because current window path has no meaning in that case. + */ + void execCommentDialogFromHelp(); + + public slots: + + /** + * Explicitely set if the floating button-bar should be shown or not. + * Tehorically, this choice should only be left to the user, + * and to the developers for the default value, already provided in the constructor. + */ + void setUserWantsToShowBar(bool showBar); + + public: + + /** + * @Returns true if the user has enabled the LikeBack bar for this version. + */ + bool userWantsToShowBar(); + + /** + * @Returns A pointer to the KAboutData used to determin the application name and version. + * @See The LikeBack constructor for more information. + */ + const KAboutData *aboutData(); + + /** + * @Returns A pointer to the KConfig group to store user configuration (email address, if the button-bar should be shown). + * @See The LikeBack constructor for more information. + */ + KConfig *config(); + + /** + * During the first comment sending, the user is invited to enter his email address for the developers to be able to contact him back. + * He is only asked once, or he can set or change it by using the bottom-left button in the comment dialog. + * @Returns true if the user has already configured his email address. + */ + bool emailAddressAlreadyProvided(); + + /** + * @Returns The email user address, or ask it to the user if he have not provided or ignored it. + * @Returns An empty string if the user cancelled the request dialog. + */ + QString emailAddress(); + + /** + * Define or re-define the user email address. + * LikeBack will not ask it again to the user, unless you set @p userProvided to false. + * Then, this call can be considered as setting the default email address, that the user should confirm later. + */ + void setEmailAddress( const QString &address, bool userProvided = false ); + + /** + * @Returns true if @p version is an Alpha, Beta, RC, SVN or CVS version. + * You can use this static method in the constructor to enable the button-bar by default only during beta-releases. + */ + static bool isDevelopmentVersion(const QString &version); + + bool isLikeActive() const; + bool isDislikeActive() const; + bool isBugActive() const; + bool isFeatureActive() const; +}; + +#endif // LIKEBACK_H diff --git a/src/utils/likeback/likeback_p.h b/src/utils/likeback/likeback_p.h new file mode 100644 index 0000000..fabc0a1 --- /dev/null +++ b/src/utils/likeback/likeback_p.h @@ -0,0 +1,86 @@ +/*************************************************************************** + * Copyright (C) 2006 by Sebastien Laout * + * slaout@linux62.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 2 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * + ***************************************************************************/ + +#ifndef LIKEBACK_PRIVATE_H +#define LIKEBACK_PRIVATE_H + +#include + + +class QButtonGroup; + +class Kaction; + + + +class LikeBackPrivate +{ + public: + LikeBackPrivate(); + ~LikeBackPrivate(); + + LikeBackBar *bar; + KConfigGroup config; + const KAboutData *aboutData; + LikeBack::Button buttons; + QString hostName; + QString remotePath; + quint16 hostPort; + QStringList acceptedLocales; + LikeBack::WindowListing windowListing; + bool showBarByDefault; + bool showBar; + int disabledCount; + QString fetchedEmail; + KAction *action; +}; + + + +// Constructor +LikeBackPrivate::LikeBackPrivate() + : bar(0) + , aboutData(0) + , buttons(LikeBack::DefaultButtons) + , hostName() + , remotePath() + , hostPort(80) + , acceptedLocales() + , windowListing(LikeBack::NoListing) + , showBar(false) + , disabledCount(0) + , fetchedEmail() + , action(0) +{ +} + + + +// Destructor +LikeBackPrivate::~LikeBackPrivate() +{ + delete bar; + delete action; + + aboutData = 0; +} + + +#endif // LIKEBACK_PRIVATE_H diff --git a/src/utils/likeback/likebackbar.cpp b/src/utils/likeback/likebackbar.cpp new file mode 100644 index 0000000..ce3d2bf --- /dev/null +++ b/src/utils/likeback/likebackbar.cpp @@ -0,0 +1,155 @@ +/*************************************************************************** + (filename).cpp - description + ------------------- + begin : (Weekday) (Month) (day) 2008 + copyright : (C) 2008 by (yourname) + email : (e-mail address) + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include + +#include "likebackbar.h" +#include "../../kmessdebug.h" + + + +// Constructor +LikeBackBar::LikeBackBar( LikeBack *likeBack ) +: QWidget( 0, Qt::Tool | Qt::X11BypassWindowManagerHint ) +, Ui::LikeBackBar() +, m_likeBack( likeBack ) +{ + // Set up the user interface + setupUi( this ); + resize( sizeHint() ); + + // Set the button icons + m_likeButton ->setIcon( KIcon( "likeback_like" ) ); + m_dislikeButton->setIcon( KIcon( "likeback_dislike" ) ); + m_bugButton ->setIcon( KIcon( "likeback_bug" ) ); + m_featureButton->setIcon( KIcon( "likeback_feature" ) ); + + // Show buttons for the enabled types of feedback only + LikeBack::Button buttons = likeBack->buttons(); + m_likeButton ->setShown( buttons & LikeBack::Like ); + m_dislikeButton->setShown( buttons & LikeBack::Dislike ); + m_bugButton ->setShown( buttons & LikeBack::Bug ); + m_featureButton->setShown( buttons & LikeBack::Feature ); + + // Connect the slot which moves the bar always over the active window + connect( &m_timer, SIGNAL( timeout() ), + this, SLOT ( autoMove() ) ); +} + + + +// Destructor +LikeBackBar::~LikeBackBar() +{ +} + + + +// Begin moving the bar +void LikeBackBar::startTimer() + { + m_timer.start( 500 ); +} + + + +// End moving the bar +void LikeBackBar::stopTimer() +{ + m_timer.stop(); +} + + + +// Move the bar where the parent window is +void LikeBackBar::autoMove() +{ + static QWidget *lastWindow = 0; + + QWidget *window = kapp->activeWindow(); + + // When a Kicker applet has the focus, like the Commandline QLineEdit, + // the systemtray icon indicates to be the current window and the LikeBack is shown next to the system tray icon. + // It's obviously bad ;-) : + bool shouldShow = ( m_likeBack->userWantsToShowBar() && m_likeBack->enabledBar() && window && ! window->inherits("KSystemTray") ); + if( shouldShow ) + { + QPoint point( window->mapToGlobal(QPoint( 0, 0 ) ) ); + move( point.x() + window->width() - width(), point.y() + 1 ); + +#ifdef KMESSDEBUG_LIKEBACK + if( window != lastWindow && m_likeBack->windowNamesListing() != LikeBack::NoListing ) + { + if( window->objectName() == "unnamed" || window->objectName() == "unnamed" ) + { + kDebug() << "Unnamed active window of type" << window->metaObject()->className() << ", active window:" << LikeBack::activeWindowPath(); + } + else if( m_likeBack->windowNamesListing() == LikeBack::AllWindows ) + { + kDebug() << "Active window:" << LikeBack::activeWindowPath(); + } + } +#endif + + lastWindow = window; + } + + // Show or hide the bar accordingly: + if( shouldShow && ! isVisible() ) + { + show(); + } + else if( ! shouldShow && isVisible() ) + { + hide(); + } +} + + + +// The Like button has been clicked +void LikeBackBar::likeClicked() +{ + m_likeBack->execCommentDialog( LikeBack::Like ); +} + + + +// The Dislike button has been clicked +void LikeBackBar::dislikeClicked() +{ + m_likeBack->execCommentDialog( LikeBack::Dislike ); +} + + + +// The Bug button has been clicked +void LikeBackBar::bugClicked() +{ + m_likeBack->execCommentDialog( LikeBack::Bug ); +} + + + +// The Feature button has been clicked +void LikeBackBar::featureClicked() +{ + m_likeBack->execCommentDialog( LikeBack::Feature ); +} + + +#include "likebackbar.moc" diff --git a/src/utils/likeback/likebackbar.h b/src/utils/likeback/likebackbar.h new file mode 100644 index 0000000..877a5d8 --- /dev/null +++ b/src/utils/likeback/likebackbar.h @@ -0,0 +1,51 @@ + + +#ifndef LIKEBACKBAR_H +#define LIKEBACKBAR_H + +#include +#include + +#include "likeback.h" + +#include "ui_likebackbar.h" + + + +class LikeBackBar : public QWidget, private Ui::LikeBackBar +{ + Q_OBJECT + + public: + // Constructor + LikeBackBar( LikeBack *likeBack ); + // Destructor + ~LikeBackBar(); + + public slots: + // Begin moving the bar + void startTimer(); + // End moving the bar + void stopTimer(); + + private slots: + // Move the bar where the parent window is + void autoMove(); + // The Like button has been clicked + void likeClicked(); + // The Dislike button has been clicked + void dislikeClicked(); + // The Bug button has been clicked + void bugClicked(); + // The Feature button has been clicked + void featureClicked(); + + private: + // The parent LikeBack instance + LikeBack *m_likeBack; + // Timer to adjust the bar position + QTimer m_timer; + +}; + +#endif diff --git a/src/utils/likeback/likebackbar.ui b/src/utils/likeback/likebackbar.ui new file mode 100644 index 0000000..8f3b714 --- /dev/null +++ b/src/utils/likeback/likebackbar.ui @@ -0,0 +1,146 @@ + + LikeBackBar + + + + 0 + 0 + 96 + 24 + + + + + 0 + 0 + + + + + + + true + + + + 0 + + + 0 + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + m_likeButton + clicked() + LikeBackBar + likeClicked() + + + 23 + 23 + + + 72 + 0 + + + + + m_dislikeButton + clicked() + LikeBackBar + dislikeClicked() + + + 45 + 17 + + + 95 + 0 + + + + + m_bugButton + clicked() + LikeBackBar + bugClicked() + + + 67 + 20 + + + 95 + 1 + + + + + m_featureButton + clicked() + LikeBackBar + featureClicked() + + + 93 + 13 + + + 95 + 13 + + + + + + likeClicked() + dislikeClicked() + bugClicked() + featureClicked() + + diff --git a/src/utils/likeback/likebackdialog.cpp b/src/utils/likeback/likebackdialog.cpp new file mode 100644 index 0000000..b126f24 --- /dev/null +++ b/src/utils/likeback/likebackdialog.cpp @@ -0,0 +1,320 @@ + +#include +#include + +#include +#include +#include +#include +#include + +#include "likebackdialog.h" +#include "../kmessconfig.h" +#include "../../account.h" +#include "../../kmessdebug.h" + + + +// Constructor +LikeBackDialog::LikeBackDialog( LikeBack::Button reason, const QString &initialComment, + const QString &windowPath, const QString &context, LikeBack *likeBack ) +: KDialog( kapp->activeWindow() ) +, Ui::LikeBackDialog() +, m_context( context ) +, m_likeBack( likeBack ) +, m_windowPath( windowPath ) +{ + // KDialog Options + setCaption( i18n( "Send a Comment to the Developers" ) ); + setButtons( Ok | Cancel ); + setDefaultButton( Ok ); + setObjectName( "LikeBackFeedBack" ); + showButtonSeparator( true ); + restoreDialogSize( KMessConfig::instance()->getGlobalConfig( "LikeBackDialog" ) ); + + // Set up the user interface + QWidget *mainWidget = new QWidget( this ); + setupUi( mainWidget ); + setMainWidget( mainWidget ); + + // Group the buttons together to retrieve the checked one quickly + m_typeGroup_ = new QButtonGroup( this ); + m_typeGroup_->addButton( likeRadio_, LikeBack::Like ); + m_typeGroup_->addButton( dislikeRadio_, LikeBack::Dislike ); + m_typeGroup_->addButton( bugRadio_, LikeBack::Bug ); + m_typeGroup_->addButton( featureRadio_, LikeBack::Feature ); + + // Hide unneeded buttons + LikeBack::Button buttons = m_likeBack->buttons(); + likeRadio_ ->setVisible( buttons & LikeBack::Like ); + dislikeRadio_->setVisible( buttons & LikeBack::Dislike ); + bugRadio_ ->setVisible( buttons & LikeBack::Bug ); + featureRadio_->setVisible( buttons & LikeBack::Feature ); + + // If no specific "reason" is provided, choose the first one: + if( reason == LikeBack::AllButtons || reason == LikeBack::DefaultButtons ) + { + if( buttons & LikeBack::Dislike ) reason = LikeBack::Dislike; + else if( buttons & LikeBack::Bug ) reason = LikeBack::Bug; + else if( buttons & LikeBack::Feature ) reason = LikeBack::Feature; + else reason = LikeBack::Like; + } + // Choose which button to check + switch( reason ) + { + case LikeBack::Like: likeRadio_ ->setChecked( true ); break; + case LikeBack::Dislike: dislikeRadio_->setChecked( true ); break; + case LikeBack::Bug: bugRadio_ ->setChecked( true ); break; + case LikeBack::Feature: featureRadio_->setChecked( true ); break; + default: break; // Will never arrive here + } + + // Disable the Ok button if no comment is present + connect( m_comment, SIGNAL( textChanged() ), + this, SLOT ( verify() ) ); + + // If no window path is provided, get the current active window path: + if( m_windowPath.isEmpty() ) + { + m_windowPath = LikeBack::activeWindowPath(); + } + + // Specify the initial comment + m_comment->setPlainText( initialComment ); + m_comment->setFocus(); + + // Set the Show Bar checkbox status and connect it + showBarCheckbox_->setChecked( m_likeBack->userWantsToShowBar() ); + connect( showBarCheckbox_, SIGNAL( toggled(bool) ), + m_likeBack, SLOT ( setUserWantsToShowBar(bool) ) ); + + // Provide the initial status for email address widgets if available + emailAddressEdit_->setText( m_likeBack->emailAddress() ); + specifyEmailCheckBox_->setChecked( m_likeBack->emailAddressAlreadyProvided() ); + + // The introduction message is long and will require a new minimum dialog size + m_informationLabel->setText( introductionText() ); + setMinimumSize( minimumSizeHint() ); + + // Initially verify the widgets status + verify(); +} + + + +// Destructor +LikeBackDialog::~LikeBackDialog() +{ + KConfigGroup group = KMessConfig::instance()->getGlobalConfig( "LikeBackDialog" ); + saveDialogSize( group ); +} + + + +// Construct the introductory text of the dialog +QString LikeBackDialog::introductionText() +{ + QStringList acceptedLocales; + KLocale *kLocale = KGlobal::locale(); + QStringList acceptedLocaleCodes = m_likeBack->acceptedLocales(); + + // Define a list of languages which the application developers are able to understand + if( ! acceptedLocaleCodes.isEmpty() ) + { + foreach( const QString &locale, acceptedLocaleCodes ) + { + acceptedLocales << kLocale->languageCodeToName( locale ); + } + } + else if( ! kLocale->language().startsWith( "en" ) ) + { + acceptedLocales << kLocale->languageCodeToName( "en" ); + } + + // Put the locales list together in a readable string + QString languagesMessage; + if( ! acceptedLocales.isEmpty() ) + { + // TODO: Replace the URL with a localized one: + QString translationTool( "http://www.google.com/language_tools?hl=" + kLocale->language() ); + + if( acceptedLocales.count() == 1 ) + { + languagesMessage = i18nc( "Feedback dialog text, message with one accepted language for the comments", + "Please, write it in %1 (you may want to use an online translation tool for this).
    ", + acceptedLocales.first(), + translationTool ); + } + else + { + languagesMessage = i18nc( "Feedback dialog text, message with list of accepted languages for the comments", + "Please, write it in %1 or %2 (you may want to use an online translation tool for this).
    ", + QStringList( acceptedLocales.mid( 1 ) ).join( ", " ), + acceptedLocales.first(), + translationTool ); + } + } + + // If both "I Like" and "I Dislike" buttons are shown and one is clicked: + QString balancingMessage; + if( m_likeBack->isLikeActive() && m_likeBack->isDislikeActive() + && ( m_typeGroup_->checkedId() == LikeBack::Like || m_typeGroup_->checkedId() == LikeBack::Dislike ) ) + { + balancingMessage = i18nc( "Feedback dialog text, message to remind to balance the likes and dislikes", + "To make the comments you send more useful in improving this application, " + "try to send the same amount of positive and negative comments.
    " ); + } + + // If feature requests are not allowed: + QString noFeatureRequestsMessage; + if( ! m_likeBack->isFeatureActive() ) + { + noFeatureRequestsMessage = i18nc( "Feedback dialog text, text to disallow feature requests", + "Please, do not ask for new features: this kind of request will be ignored.
    " ); + } + + // Blend all previous messages together + return i18nc( "Feedback dialog text, %1=Application name,%2=message with list of accepted languages for the comment," + "%3=optional text to remind to balance the likes and dislikes,%4=optional text to disallow feature requests.", + "

    You can provide to the developers a brief description of your opinions of %1.
    " + "%2 " // %2: Contains the newline if present + "%3%4

    ", + m_likeBack->aboutData()->programName(), + languagesMessage, + balancingMessage, + noFeatureRequestsMessage ); +} + + + +// Check if the UI should allow the user to send the comment +void LikeBackDialog::verify() +{ + bool hasComment = ( ! m_comment->document()->isEmpty() ); + bool hasType = ( m_typeGroup_->checkedId() != -1 ); + + button( Ok )->setEnabled( hasComment && hasType ); +} + + + +// Send the comment to the developers site (reimplemented from KDialog) +void LikeBackDialog::slotButtonClicked( int buttonId ) +{ + // If the user has not pressed Ok, do nothing + if( buttonId != Ok ) + { + KDialog::slotButtonClicked( buttonId ); + return; + } + + QString type; + QString emailAddress; + + // Only send the email if the user wants it to be sent + if( specifyEmailCheckBox_->isChecked() ) + { + emailAddress = emailAddressEdit_->text(); + + if( ! Account::isValidEmail( emailAddress ) ) + { + KMessageBox::error( this, i18n( "The email address you have entered is not valid, and cannot be used: '%1'", emailAddress ) ); + return; + } + + m_likeBack->setEmailAddress( emailAddress, true ); + } + + // Disable the UI while we're sending the request + m_comment->setEnabled( false ); + button( Ok )->setEnabled( false ); + + // Choose the type of feedback + switch( m_typeGroup_->checkedId() ) + { + case LikeBack::Like: type = "Like"; break; + case LikeBack::Dislike: type = "Dislike"; break; + case LikeBack::Bug: type = "Bug"; break; + case LikeBack::Feature: type = "Feature"; break; + } + + // Compile the feedback data + QString data( "protocol=" + QUrl::toPercentEncoding( "1.0" ) + '&' + + "type=" + QUrl::toPercentEncoding( type ) + '&' + + "version=" + QUrl::toPercentEncoding( m_likeBack->aboutData()->version() ) + '&' + + "locale=" + QUrl::toPercentEncoding( KGlobal::locale()->language() ) + '&' + + "window=" + QUrl::toPercentEncoding( m_windowPath ) + '&' + + "context=" + QUrl::toPercentEncoding( m_context ) + '&' + + "comment=" + QUrl::toPercentEncoding( m_comment->toPlainText() ) + '&' + + "email=" + QUrl::toPercentEncoding( emailAddress ) ); + + +#ifdef KMESSDEBUG_LIKEBACK + kDebug() << "http://" << m_likeBack->hostName() << ":" << m_likeBack->hostPort() << m_likeBack->remotePath(); + kDebug() << data; +#endif + + // Create the HTTP sending object and the actual request + QHttp *http = new QHttp( m_likeBack->hostName(), m_likeBack->hostPort() ); + connect( http, SIGNAL( requestFinished(int,bool) ), + this, SLOT ( requestFinished(int,bool) ) ); + + QHttpRequestHeader header( "POST", m_likeBack->remotePath() ); + header.setValue( "Host", m_likeBack->hostName() ); + header.setValue( "Content-Type", "application/x-www-form-urlencoded" ); + + // Then send it at the developer site + http->setHost( m_likeBack->hostName() ); + m_requestNumber_ = http->request( header, data.toUtf8() ); +} + + + +// Display confirmation of the sending action +void LikeBackDialog::requestFinished( int id, bool error ) +{ + // Only analyze the request we've sent + if( id != m_requestNumber_ ) + { +#ifdef KMESSDEBUG_LIKEBACK + kDebug() << "Ignoring request" << id; +#endif + return; + } + +#ifdef KMESSDEBUG_LIKEBACK + kDebug() << "Request has" << (error?"failed":"succeeded"); +#endif + + m_likeBack->disableBar(); + + if( ! error ) + { + KMessageBox::information( this, + i18nc( "Dialog box text", + "

    Your comment has been sent successfully." + "It will help us improve the application!

    " + "

    Thanks for your time.

    " ), + i18nc( "Dialog box title", "Comment Sent" ) ); + + hide(); + m_likeBack->enableBar(); + KDialog::accept(); + return; + } + + // TODO: Save to file if error (connection not present at the moment) + KMessageBox::error( this, + i18nc( "Dialog box text", + "

    There has been an error while trying to send the report.

    " + "

    Please, try again later.

    "), + i18nc( "Dialog box title", "Comment Sending Error" ) ); + + m_likeBack->enableBar(); + + // Re-enable the UI + m_comment->setEnabled( true ); + verify(); +} + +#include "likebackdialog.moc" diff --git a/src/utils/likeback/likebackdialog.h b/src/utils/likeback/likebackdialog.h new file mode 100644 index 0000000..9d9982e --- /dev/null +++ b/src/utils/likeback/likebackdialog.h @@ -0,0 +1,50 @@ + + +#ifndef LIKEBACKDIALOG_H +#define LIKEBACKDIALOG_H + +#include + +#include + +#include "likeback.h" + +#include "ui_likebackdialog.h" + + +class LikeBackDialog : public KDialog, private Ui::LikeBackDialog +{ + Q_OBJECT + public: + // Constructor + LikeBackDialog( LikeBack::Button reason, const QString &initialComment, const QString &windowPath, + const QString &context, LikeBack *likeBack ); + // Destructor + ~LikeBackDialog(); + + private: + // Construct the introductory text of the dialog + QString introductionText(); + + private: + // Additional referred window information + QString m_context; + // The parent LikeBack instance + LikeBack *m_likeBack; + // Group of comment type checkboxes + QButtonGroup *m_typeGroup_; + // The id of the window this dialog refers to + QString m_windowPath; + // Identifier of the sent request + int m_requestNumber_; + + private slots: + // Check if the UI should allow the user to send the comment + void verify(); + // Send the comment to the developers site (reimpl. from KDialog) + void slotButtonClicked( int button ); + // Display confirmation of the sending action + void requestFinished( int id, bool error ); +}; + +#endif diff --git a/src/utils/likeback/likebackdialog.ui b/src/utils/likeback/likebackdialog.ui new file mode 100644 index 0000000..cb16b79 --- /dev/null +++ b/src/utils/likeback/likebackdialog.ui @@ -0,0 +1,213 @@ + + + LikeBackDialog + + + + 0 + 0 + 307 + 433 + + + + + + + + + + + 0 + 0 + + + + + + + true + + + Qt::AlignJustify|Qt::AlignTop + + + true + + + + + + + + 0 + 0 + + + + Your comment: + + + + + + + + 150 + 100 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + + false + + + + + + + + 0 + 0 + + + + Your comment is about: + + + + + + + 0 + 0 + + + + Something you like + + + + + + + + 0 + 0 + + + + Something you dislike + + + + + + + + 0 + 0 + + + + An improper behavior of the application + + + + + + + + 0 + 0 + + + + A new feature you desire + + + + + + + + + + + 0 + 0 + + + + Specify an email address to be contacted back + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + false + + + + 0 + 0 + + + + + + + + + + Show the feedback buttons bar on the windows + + + + + + + + + specifyEmailCheckBox_ + toggled(bool) + emailAddressEdit_ + setEnabled(bool) + + + 84 + 298 + + + 156 + 333 + + + + + diff --git a/src/utils/nowlisteningclient.cpp b/src/utils/nowlisteningclient.cpp index e99672f..dcfa8d0 100644 --- a/src/utils/nowlisteningclient.cpp +++ b/src/utils/nowlisteningclient.cpp @@ -19,8 +19,7 @@ #include "kmessdebug.h" -#include -#include +#include #include #include @@ -35,7 +34,36 @@ // Therefore some parts are also // (c) 2002-2006 the by Kopete developers -bool NowListeningClient::alreadyQuery = false; +// Make a Qt meta type from the internal structure which holds Player's status ( mpris compliant ) +Q_DECLARE_METATYPE( NowListeningClient::MprisPlayerStatus ) + + + +/** + * Marshall the MprisPlayerStatus structure into a DBus argument + */ +QDBusArgument &operator<<( QDBusArgument &argument, const NowListeningClient::MprisPlayerStatus &status ) +{ + argument.beginStructure(); + argument << status.Status << status.hasShuffle << status.hasRepeat << status.hasPlaylistRepeat; + argument.endStructure(); + return argument; +} + + + +/** + * Demarshall the MprisPlayerStatus structure from a DBus argument + */ +const QDBusArgument &operator>>( const QDBusArgument &argument, NowListeningClient::MprisPlayerStatus &status ) +{ + argument.beginStructure(); + argument >> status.Status >> status.hasShuffle >> status.hasRepeat >> status.hasPlaylistRepeat; + argument.endStructure(); + return argument; +} + + /** * Constructor @@ -43,6 +71,8 @@ bool NowListeningClient::alreadyQuery = false; NowListeningClient::NowListeningClient() : playing_(false) { + qDBusRegisterMetaType(); + // Connect the update timer event connect( &timer_, SIGNAL(timeout()), this, SLOT(slotUpdate()) ); } @@ -92,9 +122,9 @@ void NowListeningClient::slotUpdate() #endif // Detect changes to reduce signal calls. - QString prevArtist = artist_; - QString prevAlbum = album_; - QString prevTrack = track_; + const QString prevArtist( artist_ ); + const QString prevAlbum ( album_ ); + const QString prevTrack ( track_ ); bool prevPlaying = playing_; // Reset until proven otherwise. @@ -102,7 +132,7 @@ void NowListeningClient::slotUpdate() // Query all applications: the first found stops the search if( queryAmarok1() - || queryAmarok2() + || queryMprisPlayers() || queryJuk() || queryKsCD() ) { @@ -190,21 +220,41 @@ bool NowListeningClient::queryAmarok1() /** * Query Amarok for track information. */ -bool NowListeningClient::queryAmarok2() +bool NowListeningClient::queryMprisPlayers() { - if( alreadyQuery ) + mutex_.lock(); + + // Connect and search all services that implent mpris specifications + QStringList services; + const QDBusConnection& sessionConn( QDBusConnection::sessionBus() ); + + // Check if the connection is successful + if( sessionConn.isConnected() ) { + const QDBusConnectionInterface* bus = sessionConn.interface(); + const QDBusReply& reply( bus->registeredServiceNames() ); + + if( reply.isValid() ) + { + // Search for "org.mpris" string + services = reply.value().filter( "org.mpris." ); + } + } + + // If no service was found then return false and unlock the mutex + if( services.isEmpty() ) + { + mutex_.unlock(); return false; } - alreadyQuery = true; - // Start the d-bus interface, needed to check the application status and make calls to it - QDBusInterface dbusAmarok( "org.mpris.amarok", "/Player", "org.freedesktop.MediaPlayer" ); + QDBusInterface dbusMprisPlayer( services.at(0), "/Player", "org.freedesktop.MediaPlayer" ); // See if the application is registered. - if( ! dbusAmarok.isValid() ) + if( ! dbusMprisPlayer.isValid() ) { + mutex_.unlock(); return false; } @@ -213,8 +263,8 @@ bool NowListeningClient::queryAmarok2() #endif // Call Amarok to know whether it's playing, and what - QDBusReply metadata = dbusAmarok.call( QDBus::BlockWithGui, "GetMetadata" ); - QDBusReply isPlaying = dbusAmarok.call( QDBus::BlockWithGui, "GetStatus" ); + const QDBusReply& metadata( dbusMprisPlayer.call( QDBus::BlockWithGui, "GetMetadata" ) ); + const QDBusReply& isPlaying( dbusMprisPlayer.call( QDBus::BlockWithGui, "GetStatus" ) ); if( ! isPlaying.isValid() || ! metadata.isValid() ) { @@ -222,20 +272,20 @@ bool NowListeningClient::queryAmarok2() kDebug() << "Invalid response from Amarok!"; #endif + mutex_.unlock(); return false; } // Get the list of properties from the map - QVariantMap map( metadata.value() ); + const QVariantMap& map( metadata.value() ); // Save the returned values album_ = map[ "album" ].toString(); track_ = map[ "title" ].toString(); artist_ = map[ "artist" ].toString(); - playing_ = ( isPlaying == 0 ); // 0 playing, 1 paused, 2 stopped - - alreadyQuery = false; + playing_ = ( isPlaying.value().Status == 0 ); // 0 playing, 1 paused, 2 stopped + mutex_.unlock(); return true; } @@ -246,12 +296,7 @@ bool NowListeningClient::queryAmarok2() */ bool NowListeningClient::queryKsCD() { - if( alreadyQuery ) - { - return false; - } - - alreadyQuery = true; + mutex_.lock(); // Start the d-bus interface, needed to check the application status and make calls to it QDBusInterface dbusKsCD( "org.kde.kscd", "/CDPlayer", "org.kde.KSCD" ); @@ -259,6 +304,7 @@ bool NowListeningClient::queryKsCD() // See if the application is registered. if( ! dbusKsCD.isValid() ) { + mutex_.unlock(); return false; } @@ -267,10 +313,10 @@ bool NowListeningClient::queryKsCD() #endif // Call KsCD to know whether it's playing, and what - QDBusReply album = dbusKsCD.call( QDBus::BlockWithGui, "currentAlbum" ); - QDBusReply track = dbusKsCD.call( QDBus::BlockWithGui, "currentTrackTitle" ); - QDBusReply artist = dbusKsCD.call( QDBus::BlockWithGui, "currentArtist" ); - QDBusReply isPlaying = dbusKsCD.call( QDBus::BlockWithGui, "playing" ); + const QDBusReply& album ( dbusKsCD.call( QDBus::BlockWithGui, "currentAlbum" ) ); + const QDBusReply& track ( dbusKsCD.call( QDBus::BlockWithGui, "currentTrackTitle" ) ); + const QDBusReply& artist( dbusKsCD.call( QDBus::BlockWithGui, "currentArtist" ) ); + const QDBusReply& isPlaying( dbusKsCD.call( QDBus::BlockWithGui, "playing" ) ); if( ! isPlaying.isValid() || ! album.isValid() || ! track.isValid() || ! artist.isValid() ) { @@ -278,6 +324,7 @@ bool NowListeningClient::queryKsCD() kDebug() << "Invalid response from KsCD!"; #endif + mutex_.unlock(); return false; } @@ -287,8 +334,7 @@ bool NowListeningClient::queryKsCD() artist_ = artist; playing_ = isPlaying; - alreadyQuery = false; - + mutex_.unlock(); return true; } @@ -299,12 +345,7 @@ bool NowListeningClient::queryKsCD() */ bool NowListeningClient::queryJuk() { - if( alreadyQuery ) - { - return false; - } - - alreadyQuery = true; + mutex_.lock(); // Start the d-bus interface, needed to check the application status and make calls to it QDBusInterface dbusJuk( "org.kde.juk", "/Player", "org.kde.juk.player" ); @@ -312,6 +353,7 @@ bool NowListeningClient::queryJuk() // See if the application is registered. if( ! dbusJuk.isValid() ) { + mutex_.unlock(); return false; } @@ -320,10 +362,10 @@ bool NowListeningClient::queryJuk() #endif // Call KsCD to know whether it's playing, and what - QDBusReply album = dbusJuk.call( QDBus::BlockWithGui, "trackProperty", "Album" ); - QDBusReply track = dbusJuk.call( QDBus::BlockWithGui, "trackProperty", "Title" ); - QDBusReply artist = dbusJuk.call( QDBus::BlockWithGui, "trackProperty", "Artist" ); - QDBusReply isPlaying = dbusJuk.call( QDBus::BlockWithGui, "playing" ); + const QDBusReply& album ( dbusJuk.call( QDBus::BlockWithGui, "trackProperty", "Album" ) ); + const QDBusReply& track ( dbusJuk.call( QDBus::BlockWithGui, "trackProperty", "Title" ) ); + const QDBusReply& artist( dbusJuk.call( QDBus::BlockWithGui, "trackProperty", "Artist" ) ); + const QDBusReply& isPlaying( dbusJuk.call( QDBus::BlockWithGui, "playing" ) ); if( ! isPlaying.isValid() || ! album.isValid() || ! track.isValid() || ! artist.isValid() ) { @@ -331,6 +373,7 @@ bool NowListeningClient::queryJuk() kDebug() << "Invalid response from Juk!"; #endif + mutex_.unlock(); return false; } @@ -340,8 +383,7 @@ bool NowListeningClient::queryJuk() artist_ = artist; playing_ = isPlaying; - alreadyQuery = false; - + mutex_.unlock(); return true; } diff --git a/src/utils/nowlisteningclient.h b/src/utils/nowlisteningclient.h index bdd0b2d..d1bc60b 100644 --- a/src/utils/nowlisteningclient.h +++ b/src/utils/nowlisteningclient.h @@ -18,7 +18,7 @@ #ifndef NOWLISTENINGCLIENT_H #define NOWLISTENINGCLIENT_H -#include +#include #include @@ -56,13 +56,26 @@ class NowListeningClient : public QObject void slotUpdate(); // Query Amarok 1 for track information bool queryAmarok1(); - // Query Amarok 2 for track information - bool queryAmarok2(); + // Query Player mpris compliant for track information + bool queryMprisPlayers(); // Query KsCD for track information bool queryKsCD(); // Query Juk for track information bool queryJuk(); + public: // Public structures + + struct MprisPlayerStatus + { + MprisPlayerStatus() { Status = hasShuffle = hasRepeat = hasPlaylistRepeat = -1; }; + + int Status; // 0 = Playing, 1 = Paused, 2 = Stopped. + int hasShuffle; // 0 = Playing linearly , 1 = Playing randomly. + int hasRepeat; // 0 = Go to the next element once the current has finished playing , 1 = Repeat the current element + int hasPlaylistRepeat; // 0 = Stop playing once the last element has been played, 1 = Never give up playing + }; + + private: // The active album QString album_; @@ -74,8 +87,8 @@ class NowListeningClient : public QObject QTimer timer_; // The active track QString track_; - // The flag is used to avoid to calls new dbus request while there is one. - static bool alreadyQuery; + // Mutex used to avoid multiple requests from being active at once + QMutex mutex_; signals: void changedSong( const QString &artist, const QString &album, const QString &track, bool playing ); diff --git a/src/utils/richtextparser.cpp b/src/utils/richtextparser.cpp index 0118c28..60dfa20 100644 --- a/src/utils/richtextparser.cpp +++ b/src/utils/richtextparser.cpp @@ -1,9 +1,11 @@ /*************************************************************************** - msnplus.cpp - adds MSN Plus! codes/features + richtextparser.cpp - parses MSN and Plus messages ------------------- begin : April 30, 2008 copyright : (C) 2008 by Valerio Pilo + (C) 2009 by Sjors Gielen email : valerio@kmess.org + dazjorz@dazjorz.com ***************************************************************************/ /*************************************************************************** @@ -18,8 +20,8 @@ #include "richtextparser.h" #include "../contact/contactbase.h" +#include "../utils/kmessshared.h" #include "../currentaccount.h" -#include "../emoticon.h" #include "../emoticonmanager.h" #include "../kmessdebug.h" @@ -35,6 +37,7 @@ + // Initialize the list of MSN Plus colors // Note that a whole lot of colors are still missing from the list QStringList RichTextParser::predefinedColors_( @@ -83,17 +86,16 @@ void RichTextParser::getCleanString( QString &string ) const QString originalString = string; - string.replace( "[b]", "" ) - .replace( "[/b]", "" ) - .replace( "[i]", "" ) - .replace( "[/i]", "" ) - .replace( "[u]", "" ) - .replace( "[/u]", "" ) - .replace( "[s]", "" ) - .replace( "[/s]", "" ); + string.replace( "[b]", "", Qt::CaseInsensitive ) + .replace( "[/b]", "", Qt::CaseInsensitive ) + .replace( "[i]", "", Qt::CaseInsensitive ) + .replace( "[/i]", "", Qt::CaseInsensitive ) + .replace( "[u]", "", Qt::CaseInsensitive ) + .replace( "[/u]", "", Qt::CaseInsensitive ) + .replace( "[s]", "", Qt::CaseInsensitive ) + .replace( "[/s]", "", Qt::CaseInsensitive ); - string.replace( QRegExp( "\\[/?c=?#?[0-9a-z,]*\\]", Qt::CaseInsensitive ), "" ) - .replace( QRegExp( "\\[/?a=?#?[0-9a-z,]*\\]", Qt::CaseInsensitive ), "" ); + string.replace( QRegExp( "\\[/?(c|a)(=#?[0-9a-z,]+)?\\]", Qt::CaseInsensitive ), "" ); #ifdef KMESSDEBUG_RICHTEXTPARSER kDebug() << "Original:" << originalString; @@ -130,18 +132,18 @@ void RichTextParser::getFormattedString( QString &string ) const QString originalString = string; - string.replace( "[b]", "" ) - .replace( "[/b]", "" ) - .replace( "[i]", "" ) - .replace( "[/i]", "" ) - .replace( "[u]", "" ) - .replace( "[/u]", "" ) - .replace( "[s]", "" ) - .replace( "[/s]", "" ); + string.replace( "[b]", "", Qt::CaseInsensitive ) + .replace( "[/b]", "", Qt::CaseInsensitive ) + .replace( "[i]", "", Qt::CaseInsensitive ) + .replace( "[/i]", "", Qt::CaseInsensitive ) + .replace( "[u]", "", Qt::CaseInsensitive ) + .replace( "[/u]", "", Qt::CaseInsensitive ) + .replace( "[s]", "", Qt::CaseInsensitive ) + .replace( "[/s]", "", Qt::CaseInsensitive ); while( colorMatch_.indexIn( string ) != -1 ) { - bool isForeground = ( colorMatch_.cap( 1 ) == "c" ); + bool isForeground = ( colorMatch_.cap( 1 ).toLower() == "c" ); // match a solid color if( colorMatch_.cap( 4 ).isEmpty() ) @@ -162,7 +164,7 @@ void RichTextParser::getFormattedString( QString &string ) { string.replace( colorMatch_.pos(), colorMatch_.matchedLength(), "" + colorMatch_.cap( 3 ) + "" ); } } @@ -209,7 +211,7 @@ QString RichTextParser::getHtmlColor( const QString& color ) // Find HTML (#RRGGBB/#RGB) or CSS (red,blue) color codes int colorLength = color.length(); - if( color[0] == '#' && colorLength != 4 && colorLength != 7 ) + if( colorLength > 0 && color[0] == '#' && colorLength != 4 && colorLength != 7 ) { // Pad with zeros incomplete RGB triplets QString paddedColor( color ); @@ -265,7 +267,7 @@ QString RichTextParser::getHtmlGradient( const QString& text, const QString& sta QList tags; QChar character; QColor current = start; - QString outputText = ""; + QString outputText; unsigned int indexGradient = 0; int indexFullString = 0; unsigned int levels = text.length(); @@ -319,7 +321,7 @@ QString RichTextParser::getHtmlGradient( const QString& text, const QString& sta } // Proceed through the entire original string - for( indexFullString = 0; indexFullString < text.length(); indexFullString++ ) + for( indexFullString = 0; indexFullString < text.length(); ++indexFullString ) { // Get the new values for the current gradient character tempRed = start.red () - ( differenceRed * indexGradient ); @@ -493,25 +495,21 @@ void RichTextParser::parseMsnPlusString( QString &text ) */ void RichTextParser::parseMsnString( QString &text, bool showEmoticons, bool showSmallEmoticons, bool showLinks, bool showFormatting, const QString &handle, QStringList &pendingEmoticonTags ) { - Emoticon::htmlEscape( text ); - - // Links and emoticons are replaced in one loop cycle, traversing the message text - // Multiple search-replace cyles give unwanted side effects: - // - smileys can pop up in links like ftp://user:pass@host/ and https://host - // - emoticon replacements could be replaced by another cycle + // Remove all HTML + KMessShared::htmlEscape( text ); bool allowAddingEmoticons = false; // Build a collection of all emoticon data - const QRegExp &emoticonRegExp = emoticonManager_->getHtmlPattern(); - const QMap &emoticonReplacements = emoticonManager_->getHtmlReplacements( showSmallEmoticons ); + const QRegExp &emoticonRegExp = emoticonManager_->getHtmlPattern(); + const QHash &emoticonReplacements = emoticonManager_->getHtmlReplacements( showSmallEmoticons ); - QString code; QRegExp customRegExp; QRegExp pendingRegExp; - QMap customReplacements; - QString customEmoticonsPattern; + QHash customReplacements; + QStringList userCustomEmoticons; + QStringList customEmoticonsBlacklist; // Get theme of custom emoticons if( &handle != 0 && ! handle.isEmpty() ) @@ -525,9 +523,9 @@ void RichTextParser::parseMsnString( QString &text, bool showEmoticons, bool sho if( handle == CurrentAccount::instance()->getHandle() ) { - customRegExp = emoticonManager_->getHtmlPattern( true ); - customReplacements = emoticonManager_->getHtmlReplacements( showSmallEmoticons, true ); - // We already have all of our emoticons, there are no pending ones + customRegExp = emoticonManager_->getHtmlPattern( true ); + customReplacements = emoticonManager_->getHtmlReplacements( showSmallEmoticons, true ); + // We already have all of our emoticons, there are no pending ones } else { @@ -537,283 +535,351 @@ void RichTextParser::parseMsnString( QString &text, bool showEmoticons, bool sho customRegExp = contact->getEmoticonPattern(); customReplacements = contact->getEmoticonReplacements(); pendingRegExp = contact->getPendingEmoticonPattern(); + customEmoticonsBlacklist = contact->getEmoticonBlackList(); allowAddingEmoticons = true; - customEmoticonsPattern = emoticonManager_->getHtmlPattern( true ).pattern(); + userCustomEmoticons = emoticonManager_->getList( true ); // Used to verify if we've already added an emoticon } } } + // TODO: place these regexps at the beginning of this file and + // initialize them *once*! QRegExp linkRegExp; - linkRegExp.setPattern( "\\b(?:http://|https://|ftp://|sftp://|www\\.)" // match protocol string - "[^ \r\n]+" // followed by the host/path + linkRegExp.setPattern( "\\b((?:http://|https://|ftp://|sftp://|www\\.)" + "\\S+)" + // match protocol string followed by the host/path + "[.,;!?]?(?:<|\\s|$)" + // ending with <, \s or $, not counting .,;?!"' before + // (there are some more modifications to a matched + // URL below) ); + linkRegExp.setMinimal(1); QRegExp emailRegExp; emailRegExp.setPattern( - "\\b(" // begin of word, start capture - "[a-z0-9_\\-\\.]+" // match e-mail username - "\\@" // match '@' - "[a-z0-9\\-\\.]+" // match domain hostname - "[a-z0-9]{2,3}" // match top-level-domain - ")" // end capture` + "\\b(" // begin of word, start capture + "[a-zA-Z0-9_\\-\\.]+" // match email username + "\\@" // match '@' + "[a-zA-Z0-9\\-\\.]+" // match domain hostname + "\\.[a-zA-Z0-9]{2,6}" // match top-level-domain + ")" // end capture` "(?:[^a-zA-Z0-9\\-]|$)" // not followed by more simple characters, or should find an end-of-line ); QRegExp geekLinkRegExp; geekLinkRegExp.setPattern( - "(^|\\b)" // look-before test, for start of capture or word delimiter + "(?:^|\\b)" // look-before test, for start of capture or word delimiter "(" // begin of word, start capture - "([a-z0-9\\-]+\\.)+" // match simple characters, but it should contain a dot between each part - "([a-z]{2,3})" // finally match domain part 2 or 3 characters - "(/[a-z0-9\\-_/\\.?=&]+)?" // match the path on the server and simple query requests + "([a-zA-Z0-9\\-]+\\.)+" // match simple characters, but it should contain a dot between each part + "([a-zA-Z]{2,3})" // finally match domain part 2 or 3 characters + "(/[a-zA-Z0-9\\-_/\\.?=&]+)?" // match the path on the server and simple query requests ")" // end capture "(?:[^a-zA-Z0-9]|$)" // not followed by more simple characters, or should find an end-of-line ); - QRegExp punctuationChars( "(?:[.,;!?\"'])$" ); - QRegExp invalidCcTld( "^(js|hh|cc|ui|fo|so|ko|qt|pp|cf|am|in|gz|ps|ai|rv|rm|wm)$" ); // block typical files instead of listing the whole country code list - QRegExp topLevelDomain( "^(?:com|org|net|edu|gov)$" ); + // these can also be initialized *once*! + QRegExp longWordsRegExp( "([\\w\\d-_\\.]{30})([\\w\\d-_\\.]+)" ); + QStringList invalidCcTldList, topLevelDomainList; + invalidCcTldList << "js" << "hh" << "cc" << "ui" << "fo" << "so" + << "ko" << "qt" << "pp" << "cf" << "am" << "in" << "gz" << "ps" + << "ai" << "rv" << "rm" << "wm"; + // block typical files instead of listing the whole country code list + topLevelDomainList << "com" << "org" << "net" << "edu" << "gov"; + // removing the need to test these every time: #ifdef KMESSTEST KMESS_ASSERT( emoticonRegExp.isValid() ); KMESS_ASSERT( emailRegExp.isValid() ); KMESS_ASSERT( linkRegExp.isValid() ); KMESS_ASSERT( geekLinkRegExp.isValid() ); + KMESS_ASSERT( longWordsRegExp.isValid() ); #endif // Set the filename of the placeholder image for pending emoticons - static QString pendingEmoticonPlaceholder( KGlobal::dirs()->findResource( "appdata", "pics/empty.png" ) ); - - static const int REGEXP_COUNT = 6; - const QRegExp* regexps[REGEXP_COUNT]; - regexps[0] = ( customRegExp.isEmpty() ? 0 : &customRegExp ); // is first, to allow overwriting normal emoticons - regexps[1] = ( pendingRegExp.isEmpty() ? 0 : &pendingRegExp ); - regexps[2] = ( showEmoticons && ! emoticonRegExp.isEmpty() ? &emoticonRegExp : 0 ); - regexps[3] = ( showLinks ? &linkRegExp : 0 ); - regexps[4] = ( showLinks ? &emailRegExp : 0 ); - regexps[5] = ( showLinks ? &geekLinkRegExp : 0 ); - - QString replacement; - int lastPos = 0; - int matches[ REGEXP_COUNT]; - memset( matches, -1, sizeof( matches ) ); - - while( true ) + static QString pendingEmoticonPlaceholder( + Qt::escape( KGlobal::dirs()->findResource( "appdata", "pics/empty.png" ) ) ); + + // Set up the emoticon replacement list + QHash emoticonReplacementList; + QHash::const_iterator ei; + // first write emoticonReplacements, then overwrite with customReplacements. + // We can't do pendingEmoticons right now, because we don't have a QHash of them. + // This is considered TODO. + ei = emoticonReplacements.constBegin(); + while( ei != emoticonReplacements.constEnd()) { - // Find out which expression matches first - int matchedRegExp = -1; - int matchStart = -1; - int matchedLength = 0; - for(int i = 0; i < REGEXP_COUNT; i++) + KMESS_ASSERT( ! ei.value().isEmpty() ); + emoticonReplacementList.insert( ei.key(), "" + ei.value() + "" ); + ++ei; + } + ei = customReplacements.constBegin(); + while( ei != customReplacements.constEnd()) + { + KMESS_ASSERT( ! ei.value().isEmpty() ); + + if( customEmoticonsBlacklist.contains( ei.key() ) ) { - if( regexps[ i ] == 0 ) - { - continue; - } - - matches[ i ] = regexps[ i ]->indexIn( text, lastPos ); - if( matches[ i ] == -1 || (int) text.length() < matches[ i ] ) - { - continue; - } - -/*#ifdef KMESSDEBUG_CHATVIEW - kDebug() << "regexp " << i << " matches at character " << matches[ i ]; -#endif*/ - - // See if it's before all other regexps - if( matches[ i ] < matchStart || matchStart == -1 ) - { - matchStart = matches[ i ]; - matchedRegExp = i; - matchedLength = regexps[ i ]->matchedLength(); - } +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Ignoring blacklisted emoticon" << ei.key(); +#endif + ++ei; + continue; } - - QString link; - QString linkBefore; - QString code; - QString altText; - QString placeholderId; - - // Determine the replacement for the matched expression - switch( matchedRegExp ) + if( allowAddingEmoticons && ! userCustomEmoticons.contains( ei.key() ) ) { - - // Found a custom emoticon - case 0: - code = text.mid( matchStart, customRegExp.matchedLength() ); // cap(0) is not const - - // Avoid replacing invalid emoticons with nothing - if( ! customReplacements.contains( code ) ) - { -#ifdef KMESSDEBUG_CHATVIEW - kWarning() << "Emoticon replacement for '" << code << "' not found!"; +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Inserting emoticon additional link:" << ei.key(); #endif - replacement = code; - break; - } + QString imagePath( ei.value() ); + QString urlCode( QUrl::toPercentEncoding( ei.key() ) ); - replacement = customReplacements[ code ]; + // Retrieve the image name from the replacement + // TODO: Change the ' to \", and optimize/cache the result (somehow!) + imagePath = imagePath.replace( "\"", "'"); + imagePath = imagePath.mid( imagePath.indexOf( "src='" ) + 5 ); + imagePath = imagePath.left( imagePath.indexOf( "'" ) ); - // This emoticon is unknown, allow the user to add it by adding an internal KMess link to it - if( allowAddingEmoticons && ! customEmoticonsPattern.contains( code ) ) - { - QString imagePath( replacement ); - QString urlCode = QUrl::toPercentEncoding( code ); + // i18n() will unescape the string: Without this, an emoticon like " 'test " will + // result in an attribute like this: " title='Add this emoticon: 'test' ", messing + // up the whole markup + QString escapedCode( ei.key() ); + KMessShared::htmlEscape( escapedCode ); - // Retrieve the image name from the replacement - imagePath = imagePath.replace( "\"", "'" ); - imagePath = imagePath.mid( imagePath.indexOf( "src='" ) + 5 ); - imagePath = imagePath.mid( 0, imagePath.indexOf( "'" ) ); - - // The name attribute is required as, if the user adds the emoticon, we'll want to make all links like this unclickable - replacement = "" - + replacement - + ""; - } - break; - - - // Found a custom emoticon, but the image file is still being downloaded - // Generate a placeholder tag, , and update this tag later when the emoticon is received - case 1: - // Generate and store placeholder ID - placeholderId = "ce" + QString::number( ++lastPendingEmoticonId_ ); - pendingEmoticonTags.append( placeholderId ); - - // Insert placeholder - code = text.mid( matchStart, pendingRegExp.matchedLength() ); // cap(0) is not const - replacement = "" + code
-                    + ""; - break; - - - // Found an emoticon - case 2: - code = text.mid( matchStart, emoticonRegExp.matchedLength() ); // cap(0) is not const - if( emoticonReplacements.contains( code ) ) - { - replacement = emoticonReplacements[ code ]; - } - else - { - // HACK: Replace with the same string, to skip the entire code and continue parsing after it - // See EmoticonTheme::updateCache() - replacement = code; -#ifdef KMESSDEBUG_CHATVIEW - kDebug() << "Skipping unmatched code '" << code << "'"; -#endif - } - - break; - - - // Found a link - case 3: - // When www. is found, automatically add http:// to the href - // This doesn't clash, because http:// links are matched earlier - link = linkRegExp.cap(0); - if( ! link.isEmpty() ) - { - // filter out puntuation char - matchedLength = link.length(); - if( punctuationChars.exactMatch(link) // matches standard chars at end - || ( link.endsWith(")") && ! link.contains("(") ) ) // has ")" at end, unless it's a wikipedia disambiguation link - { - matchedLength--; - link.remove( matchedLength, 1 ); - } - - // Create link - replacement = ( link.startsWith("www.") ) - ? replacement = "" + link + "" - : replacement = "" + link + ""; - } - break; - - - // Found a e-mail address - case 4: - link = emailRegExp.cap(1); - if( ! link.isEmpty() ) - { - matchedLength = link.length(); // filter out puntuation char - replacement = "" + link + ""; - } - break; - - - // Found a geek-style link - case 5: - linkBefore = geekLinkRegExp.cap(1); // matched look-before character - link = geekLinkRegExp.cap(2); - if( ! link.isEmpty() ) - { - // Avoid matching "index.htm", "test.js" etc. - // The list can never be complete but filter out 99% of the cases - QString tld = geekLinkRegExp.cap(4); - if( ( tld.length() == 2 && ! invalidCcTld.exactMatch(tld) ) - || ( tld.length() == 3 && topLevelDomain.exactMatch(tld) ) ) - { - matchedLength = linkBefore.length() + link.length(); // filter out puntuation char - replacement = linkBefore + "" + link + ""; - } - } - break; - - // Nothing was found, stop - case -1: - break; - - default: -#ifdef KMESSTEST - kWarning() << "result of regular expression " << matchedRegExp << " is unhandled!"; -#endif - break; - } - - // Nothing was found, stop - if( matchedRegExp == -1 ) - { - // C doesn't allow us to break the while loop inside the switch statement, so break again - break; - } - - // Process the replacement - if( replacement.isEmpty() || text.mid(matchStart, matchedLength).isEmpty() ) - { - // No replacement found, move cursor to next char - lastPos = matchStart + 1; + emoticonReplacementList.insert( ei.key(), + "" + + ei.value() + "" ); } else { - // Replace the original text -/*#ifdef KMESSDEBUG_CHATVIEW - kDebug() << "replacing '" << text.mid( matchStart, matchedLength ) << "' with: " << replacement << " (matched regexp=" << matchedRegExp << ")"; -#endif*/ - text = text.replace( matchStart, matchedLength, replacement ); - lastPos = matchStart + replacement.length(); - replacement = QString::null; +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Not inserting emoticon additional link for " << ei.key() << ". allowAddingEmoticons=" << allowAddingEmoticons + << "; customReplacements.contains( ei.key() ) = " << customReplacements.contains( ei.key() ); +#endif + emoticonReplacementList.insert( ei.key(), ei.value() ); + } + ++ei; + } + // TODO: also do pending emoticons here + + // set up all regexps + static const int REGEXP_COUNT = 7; + const QRegExp* regexps[REGEXP_COUNT]; + + regexps[0] = ( showLinks ? &linkRegExp : 0 ); + regexps[1] = ( showLinks ? &emailRegExp : 0 ); + regexps[2] = ( showLinks ? &geekLinkRegExp : 0 ); + regexps[3] = ( ( showEmoticons && ! customRegExp .isEmpty() ) ? &customRegExp : 0 ); + regexps[4] = ( ( showEmoticons && ! pendingRegExp .isEmpty() ) ? &pendingRegExp : 0 ); + regexps[5] = ( ( showEmoticons && ! emoticonRegExp.isEmpty() ) ? &emoticonRegExp : 0 ); + regexps[6] = ( &longWordsRegExp ); + + // We apply the regexps in order, and each time, we take the matched part out of the string and re-add it + // to the QStringList. Every piece of already-parsed data is HTML and starts with <, so we know what strings + // not to parse. + QString parseString, matched, replacement, tld, placeholderId, link, wordWrapLink; + QStringList output( text ); +#if QT_VERSION >= 0x040500 + const QRegExp *regexp; +#else + QRegExp *regexp; +#endif + int index; + + for( int i = 0; i < REGEXP_COUNT; ++i ) + { +#if QT_VERSION >= 0x040500 + regexp = regexps[i]; +#else + regexp = const_cast( regexps[i] ); // QRegExp->cap() is not const in Qt 4.4 +#endif + if( regexp == 0 ) + { + continue; + } + + for( int j = 0; j < output.size(); ++j ) + { + parseString = output.at( j ); +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "applying regexp" << i << "to string" << parseString; +#endif + + // Don't parse this piece, it's HTML + if( parseString.startsWith( "<" ) ) + { + continue; + } + index = regexp->indexIn( parseString ); + + if( index != -1 ) + { +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Regexp" << i << "matches at character" << index << "in string" << j; +#endif + + // Match, turn this piece into HTML (split string up into 3 strings) + switch( i ) + { + // Normal link + case 0: + matched = regexp->cap( 1 ); + + // Some link nicifying: only allow ')' at the end if there's '(', same with ") + if( matched.endsWith(")") && ! matched.contains("(") ) + { + matched.chop( 1 ); + } + if( matched.endsWith ( """ ) + && matched.lastIndexOf( """, -6 ) == -1 ) + { + matched.chop( 5 ); + } + if( matched.endsWith ( "'" ) + && matched.lastIndexOf( "'", -6 ) == -1 ) + { + matched.chop( 5 ); + } + + // "nicify" the link: make sure it word wraps in KHTML :) + wordWrapLink = QString(); + for( int k = 0; k < matched.length(); k += 30 ) + { + wordWrapLink.append( matched.mid( k, 30 ) + "­" ); + } + wordWrapLink.chop( 5 ); // chop off the last ­ + + if( matched.startsWith( "www." ) ) + { + replacement = "" + + wordWrapLink + ""; + } + else + { + replacement = "" + + wordWrapLink + ""; + } + // Filter out long words in the links + break; + + + // Email link + case 1: + matched = regexp->cap( 1 ); + replacement = "" + matched + ""; + break; + + + // Geek-style link + case 2: + matched = regexp->cap( 1 ); + tld = geekLinkRegExp.cap( 3 ); + if( ( tld.length() == 2 && ! invalidCcTldList.contains(tld) ) + || ( tld.length() == 3 && topLevelDomainList.contains(tld) ) ) + { + replacement = "" + matched + ""; + } + else + { + // Not a valid geeklink, don't replace it + replacement = matched; + } + break; + + + // Pending emoticon + case 4: + // For now, we will have to do pending emoticons seperately from custom + // and normal ones. TODO: fix this. + + // Don't replace anything if this emoticon is blacklisted + if( customEmoticonsBlacklist.contains( matched ) ) + { + replacement = matched; + break; + } + + placeholderId = "ce" + QString::number( ++lastPendingEmoticonId_ ); + pendingEmoticonTags.append( placeholderId ); + + // Insert placeholder + matched = regexp->cap( 0 ); + replacement = "" + matched +
+                          ""; + break; + + + // Custom emoticon: parsed like standard emoticons, to allow + // overwriting a standard emoticon's shortcut with a custom one + case 3: + // Standard emoticon + case 5: + matched = regexp->cap( 0 ); + if( ! emoticonReplacementList.contains( matched ) ) + { + kWarning() << "Emoticon replacement list does not contain matched emoticon" + << matched; + replacement = matched; + break; + } + replacement = emoticonReplacementList.value( matched ); + break; + + + // Long words + case 6: + matched = regexp->cap( 1 ); + replacement = matched + "­"; + break; + + + default: + kWarning() << "Warning: Unhandled regexp"; + replacement.clear(); + break; + } + + if( matched.isEmpty() ) + { + kWarning() << "Warning: Zero-length regexp match in regexp" << i << "- string:" << parseString; + } + +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << j << ":" << parseString.left( index ); + kDebug() << j + 1 << ":" << replacement; + kDebug() << j + 2 << ":" << parseString.mid( index + matched.length() ); +#endif + output.replace( j, parseString.left( index ) ); + output.insert( j + 1, replacement); + output.insert( j + 2, parseString.mid( index + matched.length() ) ); + + // Increment j here: it'll be also incremented by the loop. + // This is because j+1 now is an html string and needs not to be parsed + j++; + +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "j is now:" << j; +#endif + } } } + text = output.join( "" ) // Replace any "> "s in the message with "> " to avoid missing spaces after emoticons - text = text.replace( "> ", "> " ); - + .replace( "> ", "> " ) // Replace double spaces with double  s so that they'll show properly - text = text.replace( " ", "  " ); + .replace( " ", "  " ); + // TODO: We don't want to remove MSN+ tags when showFormatting is disabled!! // Replace the MSN Plus text formatting tags if( showFormatting ) { @@ -844,6 +910,7 @@ FormattedString::FormattedString( const QString &string, bool parseName ) { original_ = formatted_ = + escaped_ = cleaned_ = string; } } @@ -856,11 +923,14 @@ const QString &FormattedString::getString( FormattingMode mode ) const { switch( mode ) { - case STRING_CLEANED: return cleaned_; - case STRING_FORMATTED: return formatted_; - case USE_CHAT_SETTING: return CurrentAccount::instance()->getUseChatFormatting() ? formatted_ : cleaned_; - case USE_LIST_SETTING: return CurrentAccount::instance()->getUseListFormatting() ? formatted_ : cleaned_; - default: return original_; + case STRING_CLEANED: return cleaned_; + case STRING_CLEANED_ESCAPED: return escaped_; + case STRING_FORMATTED: return formatted_; + case STRING_CHAT_SETTING: return CurrentAccount::instance()->getUseChatFormatting() ? formatted_ : cleaned_; + case STRING_LIST_SETTING: return CurrentAccount::instance()->getUseListFormatting() ? formatted_ : cleaned_; + case STRING_CHAT_SETTING_ESCAPED: return CurrentAccount::instance()->getUseChatFormatting() ? formatted_ : escaped_; + case STRING_LIST_SETTING_ESCAPED: return CurrentAccount::instance()->getUseListFormatting() ? formatted_ : escaped_; + default: return original_; } } @@ -870,14 +940,17 @@ const QString &FormattedString::getString( FormattingMode mode ) const void FormattedString::setString( const QString &string ) { // Save the new string everywhere + cleaned_ = + escaped_ = original_ = - formatted_ = - cleaned_ = string; + formatted_ = string; // Then parse the cleaned and formatted versions if( ! string.isEmpty() ) { RichTextParser::getCleanString( cleaned_ ); RichTextParser::parseMsnString( formatted_, showEmoticons_, showSmallEmoticons_, showLinks_, true ); + escaped_ = cleaned_; + KMessShared::htmlEscape( escaped_ ); } } diff --git a/src/utils/richtextparser.h b/src/utils/richtextparser.h index cb2e4ce..2b33420 100644 --- a/src/utils/richtextparser.h +++ b/src/utils/richtextparser.h @@ -34,14 +34,19 @@ class EmoticonManager; /** * String types available when dealing with formatting + * + * Use one of these flags to obtain a string parsed the way you need it */ enum FormattingMode { - STRING_ORIGINAL = 0 - , STRING_CLEANED - , STRING_FORMATTED - , USE_CHAT_SETTING - , USE_LIST_SETTING + STRING_ORIGINAL = 0 /// Unchanged string + , STRING_CLEANED /// All formatting tags removed + , STRING_CLEANED_ESCAPED /// Same as STRING_CLEANED, but html-escaped + , STRING_FORMATTED /// All formatting tags translated to HTML + , STRING_CHAT_SETTING /// Tags parsed or removed depending on the user's chat window formatting option + , STRING_CHAT_SETTING_ESCAPED /// Same as STRING_CHAT_SETTING, but html-escaped if the option is off + , STRING_LIST_SETTING /// Tags parsed or removed depending on the user's contact list formatting option + , STRING_LIST_SETTING_ESCAPED /// Same as STRING_LIST_SETTING, but html-escaped if the option is off }; @@ -142,6 +147,8 @@ class FormattedString } private: + // HTML-Escaped version of the string + QString escaped_; // cleaned up version of the string QString cleaned_; // The formatted version of the string diff --git a/src/utils/thumbnailprovider.cpp b/src/utils/thumbnailprovider.cpp index 97dad35..1d02f5f 100644 --- a/src/utils/thumbnailprovider.cpp +++ b/src/utils/thumbnailprovider.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -137,9 +136,9 @@ const QByteArray &ThumbnailProvider::getData() const */ void ThumbnailProvider::generateFallbackImage() { - QString iconTitle = KMimeType::iconNameForUrl( KUrl( fileName_ ) ); + QString iconTitle( KMimeType::iconNameForUrl( KUrl( fileName_ ) ) ); KIconLoader *loader = KIconLoader::global(); - QString iconPath = loader->iconPath( iconTitle, -size_, false ); + QString iconPath ( loader->iconPath( iconTitle, -size_, false ) ); storeImage( QImage( iconPath ) ); } @@ -165,7 +164,7 @@ QString ThumbnailProvider::getImageTag( const QString &altText ) const return QString::null; } - QString previewData = KCodecs::base64Encode( thumbnailData_ ); + QString previewData( thumbnailData_.toBase64() ); return " #include #include #include -#include - #include "config-kmess.h" #include "kmessdebug.h" #include "xautolock.h" @@ -189,7 +186,7 @@ bool XAutoLock::isScreenSaverActive() #endif // Get on the bus - QDBusConnection dbus = QDBusConnection::sessionBus(); + const QDBusConnection& dbus( QDBusConnection::sessionBus() ); if( ! dbus.isConnected() ) { @@ -200,10 +197,10 @@ bool XAutoLock::isScreenSaverActive() } // Generate the message we'll send to the active Screen Saver service - QDBusMessage message = QDBusMessage::createMethodCall( "org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver", "GetActive" ); + const QDBusMessage& message( QDBusMessage::createMethodCall( "org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver", "GetActive" ) ); // Call the service and wait for it to answer - QDBusReply reply = dbus.call( message ); + const QDBusReply& reply( dbus.call( message ) ); // Check if the answer is valid, and if so return the obtained value if( reply.isValid() ) diff --git a/src/utils/xautolock.h b/src/utils/xautolock.h index dc14c8e..c2fac84 100644 --- a/src/utils/xautolock.h +++ b/src/utils/xautolock.h @@ -19,8 +19,6 @@ #ifndef XAUTOLOCK_H #define XAUTOLOCK_H - -#include #include #ifdef HAVE_XSCREENSAVER diff --git a/src/utils/xmlfunctions.cpp b/src/utils/xmlfunctions.cpp index 64c3f51..fb2286c 100644 --- a/src/utils/xmlfunctions.cpp +++ b/src/utils/xmlfunctions.cpp @@ -32,8 +32,8 @@ QDomNode XmlFunctions::getNode( const QDomNode &rootNode, const QString &path ) KMESS_ASSERT( ! path.isEmpty() ); #endif - QStringList pathItems = path.split( "/", QString::SkipEmptyParts ); - QDomNode childNode = rootNode.namedItem( pathItems[0] ); // can be a null node + const QStringList& pathItems( path.split( "/", QString::SkipEmptyParts ) ); + QDomNode childNode( rootNode.namedItem( pathItems[0] ) ); // can be a null node int i = 1; while( i < pathItems.count() ) @@ -48,8 +48,8 @@ QDomNode XmlFunctions::getNode( const QDomNode &rootNode, const QString &path ) } #ifdef KMESSDEBUG_XMLFUNCTIONS - QString message = "reading node \"" + rootNode.nodeName() + "/" + pathItems.join("/") + "\": " - + ( ! childNode.isNull() ? "found" : "not found: " + pathItems[ i - 1 ] ); + QString message( "reading node \"" + rootNode.nodeName() + "/" + pathItems.join("/") + "\": " + + ( ! childNode.isNull() ? "found" : "not found: " + pathItems[ i - 1 ] ) ); kDebug() << message.toLatin1().data(); #endif @@ -116,6 +116,7 @@ QString XmlFunctions::getNodeValue( const QDomNode &rootNode, const QString &pat #endif // Because writing node.namedItem("childItem").namedItem("child2").toElement().text() is not funny. + //return getNode( rootNode, path ).firstChild().toText().data(); return getNode( rootNode, path ).toElement().text(); } diff --git a/templates/cpp b/templates/cpp index c7e9f1f..13071a8 100644 --- a/templates/cpp +++ b/templates/cpp @@ -1,8 +1,8 @@ /*************************************************************************** (filename).cpp - description ------------------- - begin : (Weekday) (Month) (day) 2008 - copyright : (C) 2008 by (yourname) + begin : (Weekday) (Month) (day) 2009 + copyright : (C) 2009 by (yourname) email : (e-mail address) ***************************************************************************/ diff --git a/templates/h b/templates/h index 50df196..20a37ed 100644 --- a/templates/h +++ b/templates/h @@ -1,8 +1,8 @@ /*************************************************************************** (filename).h - description ------------------- - begin : (Weekday) (Month) (day) 2008 - copyright : (C) 2008 by (yourname) + begin : (Weekday) (Month) (day) 2009 + copyright : (C) 2009 by (yourname) email : (e-mail address) ***************************************************************************/ diff --git a/tests/modeltest/modeltest.cpp b/tests/modeltest/modeltest.cpp index e8a4dff..7b4dfaf 100644 --- a/tests/modeltest/modeltest.cpp +++ b/tests/modeltest/modeltest.cpp @@ -117,7 +117,6 @@ void ModelTest::nonDestructiveBasicTest() QVariant variant; model->setData(QModelIndex(), variant, -1); model->setHeaderData(-1, Qt::Horizontal, QVariant()); - model->setHeaderData(0, Qt::Horizontal, QVariant()); model->setHeaderData(999999, Qt::Horizontal, QVariant()); QMap roles; model->sibling(0, 0, QModelIndex()); @@ -522,3 +521,5 @@ void ModelTest::rowsRemoved(const QModelIndex & parent, int start, int end) Q_ASSERT(c.next == model->data(model->index(start, 0, c.parent))); } + +#include "modeltest.moc" diff --git a/tests/old_richtextparser.cpp b/tests/old_richtextparser.cpp new file mode 100644 index 0000000..92d31d2 --- /dev/null +++ b/tests/old_richtextparser.cpp @@ -0,0 +1,932 @@ +/*************************************************************************** + old_richtextparser.cpp - The old MSN and Plus parser + ------------------- + begin : April 30, 2008 + copyright : (C) 2008 by Valerio Pilo + email : valerio@kmess.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "old_richtextparser.h" + +#include "../src/contact/contactbase.h" +#include "../src/utils/kmessshared.h" +#include "../src/currentaccount.h" +#include "../src/emoticonmanager.h" +#include "../src/kmessdebug.h" + +#include + +#include +#include +#include +#include + +#include +#include + + + + +// Initialize the list of MSN Plus colors +// Note that a whole lot of colors are still missing from the list +QStringList OldRichTextParser::predefinedColors_( + QStringList() << "FFFFFF" << "000000" << "00007F" << "009300" << "FF0000" + << "7F0000" << "9C009C" << "FC7F00" << "FFFF00" << "00FC00" + << "009393" << "00FFFF" << "2020FC" << "FF00FF" << "7F7F7F" + << "D2D2D2" << "E7E6E4" << "CFCDD0" << "FFDEA4" << "FFAEB9" + << "FFA8FF" << "B4B4FC" << "BAFBE5" << "C1FFA3" << "FAFDA2" + << "B6B4D7" << "A2A0A1" << "F9C152" << "FF6D66" << "FF62FF" + << "6C6CFF" << "68FFC3" << "8EFF67" << "F9FF57" << "858482" + << "6E6B7D" << "FFA01E" << "F92611" << "FF20FF" << "202BFF" + << "1EFFA5" << "60F913" << "FFF813" << "5E6464" << "4B494C" + << "D98812" << "EB0505" << "DE00DE" << "0000D3" << "03CC88" + << "59D80D" << "D4C804" << "000268" << "18171C" << "944E00" + << "9B0008" << "980299" << "01038C" << "01885F" << "389600" + << "9A9E15" << "473400" << "4D0000" << "5F0162" << "000047" + << "06502F" << "1C5300" << "544D05" ); +// Initialize the qhash maps +QHash OldRichTextParser::cleanedStringsCache_; +QHash OldRichTextParser::formattedStringsCache_; +// Initialize the MSN Plus tag matching regexp +QRegExp OldRichTextParser::colorMatch_( "\\[(c|a)=(#?[0-9a-z]+)\\](.*)\\[/\\1(?:=(#?[0-9a-z]+))?\\]", + Qt::CaseInsensitive ); +// Set the id counter for emoticons not yet received +int OldRichTextParser::lastPendingEmoticonId_ = 0; +// Set the pointer to the instance of the Emoticon Manager +EmoticonManager *OldRichTextParser::emoticonManager_ = 0; + + + +// Return the given string with MSN Plus! formatting stripped out +void OldRichTextParser::getCleanString( QString &string ) +{ + // First check if the string does not need modification + if( ! string.contains( "[" ) ) + { + return; + } + + // Check if the string is already in cache + if( cleanedStringsCache_.contains( string ) ) + { + string = cleanedStringsCache_.value( string ); + return; + } + + const QString originalString = string; + + string.replace( "[b]", "", Qt::CaseInsensitive ) + .replace( "[/b]", "", Qt::CaseInsensitive ) + .replace( "[i]", "", Qt::CaseInsensitive ) + .replace( "[/i]", "", Qt::CaseInsensitive ) + .replace( "[u]", "", Qt::CaseInsensitive ) + .replace( "[/u]", "", Qt::CaseInsensitive ) + .replace( "[s]", "", Qt::CaseInsensitive ) + .replace( "[/s]", "", Qt::CaseInsensitive ); + + string.replace( QRegExp( "\\[/?(c|a)(=#?[0-9a-z,]+)?\\]", Qt::CaseInsensitive ), "" ); + +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Original:" << originalString; + kDebug() << "Parsed:" << string; +#endif + + // Add this to the cache + cleanedStringsCache_.insert( originalString, string ); + + // Keep the queue size to the maximum allowed length + if( cleanedStringsCache_.count() > OLD_MSN_PLUS_STRINGCACHESIZE ) + { + cleanedStringsCache_.remove( cleanedStringsCache_.constBegin().key() ); + } +} + + + +// Return the given string with MSN Plus! formatting parsed +void OldRichTextParser::getFormattedString( QString &string ) +{ + // First check if the string does not need modification + if( ! string.contains( "[" ) ) + { + return; + } + + // Check if the string is already in cache + if( formattedStringsCache_.contains( string ) ) + { + string = formattedStringsCache_.value( string ); + return; + } + + const QString originalString = string; + + string.replace( "[b]", "", Qt::CaseInsensitive ) + .replace( "[/b]", "", Qt::CaseInsensitive ) + .replace( "[i]", "", Qt::CaseInsensitive ) + .replace( "[/i]", "", Qt::CaseInsensitive ) + .replace( "[u]", "", Qt::CaseInsensitive ) + .replace( "[/u]", "", Qt::CaseInsensitive ) + .replace( "[s]", "", Qt::CaseInsensitive ) + .replace( "[/s]", "", Qt::CaseInsensitive ); + + while( colorMatch_.indexIn( string ) != -1 ) + { + bool isForeground = ( colorMatch_.cap( 1 ).toLower() == "c" ); + + // match a solid color + if( colorMatch_.cap( 4 ).isEmpty() ) + { + string.replace( colorMatch_.pos(), colorMatch_.matchedLength(), + "" + colorMatch_.cap( 3 ) + "" ); + } + // Match a foreground color gradient + else if( isForeground ) + { + string.replace( colorMatch_.pos(), colorMatch_.matchedLength(), + getHtmlGradient( colorMatch_.cap( 3 ), colorMatch_.cap( 2 ), colorMatch_.cap( 4 ) ) ); + + } + // Match a background color gradient + else + { + string.replace( colorMatch_.pos(), colorMatch_.matchedLength(), + "" + colorMatch_.cap( 3 ) + "" ); + } + } + + // Add the parsed string in a tag which is not usually used elsewhere: this drastically reduces parsing problems + // originated by, for example, missing closing tags + string = "" + string + ""; + +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Original:" << originalString; + kDebug() << "Parsed:" << string; +#endif + + // Add this to the cache + formattedStringsCache_.insert( originalString, string ); + + // Keep the queue size to the maximum allowed length + if( formattedStringsCache_.count() > OLD_MSN_PLUS_STRINGCACHESIZE ) + { + formattedStringsCache_.remove( formattedStringsCache_.constBegin().key() ); + } +} + + + +// Turns color codes (english color names, RGB triplets, MSN Plus! palette colors) into an HTML RGB color code +QString OldRichTextParser::getHtmlColor( const QString& color ) +{ + bool convertedOk; + int colorNum = color.toInt( &convertedOk ); + + // Find colors in the MSN Plus! palette + if( convertedOk ) + { + if( colorNum < predefinedColors_.size() ) + { + return "#" + predefinedColors_[ colorNum ]; + } + else + { + return "#000000"; + } + } + + // Find HTML (#RRGGBB/#RGB) or CSS (red,blue) color codes + int colorLength = color.length(); + if( colorLength > 0 && color[0] == '#' && colorLength != 4 && colorLength != 7 ) + { + // Pad with zeros incomplete RGB triplets + QString paddedColor( color ); + paddedColor.append( QString().fill( '0', 7 - colorLength ) ); + QColor cssOrHtmlColor( paddedColor ); + if( cssOrHtmlColor.isValid() ) + { + return cssOrHtmlColor.name(); + } + } + else + { + QColor cssOrHtmlColor( color ); + if( cssOrHtmlColor.isValid() ) + { + return cssOrHtmlColor.name(); + } + } + + return "#000000"; + +/* + // These are not used with MSN+ Live, though are still parsed for backwards compatibility + + // Find arbitrary RGB triplets + if( color.contains( "," ) ) + { + QStringList rgb = color.split( ",", QString::KeepEmptyParts ); + QColor rgbColor( rgb[0].toInt(), rgb[1].toInt(), rgb[2].toInt() ); + + if( rgbColor.isValid() ) + { + return rgbColor.name(); + } + } +*/ +} + + + +// Turns a string into a gradient colored one, using Qt HTML tags +QString OldRichTextParser::getHtmlGradient( const QString& text, const QString& startColor, const QString& endColor ) +{ + QColor start( getHtmlColor( startColor ) ); + QColor end ( getHtmlColor( endColor ) ); + + // Skip gradienting wrong colors or empty strings + if( ! start.isValid() || ! end.isValid() || text.isEmpty() ) + { + return text; + } + + QList tags; + QChar character; + QColor current = start; + QString outputText; + unsigned int indexGradient = 0; + int indexFullString = 0; + unsigned int levels = text.length(); + int differenceRed, differenceGreen, differenceBlue, tempRed, tempGreen, tempBlue; + QRegExp looseTagsMatch( "<[^>]+>|&[a-z]+;|&#[0-9]+;|\\[/?[ca](=#?[0-9a-z]+)?\\]", Qt::CaseInsensitive ); + +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Text to gradient:" << text; +#endif + + // Search in the text all the tags to skip, and store their positions for faster parsing + while( looseTagsMatch.indexIn( text, indexFullString, QRegExp::CaretAtOffset ) > -1 ) + { + int pos = looseTagsMatch.pos( 0 ); + int len = looseTagsMatch.matchedLength(); + +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Adding tag to skip at pos" << pos << "(len" << len << "):" << looseTagsMatch.cap( 0 ); +#endif + + // Add position and length of the tag to allow skipping it later + tags << pos; + tags << len; + + // Continue searching after the tag + indexFullString = pos + len; + + // Subtract from the gradient size the tag length: it will be output as one single char + levels -= len; + } + + // Calculate the RGB difference between the starting and ending color + differenceRed = (int)floor( (float)( start.red () - end.red () ) / (float)levels ); + differenceGreen = (int)floor( (float)( start.green() - end.green() ) / (float)levels ); + differenceBlue = (int)floor( (float)( start.blue () - end.blue () ) / (float)levels ); + +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Size is" << text.length() <<"(" << levels << "stripped) -" + << "Colored from" << start.name() << "to" << end.name() << ", difference: (" + << differenceRed << "," << differenceGreen << "," << differenceBlue << ")"; +#endif + + // When the start and end colors are the same, don't waste time creating a gradient with only one color + if( differenceRed == 0 && differenceGreen == 0 && differenceBlue == 0 ) + { +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "The gradient colors are equal, converting it to solid color."; +#endif + + return "" + text + ""; + } + + // Proceed through the entire original string + for( indexFullString = 0; indexFullString < text.length(); ++indexFullString ) + { + // Get the new values for the current gradient character + tempRed = start.red () - ( differenceRed * indexGradient ); + tempGreen = start.green() - ( differenceGreen * indexGradient ); + tempBlue = start.blue () - ( differenceBlue * indexGradient ); + + // The values may get out of the limits, and since setRgb() voids the whole RGB color if one of the values is + // out of range, we must assure them to be always in range + current.setRgb( tempRed < 0 ? 0 : ( tempRed > 255 ? 255 : tempRed ), + tempGreen < 0 ? 0 : ( tempGreen > 255 ? 255 : tempGreen ), + tempBlue < 0 ? 0 : ( tempBlue > 255 ? 255 : tempBlue ) ); + + // Match the formatting tags: they must be skipped + if( tags.count() > 0 && tags.first() == indexFullString ) + { + // Remove the tag position and size from the list + tags.takeFirst(); + int matchLength = tags.takeFirst(); + + // Output the whole tag as a single color + outputText += "" + text.mid( indexFullString, matchLength ) + ""; + +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Outputting whole tag:" << text.mid( indexFullString, matchLength ); +#endif + + // Move the index on to the tag end + indexFullString += matchLength - 1; + continue; + } + + // Get the next character to colorize + character = text[ indexFullString ]; + + // Use the to save characters + outputText += "" + character + ""; + + indexGradient++; + } + + return outputText; +} + + + +/** + * @brief Initialize the class + */ +void OldRichTextParser::initialize() +{ + colorMatch_.setMinimal( true ); + emoticonManager_ = EmoticonManager::instance(); +} + + + +/** + * @brief Replace the very old Messenger Plus characters with HTML markup + * + * Replace the oldest MSN+ tags with HTML-compatible formatting. This kind of formatting + * method uses reserved characters - thing which may cause i18n problems - but many MSN+ + * commands (most notably, the predefined messages with sound) still use it. + * + * @param text The text to format. The original string will be lost. + */ +void OldRichTextParser::parseMsnPlusString( QString &text ) +{ + bool boldFlag = false; + bool italicFlag = false; + bool underlineFlag = false; + bool fontFlag = false; + QColor color; + + QRegExp htmlTest( "^\x04""&#?[a-z0-9]+;" ); + QRegExp fontCapture = QRegExp( "^\x03""([0-9]{1,2})(,([0-9]{1,2}))?" ); + + for( int index = 0; index < text.length(); index++ ) + { + switch( text.at( index ).unicode() ) + { + case 0x0002: // bold character + boldFlag = !boldFlag; + + text = text.replace( index, 1, ( boldFlag ) ? "" : "" ); + index += ( boldFlag ) ? 2 : 3; // Skip the characters we've just added + break; + + case 0x0003: // color character + fontFlag = !fontFlag; + + fontCapture.indexIn( text, index, QRegExp::CaretAtOffset ); + + color = getHtmlColor( fontCapture.cap(1) ); + + // Font background text is ignored, as it's impossible to render in Qt's HTML subset + if( fontCapture.matchedLength() == -1 ) + { + // No color found after the special character, close the html tag + text = text.replace( index, 1, "" ); + index += 6; // Skip the characters we've just added + } + else + { + // Font color open + text = text.replace( index, fontCapture.matchedLength(), "" ); + index += 21; // Skip the characters we've just added + } + break; + + case 0x0004: + // Sound tag: this character is followed by another which identifies the sound ID + htmlTest.indexIn( text, index, QRegExp::CaretAtOffset ); + if( htmlTest.matchedLength() != -1 ) + { + // Some sounds IDs are HTML entities: that has to be taken care of, too + text = text.replace( index, htmlTest.matchedLength(), "" ); + } + else + { + // we need to delete this character and the following one from the string + text = text.replace( index, 2, "" ); + } + + // Restart from where we encountered the starting character + index -= 1; + break; + + case 0x0005: // italic character + italicFlag = !italicFlag; + + text = text.replace( index, 1, ( italicFlag ) ? "" : "" ); + index += ( italicFlag ) ? 2 : 3; // Skip the characters we've just added + break; + + case 0x001f: // underline character + underlineFlag = !underlineFlag; + + text = text.replace( index, 1, ( underlineFlag ) ? "" : "" ); + index += ( underlineFlag ) ? 2 : 3; // Skip the characters we've just added + break; + } + + } + + // Close any tag still open. Hopefully, the parser will not complain too much if the closing order is wrong + if( boldFlag ) text.append( "
    " ); + if( italicFlag ) text.append( "" ); + if( underlineFlag ) text.append( "
    " ); + if( fontFlag ) text.append( "" ); +} + + + +/** + * Transform a string into its rich text form + * + * This is the one-stop shop for text parsing. This method is capable of single-pass conversion of + * many things in their rich text equivalents: + * - web links are made clickable, even geek-style "kmess.org" links and email addresses + * - emoticons shortcuts are transformed in HTML image tags, even custom ones, and not yet received ones + * - MSN Plus formatting is turned into HTML formatting + * + * @param text The string to parse + * @param showEmoticons Whether to show MSN emoticons in the parsed string + * @param showSmallEmoticons Whether the emoticons should be full-size or small + * @param showLinks Whether to enable clickable links and email addresses + * @param showFormatting Whether to show or strip away MSN+ formatting tags + * @param handle If not null or empty, custom emoticons of this contact will be parsed + * @param pendingEmoticonTags If the handle is specified, this must be too: this is a list of pending + * custom emoticons which the contact specified by handle has sent to us. + */ +void OldRichTextParser::parseMsnString( QString &text, bool showEmoticons, bool showSmallEmoticons, bool showLinks, bool showFormatting, const QString &handle, QStringList &pendingEmoticonTags ) +{ + KMessShared::htmlEscape( text ); + + // Links and emoticons are replaced in one loop cycle, traversing the message text + // Multiple search-replace cyles give unwanted side effects: + // - smileys can pop up in links like ftp://user:pass@host/ and https://host + // - emoticon replacements could be replaced by another cycle + + bool allowAddingEmoticons = false; + + // Build a collection of all emoticon data + const QRegExp &emoticonRegExp = emoticonManager_->getHtmlPattern(); + const QHash &emoticonReplacements = emoticonManager_->getHtmlReplacements( showSmallEmoticons ); + + + QString code; + QRegExp customRegExp; + QRegExp pendingRegExp; + QHash customReplacements; + QRegExp userCustomEmoticons; + QStringList customEmoticonsBlacklist; + + // Get theme of custom emoticons + if( &handle != 0 && ! handle.isEmpty() ) + { + // Avoid problems if no list of pending emoticons has been given + if( &pendingEmoticonTags == 0 ) + { + kWarning() << "The given pending emoticons list is not valid!"; + pendingEmoticonTags = QStringList(); + } + + if( handle == CurrentAccount::instance()->getHandle() ) + { + customRegExp = emoticonManager_->getHtmlPattern( true ); + customReplacements = emoticonManager_->getHtmlReplacements( showSmallEmoticons, true ); + // We already have all of our emoticons, there are no pending ones + } + else + { + const ContactBase *contact = CurrentAccount::instance()->getContactByHandle( handle ); + if( contact != 0 ) + { + customRegExp = contact->getEmoticonPattern(); + customReplacements = contact->getEmoticonReplacements(); + pendingRegExp = contact->getPendingEmoticonPattern(); + customEmoticonsBlacklist = contact->getEmoticonBlackList(); + + allowAddingEmoticons = true; + userCustomEmoticons = emoticonManager_->getHtmlPattern( true ); // Used to verify if we've already added an emoticon + } + } + } + + + QRegExp linkRegExp; + linkRegExp.setPattern( "\\b(?:http://|https://|ftp://|sftp://|www\\.)" // match protocol string + "[^ \r\n]+" // followed by the host/path + ); + + QRegExp emailRegExp; + emailRegExp.setPattern( + "\\b(" // begin of word, start capture + "[a-z0-9_\\-\\.]+" // match email username + "\\@" // match '@' + "[a-z0-9\\-\\.]+" // match domain hostname + "\\.[a-z0-9]{2,6}" // match top-level-domain + ")" // end capture` + "(?:[^a-zA-Z0-9\\-]|$)" // not followed by more simple characters, or should find an end-of-line + ); + + QRegExp geekLinkRegExp; + geekLinkRegExp.setPattern( + "(^|\\b)" // look-before test, for start of capture or word delimiter + "(" // begin of word, start capture + "([a-z0-9\\-]+\\.)+" // match simple characters, but it should contain a dot between each part + "([a-z]{2,3})" // finally match domain part 2 or 3 characters + "(/[a-z0-9\\-_/\\.?=&]+)?" // match the path on the server and simple query requests + ")" // end capture + "(?:[^a-zA-Z0-9]|$)" // not followed by more simple characters, or should find an end-of-line + ); + + QRegExp longWordsRegExp( "([\\w\\d-_\\.]{30})([\\w\\d-_\\.]+)" ); + QRegExp punctuationChars( "(?:[.,;!?\"'])$" ); + QRegExp invalidCcTld( "^(js|hh|cc|ui|fo|so|ko|qt|pp|cf|am|in|gz|ps|ai|rv|rm|wm)$" ); // block typical files instead of listing the whole country code list + QRegExp topLevelDomain( "^(?:com|org|net|edu|gov)$" ); + +#ifdef KMESSTEST + KMESS_ASSERT( emoticonRegExp.isValid() ); + KMESS_ASSERT( emailRegExp.isValid() ); + KMESS_ASSERT( linkRegExp.isValid() ); + KMESS_ASSERT( geekLinkRegExp.isValid() ); + KMESS_ASSERT( longWordsRegExp.isValid() ); +#endif + + // Set the filename of the placeholder image for pending emoticons + static QString pendingEmoticonPlaceholder( KGlobal::dirs()->findResource( "appdata", "pics/empty.png" ) ); + + static const int REGEXP_COUNT = 7; + const QRegExp* regexps[REGEXP_COUNT]; + + // Allow to overwrite standard emoticons by parsing custom emoticons before standard ones + regexps[0] = ( ( showEmoticons && ! customRegExp .isEmpty() ) ? &customRegExp : 0 ); + regexps[1] = ( ( showEmoticons && ! pendingRegExp .isEmpty() ) ? &pendingRegExp : 0 ); + regexps[2] = ( ( showEmoticons && ! emoticonRegExp.isEmpty() ) ? &emoticonRegExp : 0 ); + regexps[3] = ( showLinks ? &linkRegExp : 0 ); + regexps[4] = ( showLinks ? &emailRegExp : 0 ); + regexps[5] = ( showLinks ? &geekLinkRegExp : 0 ); + regexps[6] = ( &longWordsRegExp ); + + QString replacement; + int lastPos = 0; + int matches[ REGEXP_COUNT ]; + memset( matches, -1, sizeof( matches ) ); + + while( true ) + { + // Find out which expression matches first + int matchedRegExp = -1; + int matchStart = -1; + int matchedLength = 0; + for(int i = 0; i < REGEXP_COUNT; i++) + { + if( regexps[ i ] == 0 ) + { + continue; + } + + matches[ i ] = regexps[ i ]->indexIn( text, lastPos ); + if( matches[ i ] == -1 || (int) text.length() < matches[ i ] ) + { + continue; + } + +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "regexp " << i << " matches at character " << matches[ i ]; +#endif + + // See if it's before all other regexps + if( matches[ i ] < matchStart || matchStart == -1 ) + { + matchStart = matches[ i ]; + matchedRegExp = i; + matchedLength = regexps[ i ]->matchedLength(); + } + } + + + QString link; + QString linkBefore; + QString code; + QString altText; + QString placeholderId; + + // Determine the replacement for the matched expression + switch( matchedRegExp ) + { + + // Found a custom emoticon + case 0: + code = text.mid( matchStart, customRegExp.matchedLength() ); // cap(0) is not const + + // Avoid replacing invalid emoticons with nothing + if( ! customReplacements.contains( code ) ) + { +#ifdef KMESSDEBUG_RICHTEXTPARSER + kWarning() << "Emoticon replacement for '" << code << "' not found!"; +#endif + replacement = code; + break; + } + + // Do not display unwanted emoticons + if( customEmoticonsBlacklist.contains( code ) ) + { +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Ignoring blacklisted emoticon" << code; +#endif + replacement = code; + break; + } + + replacement = customReplacements[ code ]; + + // This emoticon is unknown, allow the user to add it by adding an internal KMess link to it + if( allowAddingEmoticons && userCustomEmoticons.indexIn( code ) == -1 ) + { +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Inserting emoticon addition link:" << code; +#endif + QString imagePath( replacement ); + QString urlCode( QUrl::toPercentEncoding( code ) ); + + // Retrieve the image name from the replacement + imagePath = imagePath.replace( "\"", "'" ); + imagePath = imagePath.mid( imagePath.indexOf( "src='" ) + 5 ); + imagePath = imagePath.mid( 0, imagePath.indexOf( "'" ) ); + + // i18n() will unescape the string: Without this, an emoticon like " 'test " will result in + // an attribute like this: " title='Add this emoticon: 'test' ", messing up the whole markup + QString escapedCode( code ); + KMessShared::htmlEscape( escapedCode ); + + // The name attribute is required as, if the user adds the emoticon, we'll want to make all links like this unclickable + replacement = "" + + replacement + + ""; + } +#ifdef KMESSDEBUG_RICHTEXTPARSER + else + { + kDebug() << "Allow adding emoticons:" << allowAddingEmoticons << "code:" << code; + } +#endif + break; + + + // Found a custom emoticon, but the image file is still being downloaded + // Generate a placeholder tag, , and update this tag later when the emoticon is received + case 1: + // Generate and store placeholder ID + placeholderId = "ce" + QString::number( ++lastPendingEmoticonId_ ); + pendingEmoticonTags.append( placeholderId ); + + // Insert placeholder + code = text.mid( matchStart, pendingRegExp.matchedLength() ); // cap(0) is not const + replacement = "" + code
+                    + ""; + break; + + + // Found an emoticon + case 2: + code = text.mid( matchStart, emoticonRegExp.matchedLength() ); // cap(0) is not const + if( emoticonReplacements.contains( code ) ) + { + replacement = emoticonReplacements[ code ]; + } + else + { + // HACK: Replace with the same string, to skip the entire code and continue parsing after it + // See EmoticonTheme::updateCache() + replacement = code; +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "Skipping unmatched code '" << code << "'"; +#endif + } + + break; + + + // Found a link + case 3: + // When www. is found, automatically add http:// to the href + // This doesn't clash, because http:// links are matched earlier + link = linkRegExp.cap(0); + if( ! link.isEmpty() ) + { + // filter out puntuation char + matchedLength = link.length(); + if( punctuationChars.exactMatch(link) // matches standard chars at end + || ( link.endsWith(")") && ! link.contains("(") ) ) // has ")" at end, unless it's a wikipedia disambiguation link + { + matchedLength--; + link.remove( matchedLength, 1 ); + } + + // Filter out long words in links (one example: eBay auctions) + QString longWordFilter( link ); + longWordFilter.replace( longWordsRegExp, "\\1­\\2" ); + + // Create link + replacement = ( link.startsWith("www.") ) + ? replacement = "" + longWordFilter + "" + : replacement = "" + longWordFilter + ""; + } + break; + + + // Found a email address + case 4: + link = emailRegExp.cap(1); + if( ! link.isEmpty() ) + { + matchedLength = link.length(); // filter out puntuation char + replacement = "" + link + ""; + } + break; + + + // Found a geek-style link + case 5: + linkBefore = geekLinkRegExp.cap(1); // matched look-before character + link = geekLinkRegExp.cap(2); + if( ! link.isEmpty() ) + { + // Avoid matching "index.htm", "test.js" etc. + // The list can never be complete but filter out 99% of the cases + QString tld( geekLinkRegExp.cap(4) ); + if( ( tld.length() == 2 && ! invalidCcTld.exactMatch(tld) ) + || ( tld.length() == 3 && topLevelDomain.exactMatch(tld) ) ) + { + matchedLength = linkBefore.length() + link.length(); // filter out puntuation char + replacement = linkBefore + "" + link + ""; + } + } + break; + + + // Found an excessively long word (for example, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!) + case 6: + matchedLength = longWordsRegExp.cap( 0 ).length(); + replacement = longWordsRegExp.cap( 1 ) + "­" + longWordsRegExp.cap( 2 ); + break; + + // Nothing was found, stop + case -1: + break; + + default: +#ifdef KMESSDEBUG_RICHTEXTPARSER + kWarning() << "result of regular expression " << matchedRegExp << " is unhandled!"; +#endif + break; + } + + // Nothing was found, stop + if( matchedRegExp == -1 ) + { + // C doesn't allow us to break the while loop inside the switch statement, so break again + break; + } + + // Process the replacement + if( replacement.isEmpty() || text.mid(matchStart, matchedLength).isEmpty() ) + { + // No replacement found, move cursor to next char + lastPos = matchStart + 1; + } + else + { + // Replace the original text +#ifdef KMESSDEBUG_RICHTEXTPARSER + kDebug() << "replacing '" << text.mid( matchStart, matchedLength ) << "' with: " << replacement << " (matched regexp=" << matchedRegExp << ")"; +#endif + text.replace( matchStart, matchedLength, replacement ); + lastPos = matchStart + replacement.length(); + replacement = QString::null; + } + } + + // Replace any "> "s in the message with "> " to avoid missing spaces after emoticons + text = text.replace( "> ", "> " ); + + // Replace double spaces with double  s so that they'll show properly + text = text.replace( " ", "  " ); + + // Replace the MSN Plus text formatting tags + if( showFormatting ) + { + parseMsnPlusString( text ); + getFormattedString( text ); + } + else + { + getCleanString( text ); + } +} + + + +// Constructor, can be told to not parse the initial string but just save it (during KMess initialization) +OldFormattedString::OldFormattedString( const QString &string, bool parseName ) +: showEmoticons_ ( true ) +, showLinks_ ( false ) +, showSmallEmoticons_( true ) +{ + if( ! string.isEmpty() ) + { + if( parseName ) + { + setString( string ); + } + else + { + original_ = + formatted_ = + escaped_ = + cleaned_ = string; + } + } +} + + + +// Returns the specified version of the string +const QString &OldFormattedString::getString( OldFormattingMode mode ) const +{ + switch( mode ) + { + case OLD_STRING_CLEANED: return cleaned_; + case OLD_STRING_CLEANED_ESCAPED: return escaped_; + case OLD_STRING_FORMATTED: return formatted_; + case OLD_STRING_CHAT_SETTING: return CurrentAccount::instance()->getUseChatFormatting() ? formatted_ : cleaned_; + case OLD_STRING_LIST_SETTING: return CurrentAccount::instance()->getUseListFormatting() ? formatted_ : cleaned_; + case OLD_STRING_CHAT_SETTING_ESCAPED: return CurrentAccount::instance()->getUseChatFormatting() ? formatted_ : escaped_; + case OLD_STRING_LIST_SETTING_ESCAPED: return CurrentAccount::instance()->getUseListFormatting() ? formatted_ : escaped_; + default: return original_; + } +} + + + +// Set a string, which will be formatted according to the given flags +void OldFormattedString::setString( const QString &string ) +{ + // Save the new string everywhere + cleaned_ = + escaped_ = + original_ = + formatted_ = string; + + // Then parse the cleaned and formatted versions + if( ! string.isEmpty() ) + { + OldRichTextParser::getCleanString( cleaned_ ); + OldRichTextParser::parseMsnString( formatted_, showEmoticons_, showSmallEmoticons_, showLinks_, true ); + escaped_ = cleaned_; + KMessShared::htmlEscape( escaped_ ); + } +} diff --git a/tests/old_richtextparser.h b/tests/old_richtextparser.h new file mode 100644 index 0000000..6f605ef --- /dev/null +++ b/tests/old_richtextparser.h @@ -0,0 +1,169 @@ +/*************************************************************************** + old_richtextparser.h - old MSN and MSN Plus parser + ------------------- + begin : April 30, 2008 + copyright : (C) 2008 by Valerio Pilo + email : valerio@kmess.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef OLD_RICHTEXTPARSER_H +#define OLD_RICHTEXTPARSER_H + +#include "../src/emoticon.h" + +#include +#include + + +#define OLD_MSN_PLUS_STRINGCACHESIZE 100 + + +// Forward declarations +class EmoticonManager; + + + +/** + * String types available when dealing with formatting + * + * Use one of these flags to obtain a string parsed the way you need it + */ +enum OldFormattingMode +{ + OLD_STRING_ORIGINAL = 0 /// Unchanged string + , OLD_STRING_CLEANED /// All formatting tags removed + , OLD_STRING_CLEANED_ESCAPED /// Same as STRING_CLEANED, but html-escaped + , OLD_STRING_FORMATTED /// All formatting tags translated to HTML + , OLD_STRING_CHAT_SETTING /// Tags parsed or removed depending on the user's chat window formatting option + , OLD_STRING_CHAT_SETTING_ESCAPED /// Same as STRING_CHAT_SETTING, but html-escaped if the option is off + , OLD_STRING_LIST_SETTING /// Tags parsed or removed depending on the user's contact list formatting option + , OLD_STRING_LIST_SETTING_ESCAPED /// Same as STRING_LIST_SETTING, but html-escaped if the option is off +}; + + + +/** + * @brief Implements features from the MSN Plus extension to KMess + * + * Implements features from the "MSN Plus! Live" extension for MSN Messenger + * and Windows Live Messenger. These features can be: custom formatting in + * nick names, personal messages and in chat text; sending/receiving of + * little sound clips; contact pinging; special colored phrases which trigger + * a sound; various IRC-style commands, like /me; et cetera. + * Some of them are worth adding in KMess, some others are kind of useless but + * someday they could be implemented. + * + * Currently the only implemented feature is text formatting, which is the + * most used and also the most annoying to not have; reading friendly names + * with all the tags and codes really IS annoying. + * + * @author Valerio Pilo + * @author Antonio Nastasi + */ +class OldRichTextParser +{ + friend class KMessTest; + + public: // Public static methods + + // Return the given string with MSN Plus! formatting stripped out + static void getCleanString( QString &string ); + // Initialize the class + static void initialize(); + // Return the given string with links and emoticons translated to HTML + static void parseMsnString( QString &text, bool showEmoticons = true, bool showSmallEmoticons = true, bool showLinks = true, bool showFormatting = false, const QString &handle = *((QString*)0), QStringList &pendingEmoticonTags = *((QStringList*)0) ); + static void oldParseMsnString( QString &text, bool showEmoticons = true, bool showSmallEmoticons = true, bool showLinks = true, bool showFormatting = false, const QString &handle = *((QString*)0), QStringList &pendingEmoticonTags = *((QStringList*)0) ); + + + private: // Private static methods + + // Return the given string with MSN Plus! formatting parsed + static void getFormattedString( QString &string ); + // Turns color codes (english color names, RGB triplets, MSN Plus! palette colors) into an HTML RGB color code + static QString getHtmlColor( const QString& color ); + // Turns a string into a gradient colored one, using Qt HTML tags + static QString getHtmlGradient( const QString& text, const QString& start, const QString& end ); + // Replace the Messenger Plus characters with HTML markup + static void parseMsnPlusString( QString &text ); + + + private: // Private properties + + // QHash maps for storing the string already parsed + static QHash cleanedStringsCache_; + static QHash formattedStringsCache_; + + // Regular expression to match colors + static QRegExp colorMatch_; + // The last assigned ID for pending emoticon placeholders + static int lastPendingEmoticonId_; + // An instance of the Emoticon Manager + static EmoticonManager *emoticonManager_; + // List of MSN Plus colors + static QStringList predefinedColors_; + +}; + + + +/** + * @brief A collection of strings to use with formatting + * + * A little class to hold together three strings: the original one, a formatted and a cleaned up version of it; + * it also allows for very easy manipulation. + * + * @author Valerio Pilo + */ +class OldFormattedString +{ + public: + // Constructor, can be told to not parse the initial string but just save it (during KMess initialization) + OldFormattedString( const QString &string = QString(), bool parseName = true ); + // Set a string, which will be formatted according to the given flags + void setString( const QString &string ); + // Returns the specified version of the string + const QString &getString( OldFormattingMode mode = OLD_STRING_CLEANED ) const; + + // Returns the cleaned up version of the set string + inline const QString & getCleaned() const { return cleaned_; } + // Returns the formatted version of the set string + inline const QString &getFormatted() const { return formatted_; } + // Returns the original string + inline const QString & getOriginal() const { return original_; } + // Changes the formatting options which will be used for the string + inline void setOptions( bool showEmoticons = true, bool showSmallEmoticons = true, bool showLinks = false ) + { + showEmoticons_ = showEmoticons; + showLinks_ = showLinks; + showSmallEmoticons_ = showSmallEmoticons; + } + + private: + // HTML-Escaped version of the string + QString escaped_; + // cleaned up version of the string + QString cleaned_; + // The formatted version of the string + QString formatted_; + // The original string + QString original_; + // Whether to show emoticons in the formatted string + bool showEmoticons_; + // Whether to make links clickable or not + bool showLinks_; + // Whether to display the emoticons big or small + bool showSmallEmoticons_; +}; + + + +#endif